diff --git a/apps/conference/admin_urls.py b/apps/conference/admin_urls.py index 4f975505..dc69199a 100644 --- a/apps/conference/admin_urls.py +++ b/apps/conference/admin_urls.py @@ -3,7 +3,8 @@ from django.conf.urls import patterns, include, url from admin import ConferenceListView, ConferenceView urlpatterns = patterns('conference.admin', - url(r'^upload-photo/(?P.*)/$', 'upload_conference_photo'), + url(r'^upload-photo/(?P.*)/$', 'upload_conference_photo', + name='conference_upload_photo'), url(r'^delete/(?P.*)$', 'conference_delete'), url(r'^copy/$', 'conf_copy'), url(r'^all/$', ConferenceListView.as_view(), name='admin-conference-all'), diff --git a/apps/conference/models.py b/apps/conference/models.py index a938b0ef..c44b6399 100644 --- a/apps/conference/models.py +++ b/apps/conference/models.py @@ -222,7 +222,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin): return names + ' ' + titles + ' ' + themes + ' ' + tags def upload_photo_url(self): - return '/admin/conference/upload-photo/%s/' % self.id + return reverse_lazy('conference_upload_photo', args=[self.id]) def clicks(self): return self.paid_new.tickets.clicks() + self.paid_new.official.clicks() diff --git a/apps/conference/tests/__init__.py b/apps/conference/tests/__init__.py index b91e669f..4a7770a9 100644 --- a/apps/conference/tests/__init__.py +++ b/apps/conference/tests/__init__.py @@ -1 +1,2 @@ -from .test_models import * +# from .test_models import * +from .test_views import * diff --git a/apps/conference/tests/test_forms.py b/apps/conference/tests/test_forms.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/conference/tests/test_models.py b/apps/conference/tests/test_models.py index aa79c231..8a144fbd 100644 --- a/apps/conference/tests/test_models.py +++ b/apps/conference/tests/test_models.py @@ -1,10 +1,16 @@ import datetime -from django.core.urlresolvers import reverse +from accounts.models import User +from django.contrib.contenttypes.models import ContentType +from django.core.urlresolvers import reverse, NoReverseMatch from django.test import TestCase +from expobanner.models import Paid, Banner +from note.models import Note from service.models import Service +from stats_collector.models import ObjectStats +from theme.models import Tag, Theme -from ..models import Conference, Speaker +from ..models import Conference, Speaker, Statistic, TimeTable from city.models import City from country.models import Country from events.models import TargetAudience @@ -12,8 +18,6 @@ from events.models import TargetAudience class ConferenceTest(TestCase): def setUp(self): - audience = TargetAudience.objects.create(title='All') - self.conference = Conference.objects.create( name='New Conference', data_begin=datetime.datetime.now(), @@ -24,7 +28,6 @@ class ConferenceTest(TestCase): url='new-conference', services=b'0001000' ) - self.conference.audience.add(audience) def test_a_conference_create(self): conference_count = Conference.objects.all().count() @@ -62,8 +65,22 @@ class ConferenceTest(TestCase): self.assertEqual(country, new_conference.country) self.assertEqual(city, new_conference.city) + def test_method_unicode(self): + self.assertEqual( + str(self.conference), + self.conference.lazy_translation_getter( + 'name', unicode(self.conference.pk)) + ) + def test_method_get_services(self): - pass + services = [item for item, bool in self.conference.services if bool] + qs = Service.objects.language() + qs = qs.filter(url__in=services) + + self.assertEqual( + sorted(self.conference.get_services(), key=lambda x: x.pk), + sorted(list(qs), key=lambda x: x.pk) + ) def test_method_get_news_url(self): self.assertEqual( @@ -72,11 +89,13 @@ class ConferenceTest(TestCase): ) def test_method_get_audience(self): - audience = TargetAudience.objects.all()[0] - self.assertIn(audience, self.conference.get_audience()) + self.assertFalse(self.conference.get_audience()) - def test_method_get_services(self): - pass + self.conference.audience.add( + TargetAudience.objects.create(title='All')) + audience = TargetAudience.objects.filter(title='All')[0] + + self.assertIn(audience, self.conference.get_audience()) def test_method_get_calendar_url(self): self.assertEqual( @@ -99,5 +118,175 @@ class ConferenceTest(TestCase): reverse('conference_add_note', args=[self.conference.url]) ) + def test_method_get_note_by_user(self): + user = User.objects.all()[0] + + self.assertEqual(self.conference.get_note_by_user(user.id), '') + + text = 'Great' + ct = ContentType.objects.get_for_model(self.conference) + object_id = self.conference.id + Note.objects.create( + content_type=ct, object_id=object_id, + user=user, text=text + ) + + self.assertEqual(self.conference.get_note_by_user(user.id), text) + + def test_method_tags(self): + self.assertFalse(self.conference.tags()) + + theme = Theme.objects.create( + name='Theme name', main_title='Theme title' + ) + tag = Tag.objects.create( + name='Tag name', main_title='Tag title', theme=theme + ) + self.conference.tag.add(tag) + + self.assertIn(tag, self.conference.tags()) + + def test_method_get_index_text(self): + self.assertIn( + self.conference.name, + self.conference.get_index_text() + ) + + title = 'Conf Title' + self.conference.main_title = title + self.conference.save() + + self.assertIn(title, self.conference.get_index_text()) + + theme_name = 'Theme name' + theme = Theme.objects.create( + name=theme_name, main_title='Theme title' + ) + tag_name = 'Tag name' + tag = Tag.objects.create( + name=tag_name, main_title='Tag title', theme=theme + ) + self.conference.tag.add(tag) + + self.assertIn(tag_name, self.conference.get_index_text()) + + self.conference.theme.add(theme) + + self.assertIn(theme_name, self.conference.get_index_text()) + + def test_method_upload_photo_url(self): + self.assertEqual( + reverse('conference_upload_photo', args=[self.conference.id]), + self.conference.upload_photo_url() + ) + + def test_method_clicks(self): + with self.assertRaises(AttributeError): + self.conference.clicks() + + ticket_url = 'ticket_url/' + ticket = Banner.objects.create_for_paid( + self.conference, ticket_url, 'tickets') + official_url = 'official_url/' + official = Banner.objects.create_for_paid( + self.conference, official_url, 'official') + paid = Paid.objects.create( + tickets=ticket, official=official, catalog=ticket) + + self.conference.paid_new = paid + self.conference.save() + + self.assertEqual(self.conference.clicks(), 0) + + self.client.get(ticket.get_click_link()) + + self.assertEqual(self.conference.clicks(), 1) + + self.client.get(official.get_click_link()) + + self.assertEqual(self.conference.clicks(), 2) + + def test_method_get_paid_change_url(self): + try: + self.conference.get_paid_change_url() + except NoReverseMatch: + pass + + ticket = Banner.objects.create_for_paid( + self.conference, 'ticket_url', 'tickets') + official = Banner.objects.create_for_paid( + self.conference, 'official_url', 'official') + paid = Paid.objects.create( + tickets=ticket, official=official, catalog=official) + + self.conference.paid_new = paid + self.conference.save() + + self.assertEqual( + self.conference.get_paid_change_url(), + reverse('confbanner-update_paid', + args=[self.conference.paid_new.id]) + ) + + def test_method_get_objectstat_views(self): + self.assertEqual( + self.conference.get_objectstat_views(), + sum(ObjectStats.objects.filter( + conference=self.conference).values_list('value', flat=True)) + ) + + class SpeakerTest(TestCase): - pass \ No newline at end of file + def test_create_speaker(self): + speacers = Speaker.objects.all().count() + Speaker.objects.create(fullname='Hgangu Piter') + speacers_plus_one = Speaker.objects.all().count() + + self.assertEqual(speacers + 1, speacers_plus_one) + + def test_method_unicode(self): + fullname = 'Hgangu Piter' + speaker = Speaker.objects.create(fullname=fullname) + self.assertEqual(str(speaker), fullname) + + +class StatisticTest(TestCase): + def test_create_statistic(self): + stats = Statistic.objects.all().count() + conf = Conference.objects.create( + name='New Conference', + data_begin=datetime.datetime.now(), + data_end=datetime.timedelta(24)+datetime.datetime.now(), + country=Country.objects.all()[0], + city=City.objects.all()[0] + ) + Statistic.objects.create( + conference=conf, + year=datetime.datetime.now().year, + countries='Monaco' + ) + stats_plus_one = Statistic.objects.all().count() + + self.assertEqual(stats + 1, stats_plus_one) + + +class TimeTableTest(TestCase): + def test_create_timetable(self): + tables = TimeTable.objects.all().count() + conf = Conference.objects.create( + name='New Conference', + data_begin=datetime.datetime.now(), + data_end=datetime.timedelta(24) + datetime.datetime.now(), + country=Country.objects.all()[0], + city=City.objects.all()[0] + ) + TimeTable.objects.create( + conference=conf, + begin=datetime.datetime.now(), + end=datetime.timedelta(24) + datetime.datetime.now(), + name='All times' + ) + tables_plus_one = TimeTable.objects.all().count() + self.assertEqual( + tables + 1, tables_plus_one + ) diff --git a/apps/conference/tests/test_views.py b/apps/conference/tests/test_views.py new file mode 100644 index 00000000..c0429965 --- /dev/null +++ b/apps/conference/tests/test_views.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +from city.models import City +from country.models import Country +from django.core.urlresolvers import reverse +from django.test import TestCase +from django.utils.translation import ugettext as _ +from functions.views_help import get_side_items + + +class ConferenceByTest(object): + """Функционал 'абстрактного' класса ConferenceBy""" + def setUp(self): + self.response = self.client.get(self.url) + + def test_template(self): + self.assertTemplateUsed( + self.response, + 'client/conference/conference_by.html' + ) + + def test_is_available(self): + self.assertEqual(self.response.status_code, 200) + + def test_titles(self): + self.assertContains(self.response, self.title1) + self.assertContains(self.response, self.title2) + + def test_link(self): + link = '/conference/%s' % (self.catalog, ) + self.assertContains(self.response, link) + + def test_queryset(self): + obj_list = self.response.context[-1].get('object_list') + for obj in obj_list: + self.assertContains( + self.response, obj.name + ) + self.assertContains( + self.response, obj.url + ) + +class CanFilterAndSidePopular(object): + """Функционал can_filter and side_popular in get_context_data""" + def test_can_filter(self): + text = 'ВЫБРАТЬ ПО КРИТЕРИЯМ:' + can_filter = self.response.context[-1].get('can_filter', None) + if can_filter is False: + self.assertNotContains(self.response, text) + elif can_filter is True: + self.assertContains(self.response, text) + + def test_side_popular(self): + side_popular = get_side_items('conf', self.model) + for popular in side_popular: + self.assertContains(self.response, popular.get('url')) + self.assertContains(self.response, popular.get('name')) + + +class ConferenceByCountryTest(ConferenceByTest, CanFilterAndSidePopular, TestCase): + url = reverse('conference_country') + title1 = _(u'По странам') + title2 = _(u'Коференции мира по странам') + catalog = 'country/' + model = Country + + +class ConferenceByThemeTest(ConferenceByTest, TestCase): + url = reverse('conference_theme') + title1 = _(u'По тематикам') + title2 = _(u'Коференции мира по тематикам') + catalog = 'theme/' + + +class ConferenceByTagTest(ConferenceByTest, TestCase): + url = reverse('conference_tag') + title1 = _(u'По тегам') + title2 = _(u'Коференции мира по тегам') + catalog = 'tag/' + + +class ConferenceByCityTest(ConferenceByTest, CanFilterAndSidePopular, TestCase): + url = reverse('conference_city') + title1 = _(u'По городам') + title2 = _(u'Коференции мира по городам') + catalog = 'city/' + model = City + + +class ConferenceCatalogTest(object): + def test_template(self): + self.assertTemplateUsed( + self.response, + 'client/conference/catalog.html' + ) + + +# class ConferenceCountryCatalogTest(ConferenceCatalogTest, TestCase): +# def setUp(self): +# url = reverse('conference_country_catalog', args=[]) +# self.response = self.client.get(url) diff --git a/apps/conference/urls.py b/apps/conference/urls.py index 0b99a2bf..9d22369c 100644 --- a/apps/conference/urls.py +++ b/apps/conference/urls.py @@ -36,15 +36,20 @@ urlpatterns = patterns('', # search url(r'^conference/search/', ExpositionSearchView.as_view()), # country catalog - url(r'^conference/country/$', ConferenceByCountry.as_view(), {'meta_id':51}), - url(r'^conference/country/(?P[^/]*)/(?P\d+)/(?P[^/]*)/page/(?P\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':25}), + url(r'^conference/country/$', + ConferenceByCountry.as_view(), {'meta_id':51}, + name='conference_country'), + url(r'^conference/country/(?P[^/]*)/(?P\d+)/(?P[^/]*)/page/(?P\d+)/$', + ConferenceCountryCatalog.as_view(), {'meta_id':25}, + name='conference_country_catalog'), url(r'^conference/country/(?P[^/]*)/(?P\d+)/page/(?P\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':24}), url(r'^conference/country/(?P[^/]*)/page/(?P\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':23}), url(r'^conference/country/(?P[^/]*)/(?P\d+)/(?P[^/]*)/$', ConferenceCountryCatalog.as_view(), {'meta_id':25}), url(r'^conference/country/(?P[^/]*)/(?P\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':24}), url(r'^conference/country/(?P[^/]*)/$', ConferenceCountryCatalog.as_view(), {'meta_id':23}, name='conf_country'), # city catalog - url(r'^conference/city/$', ConferenceByCity.as_view(), {'meta_id':52}), + url(r'^conference/city/$', + ConferenceByCity.as_view(), {'meta_id':52}, name='conference_city'), url(r'^conference/city/(?P[^/]*)/(?P\d+)/(?P[^/]*)/page/(?P\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':28}), url(r'^conference/city/(?P[^/]*)/(?P\d+)/page/(?P\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':27}), url(r'^conference/city/(?P[^/]*)/page/(?P\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':26}), @@ -52,7 +57,8 @@ urlpatterns = patterns('', url(r'^conference/city/(?P[^/]*)/(?P\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':27}), url(r'^conference/city/(?P[^/]*)/$', ConferenceCityCatalog.as_view(), {'meta_id':26}, name='conf_city'), # theme catalog - url(r'^conference/theme/$', ConferenceByTheme.as_view(), {'meta_id':50}), + url(r'^conference/theme/$', + ConferenceByTheme.as_view(), {'meta_id':50}, name='conference_theme'), url(r'^conference/theme/(?P[^/]*)/country/(?P[^/]*)/(?P\d+)/(?P[^/]*)/page/(?P\d+)/$', ConferenceThemeCatalog.as_view()), url(r'^conference/theme/(?P[^/]*)/country/(?P[^/]*)/(?P\d+)/page/(?P\d+)/$', ConferenceThemeCatalog.as_view()), url(r'^conference/theme/(?P[^/]*)/country/(?P[^/]*)/(?P\d+)/(?P[^/]*)/$', ConferenceThemeCatalog.as_view()), @@ -76,7 +82,8 @@ urlpatterns = patterns('', url(r'^conference/theme/(?P[^/]*)/(?P\d+)/$', ConferenceThemeCatalog.as_view(), {'meta_id':30}), url(r'^conference/theme/(?P[^/]*)/$', ConferenceThemeCatalog.as_view(), {'meta_id':29}), # tag catalog - url(r'^conference/tag/$', ConferenceByTag.as_view(), {'meta_id':50}), + url(r'^conference/tag/$', + ConferenceByTag.as_view(), {'meta_id':50}, name='conference_tag'), url(r'^conference/tag/(?P[^/]*)/(?P\d+)/(?P[^/]*)/page/(?P\d+)/$', ConferenceTagCatalog.as_view(), {'meta_id':34}), url(r'^conference/tag/(?P[^/]*)/(?P\d+)/page/(?P\d+)/$', ConferenceTagCatalog.as_view(), {'meta_id':33}), url(r'^conference/tag/(?P[^/]*)/page/(?P\d+)/$', ConferenceTagCatalog.as_view(), {'meta_id':32}), diff --git a/apps/functions/model_mixin.py b/apps/functions/model_mixin.py index 997ccd2b..680a4d4b 100644 --- a/apps/functions/model_mixin.py +++ b/apps/functions/model_mixin.py @@ -256,7 +256,7 @@ class EventMixin(object): if not isinstance(getattr(self, '_get_services_detail', None), list): # excluded = ['visit', 'tickets'] # country_ids = [item for item, bool in self.country.services if bool==True] - services = [item for item, bool in self.services if bool==True] + services = [item for item, bool in self.services if bool] qs = Service.objects.language() if excluded is not None: qs = qs.exclude(url__in=excluded)