From fae73f6af4d096d4eb5731ccbf08573a6b84c08c Mon Sep 17 00:00:00 2001 From: avgoeid Date: Tue, 31 Jan 2017 09:18:02 +0200 Subject: [PATCH 01/17] =?UTF-8?q?conference=20=D0=BF=D0=BE=D0=B4=D0=B3?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/__init__.py | 0 apps/conference/models.py | 7 +-- apps/conference/tests.py | 16 ------ apps/conference/tests/__init__.py | 1 + apps/conference/tests/test_models.py | 75 ++++++++++++++++++++++++++++ apps/events/models.py | 2 +- proj/settings.py | 6 +-- 7 files changed, 84 insertions(+), 23 deletions(-) create mode 100644 apps/__init__.py delete mode 100644 apps/conference/tests.py create mode 100644 apps/conference/tests/__init__.py create mode 100644 apps/conference/tests/test_models.py diff --git a/apps/__init__.py b/apps/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/conference/models.py b/apps/conference/models.py index 72be39fb..da977253 100644 --- a/apps/conference/models.py +++ b/apps/conference/models.py @@ -83,7 +83,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin): periodic_once = models.CharField(verbose_name=_(u'Проводится в n-й раз'), help_text=_(u'10'), max_length=10, blank=True, null=True) periodic = models.FloatField(verbose_name=_(u'Переодичность'), blank=True, null=True) - audience = models.ManyToManyField(TargetAudience, null=True) + audience = BitField(flags=[k for k, v in BIT_AUDIENCE]) web_page = models.CharField(verbose_name=_(u'Вебсайт'), max_length=255, blank=True) link = models.CharField(verbose_name=_(u'Линк на регистрацию'), max_length=255, blank=True) programm_link = models.URLField(verbose_name=_(u'Программа конференции'), max_length=255, blank=True) @@ -115,7 +115,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin): #translated fields translations = TranslatedFields( - name = models.CharField(verbose_name=_(u'Название'), max_length=255), + name=models.CharField(verbose_name=_(u'Название'), max_length=255), main_title=models.TextField(verbose_name=_(u'Краткое описание'), blank=True), description=models.TextField(verbose_name=_(u'Описание'), blank=True), main_themes=models.TextField(verbose_name=_(u'Основные темы'), blank=True), @@ -186,7 +186,8 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin): return '/conference/' def get_audience(self): - checked = [item for item, bool in self.audience if bool==True] + print self.audience.all() + checked = [item for item, bool in self.audience if bool] audience = [] for k, v in BIT_AUDIENCE: for item in checked: diff --git a/apps/conference/tests.py b/apps/conference/tests.py deleted file mode 100644 index 501deb77..00000000 --- a/apps/conference/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -This file demonstrates writing tests using the unittest module. These will pass -when you run "manage.py test". - -Replace this with more appropriate tests for your application. -""" - -from django.test import TestCase - - -class SimpleTest(TestCase): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - self.assertEqual(1 + 1, 2) diff --git a/apps/conference/tests/__init__.py b/apps/conference/tests/__init__.py new file mode 100644 index 00000000..b91e669f --- /dev/null +++ b/apps/conference/tests/__init__.py @@ -0,0 +1 @@ +from .test_models import * diff --git a/apps/conference/tests/test_models.py b/apps/conference/tests/test_models.py new file mode 100644 index 00000000..0ef3b1bf --- /dev/null +++ b/apps/conference/tests/test_models.py @@ -0,0 +1,75 @@ +import datetime + +from django.test import TestCase + +from ..models import Conference, Speaker +from city.models import City +from country.models import Country +from events.models import TargetAudience + + +class ConferenceTest(TestCase): + def setUp(self): + + + self.conference = 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], + + url='new-conference', + audience=0 + ) + + + def test_a_conference_create(self): + conference_count = Conference.objects.all().count() + 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] + ) + new_conference_count = Conference.objects.all().count() + + self.assertEqual(conference_count + 1, new_conference_count) + + def test_save_conference_info(self): + name = 'New Conference' + datetime_now = datetime.datetime.now() + data_begin = datetime_now + data_end = datetime.timedelta(24) + datetime_now + country = Country.objects.all()[0] + city = City.objects.all()[0] + + new_conference = Conference.objects.create( + name=name, + data_begin=data_begin, + data_end=data_end, + country=country, + city=city + ) + + self.assertEqual(name, new_conference.name) + self.assertEqual(data_begin, new_conference.data_begin) + self.assertEqual(data_end, new_conference.data_end) + self.assertEqual(country, new_conference.country) + self.assertEqual(city, new_conference.city) + + def test_method_get_services(self): + pass + + def test_method_get_news_url(self): + self.assertEqual( + '%s' % self.conference.get_news_url(), + '/news/conference/%s/' % self.conference.url + ) + + def test_method_get_audience(self): + self.assertEqual(self.conference.get_audience(), '') + +class SpeakerTest(TestCase): + pass \ No newline at end of file diff --git a/apps/events/models.py b/apps/events/models.py index 040760e1..faef6e64 100644 --- a/apps/events/models.py +++ b/apps/events/models.py @@ -10,4 +10,4 @@ class TargetAudience(models.Model): title = models.CharField(_(u'Название'), max_length=200) def __unicode__(self): - return unicode(self.title) \ No newline at end of file + return unicode(self.title) diff --git a/proj/settings.py b/proj/settings.py index 0de4e410..96f4be49 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -2,10 +2,10 @@ # Django settings for proj project. import os import sys -import django -from django.utils.translation import ugettext_lazy as _ from ConfigParser import ConfigParser +import django +from django.utils.translation import ugettext_lazy as _ DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) SITE_ROOT = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0] @@ -531,7 +531,7 @@ PERIODIC = { # } try: - from local import * + from proj.local import * except ImportError, e: pass From ec75b5c3027f4b4ef3eeeb7e3025ccf7abfc7103 Mon Sep 17 00:00:00 2001 From: avgoeid Date: Thu, 2 Feb 2017 08:39:27 +0200 Subject: [PATCH 02/17] conference model tests --- README.md | 9 + apps/conference/forms.py | 5 +- apps/conference/models.py | 29 +- apps/conference/tests/test_models.py | 40 +- apps/conference/urls.py | 11 +- apps/events/urls.py | 8 +- apps/exposition/forms.py | 5 +- ...002_auto__del_field_exposition_audience.py | 631 ++++++++++++++++++ apps/exposition/models.py | 25 +- apps/import_xls/utils.py | 1 - static/custom_js/main.js | 22 +- 11 files changed, 720 insertions(+), 66 deletions(-) create mode 100644 apps/exposition/migrations/0002_auto__del_field_exposition_audience.py diff --git a/README.md b/README.md index 13fee6be..6abe0b44 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,15 @@ DATABASES = { 'HOST': '', 'PORT': '', 'TEST_CHARSET': 'utf8', + }, + 'test': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'test_expomap', + 'USER': 'root', + 'PASSWORD': '1', + 'HOST': '', + 'PORT': '', + 'TEST_CHARSET': 'utf8', } } diff --git a/apps/conference/forms.py b/apps/conference/forms.py index 3cdb0d39..89869645 100644 --- a/apps/conference/forms.py +++ b/apps/conference/forms.py @@ -7,7 +7,7 @@ from django.core.validators import validate_email, URLValidator from django.utils.translation import ugettext as _ #models from events.models import TargetAudience -from models import Conference, TimeTable, CURRENCY, Statistic, BIT_AUDIENCE, Speaker +from models import Conference, TimeTable, CURRENCY, Statistic, Speaker from country.models import Country from city.models import City from theme.models import Theme, Tag @@ -41,7 +41,8 @@ class ConferenceCreateForm(forms.Form): (4.0, _(u'4 раза в год')), (5.0, _(u'5 раз в год')), (0.5, _(u'Раз в 2 года')),(0.33, _(u'Раз в 3 года')), (0.25, _(u'Раз в 4 года')), (0.2, _(u'Раз в 5 лет'))) - # public = [(item1, item2) for item1, item2 in BIT_AUDIENCE] + # public = [(i, i) for i in + # TargetAudience.objects.all().values_list('title', flat=True)] currencies = [(item, item) for item in CURRENCY] diff --git a/apps/conference/models.py b/apps/conference/models.py index da977253..28c2b558 100644 --- a/apps/conference/models.py +++ b/apps/conference/models.py @@ -33,7 +33,6 @@ flags = ['catalog', 'translator', 'participation', 'remote', 'tickets', 'visit', CURRENCY = settings.CURRENCY -BIT_AUDIENCE = settings.BIT_AUDIENCE class Conference(TranslatableModel, EventMixin, ExpoMixin): """ @@ -83,7 +82,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin): periodic_once = models.CharField(verbose_name=_(u'Проводится в n-й раз'), help_text=_(u'10'), max_length=10, blank=True, null=True) periodic = models.FloatField(verbose_name=_(u'Переодичность'), blank=True, null=True) - audience = BitField(flags=[k for k, v in BIT_AUDIENCE]) + audience = models.ManyToManyField(TargetAudience, null=True) web_page = models.CharField(verbose_name=_(u'Вебсайт'), max_length=255, blank=True) link = models.CharField(verbose_name=_(u'Линк на регистрацию'), max_length=255, blank=True) programm_link = models.URLField(verbose_name=_(u'Программа конференции'), max_length=255, blank=True) @@ -179,32 +178,28 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin): # else: # return [] + def get_audience(self): + return self.audience.all() + def get_news_url(self): return reverse_lazy('news_conference', kwargs={'slug': self.url}) def get_catalog_url(self): return '/conference/' - def get_audience(self): - print self.audience.all() - checked = [item for item, bool in self.audience if bool] - audience = [] - for k, v in BIT_AUDIENCE: - for item in checked: - if item == k: - audience.append(v) - - return ', '.join(audience) - - def get_calendar_url(self): - return '/conference-add-calendar/%s/'%self.id + return reverse_lazy('conference_add_calendar', args=[self.id]) def get_visit_url(self): - return '/conference-visit/%s/'%self.id + return reverse_lazy( + 'events:event_visit', args=['conference', self.id] + ) def get_note_url(self): - return '/conference/add-note/%s/'%self.url + return reverse_lazy( + 'conference_add_note', + args=[self.url] + ) def get_note_by_user(self, user_id): note = self.note.filter(user__id=user_id) diff --git a/apps/conference/tests/test_models.py b/apps/conference/tests/test_models.py index 0ef3b1bf..aa79c231 100644 --- a/apps/conference/tests/test_models.py +++ b/apps/conference/tests/test_models.py @@ -1,6 +1,8 @@ import datetime +from django.core.urlresolvers import reverse from django.test import TestCase +from service.models import Service from ..models import Conference, Speaker from city.models import City @@ -10,7 +12,7 @@ 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', @@ -20,9 +22,9 @@ class ConferenceTest(TestCase): city=City.objects.all()[0], url='new-conference', - audience=0 + services=b'0001000' ) - + self.conference.audience.add(audience) def test_a_conference_create(self): conference_count = Conference.objects.all().count() @@ -51,6 +53,7 @@ class ConferenceTest(TestCase): data_end=data_end, country=country, city=city + ) self.assertEqual(name, new_conference.name) @@ -64,12 +67,37 @@ class ConferenceTest(TestCase): def test_method_get_news_url(self): self.assertEqual( - '%s' % self.conference.get_news_url(), - '/news/conference/%s/' % self.conference.url + self.conference.get_news_url(), + reverse('news_conference', kwargs={'slug': self.conference.url}) ) def test_method_get_audience(self): - self.assertEqual(self.conference.get_audience(), '') + audience = TargetAudience.objects.all()[0] + self.assertIn(audience, self.conference.get_audience()) + + def test_method_get_services(self): + pass + + def test_method_get_calendar_url(self): + self.assertEqual( + self.conference.get_calendar_url(), + reverse('conference_add_calendar', args=[self.conference.id]) + ) + + def test_method_get_visit_url(self): + self.assertEqual( + self.conference.get_visit_url(), + reverse( + 'events:event_visit', + args=['conference', self.conference.id] + ) + ) + + def test_method_get_note_url(self): + self.assertEqual( + self.conference.get_note_url(), + reverse('conference_add_note', args=[self.conference.url]) + ) class SpeakerTest(TestCase): pass \ No newline at end of file diff --git a/apps/conference/urls.py b/apps/conference/urls.py index e1c28e97..0b99a2bf 100644 --- a/apps/conference/urls.py +++ b/apps/conference/urls.py @@ -23,8 +23,15 @@ from .views import ( urlpatterns = patterns('', - url(r'^conference/add-note/(?P[^/]*)/$', 'conference.views.add_note'), - url(r'^conference-add-calendar/(?P\d+)/$', 'conference.views.conference_add_calendar'), + url( + r'^conference/add-note/(?P[^/]*)/$', + 'conference.views.add_note', + name='conference_add_note' + ), + url(r'^conference-add-calendar/(?P\d+)/$', + 'conference.views.conference_add_calendar', + name='conference_add_calendar' + ), # url(r'^conference-visit/(?P\d+)/$', 'conference.views.conference_visit'), # search url(r'^conference/search/', ExpositionSearchView.as_view()), diff --git a/apps/events/urls.py b/apps/events/urls.py index 48d0f620..f9f1b19d 100644 --- a/apps/events/urls.py +++ b/apps/events/urls.py @@ -13,5 +13,9 @@ events_urlpatterns = patterns('', urlpatterns = ( url(r'^events/', include(events_urlpatterns)), - url(r'^(?P(exposition|conference))-visit/(?P\d+)/$', event_visit), -) \ No newline at end of file + url( + r'^(?P(exposition|conference))-visit/(?P\d+)/$', + event_visit, + name='event_visit' + ), +) diff --git a/apps/exposition/forms.py b/apps/exposition/forms.py index 9b267a10..f0f92710 100644 --- a/apps/exposition/forms.py +++ b/apps/exposition/forms.py @@ -6,7 +6,8 @@ from django.forms.util import ErrorList from django.core.validators import validate_email, URLValidator from django.utils.translation import ugettext as _ #models -from models import Exposition, TimeTable, TmpTimeTable, AUDIENCE1, CURRENCY, Statistic, BIT_AUDIENCE +from events.models import TargetAudience +from models import Exposition, TimeTable, TmpTimeTable, CURRENCY, Statistic from theme.models import Tag from country.models import Country from theme.models import Theme @@ -35,7 +36,7 @@ class ExpositionCreateForm(forms.Form): PERIODIC = ((0, _(u'Не выбрано')), (1.0, _(u'Ежегодно')), (2.0, _(u'2 раза в год')), (3.0, _(u'3 раза в год')), (4.0, _(u'4 раза в год')), (5.0, _(u'5 раз в год')), (0.5, _(u'Раз в 2 года')),(0.33, _(u'Раз в 3 года')), (0.25, _(u'Раз в 4 года')), (0.2, _(u'Раз в 5 лет'))) - public = [(item1, item2) for item1, item2 in BIT_AUDIENCE] + public = [(i, i) for i in TargetAudience.objects.all().values_list('title', flat=True)] currencies = [(item, item) for item in CURRENCY] data_begin = forms.DateField(label=_(u'Дата начала'), input_formats=['%Y-%m-%d', '%d.%m.%Y']) diff --git a/apps/exposition/migrations/0002_auto__del_field_exposition_audience.py b/apps/exposition/migrations/0002_auto__del_field_exposition_audience.py new file mode 100644 index 00000000..85aadb28 --- /dev/null +++ b/apps/exposition/migrations/0002_auto__del_field_exposition_audience.py @@ -0,0 +1,631 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting field 'Exposition.audience' + db.delete_column(u'exposition_exposition', 'audience') + + # Adding M2M table for field audience on 'Exposition' + m2m_table_name = db.shorten_name(u'exposition_exposition_audience') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('exposition', models.ForeignKey(orm[u'exposition.exposition'], null=False)), + ('targetaudience', models.ForeignKey(orm[u'events.targetaudience'], null=False)) + )) + db.create_unique(m2m_table_name, ['exposition_id', 'targetaudience_id']) + + + def backwards(self, orm): + # Adding field 'Exposition.audience' + db.add_column(u'exposition_exposition', 'audience', + self.gf('django.db.models.fields.BigIntegerField')(default=1), + keep_default=False) + + # Removing M2M table for field audience on 'Exposition' + db.delete_table(db.shorten_name(u'exposition_exposition_audience')) + + + models = { + u'accounts.user': { + 'Meta': {'ordering': "['-rating']", 'object_name': 'User'}, + 'blocked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'company': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'users'", 'null': 'True', 'to': u"orm['company.Company']"}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_registered': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '255', 'db_index': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_admin': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'organiser': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['organiser.Organiser']", 'unique': 'True', 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'position': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'rating': ('django.db.models.fields.IntegerField', [], {'default': '100'}), + 'readonly': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'translator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['translator.Translator']", 'blank': 'True', 'unique': 'True'}), + 'url': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}) + }, + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'city.city': { + 'Meta': {'unique_together': '()', 'object_name': 'City', 'index_together': '()'}, + 'code_IATA': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['directories.Iata']", 'null': 'True', 'blank': 'True'}), + 'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'cities'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'old_url': ('django.db.models.fields.CharField', [], {'max_length': '55'}), + 'phone_code': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'population': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}) + }, + u'company.company': { + 'Meta': {'ordering': "['-rating', 'id']", 'unique_together': '()', 'object_name': 'Company', 'index_together': '()'}, + 'address': ('functions.custom_fields.LocationField', [], {'blank': 'True'}), + 'blocked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'city': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), + 'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'created_company'", 'null': 'True', 'to': u"orm['accounts.User']"}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'facebook': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'foundation': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'linkedin': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rating': ('django.db.models.fields.IntegerField', [], {'default': '100'}), + 'staff_number': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'tag': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['theme.Tag']"}), + 'theme': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['theme.Theme']"}), + 'twitter': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'url': ('django.db.models.fields.SlugField', [], {'max_length': '255'}), + 'vk': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'country.area': { + 'Meta': {'ordering': "['translations__name']", 'unique_together': '()', 'object_name': 'Area', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'country.country': { + 'Meta': {'ordering': "['translations__name']", 'unique_together': '()', 'object_name': 'Country', 'index_together': '()'}, + 'area': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Area']"}), + 'big_cities': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'cities'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['city.City']"}), + 'capital': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'capital'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), + 'country_code': ('django.db.models.fields.CharField', [], {'max_length': '2'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'currency': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['directories.Currency']", 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'language': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['directories.Language']", 'null': 'True', 'blank': 'True'}), + 'latitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}), + 'longitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'old_url': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '55'}), + 'phone_code': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'population': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), + 'teritory': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'time_delivery': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'timezone': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}) + }, + u'directories.currency': { + 'Meta': {'unique_together': '()', 'object_name': 'Currency', 'index_together': '()'}, + 'code': ('django.db.models.fields.CharField', [], {'max_length': '3'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'directories.iata': { + 'Meta': {'object_name': 'Iata'}, + 'airport': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'code': ('django.db.models.fields.CharField', [], {'max_length': '4'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'directories.language': { + 'Meta': {'unique_together': '()', 'object_name': 'Language', 'index_together': '()'}, + 'code': ('django.db.models.fields.CharField', [], {'max_length': '2'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'events.targetaudience': { + 'Meta': {'ordering': "['title']", 'object_name': 'TargetAudience'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'title_en': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'title_ru': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + u'expobanner.banner': { + 'Meta': {'ordering': "['sort']", 'object_name': 'Banner'}, + 'alt': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'cookie': ('django.db.models.fields.CharField', [], {'default': "'expo_b_default_popup'", 'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'country': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['country.Country']", 'null': 'True', 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'customer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Customer']", 'null': 'True', 'blank': 'True'}), + 'flash': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2017, 2, 1, 0, 0)'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'banners'", 'null': 'True', 'to': u"orm['expobanner.BannerGroup']"}), + 'html': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'img': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'link': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'often': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '1', 'null': 'True', 'blank': 'True'}), + 'paid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'popup': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'sort': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '500'}), + 'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'theme': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Theme']", 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'to': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'urls': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'url_banners'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['expobanner.URL']"}) + }, + u'expobanner.bannergroup': { + 'Meta': {'ordering': "['name']", 'object_name': 'BannerGroup'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'height': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'speed': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '2000'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}) + }, + u'expobanner.customer': { + 'Meta': {'ordering': "['name']", 'object_name': 'Customer'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + u'expobanner.mainpage': { + 'Meta': {'ordering': "['-public']", 'object_name': 'MainPage'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'link': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Banner']"}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'position': ('django.db.models.fields.PositiveIntegerField', [], {'default': '2', 'null': 'True', 'blank': 'True'}), + 'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}) + }, + u'expobanner.paid': { + 'Meta': {'ordering': "['-public']", 'object_name': 'Paid'}, + 'catalog': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_catalog'", 'to': u"orm['expobanner.Banner']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'kind': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '1', 'db_index': 'True'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'official': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_official'", 'to': u"orm['expobanner.Banner']"}), + 'organiser': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), + 'participants_list': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'paid_participants_list'", 'null': 'True', 'to': u"orm['expobanner.Banner']"}), + 'participation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_participation'", 'null': 'True', 'to': u"orm['expobanner.Banner']"}), + 'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'tickets': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_tickets'", 'to': u"orm['expobanner.Banner']"}) + }, + u'expobanner.top': { + 'Meta': {'ordering': "['position']", 'object_name': 'Top'}, + 'base_catalog': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'catalog': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'cities': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'top_in_set'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['city.City']"}), + 'country': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['country.Country']", 'null': 'True', 'blank': 'True'}), + 'excluded_cities': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['city.City']", 'null': 'True', 'blank': 'True'}), + 'excluded_tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Tag']", 'null': 'True', 'blank': 'True'}), + 'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2017, 2, 1, 0, 0)'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'link': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Banner']"}), + 'months': ('functions.custom_fields.MonthMultiSelectField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'position': ('django.db.models.fields.PositiveIntegerField', [], {'default': '2', 'null': 'True', 'blank': 'True'}), + 'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}), + 'theme': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Theme']", 'null': 'True', 'blank': 'True'}), + 'to': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'years': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}) + }, + u'expobanner.url': { + 'Meta': {'ordering': "['-created_at']", 'object_name': 'URL'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'regex': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'site_urls'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['sites.Site']"}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '2048'}) + }, + u'exposition.exposition': { + 'Meta': {'unique_together': '()', 'object_name': 'Exposition', 'index_together': '()'}, + 'application_deadline': ('django.db.models.fields.DateField', [], {'null': 'True'}), + 'area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'audience': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['events.TargetAudience']", 'null': 'True', 'symmetrical': 'False'}), + 'bad_url': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'canceled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'canceled_by_administrator': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'city': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'exposition_city'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), + 'company': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['company.Company']"}), + 'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'exposition_country'", 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'exposition_creator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['accounts.User']"}), + 'currency': ('functions.custom_fields.EnumField', [], {'default': "'RUB'", 'values': "('RUB', 'USD', 'EUR', 'RMB', 'GBP', 'AED', 'SGD', 'TRY', 'CZK', 'CHF', 'SEK', 'LKR', 'UAH', 'IDR', 'PLN', 'JPY')"}), + 'data_begin': ('django.db.models.fields.DateField', [], {'db_index': 'True'}), + 'data_end': ('django.db.models.fields.DateField', [], {}), + 'discount': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'expohit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'foundation_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'main': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.MainPage']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'main_page': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'max_closed_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'max_closed_equipped_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'max_open_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'members': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'members_choice': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'min_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'min_closed_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'min_closed_equipped_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'min_open_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'min_stand_size': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'moved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), + 'org': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'organiser': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_organisers'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['organiser.Organiser']"}), + 'paid_new': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Paid']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'periodic': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), + 'photogallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'place': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'exposition_place'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['place_exposition.PlaceExposition']"}), + 'place_alt': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'price_catalog': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'price_choice': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'price_choice_eur': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'price_eur': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'price_rub': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'quality_label': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), + 'rating': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'registration_link': ('django.db.models.fields.URLField', [], {'max_length': '255', 'blank': 'True'}), + 'registration_payment': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), + 'tag': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_tags'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['theme.Tag']"}), + 'tax': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'theme': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'exposition_themes'", 'symmetrical': 'False', 'to': u"orm['theme.Theme']"}), + 'top': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Top']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_users'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['accounts.User']"}), + 'views': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'visitors': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'visitors_choice': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) + }, + u'exposition.expositiontranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ExpositionTranslation', 'db_table': "u'exposition_exposition_translation'", 'index_together': '()'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'descriptions': ('django.db.models.fields.CharField', [], {'max_length': '250'}), + 'discount_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'keywords': ('django.db.models.fields.CharField', [], {'max_length': '250'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'main_title': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['exposition.Exposition']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'participation_note': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'pre_condition': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'price_all': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'price_all_bar': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'price_day': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'price_day_bar': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'products': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'stand_condition': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'stat_countries': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'time': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '250'}), + 'visit_note': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) + }, + u'exposition.statistic': { + 'Meta': {'unique_together': '()', 'object_name': 'Statistic', 'index_together': '()'}, + 'area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'countries_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'exposition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'statistic'", 'to': u"orm['exposition.Exposition']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'members': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'visitors': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'year': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + u'exposition.statistictranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'StatisticTranslation', 'db_table': "u'exposition_statistic_translation'", 'index_together': '()'}, + 'countries': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['exposition.Statistic']"}) + }, + u'exposition.timetable': { + 'Meta': {'unique_together': '()', 'object_name': 'TimeTable', 'index_together': '()'}, + 'begin': ('django.db.models.fields.DateTimeField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'end': ('django.db.models.fields.DateTimeField', [], {}), + 'exposition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'business_program'", 'to': u"orm['exposition.Exposition']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'timetable_organiser': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['organiser.Organiser']", 'null': 'True', 'blank': 'True'}) + }, + u'exposition.timetabletranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'TimeTableTranslation', 'db_table': "u'exposition_timetable_translation'", 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['exposition.TimeTable']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'place': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'programe': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'speaker': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) + }, + u'exposition.tmptimetable': { + 'Meta': {'unique_together': '()', 'object_name': 'TmpTimeTable', 'index_together': '()'}, + 'begin': ('django.db.models.fields.DateTimeField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'end': ('django.db.models.fields.DateTimeField', [], {}), + 'exposition': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['exposition.Exposition']", 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'timetable_organiser': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['organiser.Organiser']", 'null': 'True', 'blank': 'True'}) + }, + u'exposition.tmptimetabletranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'TmpTimeTableTranslation', 'db_table': "u'exposition_tmptimetable_translation'", 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['exposition.TmpTimeTable']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'place': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'programe': ('django.db.models.fields.TextField', [], {}), + 'speaker': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) + }, + u'file.filemodel': { + 'Meta': {'unique_together': '()', 'object_name': 'FileModel', 'index_together': '()'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'file_path': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + 'file_type': ('functions.custom_fields.EnumField', [], {'default': "'PDF'", 'values': "('PDF', 'DOC', 'TXT', 'OTHER', 'JPG', 'BMP', 'PNG', 'GIF')", 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'img_height': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'img_width': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'purpose': ('functions.custom_fields.EnumField', [], {'default': "'photo'", 'values': "['photo', 'flat', 'logo', 'map', 'scheme teritory', 'diplom', 'preview', 'preview2']"}) + }, + u'note.note': { + 'Meta': {'object_name': 'Note'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounts.User']"}) + }, + u'organiser.organiser': { + 'Meta': {'unique_together': '()', 'object_name': 'Organiser', 'index_together': '()'}, + 'active': ('django.db.models.fields.NullBooleanField', [], {'default': '0', 'null': 'True', 'blank': 'True'}), + 'address': ('functions.custom_fields.LocationField', [], {'null': 'True', 'blank': 'True'}), + 'city': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['city.City']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Country']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'events_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'facebook': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'foundation': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'linkedin': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'place_conference': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'organiser_place_conference'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['place_conference.PlaceConference']"}), + 'place_exposition': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'organiser_place_exposition'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['place_exposition.PlaceExposition']"}), + 'rating': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'staff_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'tag': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Tag']", 'null': 'True', 'blank': 'True'}), + 'theme': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Theme']", 'null': 'True', 'blank': 'True'}), + 'twitter': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'url': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'}), + 'vk': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) + }, + u'photologue.gallery': { + 'Meta': {'ordering': "['-date_added']", 'unique_together': '()', 'object_name': 'Gallery', 'index_together': '()'}, + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'photos': ('sortedm2m.fields.SortedManyToManyField', [], {'blank': 'True', 'related_name': "'galleries'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['photologue.Photo']"}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '200'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}) + }, + u'photologue.photo': { + 'Meta': {'ordering': "['sort']", 'unique_together': '()', 'object_name': 'Photo', 'index_together': '()'}, + 'crop_from': ('django.db.models.fields.CharField', [], {'default': "'center'", 'max_length': '10', 'blank': 'True'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_related'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '200'}), + 'sort': ('django.db.models.fields.PositiveIntegerField', [], {'default': '10', 'null': 'True', 'db_index': 'True'}), + 'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), + 'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['photologue.UserMark']", 'null': 'True', 'symmetrical': 'False'}), + 'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) + }, + u'photologue.photoeffect': { + 'Meta': {'object_name': 'PhotoEffect'}, + 'background_color': ('django.db.models.fields.CharField', [], {'default': "'#FFFFFF'", 'max_length': '7'}), + 'brightness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'color': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'contrast': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'filters': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'reflection_size': ('django.db.models.fields.FloatField', [], {'default': '0'}), + 'reflection_strength': ('django.db.models.fields.FloatField', [], {'default': '0.6'}), + 'sharpness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + 'transpose_method': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}) + }, + u'photologue.usermark': { + 'Meta': {'object_name': 'UserMark'}, + 'height': ('django.db.models.fields.PositiveSmallIntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'left': ('django.db.models.fields.PositiveSmallIntegerField', [], {}), + 'top': ('django.db.models.fields.PositiveSmallIntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'marks'", 'to': u"orm['accounts.User']"}), + 'width': ('django.db.models.fields.PositiveSmallIntegerField', [], {}) + }, + u'place_conference.placeconference': { + 'Meta': {'unique_together': '()', 'object_name': 'PlaceConference', 'index_together': '()'}, + 'address': ('functions.custom_fields.LocationField', [], {}), + 'amount_halls': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'banquet_hall': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'catering': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'city': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'place_conferences'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), + 'conference_call': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Country']", 'on_delete': 'models.PROTECT'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'exp_hall_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'exposition_hall': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'foundation_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'hotel': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'multimedia_equipment': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'top': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Top']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'total_capacity': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'translate_equipment': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'type': ('functions.custom_fields.EnumField', [], {'default': "'Convention centre'", 'values': "['Convention centre', 'Exposition centre']"}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'video_link': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'views': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'virtual_tour': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'web_page': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'wifi': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}) + }, + u'place_exposition.placeexposition': { + 'Meta': {'ordering': "['-rating', 'id']", 'unique_together': '()', 'object_name': 'PlaceExposition', 'index_together': '()'}, + 'address': ('functions.custom_fields.LocationField', [], {}), + 'bank': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'business_centre': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'cafe': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'children_room': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'city': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'place_expositions'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), + 'closed_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'conference_centre': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Country']", 'on_delete': 'models.PROTECT'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'disabled_service': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'event_in_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'foundation_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}), + 'mobile_application': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'online_registration': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'open_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'parking': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'partner': ('django.db.models.fields.NullBooleanField', [], {'default': '0', 'null': 'True', 'blank': 'True'}), + 'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'photogallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'press_centre': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'rating': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'terminals': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'top': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Top']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'total_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'total_halls': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'total_pavilions': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'type': ('functions.custom_fields.EnumField', [], {'default': "'Exposition complex'", 'values': "['Exposition complex', 'Convention centre', 'Exposition centre']"}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), + 'views': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'virtual_tour': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'web_page': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), + 'wifi': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}) + }, + u'sites.site': { + 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"}, + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'theme.tag': { + 'Meta': {'unique_together': '()', 'object_name': 'Tag', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), + 'theme': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'on_delete': 'models.PROTECT', 'to': u"orm['theme.Theme']"}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}) + }, + u'theme.theme': { + 'Meta': {'unique_together': '()', 'object_name': 'Theme', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'main_page_conf': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'main_page_expo': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), + 'types': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}) + }, + u'translator.translator': { + 'Meta': {'unique_together': '()', 'object_name': 'Translator', 'index_together': '()'}, + 'birth': ('django.db.models.fields.DateField', [], {}), + 'car': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'gender': ('functions.custom_fields.EnumField', [], {'default': "'male'", 'values': "('male', 'female')"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['exposition'] \ No newline at end of file diff --git a/apps/exposition/models.py b/apps/exposition/models.py index 3598fe7d..2b98962e 100644 --- a/apps/exposition/models.py +++ b/apps/exposition/models.py @@ -12,6 +12,7 @@ from django.db.models import Q from django.db.models.signals import post_save, pre_save from django.utils import translation from django.utils.translation import ugettext as _ +from events.models import TargetAudience from functions.custom_fields import EnumField from functions.db import db_table_exists from functions.model_mixin import EventMixin, ExpoMixin @@ -24,18 +25,6 @@ from organiser.models import Organiser from service.models import Service from events.common import MEMBERS, VISITORS, PRICE, PRICE_EUR - -AUDIENCE1 = ((None,_(u'Не выбрано')), - ('experts', _(u'Специалисты')), - ('experts and consumers', _(u'Специалисты и потребители')), - ('general public', _(u'Широкая публика')) - ) -AUDIENCE = (None,'experts', 'experts and consumers', 'general public') - - -BIT_AUDIENCE = settings.BIT_AUDIENCE - - CURRENCY = settings.CURRENCY # check if table exist and create flags if true @@ -136,7 +125,7 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin): #about periodic = models.FloatField(verbose_name=_(u'Переодичность'), blank=True, null=True) - audience = BitField(flags=[k for k, v in BIT_AUDIENCE]) + audience = models.ManyToManyField(TargetAudience, null=True) web_page = models.CharField(verbose_name=_(u'Вебсайт'), max_length=255, blank=True) foundation_year = models.PositiveIntegerField(verbose_name=_(u'Год основания'), blank=True, null=True) area = models.PositiveIntegerField(verbose_name=_(u'Площадь'), blank=True, null=True) @@ -240,16 +229,6 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin): def statistic_exists(self): return Statistic.objects.filter(exposition=self).exists() - def get_audience(self): - checked = [item for item, bool in self.audience if bool==True] - audience = [] - for k, v in BIT_AUDIENCE: - for item in checked: - if item == k: - audience.append(unicode(v)) - - return ', '.join(audience) - def get_periodic(self): periodic = {0: '', 1.0: _(u'Ежегодно'), 2.0: _(u'2 раза в год'), 3.0: _(u'3 раза в год'), 4.0: _(u'4 раза в год'), 5.0: _(u'5 раз в год'), 0.5: _(u'Раз в 2 года'), diff --git a/apps/import_xls/utils.py b/apps/import_xls/utils.py index 86782f6c..049451a5 100644 --- a/apps/import_xls/utils.py +++ b/apps/import_xls/utils.py @@ -13,7 +13,6 @@ from country.models import Country from city.models import City from theme.models import Theme, Tag from functions.files import get_alternative_filename -from exposition.models import BIT_AUDIENCE from accounts.models import User from django.utils.translation import ugettext as _ diff --git a/static/custom_js/main.js b/static/custom_js/main.js index 1d1d6b80..a5e4ab1b 100644 --- a/static/custom_js/main.js +++ b/static/custom_js/main.js @@ -235,7 +235,7 @@ $(document).ready(function(){ return false; }); // end on-of events - if( $("#id_city" ).length && $("#id_city" ).is('select') ) { + if( $("#id_city" ).length ) { $('#id_city').select2({ placeholder: "Город", width: 'element', @@ -491,16 +491,16 @@ $(document).ready(function(){ }); }); - /* FIXME: Проверить все select2 */ - // if($('select').length){ - // try{ - // $('select').select2({ - // width: 'element', - // allowClear: true - // - // }); - // } catch (e){} - // } + /* FIXME: Проверить инициализацию всех select2 */ + if($('select').length){ + try{ + $('select').select2({ + width: 'element', + allowClear: true + + }); + } catch (e){} + } From 88184cfb2d718c8e35e2aedbd1c4879b4c7cc524 Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Thu, 2 Feb 2017 10:33:24 +0200 Subject: [PATCH 03/17] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20=D1=88=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/c_admin/proj/settings.html | 31 ---------------------------- 1 file changed, 31 deletions(-) delete mode 100644 templates/c_admin/proj/settings.html diff --git a/templates/c_admin/proj/settings.html b/templates/c_admin/proj/settings.html deleted file mode 100644 index 33728aec..00000000 --- a/templates/c_admin/proj/settings.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends 'base.html' %} -{% load static %} - -{% block body %} - -
{% csrf_token %} -
- Настройки -
-
-

Основные настройки

-
-
- {# key #} - {% with field='hall_capacity_tmpl' form=form languages=languages %} - {% include 'c_admin/forms/multilang.html' %} - {% endwith %} -
-
- - -
- - -
- -
-
- - -{% endblock %} From 39c115a3a0b13a8141542bdce782448dfdac0b57 Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Thu, 2 Feb 2017 12:52:56 +0200 Subject: [PATCH 04/17] =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=BE=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=83=20=D0=BC=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/place_conference/models.py | 5 +- apps/place_exposition/models.py | 5 +- apps/place_exposition/views.py | 21 ++-- templates/client/includes/meta.html | 2 +- .../client/includes/place/place_list.html | 101 +++++++++--------- templates/client/place/place_detail.html | 2 +- 6 files changed, 69 insertions(+), 67 deletions(-) diff --git a/apps/place_conference/models.py b/apps/place_conference/models.py index 532c2461..1ebb4ee4 100644 --- a/apps/place_conference/models.py +++ b/apps/place_conference/models.py @@ -2,6 +2,7 @@ from django.db import models from django.contrib.contenttypes import generic from django.db.models.signals import post_save, pre_save +from django.utils import timezone from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from functions.custom_fields import EnumField from functions.custom_fields import LocationField @@ -107,8 +108,8 @@ class PlaceConference(TranslatableModel, ExpoMixin): return '/places' def get_events_number(self): - exp = Conference.objects.filter(place=self) - return len(exp) + return Conference.objects.filter(place=self, + data_begin__gt=timezone.now()).count() def events(self): events = Conference.objects.filter(place=self)[:6] diff --git a/apps/place_exposition/models.py b/apps/place_exposition/models.py index 24f3a533..9632908c 100644 --- a/apps/place_exposition/models.py +++ b/apps/place_exposition/models.py @@ -4,6 +4,7 @@ from django.db.models import Q from django.contrib.contenttypes import generic from django.db.models.signals import post_save, pre_save from django.utils.translation import ugettext as _ +from django.utils import timezone from functools import partial from django.conf import settings from django.core.urlresolvers import reverse @@ -255,8 +256,8 @@ class PlaceExposition(TranslatableModel, ExpoMixin): return duplicate def get_events_number(self): - exp = Exposition.objects.filter(place=self) - return len(exp) + return Exposition.objects.filter(place=self, + data_begin__gt=timezone.now()).count() class Hall(TranslatableModel): diff --git a/apps/place_exposition/views.py b/apps/place_exposition/views.py index 286c3262..fae2ac85 100644 --- a/apps/place_exposition/views.py +++ b/apps/place_exposition/views.py @@ -10,11 +10,12 @@ from django.template import RequestContext from django.utils import translation from django.utils.translation import ugettext as _ from django.views.generic import DetailView, FormView +from django.utils import timezone from functions.cache_mixin import CacheMixin, JitterCacheMixin from functions.custom_views import ListView from meta.views import MetadataMixin from place_conference.models import PlaceConference - +from exposition.models import Exposition from .models import PlaceExposition @@ -131,15 +132,12 @@ class PlaceList(JitterCacheMixin, MetadataMixin, ListView): paginate_by = settings.CLIENT_PAGINATION template_name = 'client/place/place_list.html' - def get_queryset(self): - #qs = super(PlaceList, self).get_queryset().order_by('-rating') - qs= PlaceExposition.objects.language().select_related('country', 'city').all().order_by('-rating') - conf_qs = PlaceConference.objects.language().all() + qs = PlaceExposition.objects.language().select_related('country', 'city').order_by('-rating') + conf_qs = PlaceConference.objects.language().select_related('country', 'city') return list(qs)+list(conf_qs) - class PlaceCatalogBy(JitterCacheMixin, MetadataMixin, ListView): cache_range = [60*30, 60*60] template_name = 'client/place/catalog_by.html' @@ -232,20 +230,27 @@ class PlaceCityCatalog(PlaceCatalog): return context -class PlaceExpositionListView(ListView): +class PlaceExpositionListView(MetadataMixin, JitterCacheMixin, ListView): """ Представление перечня событий относительно места. Переход на эту страницу происходит со страницы подробного просмотра места, по ссылке "Все события" """ template_name = 'client/place/place_exposition_list.html' + cache_range = settings.CACHE_RANGE def get_object(self): slug = self.kwargs.get('slug') return get_object_or_404(PlaceExposition, url=slug) def get_queryset(self): - return self.get_object().exposition_place.all() + return Exposition.objects.filter( + place=self.get_object(), data_begin__gte=timezone.now() + ).select_related( + 'country', 'city' + ).prefetch_related( + 'tag' + ) def get_context_data(self, **kwargs): ctx = super(PlaceExpositionListView, self).get_context_data(**kwargs) diff --git a/templates/client/includes/meta.html b/templates/client/includes/meta.html index cfcbc5f7..aca926aa 100644 --- a/templates/client/includes/meta.html +++ b/templates/client/includes/meta.html @@ -32,6 +32,6 @@ {% else %} {% block title_head %}{% trans 'Expomap — выставки, конференции, семинары' %}{% endblock %} - + {% endif %} diff --git a/templates/client/includes/place/place_list.html b/templates/client/includes/place/place_list.html index 11a5ed46..4e5a3eff 100644 --- a/templates/client/includes/place/place_list.html +++ b/templates/client/includes/place/place_list.html @@ -1,61 +1,56 @@ -{% load static %} -{% load i18n %} +{% load static i18n %} -{% with objects=object_list %} - {% include 'client/includes/banners/tops.html' %} - -{% endwith %} + {% if forloop.counter == 10 %} + {% include 'client/includes/banners/catalog_inner.html' %} + {%endif %} + {% endfor %} + diff --git a/templates/client/place/place_detail.html b/templates/client/place/place_detail.html index 0b06f805..c82a8a2d 100644 --- a/templates/client/place/place_detail.html +++ b/templates/client/place/place_detail.html @@ -114,7 +114,7 @@ {% endif %} - {# TODO: request optization #} + {# TODO: request optimization #} {% if object.halls.count %}
From c39c639d3a0e521e6ea7ba5e64d494f68b4fb18a Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Thu, 2 Feb 2017 13:19:12 +0200 Subject: [PATCH 05/17] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=BF=D1=80=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B5=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B5=D0=BA=D1=82=20=D1=80=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D1=8B=D0=BB=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- apps/accounts/models.py | 1 + apps/accounts/urls.py | 2 +- apps/accounts/views.py | 12 +++++------- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index f622132d..772dc2a0 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,7 @@ compilemessages: -@ipython manage.py compilemessages collectstatic: - @ipython manage.py collectstatic --noinput + @ipython manage.py collectstatic user: -@ipython manage.py createsuperuser diff --git a/apps/accounts/models.py b/apps/accounts/models.py index 983a98f5..0d806af6 100644 --- a/apps/accounts/models.py +++ b/apps/accounts/models.py @@ -11,6 +11,7 @@ from django.db.models.loading import get_model from django.db.models.signals import post_save from django.utils import timezone from django.utils.translation import ugettext as _ + from functions.form_check import translit_with_separator from functions.model_mixin import GetURLorPK diff --git a/apps/accounts/urls.py b/apps/accounts/urls.py index eeaf3696..c9842f55 100644 --- a/apps/accounts/urls.py +++ b/apps/accounts/urls.py @@ -21,7 +21,7 @@ from views import ( urlpatterns = patterns('', url(r'^profile/company/$', login_required(ProfileCompanyView.as_view())), - url(r'^profile/mailing/$', MailingSettings.as_view(), name='accounts-mailing_settings'), + url(r'^profile/mailing/$', login_required(MailingSettings.as_view()), name='accounts-mailing_settings'), # url(r'^profile/mailing/unsubscribe/$', MailingSettingsUnsubscribe.as_view(), name='accounts-mailing_settings_unsubscribe'), url(r'^profile/settings/$', login_required(SettingsView.as_view()), name='accounts_settings'), url(r'^profile/calendar/remove/$', 'accounts.views.remove_from_calendar'), diff --git a/apps/accounts/views.py b/apps/accounts/views.py index 65622297..56bb701b 100644 --- a/apps/accounts/views.py +++ b/apps/accounts/views.py @@ -135,13 +135,11 @@ class MailingSettings(GetUserMixin, ContextMixin, AjaxableResponseMixin, CreateU 'checked_th': list(instance.themes.values_list('pk', flat=True)), 'contact': instance, }) - elif not self.request.user.is_authenticated(): - raise HttpResponseForbidden() - if self.request.GET.get('unsibscribe') and instance.subscriber: - instance.unsubscribe() - self.extra_ctx.update({'unsubscribe_success': True}) - elif not instance.subscriber: - self.extra_ctx.update({'unsubscribed': True}) + if self.request.GET.get('unsibscribe') and instance.subscriber: + instance.unsubscribe() + self.extra_ctx.update({'unsubscribe_success': True}) + elif not instance.subscriber: + self.extra_ctx.update({'unsubscribed': True}) return instance def form_valid(self, form): From ef3162786a5cb11a22b4e4e0105529be46140788 Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Thu, 2 Feb 2017 15:49:00 +0200 Subject: [PATCH 06/17] =?UTF-8?q?=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BB=20accounts=20=D0=BE=D1=82=20=D0=BB=D0=B8=D1=88=D0=BD?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/accounts/admin.py | 50 ------------------------------------- apps/accounts/admin_urls.py | 2 +- apps/accounts/forms.py | 45 --------------------------------- apps/accounts/models.py | 16 ------------ apps/accounts/urls.py | 2 -- apps/accounts/views.py | 14 +---------- proj/admin.py | 3 +-- proj/decorators.py | 16 ------------ proj/middleware.py | 5 ---- proj/views.py | 6 ----- 10 files changed, 3 insertions(+), 156 deletions(-) delete mode 100644 proj/decorators.py diff --git a/apps/accounts/admin.py b/apps/accounts/admin.py index da600922..0c3e3456 100644 --- a/apps/accounts/admin.py +++ b/apps/accounts/admin.py @@ -20,8 +20,6 @@ from django.views.generic import DeleteView, TemplateView, UpdateView from django.views.generic.dates import DateMixin, MonthMixin, YearMixin from forms import ( ChangePasswordForm, - EmailAnnouncementForm, - UserCreationForm, UserFilterForm, UserForm ) @@ -55,13 +53,6 @@ class UserListView(AdminListView): return context -class EditUser(UpdateView): - model = User - form_class = UserForm - success_url = '/admin/accounts/all' - template_name = 'user_change.html' - - def user_change(request, url): """ Return form of user and post it on the server. @@ -116,47 +107,6 @@ def user_change(request, url): return render_to_response('user_change.html', context) -def create_admin(request): - if request.POST: - form = UserCreationForm(request.POST) - if form.is_valid(): - user = form.save(commit=False) - user.is_admin = False - user.save() - return HttpResponseRedirect('/admin/accounts/all') - - else: - form = UserCreationForm() - - args = {} - args.update(csrf(request)) - args['form'] = form - - return render_to_response('create_admin.html', args) - -def create_md5(request): - if request.POST: - form = UserCreationForm(request.POST) - if form.is_valid(): - user = User() - user.email = request.POST['email'] - user.first_name = request.POST['first_name'] - user.last_name = request.POST['last_name'] - user.password = md5(request.POST['password2']).hexdigest() - user.is_admin = True - user.save() - - return HttpResponseRedirect('/admin/accounts/all') - - else: - form = UserCreationForm() - - args = {} - args.update(csrf(request)) - args['form'] = form - - return render_to_response('create_admin.html', args) - def generatePassword(): """ diff --git a/apps/accounts/admin_urls.py b/apps/accounts/admin_urls.py index 6a381787..527d49ea 100644 --- a/apps/accounts/admin_urls.py +++ b/apps/accounts/admin_urls.py @@ -3,7 +3,7 @@ from django.conf.urls import patterns, url from django.core.urlresolvers import reverse_lazy from functions.custom_views import SimpleObjectChangeView -from .admin import AccountsStatistic, DeleteAccount, EditUser, UserListView +from .admin import AccountsStatistic, DeleteAccount, UserListView from .models import User attrs = { diff --git a/apps/accounts/forms.py b/apps/accounts/forms.py index 43cfa1a7..fe0575f6 100644 --- a/apps/accounts/forms.py +++ b/apps/accounts/forms.py @@ -29,43 +29,6 @@ def clean_relation_field(inst, field_name, model): return None -class UserCreationForm(forms.ModelForm): - password1 = forms.CharField(label=_(u'Пароль'), widget=forms.PasswordInput(render_value=False)) - password2 = forms.CharField(label=_(u'Повторите пароль'), widget=forms.PasswordInput(render_value=False)) - - class Meta: - model = User - fields = ('email', 'first_name', 'last_name') - - def clean_email(self): - """ - checking if user already exist - """ - email = self.cleaned_data.get('email') - try: - User.objects.get(email=email) - except User.DoesNotExist: - return email - raise forms.ValidationError(_(u'Пользователь с таким email уже существует')) - - def clean_password2(self): - password1 = self.cleaned_data.get('password1') - password2 = self.cleaned_data.get('password2') - - if password1 and password2 and password1 != password2: - raise forms.ValidationError(_(u'Пароли не совпадают')) - return password2 - - def save(self, commit=True): - user = super(UserCreationForm, self).save(commit=False) - user.set_password(self.cleaned_data['password2']) - - if commit: - user.save() - - return user - - class UserForm(forms.ModelForm): # email = forms.EmailField(widget=forms.TextInput(attrs={'disabled' : True}), required=False) country = forms.ChoiceField(label=_(u'Страна'), choices=[(item.id, item.name) for item in Country.objects.language().all()], @@ -196,14 +159,6 @@ class ChangePasswordForm(forms.Form): return data -class EmailAnnouncementForm(forms.Form): - data = [(1, _(u'Получать приглашения, сообщения и другую корреспонденцию от пользователей Expomap')), - (2, _(u'Получать обзор событий')), - (3, _(u'Получать новости'))] - announcement = forms.MultipleChoiceField(choices=data, widget=forms.CheckboxSelectMultiple()) - - - url_regex = re.compile('^\w*$') class RegistrationCompleteForm(forms.ModelForm): country = forms.ModelChoiceField(label=_(u'Страна'), queryset=Country.objects.all(), diff --git a/apps/accounts/models.py b/apps/accounts/models.py index 0d806af6..96b79a3a 100644 --- a/apps/accounts/models.py +++ b/apps/accounts/models.py @@ -141,16 +141,12 @@ class User(AbstractBaseUser, PermissionsMixin, GetURLorPK): log = UserLog.objects.filter(user_id=self.pk)[0] return log - def get_full_name(self): """ Returns the first_name plus the last_name, with a space in between. """ return u'%s %s'%(self.first_name, self.last_name) - def set_url(self, st): - self.url = translit_with_separator(u'%s'%st) - def __unicode__(self): return self.email @@ -167,9 +163,6 @@ class User(AbstractBaseUser, PermissionsMixin, GetURLorPK): def has_perm(self, perm, obj=None): return True - def has_module_perms(self, app_label): - return True - def get_expositions_number(self): # 1 query return self.exposition_users.all().count() @@ -182,15 +175,6 @@ class User(AbstractBaseUser, PermissionsMixin, GetURLorPK): # 1 query return self.seminar_users.all().count() - def get_webinars_number(self): - # 1 query - return self.webinar_users.all().count() - - def get_events_number(self): - # 4 query - n = self.get_expositions_number() + self.get_conferences_number() + self.get_seminars_number() + self.get_webinars_number() - return n - def get_permanent_url(self): if self.url: return '/%s/' % self.url diff --git a/apps/accounts/urls.py b/apps/accounts/urls.py index c9842f55..51a6a553 100644 --- a/apps/accounts/urls.py +++ b/apps/accounts/urls.py @@ -9,7 +9,6 @@ from views import ( Feed, HomeView, MailingSettings, - # MailingSettingsUnsubscribe, NameView, PhoneView, ProfileCompanyView, @@ -22,7 +21,6 @@ from views import ( urlpatterns = patterns('', url(r'^profile/company/$', login_required(ProfileCompanyView.as_view())), url(r'^profile/mailing/$', login_required(MailingSettings.as_view()), name='accounts-mailing_settings'), - # url(r'^profile/mailing/unsubscribe/$', MailingSettingsUnsubscribe.as_view(), name='accounts-mailing_settings_unsubscribe'), url(r'^profile/settings/$', login_required(SettingsView.as_view()), name='accounts_settings'), url(r'^profile/calendar/remove/$', 'accounts.views.remove_from_calendar'), url(r'^profile/calendar/export/$', 'core.views.download_workbook'), diff --git a/apps/accounts/views.py b/apps/accounts/views.py index 56bb701b..bb4b735c 100644 --- a/apps/accounts/views.py +++ b/apps/accounts/views.py @@ -29,7 +29,7 @@ from company.edit_forms import NameForm as CompNameForm, HomeForm as CompHomeFor from emencia.django.newsletter.forms import SubscribeSettingsForm, MailingSettingsForm from emencia.django.newsletter.models import Contact, ContactSettings -from .forms import ChangePasswordForm, EmailAnnouncementForm, FeedFilterForm +from .forms import ChangePasswordForm, FeedFilterForm from .models import User from .edit_forms import AvatarForm, NameForm, HomeForm, WorkForm, AboutCompanyForm, PhoneForm, EmailForm,\ WebPageForm, SocialForm, AboutForm @@ -155,18 +155,6 @@ class MailingSettings(GetUserMixin, ContextMixin, AjaxableResponseMixin, CreateU # print(self.request.POST) return super(MailingSettings, self).form_invalid(form) -# -# class MailingSettingsUnsubscribe(GetUserMixin, RedirectView): -# url = reverse_lazy('accounts-mailing_settings') -# -# def get(self, request, *args, **kwargs): -# contact = self.get_user() -# if contact is None: -# return HttpResponseForbidden() -# if contact.subscriber: -# contact.unsubscribe() -# return super(MailingSettingsUnsubscribe, self).get(request, *args, **kwargs) - class CalendarView(TemplateView): """ diff --git a/proj/admin.py b/proj/admin.py index 390ea1c1..2f83ba63 100644 --- a/proj/admin.py +++ b/proj/admin.py @@ -28,6 +28,7 @@ def ajax_city(request): objects = City.objects.language().filter(country=request.GET['id']).order_by('name') return render_to_response('select.html', {'objects': objects}) + def ajax_tag(request): """ @@ -127,14 +128,12 @@ def ajax_post_stat(request, obj_id=None): def ajax_delete_stat(request, id): redirect_to = request.META.get('HTTP_REFERER') - if id: try: Statistic.objects.get(id=id).delete() except Statistic.DoesNotExist: pass - return HttpResponseRedirect(redirect_to) diff --git a/proj/decorators.py b/proj/decorators.py deleted file mode 100644 index 149b9358..00000000 --- a/proj/decorators.py +++ /dev/null @@ -1,16 +0,0 @@ -from functools import wraps - -from django.template import RequestContext -from django.shortcuts import render_to_response - - -def render_to(tpl): - def decorator(func): - @wraps(func) - def wrapper(request, *args, **kwargs): - out = func(request, *args, **kwargs) - if isinstance(out, dict): - out = render_to_response(tpl, out, RequestContext(request)) - return out - return wrapper - return decorator \ No newline at end of file diff --git a/proj/middleware.py b/proj/middleware.py index 831abbac..cabfc7a0 100644 --- a/proj/middleware.py +++ b/proj/middleware.py @@ -52,8 +52,6 @@ class Referer(object): for key, val in data_exists.iteritems(): if val: if key == 'search': - print(request.session.get('search', [])) - print(request.session.get('search', []))[-2:] search = request.session.get('search', [])[-2:] search.append(val) request.session['search'] = search @@ -112,9 +110,6 @@ def check_places(slug): # https://gist.github.com/b1/3155460 -""" spaceless middleware -MIDDLEWARE_CLASSES += ('core_utils.middleware.SpacelessMiddleware',) -""" class SpacelessMiddleware(object): """ trim spaces between tags if not in DEBUG """ def process_response(self, request, response): diff --git a/proj/views.py b/proj/views.py index f1cb9667..709cad65 100644 --- a/proj/views.py +++ b/proj/views.py @@ -21,12 +21,6 @@ from emencia.django.newsletter.forms import SubscribeAssideForm from django.db.models.loading import get_model -def clear_slashes(str_): - if str_[0] == r'/': - str_ = str_[1:] - if str_[-1] == r'/': - str_ = str_[:-1] - return str_ def add_seo(request): url = request.path From fd6fbbb1bee2882e537ccecee0dbb5b19abbdaa9 Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Thu, 2 Feb 2017 17:25:24 +0200 Subject: [PATCH 07/17] =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=B0=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=20=D0=B2=D1=81=D0=B5=D1=85=20=D1=81=D0=BE=D0=B1=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B9=20=D0=BC=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/place_exposition/urls.py | 1 + apps/place_exposition/views.py | 7 +- apps/theme/admin.py | 3 - apps/theme/forms.py | 7 -- ...n_keywords__del_field_themetranslation_.py | 80 +++++++++++++++++++ apps/theme/models.py | 6 +- templates/c_admin/theme/theme_add.html | 12 --- 7 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 apps/theme/migrations/0002_auto__del_field_themetranslation_keywords__del_field_themetranslation_.py diff --git a/apps/place_exposition/urls.py b/apps/place_exposition/urls.py index 5ee78d27..e3fe1120 100644 --- a/apps/place_exposition/urls.py +++ b/apps/place_exposition/urls.py @@ -45,6 +45,7 @@ urlpatterns = patterns( url( r'^(?P.*)/expositions/$', PlaceExpositionListView.as_view(), + {'meta_id': 94}, name='place_exposition_list' ), url( diff --git a/apps/place_exposition/views.py b/apps/place_exposition/views.py index fae2ac85..d438c3c3 100644 --- a/apps/place_exposition/views.py +++ b/apps/place_exposition/views.py @@ -230,18 +230,19 @@ class PlaceCityCatalog(PlaceCatalog): return context -class PlaceExpositionListView(MetadataMixin, JitterCacheMixin, ListView): +class PlaceExpositionListView(MetadataMixin, ListView): """ Представление перечня событий относительно места. Переход на эту страницу происходит со страницы подробного просмотра места, по ссылке "Все события" """ template_name = 'client/place/place_exposition_list.html' - cache_range = settings.CACHE_RANGE + # cache_range = settings.CACHE_RANGE def get_object(self): slug = self.kwargs.get('slug') - return get_object_or_404(PlaceExposition, url=slug) + self.object = get_object_or_404(PlaceExposition, url=slug) + return self.object def get_queryset(self): return Exposition.objects.filter( diff --git a/apps/theme/admin.py b/apps/theme/admin.py index f8c4b1f1..68ab8378 100644 --- a/apps/theme/admin.py +++ b/apps/theme/admin.py @@ -95,9 +95,6 @@ def theme_change(request, theme_id=None): data['name_%s'%code] = obj.name data['description_%s'%code] = obj.description data['main_title_%s'%code] = obj.main_title - data['title_%s'%code] = obj.title - data['keywords_%s'%code] = obj.keywords - data['descriptions_%s'%code] = obj.descriptions diff --git a/apps/theme/forms.py b/apps/theme/forms.py index c71820ff..9026c466 100644 --- a/apps/theme/forms.py +++ b/apps/theme/forms.py @@ -30,13 +30,6 @@ class ThemeForm(forms.Form): self.fields['name_%s' % code] = forms.CharField(label=_(u'Название'), required=required) self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required) self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=False, widget=CKEditorWidget)#with saving form - #meta data - self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Description'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Keywords'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) def save(self, id=None): data = self.cleaned_data diff --git a/apps/theme/migrations/0002_auto__del_field_themetranslation_keywords__del_field_themetranslation_.py b/apps/theme/migrations/0002_auto__del_field_themetranslation_keywords__del_field_themetranslation_.py new file mode 100644 index 00000000..231b3205 --- /dev/null +++ b/apps/theme/migrations/0002_auto__del_field_themetranslation_keywords__del_field_themetranslation_.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting field 'ThemeTranslation.keywords' + db.delete_column(u'theme_theme_translation', 'keywords') + + # Deleting field 'ThemeTranslation.title' + db.delete_column(u'theme_theme_translation', 'title') + + # Deleting field 'ThemeTranslation.descriptions' + db.delete_column(u'theme_theme_translation', 'descriptions') + + + def backwards(self, orm): + # Adding field 'ThemeTranslation.keywords' + db.add_column(u'theme_theme_translation', 'keywords', + self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), + keep_default=False) + + # Adding field 'ThemeTranslation.title' + db.add_column(u'theme_theme_translation', 'title', + self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), + keep_default=False) + + # Adding field 'ThemeTranslation.descriptions' + db.add_column(u'theme_theme_translation', 'descriptions', + self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), + keep_default=False) + + + models = { + u'theme.tag': { + 'Meta': {'unique_together': '()', 'object_name': 'Tag', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), + 'theme': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'on_delete': 'models.PROTECT', 'to': u"orm['theme.Theme']"}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}) + }, + u'theme.tagtranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'TagTranslation', 'db_table': "u'theme_tag_translation'", 'index_together': '()'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'descriptions': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'keywords': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'main_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.Tag']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}) + }, + u'theme.theme': { + 'Meta': {'unique_together': '()', 'object_name': 'Theme', 'index_together': '()'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'main_page_conf': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'main_page_expo': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), + 'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), + 'types': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), + 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}) + }, + u'theme.themetranslation': { + 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ThemeTranslation', 'db_table': "u'theme_theme_translation'", 'index_together': '()'}, + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'main_title': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.Theme']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + } + } + + complete_apps = ['theme'] \ No newline at end of file diff --git a/apps/theme/models.py b/apps/theme/models.py index c5c2736e..3fc7725d 100644 --- a/apps/theme/models.py +++ b/apps/theme/models.py @@ -47,11 +47,7 @@ class Theme(TranslatableModel): translations = TranslatedFields( name = models.CharField(max_length=255), main_title = models.CharField(max_length=255), - description = models.TextField(blank=True), - #-----meta data - title = models.CharField(max_length=255, blank=True), - descriptions = models.CharField(max_length=255, blank=True), - keywords = models.CharField(max_length=255, blank=True), + description = models.TextField(blank=True) ) main_page_conf = models.PositiveIntegerField(default=0, db_index=True) diff --git a/templates/c_admin/theme/theme_add.html b/templates/c_admin/theme/theme_add.html index 73496583..cabcbcea 100644 --- a/templates/c_admin/theme/theme_add.html +++ b/templates/c_admin/theme/theme_add.html @@ -42,18 +42,6 @@ {% with field='description' form=form languages=languages %} {% include 'c_admin/forms/multilang.html' %} {% endwith %} - {# keywords #} - {% with field='keywords' form=form languages=languages %} - {% include 'c_admin/forms/multilang.html' %} - {% endwith %} - {# title #} - {% with field='title' form=form languages=languages %} - {% include 'c_admin/forms/multilang.html' %} - {% endwith %} - {# descriptions #} - {% with field='descriptions' form=form languages=languages %} - {% include 'c_admin/forms/multilang.html' %} - {% endwith %}
From da695bca1a4072941aa876f4609611b3b72202b7 Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Fri, 3 Feb 2017 11:18:58 +0200 Subject: [PATCH 08/17] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=87=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B2=D0=B8=D0=B3=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2?= =?UTF-8?q?=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=BA=D0=B5=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=81=D1=81=D1=8B=D0=BB=D0=BE=D0=BA=20=D0=B1=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/expobanner/admin.py | 7 +------ templates/c_admin/expobanner/link_list.html | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/apps/expobanner/admin.py b/apps/expobanner/admin.py index b7b2124d..33266cac 100644 --- a/apps/expobanner/admin.py +++ b/apps/expobanner/admin.py @@ -125,14 +125,9 @@ class BannerList(AbstractList): class LinkList(AbstractList): - model = Banner verbose = _(u'Список ссылок') template_name = 'c_admin/expobanner/link_list.html' - - def get_queryset(self): - qs = super(LinkList, self).get_queryset() - qs = qs.filter(link=True).order_by('-created_at') - return qs + queryset = Banner.objects.filter(link=True).order_by('-created_at') class CustomerList(AbstractList): diff --git a/templates/c_admin/expobanner/link_list.html b/templates/c_admin/expobanner/link_list.html index 4bef0ff9..58cab8ba 100644 --- a/templates/c_admin/expobanner/link_list.html +++ b/templates/c_admin/expobanner/link_list.html @@ -35,7 +35,7 @@ {% endblock %} {# pagination #} - {% include 'c_admin/includes/admin_pagination.html' with page_obj=object_list %} + {% include 'c_admin/includes/admin_pagination.html' %} {% trans "Назад к управлению баннерами" %} {% endblock %} From 5b1cd607231fd0c20a968487d3c5192788b645f9 Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Fri, 3 Feb 2017 11:56:34 +0200 Subject: [PATCH 09/17] =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=B0=20=D1=82=D0=B5?= =?UTF-8?q?=D0=B3=D0=B8=20=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D0=B8=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/c_admin/includes/admin_nav.html | 1 + templates/client/exposition/catalog_theme.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/c_admin/includes/admin_nav.html b/templates/c_admin/includes/admin_nav.html index 3ef8b43b..ab3f6355 100644 --- a/templates/c_admin/includes/admin_nav.html +++ b/templates/c_admin/includes/admin_nav.html @@ -52,6 +52,7 @@
  • {% trans 'Описание по умолчанию' %}
  • Мета
  • +
  • Список seo-текстов
  • Перевод
  • Редиректы
  • diff --git a/templates/client/exposition/catalog_theme.html b/templates/client/exposition/catalog_theme.html index 45277f6f..1dfdda66 100644 --- a/templates/client/exposition/catalog_theme.html +++ b/templates/client/exposition/catalog_theme.html @@ -56,7 +56,7 @@ {% block page_title %}
    -

    {% if meta %}{{ meta.h1 }}{% else %}{% trans 'Выставки' %}: {{ filter_object.name }}{% endif %}

    +

    {% if meta %}{{ meta.h1 }}{% elif seo_text %}{{ seo_text.title }}{% else %}{% trans 'Выставки' %}: {{ filter_object.name }}{% endif %}

    {% include 'includes/exposition/catalog_filter_period.html' %} From a41865f9edd209c1083fd7db4f74065b23fde1df Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Fri, 3 Feb 2017 12:02:53 +0200 Subject: [PATCH 10/17] =?UTF-8?q?=D0=BA=D1=80=D0=B0=D1=82=D0=BA=D0=BE?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BE=D1=81=D1=82=D0=B8=20=D0=B2=20=D0=B0?= =?UTF-8?q?=D0=B4=D0=BC=D0=B8=D0=BD=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/article/admin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/article/admin.py b/apps/article/admin.py index 18b67c93..9e36cce2 100644 --- a/apps/article/admin.py +++ b/apps/article/admin.py @@ -206,6 +206,7 @@ class BlogView(FormView): data['main_title_%s' % code] = obj.main_title data['preview_%s' % code] = obj.preview data['description_%s' % code] = obj.description + data['short_description_%s' % code] = obj.short_description data['title_%s' % code] = obj.title data['keywords_%s' % code] = obj.keywords data['descriptions_%s' % code] = obj.descriptions From e75c406714ec84375e072893ef4f99f107fb8bd7 Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Fri, 3 Feb 2017 12:34:20 +0200 Subject: [PATCH 11/17] =?UTF-8?q?=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BB=20article=20=D0=BE=D1=82=20=D0=BB=D0=B8=D1=88=D0=BD?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/article/admin.py | 113 +---------- apps/article/forms.py | 171 ---------------- apps/article/models.py | 55 ------ templates/c_admin/article/article_add.html | 186 ------------------ templates/c_admin/article/article_all.html | 69 ------- .../article/article_confirm_delete.html | 2 +- templates/c_admin/article/blog_form.html | 93 ++++++--- 7 files changed, 65 insertions(+), 624 deletions(-) delete mode 100644 templates/c_admin/article/article_add.html delete mode 100644 templates/c_admin/article/article_all.html diff --git a/apps/article/admin.py b/apps/article/admin.py index 9e36cce2..d944a620 100644 --- a/apps/article/admin.py +++ b/apps/article/admin.py @@ -14,7 +14,7 @@ from ckeditor.widgets import CKEditorWidget from sorl.thumbnail.admin.current import AdminImageWidget #models and forms -from .forms import ArticleForm, ArticleDeleteForm, NewsForm +from .forms import NewsForm from .models import Article, Author from theme.models import Tag @@ -48,101 +48,6 @@ class ArticleDeleteView(DeleteView): return "/admin/article/%s/all/" % type -def article_all(request): - """ - Return list of all articles with pagination - """ - return objects_list(request, Article, 'article_all.html') - -@login_required -def article_copy(request, url): - - article = Article.objects.safe_get(slug=url) - if not article: - return HttpResponseRedirect(get_referer(request)) - else: - article.clone() - return HttpResponseRedirect(get_referer(request)) - - -def article_add(request): - """ - Return form of article and post it on the server. - - If form is posted redirect on the page of all articles. - """ - #get organiser from current user - init_data = {'author':request.user.organiser} - #choices field which will be filled by ajax - choices = {'tag': Tag} - return add_object_with_file(request, ArticleForm, 'article_add.html', '/admin/article/all', - choices, init_data) - - -def article_delete(request, url): - return delete_object(request, Article, ArticleDeleteForm, url, '/admin/article/all') - - -@login_required -def article_change(request, url): - """ - Return form and fill it with existing Article object data. - - If form is posted redirect on the page of all articles. - """ - try: - #check if article_id exists else redirect to the list of cities - article = Article.objects.get(slug=url) - file_form = FileModelForm(initial={'model': 'article.Article'}) - article_id = getattr(article, 'id') - except: - return HttpResponseRedirect('/admin/article/all') - - if request.POST: - form = ArticleForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - - if form.is_valid(): - form.save(getattr(article, 'id')) - return HttpResponseRedirect('/admin/article/all') - else: - data = {} - #fill form with data from database - data['author'] = article.author - data['theme'] = [item.id for item in article.theme.all()] - data['tag'] = [item.id for item in article.tag.all()] - #hidden field - data['article_id'] = article_id - - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields - data['main_title_%s' % code] = obj.main_title - data['preview_%s' % code] = obj.preview - data['description_%s' % code] = obj.description - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #fill form - form = ArticleForm(initial=data) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - args['file_form'] = file_form - - #get list of files which connected with specific model object - args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(article), object_id=getattr(article, 'id')) - args['obj_id'] = getattr(article, 'id') - - - return render_to_response('article_add.html', args) - #----------------------- from django.views.generic import FormView from functions.custom_views import ListView @@ -231,7 +136,7 @@ class BlogView(FormView): class NewsList(ListView): model = Article - template_name = 'article/article_admin_list.html' + template_name = 'c_admin/article/article_admin_list.html' paginate_by = 20 def get_queryset(self): @@ -248,17 +153,3 @@ class NewsView(BlogView): template_name = 'c_admin/article/blog_form.html' success_url = '/admin/article/news/all/' obj = None - - - - -""" -from django.views.generic import CreateView -from models import Blog -from forms import BlogForm - -class BlogCreate(CreateView): - model = Blog - form_class = BlogForm - template_name = 'c_admin/blog/blog_add.html' -""" diff --git a/apps/article/forms.py b/apps/article/forms.py index fc319bc2..1575e005 100644 --- a/apps/article/forms.py +++ b/apps/article/forms.py @@ -97,26 +97,6 @@ class _BlogForm(forms.Form): return [] -class BlogForm(_BlogForm): - author = forms.ModelChoiceField(label=_(u'Автор'), queryset=Author.objects.all()) - draft = forms.BooleanField(label=_(u'Черновик'), required=False, localize=True) - - def __init__(self, *args, **kwargs): - super(BlogForm, self).__init__(*args, **kwargs) - if len(settings.LANGUAGES) in range(10): - for lid, (code, name) in enumerate(settings.LANGUAGES): - # required = True if lid == 0 else False - self.fields['short_description_%s' % code] = forms.CharField(label=_(u'Краткое содержание'), required=False, widget=CKEditorWidget) - - def save(self, author, article=None, commit=True): - article = super(BlogForm, self).save(author, article=article, commit=False) - article.draft = self.cleaned_data['draft'] - article.author_s = self.cleaned_data['author'] - article.save() - return article - - - class NewsForm(_BlogForm): type = Article.news exposition = forms.CharField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False) @@ -154,157 +134,6 @@ class NewsForm(_BlogForm): return None -class ArticleForm(forms.Form): - """ - Create Article form for creating conference - - __init__ uses for dynamic creates fields - - save function saves data in Article object. If it doesnt exist create new object - """ - #users that have organiser profile - author = forms.ModelChoiceField(label=_(u'Автор'),queryset=User.objects.exclude(organiser__isnull=True)) - - key = forms.CharField(required=False, widget=forms.HiddenInput()) - theme = forms.ModelMultipleChoiceField(label=_(u'Тематики'), queryset=Theme.objects.all()) - #creates select input with empty choices cause it will be filled with ajax - tag = forms.MultipleChoiceField(label=_(u'Теги'), required=False) - - article_id = forms.CharField(required=False, widget=forms.HiddenInput()) - - def __init__(self, *args, **kwargs): - """ - create dynamical translated fields fields - """ - super(ArticleForm, self).__init__(*args, **kwargs) - #creates translated forms example: name_ru, name_en - # len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs - if len(settings.LANGUAGES) in range(10): - for lid, (code, name) in enumerate(settings.LANGUAGES): - # uses enumerate for detect iteration number - # first iteration is a default lang so it required fields - required = True if lid == 0 else False - self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required) - self.fields['preview_%s' % code] = forms.CharField(label=_(u'Превью'), required=required, widget=CKEditorWidget) - self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=required, widget=CKEditorWidget) - #meta data - self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Дескрипшен'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Кейвордс'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - - def save(self, id=None): - """ - change Article object with id = id - N/A add new Article object - usage: form.save(obj) - if change article - form.save() - if add article - """ - data = self.cleaned_data - #create new Article object or get exists - if not id: - article = Article() - else: - article = Article.objects.get(id=id) - #clear manytomany relations - article.theme.clear() - article.tag.clear() - - - if data.get('author'): - article.user = User.objects.get(id=data['author'].id)#.id cause select uses queryset - - #create slug field from russian language - if not getattr(article, 'slug'): - article.slug = translit_with_separator(data['main_title_ru'].strip()).lower() - - # fill translated fields and save object - fill_with_signal(Article, article, data) - # fill manytomany fields - for item in data['theme']: - article.theme.add(item.id)#.id cause select uses queryset - - for item in data['tag']: - article.tag.add(item) - - article.save() - - #save files - check_tmp_files(article, data['key']) - - - def clean(self): - id = self.cleaned_data.get('article_id') - main_title_ru = self.cleaned_data.get('main_title_ru') - - article = Article.objects.filter(url=translit_with_separator(main_title_ru)) - if article and str(article[0].id) != id: - msg = _(u'Статья с таким названием уже существует') - self._errors['main_title_ru'] = ErrorList([msg]) - del self.cleaned_data['main_title_ru'] - - return self.cleaned_data - - -class ArticleDeleteForm(forms.ModelForm): - url = forms.CharField(widget=forms.HiddenInput()) - - class Meta: - model = Article - fields = ('url',) - -#---------------------------------- -""" -from models import Blog - -class BlogForm(forms.ModelForm): - class Meta: - model = Blog - exclude = ('created', 'modified', 'creator', 'theme', 'tag') - - def __init__(self, *args, **kwargs): - super(BlogForm, self).__init__(*args, **kwargs) - - - if len(settings.LANGUAGES) in range(10): - for lid, (code, name) in enumerate(settings.LANGUAGES): - # uses enumerate for detect iteration number - # first iteration is a default lang so it required fields - required = True if lid == 0 else False - self.fields['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required) - self.fields['preview_%s' % code] = forms.CharField(label='Превью', required=required, widget=CKEditorWidget) - self.fields['description_%s' % code] = forms.CharField(label='Описание', required=required, widget=CKEditorWidget) - #meta data - self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) -""" - - - -class ArticleFilterForm(forms.Form): - theme = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, - choices=[(item.id, item.name) for item in Theme.objects.language().distinct()]) - tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) - - ''' - - def __init__(self, *args, **kwargs): - """ - create dynamical translated fields fields - """ - super(ArticleFilterForm, self).__init__(*args, **kwargs) - ids = [item['theme_id'] for item in list(Article.objects.blogs().values('theme_id').distinct())] - self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, - choices=[(item.id, item.name) for item in Theme.objects.language().filter(id__in=ids)]) - ''' - - class BlogFilterForm(forms.Form): tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) diff --git a/apps/article/models.py b/apps/article/models.py index 36f5ccd9..3d21ea1c 100644 --- a/apps/article/models.py +++ b/apps/article/models.py @@ -107,21 +107,6 @@ class Article(TranslatableModel): def __unicode__(self): return self.lazy_translation_getter('main_title', self.pk) - def translation_model(self): - return self._meta.translations_model - - def publish(self): - """ - set publish date. uses when publish date is none - """ - self.in_sitemap = True - if not self.publish_date: - # save time only first time - self.publish_date = now() - self.save() - - return self - def get_event(self): """ get event connected to article @@ -137,17 +122,8 @@ class Article(TranslatableModel): # If no slug is provided, generates one before saving. if not self.slug: self.slug = self.generate_unique_slug() - # Set the description field on save. - # if self.gen_description: - # self.description = strip_tags(self.description_from_content()) super(Article, self).save(*args, **kwargs) - def description_from_content(self): - """ - """ - # place for logic - return '' - def generate_unique_slug(self): """ Create a unique slug by passing the result of get_slug() to @@ -173,37 +149,6 @@ class Article(TranslatableModel): """ return u'%s' % self.lazy_translation_getter('main_title', self.pk) - def _get_next_or_previous_by_publish_date(self, is_next, **kwargs): - """ - Retrieves next or previous object by publish date. We implement - our own version instead of Django's so we can hook into the - published manager and concrete subclasses. - """ - arg = "publish_date__gt" if is_next else "publish_date__lt" - order = "publish_date" if is_next else "-publish_date" - lookup = {arg: self.publish_date} - concrete_model = base_concrete_model(Article, self) - try: - queryset = concrete_model.objects.published - except AttributeError: - queryset = concrete_model.objects.all - try: - return queryset(**kwargs).filter(**lookup).order_by(order)[0] - except IndexError: - pass - - def get_next_by_publish_date(self, **kwargs): - """ - Retrieves next object by publish date. - """ - return self._get_next_or_previous_by_publish_date(True, **kwargs) - - def get_previous_by_publish_date(self, **kwargs): - """ - Retrieves previous object by publish date. - """ - return self._get_next_or_previous_by_publish_date(False, **kwargs) - def admin_url(self): """ returns url for admin pages diff --git a/templates/c_admin/article/article_add.html b/templates/c_admin/article/article_add.html deleted file mode 100644 index 5589009b..00000000 --- a/templates/c_admin/article/article_add.html +++ /dev/null @@ -1,186 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{# Displays article form #} - - {% block scripts %} - - - {# selects #} - - - {# ajax #} - - - - {% endblock %} - -{% block body %} - -{# Uses multilang.html template for translated fields #} -
    {% csrf_token %} -
    - {% if obj_id %} Изменить {% else %} Добавить {% endif %}статью - -
    -
    -

    Основная информация

    -
    -
    - {# Hidden input uses for comparing with TmpFile objects #} - {{ form.key }} - {# Hidden input uses in clean method for checking url #} - {{ form.article_id }} - - {# main_title #} - - {% include 'c_admin/forms/multilang.html' with field='main_title' form=form languages=languages %} - {# theme #} -
    - -
    - {{ form.theme }} - {{ form.theme.errors }} -
    -
    - {# tag #} -
    - -
    - {{ form.tag }} - {{ form.tag.errors }} -
    -
    - {# preview #} - - {% include 'c_admin/forms/multilang.html' with field='preview' form=form languages=languages %} - - {# author #} -
    - -
    - {{ form.author }} - {{ form.author.errors }} -
    -
    - {# description #} - {% include 'c_admin/forms/multilang.html' with field='description' form=form languages=languages %} - {# keywords #} - - {% include 'c_admin/forms/multilang.html' with field='keywords' form=form languages=languages %} - - {# title #} - - {% include 'c_admin/forms/multilang.html' with field='title' form=form languages=languages %} - - {# descriptions #} - - {% include 'c_admin/forms/multilang.html' with field='descriptions' form=form languages=languages %} - -
    - -
    -
    -
    -

    Файлы

    -
    -
    - {# button that shows modal window with file form #} - Добавить файл - {# this div shows list of files and refreshes when new file added #} -
    - - - - - - - - - - - - - {% for file in files %} - - - - - - - - - - {% endfor %} - -
    idФайлИмяНазначение
    {{ file.id }}{{ file.file_name }}{{ file.purpose }} - -
    -
    - -
    -
    - -
    - - - -
    - -
    -
    - - -{# modal window #} - - -{% endblock %} diff --git a/templates/c_admin/article/article_all.html b/templates/c_admin/article/article_all.html deleted file mode 100644 index bc901b9b..00000000 --- a/templates/c_admin/article/article_all.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends 'base.html' %} -{% block body %} -{% comment %} -Displays lists of all articles in the table - and creating buttons which can change each article -{% endcomment %} - -
    -
    -

    Список статей

    -
    -
    - - - - - - - - - - - - {% for item in objects %} - - - - - - - - - - - {% endfor %} - -
    ЗаголовокАвтор 
    {{ item.main_title }}{% ifnotequal item.user None %}{{ item.user }} {% endifnotequal %} - - Изменить - - - - Копировать - - - - Удалить - -
    - Добавить статью -
    - - -
    - -{% endblock %} \ No newline at end of file diff --git a/templates/c_admin/article/article_confirm_delete.html b/templates/c_admin/article/article_confirm_delete.html index ac15985c..00dba2dd 100644 --- a/templates/c_admin/article/article_confirm_delete.html +++ b/templates/c_admin/article/article_confirm_delete.html @@ -8,4 +8,4 @@ Нет -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/c_admin/article/blog_form.html b/templates/c_admin/article/blog_form.html index e1c2366c..d1630cfe 100644 --- a/templates/c_admin/article/blog_form.html +++ b/templates/c_admin/article/blog_form.html @@ -1,34 +1,35 @@ {% extends 'base.html' %} -{% load static i18n %} - -{% block scripts %} - - {# selects #} - - - {# ajax #} - - - - - - - - - - - - -{% endblock %} +{% load static %} +{% load i18n %} +{# Displays article form #} + + {% block scripts %} + + + {# selects #} + + + + {# ajax #} + + + + + + + + + {% endblock %} {% block body %} {{ form.errors }} @@ -132,9 +133,38 @@ +
    +
    +

    {% trans "Файлы" %}

    +
    +
    + {% if article %} + {# button that shows modal window with file form #} + {% trans "Добавить файл" %} + {% else %} +

    {% trans "Файлы можно добавлять только после введения основных данных" %}

    + {% endif %} + {# this div shows list of files and refreshes when new file added #} +
    + - {% include 'c_admin/includes/filegallery.html' with object=article model='article.Article' %} + + + + + + + + + + + {% include 'file_list.html' with files=files %} + +
    {% trans "id" %}{% trans "Файл" %}{% trans "Имя" %}{% trans "Назначение" %}
    +
    +
    +
    {% if form.draft %}
    @@ -154,6 +184,7 @@ +{% include 'c_admin/includes/file_form.html' with file_form=file_form object=article %} {% endblock %} From a6540aded2e53ffc1898b4d753d6cffc86f1332f Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Fri, 3 Feb 2017 12:39:25 +0200 Subject: [PATCH 12/17] =?UTF-8?q?=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BB=20city=20=D0=BE=D1=82=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/city/admin.py | 8 +- apps/city/urls.py | 3 - apps/city/views.py | 11 +-- templates/client/city/city.html | 150 -------------------------------- 4 files changed, 2 insertions(+), 170 deletions(-) delete mode 100644 templates/client/city/city.html diff --git a/apps/city/admin.py b/apps/city/admin.py index 34a05fc7..fc5edef7 100644 --- a/apps/city/admin.py +++ b/apps/city/admin.py @@ -21,13 +21,6 @@ from functions.admin_views import AdminListView from functions.http import JsonResponse -def city_all(request): - """ - return list of all cities with pagination - """ - return objects_list(request, City, 'city_all.html') - - def city_add(request): """ Return form of city and post it on the server. @@ -35,6 +28,7 @@ def city_add(request): """ return add_object_with_file(request, CityForm, 'city_add.html', '/admin/city/all') + def city_delete(request, url): return delete_object(request, City, CityDeleteForm, url, '/admin/city/all/') diff --git a/apps/city/urls.py b/apps/city/urls.py index 2496e422..12aa719d 100644 --- a/apps/city/urls.py +++ b/apps/city/urls.py @@ -1,9 +1,6 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, url -from views import CityView urlpatterns = patterns('', url(r'get-city/', 'city.views.get_city'), - # commented for good times - #url(r'(?P.*)', CityView.as_view()), ) diff --git a/apps/city/views.py b/apps/city/views.py index 0cf49417..9143c18c 100644 --- a/apps/city/views.py +++ b/apps/city/views.py @@ -7,15 +7,6 @@ from models import City from settings.views import get_by_lang -class CityView(DetailView): - """ - this view is not used yet - """ - model = City - slug_field = 'url' - template_name = 'client/city/city.html' - - def get_city(request): """ returns filtered cities in current language in json format @@ -39,4 +30,4 @@ def get_city(request): return HttpResponse(json.dumps(result, indent=4), content_type='application/json') else: - return HttpResponse('not ajax') \ No newline at end of file + return HttpResponse('not ajax') diff --git a/templates/client/city/city.html b/templates/client/city/city.html deleted file mode 100644 index ca5797a7..00000000 --- a/templates/client/city/city.html +++ /dev/null @@ -1,150 +0,0 @@ -{% extends 'base_catalog.html' %} -{% load static %} -{% load i18n %} - -{% block bread_scrumbs %} - -{% endblock %} - -{% block page_title %} -{% endblock %} - -{% if object.get_events %} - {% block head_scripts %} - {% include "client/includes/banners/tops_head_js.html" %} - {% endblock head_scripts %} -{% endif %} - -{% block content_list %} -
    -
    - - -
    -
    -

    {{ object.name }}

    -
    - - - - - -
    -
      - {% if object.population %} -
    • {% trans 'Население' %}:{{ object.population }} {% trans 'человек' %}
    • - {% endif %} - - {% if object.code_IATA %} -
    • Код IATA:{{ object.code_IATA.code }}
    • - {% endif %} - - {% if object.phone_code %} -
    • {% trans 'Телефонный код' %}:+{{ object.phone_code }}
    • - {% endif %} - {% if object.transport %} -
    • {% trans 'Транспорт' %}:{{ object.transport }}
    • - {% endif %} -
    -
    - - - -
    -
    - - {% if object.famous_places %} - - - - - {% endif %} - {% if object.shoping %} - - - - - {% endif %} -
    {% trans 'Должны посетить' %}: - {{ object.famous_places }} -
    {% trans 'Шоппинг' %}: - {{ object.shoping }} -
    - - {% if object.description %} -
    -
    -

    {% trans "Описание" %}

    -
    - {{ object.description }} -
    -
    - {% endif %} - - {% if object.get_photos %} -
    -

    {% trans "Фотогалерея" %}

    - -
    - {% endif %} -
    - -{% if object.get_events %} -
    -
    - - {% include 'includes/exposition/exposition_list.html' with object_list=object.get_events %} -
    -{% endif %} - -{% if object.get_places %} -
    -
    - - {% include 'includes/place/place_list.html' with object_list=object.get_places %} -
    -{% endif %} - -{% if object.get_organisers %} -
    -
    - - {% include 'includes/organiser/organiser_list.html' with object_list=object.get_organisers %} -
    -{% endif %} - -{% endblock %} From d30fbf36b5912fee79eba22a3b0c9360e972ec03 Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Fri, 3 Feb 2017 12:46:28 +0200 Subject: [PATCH 13/17] =?UTF-8?q?=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BB=20company=20=D0=BE=D1=82=20=D0=BB=D0=B8=D1=88=D0=BD?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/company/admin.py | 17 ----------------- apps/company/admin_urls.py | 7 ------- apps/company/signals.py | 6 ------ 3 files changed, 30 deletions(-) delete mode 100644 apps/company/signals.py diff --git a/apps/company/admin.py b/apps/company/admin.py index 0b0c6598..a6ff6751 100644 --- a/apps/company/admin.py +++ b/apps/company/admin.py @@ -19,23 +19,6 @@ from theme.models import Tag from django.utils.translation import ugettext_lazy as _ -def company_all(request): - """ - Return list of all companies with pagination - """ - return objects_list(request, Company, 'company_all.html') - - -def company_add(request): - """ - Return form of company and post it on the server. - If form is posted redirect on the page of all companies. - """ - return add_object_with_file(request, CompanyForm, - 'company_add.html', '/admin/company/all/', - {'city': City, 'tag': Tag}) - - def company_delete(request, url): return delete_object(request, Company, CompanyDeleteForm, url, '/admin/company/all') diff --git a/apps/company/admin_urls.py b/apps/company/admin_urls.py index d42275f0..10340bf1 100644 --- a/apps/company/admin_urls.py +++ b/apps/company/admin_urls.py @@ -27,11 +27,4 @@ urlpatterns = patterns('company.admin', url(r'^(?P.*)/$', CompanyView.as_view()), url(r'^$', CompanyView.as_view()), - - # url(r'^add.*/$', 'company_add'), - # url(r'^delete/(?P.*)/$', 'company_delete'), - # url(r'^change/(?P.*)/$', 'company_change'), - # url(r'^all/$', 'company_all'), - # url(r'^all/$', CompanyListView.as_view()), - ) diff --git a/apps/company/signals.py b/apps/company/signals.py deleted file mode 100644 index 9c1a669c..00000000 --- a/apps/company/signals.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -from django.db.models.signals import post_save -from models import Company -from functions.signal_handlers import post_save_handler - -#post_save.connect(post_save_handler, sender=Company) From 601b9f316946cbcf17c290aa45cfcae2b686cfbc Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Fri, 3 Feb 2017 13:20:16 +0200 Subject: [PATCH 14/17] =?UTF-8?q?=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BB=20core=20=D0=BE=D1=82=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/core/forms.py | 42 ----------- apps/core/simple_index_view.py | 21 +----- apps/core/utils.py | 27 ------- apps/core/views.py | 130 --------------------------------- 4 files changed, 4 insertions(+), 216 deletions(-) diff --git a/apps/core/forms.py b/apps/core/forms.py index fe61cd31..1836f4eb 100644 --- a/apps/core/forms.py +++ b/apps/core/forms.py @@ -10,48 +10,6 @@ from haystack.query import SearchQuerySet, EmptySearchQuerySet from hvad.forms import TranslatableModelForm from models import Page - -class PlaceSearchForm(forms.Form): - q = forms.CharField(label=_(u'Поиск'), required=False) - w = forms.CharField(label=_(u'Где'), required=False) - - def search(self): - q = self.cleaned_data.get('q') - w = self.cleaned_data.get('w') - - if not q and not w: - return EmptySearchQuerySet() - - sqs = SearchQuerySet().models(PlaceExposition, PlaceConference) - - if q: - sqs = sqs.auto_query(q) - if w: - sqs = sqs.filter(where__contains=w) - - return sqs - -class CallbackForm(forms.Form): - callback_phone = forms.CharField() - - def clean_callback_phone(self): - phone = self.cleaned_data['callback_phone'] - phone_str = self.cleaned_data['callback_phone'] - deduct = ('-','(',')','.',' ') - for elem in deduct: - phone = phone.replace(elem, '') - if phone.isdigit(): - return phone_str - else: - raise forms.ValidationError(_(u'Введите правильный телефон')) - - def send(self): - phone = self.cleaned_data['callback_phone'] - send_mail(phone, phone, None, [settings.CALLBACK_EMAIL]) - - -# ------------------ Page Form ----------------------- - from django.conf import settings from django.forms import Textarea from ckeditor.widgets import CKEditorWidget diff --git a/apps/core/simple_index_view.py b/apps/core/simple_index_view.py index d5de62ab..9a2c6436 100644 --- a/apps/core/simple_index_view.py +++ b/apps/core/simple_index_view.py @@ -13,11 +13,11 @@ from settings.models import LandingComment, ParticipationComment class AdvertisingView(MetadataMixin, TemplateView): - template_name = 'simple_pages/advertising.html' + template_name = 'client/simple_pages/advertising.html' class AdvertisingViewLanding(JitterCacheMixin, AdvertisingView): - template_name = 'simple_pages/advertising_landing.html' + template_name = 'client/simple_pages/advertising_landing.html' def get_context_data(self, **kwargs): context = super(AdvertisingViewLanding, self).get_context_data(**kwargs) @@ -26,7 +26,7 @@ class AdvertisingViewLanding(JitterCacheMixin, AdvertisingView): class ParticipationViewLanding(JitterCacheMixin, MetadataMixin, FormView): - template_name = 'simple_pages/participation_landing.html' + template_name = 'client/simple_pages/participation_landing.html' form_class = ParticipationLandingForm def get_initial(self): @@ -61,17 +61,4 @@ class ParticipationViewLanding(JitterCacheMixin, MetadataMixin, FormView): class AboutView(MetadataMixin, TemplateView): - template_name = 'simple_pages/about.html' - - -def callback(request): - response = {'success': False} - if request.GET: - form = CallBackForm(request.GET) - if form.is_valid(): - form.save() - response['success'] = True - else: - response['errors'] = form.errors - - return HttpResponse(json.dumps(response), content_type='application/json') + template_name = 'client/simple_pages/about.html' diff --git a/apps/core/utils.py b/apps/core/utils.py index 1ae82b4c..de6edb26 100644 --- a/apps/core/utils.py +++ b/apps/core/utils.py @@ -33,33 +33,6 @@ CELL_STYLE_MAP = ( ) -def multi_getattr(obj, attr, default=None): - attributes = attr.split(".") - for i in attributes: - try: - obj = getattr(obj, i) - except AttributeError: - if default: - return default - else: - return '-' - return obj - - -def get_column_cell(obj, name): - try: - attr = multi_getattr(obj, name) - except ObjectDoesNotExist: - return '' - if hasattr(attr, '_meta'): - # A Django Model (related object) - return unicode(attr).strip() - elif hasattr(attr, 'all'): - # A Django queryset (ManyRelatedManager) - return ', '.join(unicode(x).strip() for x in attr.all()) - return attr - - def queryset_to_workbook(queryset, columns, report_date = None): # localization diff --git a/apps/core/views.py b/apps/core/views.py index 277067c9..f2d2356a 100644 --- a/apps/core/views.py +++ b/apps/core/views.py @@ -9,136 +9,6 @@ from django.core.urlresolvers import reverse_lazy from functions.views_help import split_params from django.utils.translation import ugettext as _ - -class PlaceListView(ListView): - paginate_by = 10 - params = None - single_page = False - template_name = 'place_catalog_test.html' - model = 'places' - order = 'data_begin' - - def get_params(self): - model_names = {'places': _(u'Места')} - model_alternative_name = {'places': 'place'} - params = [{'type':'model', 'url':self.model, 'name': model_names.get(self.model), - 'alternative_name': model_alternative_name.get(self.model)}] - - st = self.kwargs.get('params') - if st: - params = params + split_params(st) - - return params - - def get_queryset(self): - pl_ex = PlaceExposition.objects.all() - pl_conf = PlaceConference.objects.all() - - params = self.get_params() - for param in params: - - if param.get('type') == 'country': - country = Country.objects.safe_get(url=param.get('url')) - if country: - param['name'] = country.name - pl_ex = pl_ex.filter(country=country) - pl_conf = pl_conf.filter(country=country) - if param.get('type') == 'city': - city = City.objects.safe_get(url=param.get('url')) - if city: - param['name'] = city.name - pl_ex = pl_ex.filter(city=city) - pl_conf = pl_conf.filter(city=city) - - if param.get('type') == 'place': - pl_ex = pl_ex.filter(url=param.get('url')) - if pl_ex: - query = pl_ex - else: - query = pl_conf.filter(url=param.get('url')) - - self.single_page = True - - if query: - param['name'] = query[0].name - - #if self.request: - # views = query[0].views - # query.update(views=views+1) - self.params = params - return query - - self.params = params - return list(pl_ex) + list(pl_conf) - - - def get_context_data(self, **kwargs): - context = super(PlaceListView, self).get_context_data(**kwargs) - context['filter'] = self.params - context['single_page'] = self.single_page - context['search_form'] = self.search_form - context['search_action'] = '/places/search/' - context['type'] = 'places search' - return context - -class PlacePhotoView(PlaceListView): - paginate_by = 12 - template_name = 'place/place_photo.html' - obj = None - - def get_queryset(self): - pl_ex = PlaceExposition.objects.all() - pl_conf = PlaceConference.objects.all() - - params = self.get_params() - for param in params: - - if param.get('type') == 'country': - country = Country.objects.safe_get(url=param.get('url')) - if country: - param['name'] = country.name - pl_ex = pl_ex.filter(country=country) - pl_conf = pl_conf.filter(country=country) - if param.get('type') == 'city': - city = City.objects.safe_get(url=param.get('url')) - if city: - param['name'] = city.name - pl_ex = pl_ex.filter(city=city) - pl_conf = pl_conf.filter(city=city) - - if param.get('type') == 'place': - pl_ex = pl_ex.filter(url=param.get('url')) - if pl_ex: - query = pl_ex - else: - query = pl_conf.filter(url=param.get('url')) - - self.single_page = True - - if query: - param['name'] = query[0].name - - #if self.request: - # views = query[0].views - # query.update(views=views+1) - - params.append({'type':'photo', 'name':_(u'Фото')}) - self.params = params - self.obj = query[0] - - return query[0].photogallery.photos.all() - - self.params = params - return list(pl_ex) + list(pl_conf) - - def get_context_data(self, **kwargs): - context = super(PlacePhotoView, self).get_context_data(**kwargs) - context['object'] = self.obj - return context - - -# --------------------- Page views ------------------------ - from forms import PageForm from models import Page From 559869876f45981e905512726f89e9501ca00c2b Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Fri, 3 Feb 2017 13:36:44 +0200 Subject: [PATCH 15/17] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=84=D0=B8?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D1=80=D0=B0=20=D1=83=20=D0=BF=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=82=D0=B0=20=D0=9C=D0=B5=D1=82=D0=B0=20=D0=B2=20=D0=B0?= =?UTF-8?q?=D0=B4=D0=BC=D0=B8=D0=BD=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/article/forms.py | 19 +++++++++++++++++++ apps/core/simple_index_view.py | 13 +++++++++++++ apps/meta/admin.py | 1 + apps/meta/forms.py | 25 ++++++++++++++++++++++++- 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/apps/article/forms.py b/apps/article/forms.py index 1575e005..1ff7478b 100644 --- a/apps/article/forms.py +++ b/apps/article/forms.py @@ -97,6 +97,25 @@ class _BlogForm(forms.Form): return [] +class BlogForm(_BlogForm): + author = forms.ModelChoiceField(label=_(u'Автор'), queryset=Author.objects.all()) + draft = forms.BooleanField(label=_(u'Черновик'), required=False, localize=True) + + def __init__(self, *args, **kwargs): + super(BlogForm, self).__init__(*args, **kwargs) + if len(settings.LANGUAGES) in range(10): + for lid, (code, name) in enumerate(settings.LANGUAGES): + # required = True if lid == 0 else False + self.fields['short_description_%s' % code] = forms.CharField(label=_(u'Краткое содержание'), required=False, widget=CKEditorWidget) + + def save(self, author, article=None, commit=True): + article = super(BlogForm, self).save(author, article=article, commit=False) + article.draft = self.cleaned_data['draft'] + article.author_s = self.cleaned_data['author'] + article.save() + return article + + class NewsForm(_BlogForm): type = Article.news exposition = forms.CharField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False) diff --git a/apps/core/simple_index_view.py b/apps/core/simple_index_view.py index 9a2c6436..b434d43a 100644 --- a/apps/core/simple_index_view.py +++ b/apps/core/simple_index_view.py @@ -62,3 +62,16 @@ class ParticipationViewLanding(JitterCacheMixin, MetadataMixin, FormView): class AboutView(MetadataMixin, TemplateView): template_name = 'client/simple_pages/about.html' + + +def callback(request): + response = {'success': False} + if request.GET: + form = CallBackForm(request.GET) + if form.is_valid(): + form.save() + response['success'] = True + else: + response['errors'] = form.errors + + return HttpResponse(json.dumps(response), content_type='application/json') diff --git a/apps/meta/admin.py b/apps/meta/admin.py index 20c0f236..bc47f4ef 100644 --- a/apps/meta/admin.py +++ b/apps/meta/admin.py @@ -13,6 +13,7 @@ class MetaListView(AdminListView): form_class = MetaFilterForm model = MetaSetting + class MetaView(AdminView): form_class = MetaForm model = MetaSetting diff --git a/apps/meta/forms.py b/apps/meta/forms.py index 67fb7be2..00b9dcca 100644 --- a/apps/meta/forms.py +++ b/apps/meta/forms.py @@ -48,8 +48,31 @@ class MetaForm(forms.Form): meta.save() -class MetaFilterForm(AdminFilterForm): +class MetaFilterForm(forms.Form): model = MetaSetting + exact_name = forms.CharField(label=_(u'Название'), required=False) + name = forms.CharField(label=_(u'Часть названия'), required=False) + + def filter(self): + """ + + return filtered queryset + form must be cleaned before calling this method + + """ + model = self.model + data = self.cleaned_data + name = data['name'] + exact_name = data['exact_name'] + if exact_name: + qs = model.objects.filter(translations__title=name).distinct() + return qs + + qs = model.objects.all() + if name: + qs = qs.filter(translations__title__icontains=name).distinct() + + return qs class SeoTextForm(TranslatableModelForm): From 7bf995112287f7c4de31dbba6308179b4b98eea8 Mon Sep 17 00:00:00 2001 From: avgoeid Date: Fri, 3 Feb 2017 17:27:57 +0200 Subject: [PATCH 16/17] test_models, and began test_views --- apps/conference/admin_urls.py | 3 +- apps/conference/models.py | 2 +- apps/conference/tests/__init__.py | 3 +- apps/conference/tests/test_forms.py | 0 apps/conference/tests/test_models.py | 211 +++++++++++++++++++++++++-- apps/conference/tests/test_views.py | 100 +++++++++++++ apps/conference/urls.py | 17 ++- apps/functions/model_mixin.py | 2 +- 8 files changed, 318 insertions(+), 20 deletions(-) create mode 100644 apps/conference/tests/test_forms.py create mode 100644 apps/conference/tests/test_views.py 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) From 449ff3ff5aacec8c28c35294073ba9048766d1ef Mon Sep 17 00:00:00 2001 From: Slava Kyrachevsky Date: Mon, 6 Feb 2017 09:56:56 +0000 Subject: [PATCH 17/17] Update settings.py --- proj/settings.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/proj/settings.py b/proj/settings.py index 96f4be49..b314c31c 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -2,6 +2,7 @@ # Django settings for proj project. import os import sys +import raven from ConfigParser import ConfigParser import django @@ -398,7 +399,7 @@ INSTALLED_APPS = ( 'south', 'rosetta', 'widget_tweaks', - # 'raven.contrib.django.raven_compat', + 'raven.contrib.django.raven_compat', ) CRONJOBS = [ @@ -526,9 +527,10 @@ PERIODIC = { } # sentry -# RAVEN_CONFIG = { -# 'dsn': 'http://eb7e4b632b3543f487386cbe9151b174:0b148a7ed13643c88d3a6b014c3a4f65@sentry.oldmin.org/2', -# } +RAVEN_CONFIG = { + 'dsn': 'http://474617c96350412d80735900c6717b9a:330285c9034947a181cbae8b52bb15d8@88.198.17.35:9000/3', + 'release': raven.fetch_git_sha(os.path.dirname(os.pardir)), +} try: from proj.local import *