diff --git a/conference/migrations/0004_auto__add_field_conference_members_choice.py b/conference/migrations/0004_auto__add_field_conference_members_choice.py
new file mode 100644
index 00000000..6584a9b1
--- /dev/null
+++ b/conference/migrations/0004_auto__add_field_conference_members_choice.py
@@ -0,0 +1,561 @@
+# -*- 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):
+ # Adding field 'Conference.members_choice'
+ db.add_column(u'conference_conference', 'members_choice',
+ self.gf('django.db.models.fields.PositiveSmallIntegerField')(null=True, blank=True),
+ keep_default=False)
+
+ # Adding field 'Conference.visitors_choice'
+ db.add_column(u'conference_conference', 'visitors_choice',
+ self.gf('django.db.models.fields.PositiveSmallIntegerField')(null=True, blank=True),
+ keep_default=False)
+
+ # Adding field 'Conference.price_choice'
+ db.add_column(u'conference_conference', 'price_choice',
+ self.gf('django.db.models.fields.PositiveSmallIntegerField')(null=True, blank=True),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'Conference.members_choice'
+ db.delete_column(u'conference_conference', 'members_choice')
+
+ # Deleting field 'Conference.visitors_choice'
+ db.delete_column(u'conference_conference', 'visitors_choice')
+
+ # Deleting field 'Conference.price_choice'
+ db.delete_column(u'conference_conference', 'price_choice')
+
+
+ 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'}),
+ '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'conference.conference': {
+ 'Meta': {'unique_together': '()', 'object_name': 'Conference', 'index_together': '()'},
+ 'audience': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
+ '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': "'conference_city'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}),
+ 'company': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference_companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['company.Company']"}),
+ 'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference_country'", 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ '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', [], {}),
+ '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'}),
+ 'link': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': '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_price': ('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', [], {'null': 'True', 'blank': 'True'}),
+ 'min_price': ('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': "'conference_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': "'conference_place'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['place_conference.PlaceConference']"}),
+ 'place_alt': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'price_choice': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'quality_label': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
+ 'rating': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}),
+ 'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
+ 'tag': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference_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': "'conference_themes'", 'symmetrical': 'False', 'to': u"orm['theme.Theme']"}),
+ 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
+ 'users': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference_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', [], {'null': 'True', 'blank': 'True'}),
+ 'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+ },
+ u'conference.conferencetranslation': {
+ 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ConferenceTranslation', 'db_table': "u'conference_conference_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_themes': ('django.db.models.fields.TextField', [], {'blank': '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['conference.Conference']"}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'time': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '250'})
+ },
+ u'conference.statistic': {
+ 'Meta': {'unique_together': '()', 'object_name': 'Statistic', 'index_together': '()'},
+ 'area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'conference': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'statistic'", 'to': u"orm['conference.Conference']"}),
+ 'countries_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 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'conference.statistictranslation': {
+ 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'StatisticTranslation', 'db_table': "u'conference_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['conference.Statistic']"})
+ },
+ u'conference.timetable': {
+ 'Meta': {'unique_together': '()', 'object_name': 'TimeTable', 'index_together': '()'},
+ 'begin': ('django.db.models.fields.DateTimeField', [], {}),
+ 'conference': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'business_program'", 'to': u"orm['conference.Conference']"}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'end': ('django.db.models.fields.DateTimeField', [], {}),
+ 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', [], {'blank': 'True', 'related_name': "'conf_timetable'", 'null': 'True', 'to': u"orm['organiser.Organiser']"})
+ },
+ u'conference.timetabletranslation': {
+ 'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'TimeTableTranslation', 'db_table': "u'conference_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['conference.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', [], {}),
+ 'speaker': ('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'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(2016, 8, 4, 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'}),
+ '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'}),
+ '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.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'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'}),
+ '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'}),
+ '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 = ['conference']
\ No newline at end of file
diff --git a/conference/models.py b/conference/models.py
index f9259ec0..6c15ed15 100644
--- a/conference/models.py
+++ b/conference/models.py
@@ -22,6 +22,8 @@ from functions.translate import fill_with_signal
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from photologue.models import Gallery
from service.models import Service
+from events.common import MEMBERS, VISITORS, PRICE
+
# check if table exist and create flags if true
#flags = [item.url for item in Service.objects.all()] if db_table_exists('service_service') else []
@@ -125,6 +127,14 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
views = models.PositiveIntegerField(default=0)
+ # fields for filter easy
+ members_choice = models.PositiveSmallIntegerField(
+ _(u'Участники'), choices=MEMBERS, blank=True, null=True)
+ visitors_choice = models.PositiveSmallIntegerField(
+ _(u'Посетители'), choices=VISITORS, blank=True, null=True)
+ price_choice = models.PositiveSmallIntegerField(
+ _(u'Минимальная цена'), choices=PRICE, blank=True, null=True)
+
def __unicode__(self):
return self.lazy_translation_getter('name', unicode(self.pk))
diff --git a/conference/search_indexes.py b/conference/search_indexes.py
index bdce191b..92a0b384 100644
--- a/conference/search_indexes.py
+++ b/conference/search_indexes.py
@@ -23,6 +23,11 @@ class ConferenceIndex(indexes.SearchIndex, indexes.Indexable, ExpoSearchMixin):
catalog_name_en = indexes.CharField()
catalog_name_ru = indexes.CharField()
+ # fields for filter easy
+ members_choice = indexes.IntegerField()
+ visitors_choice = indexes.IntegerField()
+ price_choice = indexes.IntegerField()
+
def prepare_form_name(self, obj):
return None
diff --git a/events/common.py b/events/common.py
new file mode 100644
index 00000000..0581b6b5
--- /dev/null
+++ b/events/common.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+from collections import OrderedDict
+
+from django.utils.translation import ugettext as _
+
+from functions.model_utils import EnumChoices
+
+
+members_mapping = OrderedDict(
+ N200={'min': None, 'max': 200, 'value': 1, 'label': _(u'до 200')},
+ N200500={'min': 201, 'max': 500, 'value': 2, 'label': _(u'201-500')},
+ N5001000={'min': 501, 'max': 1000, 'value': 3, 'label': _(u'501-1000')},
+ N10002000={'min': 1001, 'max': 2000, 'value': 4, 'label': _(u'1001-2000')},
+ N2000={'min': 2001, 'max': None, 'value': 5, 'label': _(u'более 2000')},
+)
+
+visitors_mapping = OrderedDict(
+ N5={'min': None, 'max': 5000, 'value': 1, 'label': _(u'до 5 000')},
+ N510={'min': 5001, 'max': 10000, 'value': 2, 'label': _(u'5 001 - 10 000')},
+ N1030={'min': 10001, 'max': 30000, 'value': 3, 'label': _(u'10 001 - 30 000')},
+ N3050={'min': 30001, 'max': 50000, 'value': 4, 'label': _(u'30 001 - 50 000')},
+ N50100={'min': 50001, 'max': 100000, 'value': 5, 'label': _(u'50 001 - 100 000')},
+ N100={'min': 100001, 'max': None, 'value': 6, 'label': _(u'более 100 000')},
+)
+
+price_mapping = OrderedDict(
+ N1={'min': None, 'max': 100, 'value': 1, 'label': _(u'до 100 евро')},
+ N12={'min': 101, 'max': 200, 'value': 2, 'label': _(u'100-200 евро')},
+ N24={'min': 201, 'max': 400, 'value': 3, 'label': _(u'200-400 евро')},
+ N4={'min': 401, 'max': None, 'value': 4, 'label': _(u'более 400 евро')},
+)
+
+def get_choices_kwargs(mapping):
+ kwargs = {}
+ for key, val in mapping.iteritems():
+ kwargs[key] = (val.get('value'), val.get('label'))
+ return kwargs
+
+MEMBERS = EnumChoices(**get_choices_kwargs(members_mapping))
+VISITORS = EnumChoices(**get_choices_kwargs(visitors_mapping))
+PRICE = EnumChoices(**get_choices_kwargs(price_mapping))
+# N200=(1, _(u'до 200')),
+# N200500=(2, _(u'200-500')),
+# N5001000=(3, _(u'500-1000')),
+# N10002000=(4, _(u'1000-2000')),
+# N2000=(5, _(u'более 2000')),
+# )
+
diff --git a/events/forms.py b/events/forms.py
index d50625b4..d4b62572 100644
--- a/events/forms.py
+++ b/events/forms.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
-
from itertools import chain
+from collections import namedtuple
+
try:
from collections import ChainMap
except ImportError:
@@ -12,8 +13,9 @@ from django.utils.encoding import smart_text, force_text
from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.db.models import Count, Sum, Q, ForeignKey, ManyToManyField
+from django.db import connection
from django.core.exceptions import ValidationError
-from haystack.query import SearchQuerySet, RelatedSearchQuerySet
+from haystack.query import SearchQuerySet, RelatedSearchQuerySet, SQ
from functions.model_utils import EnumChoices
from exposition.models import Exposition
@@ -21,18 +23,8 @@ from conference.models import Conference
from theme.models import Theme, Tag
from country.models import Country
from city.models import City
-
-
-# class CountModelChoiceField(forms.ModelChoiceField):
-# def prepare_value(self, value):
-# if hasattr(value, '_meta'):
-# if self.to_field_name:
-# return value.serializable_value(self.to_field_name)
-# else:
-# return value.pk
-# elif isinstance(value, dict):
-# return value.get('pk')
-# return super(CountModelChoiceField, self).prepare_value(value)
+from events.common import MEMBERS, VISITORS, PRICE
+from events.common import members_mapping, visitors_mapping, price_mapping
class CountModelMultipleChoiceField(forms.ModelMultipleChoiceField):
@@ -71,69 +63,31 @@ class CountModelMultipleChoiceField(forms.ModelMultipleChoiceField):
return pks
-### Делаем выборку по темам, сразу заполняя перевод и кол-во событиый
-## 1-й рабочий способ (без заполнения перевода)
-# """
-# SELECT
-# `theme_theme`.`id`,
-# (
-# SELECT COUNT(`exposition_exposition_theme`.`exposition_id`)
-# FROM `exposition_exposition_theme`
-# WHERE (`theme_theme`.`id` = `exposition_exposition_theme`.`theme_id`)
-# ) AS `e_count`,
-# (
-# SELECT COUNT(`conference_conference_theme`.`conference_id`)
-# FROM `conference_conference_theme`
-# WHERE (`theme_theme`.`id` = `conference_conference_theme`.`theme_id`)
-# ) AS `c_count`,
-# `theme_theme_translation`.`name` as `name`
-# FROM
-# `theme_theme`
-# GROUP BY `theme_theme`.`id`
-# ORDER BY NULL
-# """
+fields_mapping = {
+ 'members': 'members_choice',
+ 'visitors': 'visitors_choice',
+ 'price': 'price_choice',
+}
-## 2-й рабочий способ (с заполнением перевода)
-## аттрибут перевода 'name' присвоен на 'name_t', чтобы не ругалось на неправильно заполненый перевод
-# theme_sql = \
-# """
-# SELECT
-# `theme_theme_translation`.`name` AS `name_t`,
-# `theme_theme_translation`.`master_id` AS `id`,
-# (
-# SELECT COUNT(`exposition_exposition_theme`.`exposition_id`)
-# FROM `exposition_exposition_theme`
-# WHERE (`theme_theme_translation`.`master_id` = `exposition_exposition_theme`.`theme_id`)
-# ) AS `e_count`,
-# (
-# SELECT COUNT(`conference_conference_theme`.`conference_id`)
-# FROM `conference_conference_theme`
-# WHERE (`theme_theme_translation`.`master_id` = `conference_conference_theme`.`theme_id`)
-# ) AS `c_count`
-# FROM
-# `theme_theme_translation`
-# WHERE (`theme_theme_translation`.`language_code` = 'ru')
-# GROUP BY `theme_theme_translation`.`name`
-# ORDER BY NULL
-# """
-# qs = Theme.objects.raw(theme_sql)
-_theme_expo_count = '''SELECT COUNT(`exposition_exposition_theme`.`exposition_id`) FROM `exposition_exposition_theme` '''
-theme_expo_count = _theme_expo_count + ''' WHERE (`theme_theme`.`id` = `exposition_exposition_theme`.`theme_id`) '''
-theme_expo_count_selected = theme_expo_count + ''' WHERE (`theme_theme`.`id` = `exposition_exposition_theme`.`theme_id` AND `exposition_exposition_theme`.`exposition_id` in {ids})'''
-_theme_conf_count = '''SELECT COUNT(`conference_conference_theme`.`conference_id`) FROM `conference_conference_theme` '''
-theme_conf_count = _theme_conf_count + ''' WHERE (`theme_theme`.`id` = `conference_conference_theme`.`theme_id`) '''
-theme_conf_count_selected = _theme_conf_count + ''' WHERE (`theme_theme`.`id` = `conference_conference_theme`.`theme_id` AND `conference_conference_theme`.`conference_id` in {ids})'''
+values_mapping = {
+ 'members_choice': members_mapping,
+ 'visitors_choice': visitors_mapping,
+ 'price_choice': price_mapping,
+
+}
-tag_expo_count = '''SELECT COUNT(`exposition_exposition_tag`.`exposition_id`) FROM `exposition_exposition_tag` WHERE (`theme_tag`.`id` = `exposition_exposition_tag`.`tag_id`) '''
-tag_conf_count = '''SELECT COUNT(`conference_conference_tag`.`conference_id`) FROM `conference_conference_tag` WHERE (`theme_tag`.`id` = `conference_conference_tag`.`tag_id`) '''
class FilterForm(forms.Form):
TYPES = EnumChoices(
EXPO=(1, _(u'Выставки')),
CONF=(2, _(_(u'Конференции'))),
)
-
- model = forms.TypedMultipleChoiceField(label=_(u'Тип события'), coerce=int, choices=TYPES, required=False, widget=forms.CheckboxSelectMultiple())
+ # MEMBERS = MEMBERS
+ # VISITORS = VISITORS
+ # PRICE = PRICE
+ model = forms.TypedMultipleChoiceField(
+ label=_(u'Тип события'), coerce=int,
+ choices=TYPES, required=False, widget=forms.CheckboxSelectMultiple())
theme = CountModelMultipleChoiceField(
label=_(u'Тематики'), required=False,
queryset=Theme.objects.language().values('pk', 'name'))
@@ -146,13 +100,28 @@ class FilterForm(forms.Form):
city = CountModelMultipleChoiceField(
label=_(u'Города'), required=False,
queryset=City.objects.language().values('pk', 'name'))
+ price = forms.TypedMultipleChoiceField(
+ label=_(u'Стоимость'), coerce=int,
+ choices=PRICE,
+ required=False, widget=forms.CheckboxSelectMultiple(),
+ help_text=_(u'За 1 м2 необорудованной площади'))
+ members = forms.TypedMultipleChoiceField(
+ label=_(u'Участники'), coerce=int,
+ choices=MEMBERS,
+ required=False, widget=forms.CheckboxSelectMultiple())
+ visitors = forms.TypedMultipleChoiceField(
+ label=_(u'Посетители'), coerce=int,
+ choices=VISITORS,
+ required=False, widget=forms.CheckboxSelectMultiple())
def __init__(self, *args, **kwargs):
super(FilterForm, self).__init__(*args, **kwargs)
self._is_valid = False
self._models = None
self._lookup_kwargs = None
+ self._lookup_args = None
self.lang = get_language()
+ # self.db_cursor = connection.cursor()
# self.selected_filter_data = {}
# self.fields['theme'].queryset = self.get_theme_choices()
# self.fields['tag'].queryset = self.get_tag_choices()
@@ -163,7 +132,7 @@ class FilterForm(forms.Form):
# if getattr(self, '_is_valid', None) is None:
self._is_valid = super(FilterForm, self).is_valid()
- # нам нужно сбрасывать сохраненные модели,
+ # нам нужно сбрасывать сохраненный выбор моделей,
# т.к. после валидации нужно вернуть только выбранные
self._models = None
return self._is_valid
@@ -179,82 +148,49 @@ class FilterForm(forms.Form):
self._models.append(Conference)
return self._models or [Exposition, Conference]
- def get_theme_choices(self, ids):
- # 3-й рабочий способ (с родным заполением перевода)
- # в ходе поиска решения, был найден и 4-й рабочий способ используя RawSQL, но он для Django >= 1.8
- # https://docs.djangoproject.com/en/1.9/ref/models/expressions/#raw-sql-expressions
- # from django.db.models.expressions import RawSQL
- conf = []
- expo = []
- for _type, pk in ids:
- if _type == 'conference':
- conf.append(pk)
- else:
- expo.append(int(pk))
-
- if getattr(self, '_theme_choices', None) is None:
- if Exposition in self.models and Conference in self.models:
- count_query = '({q1}) + ({q2})'.format(
- q1=theme_expo_count if not expo else theme_expo_count_selected.format(ids=tuple(expo)),
- q2=theme_conf_count if not conf else theme_conf_count_selected.format(ids=tuple(conf)),
- )
- filter_types = Q(types=Theme.types.conference) | Q(types=Theme.types.exposition)
- elif Exposition in self.models:
- count_query = theme_expo_count
- filter_types = Q(types=Theme.types.exposition)
- elif Conference in self.models:
- count_query = theme_conf_count
- filter_types = Q(types=Theme.types.conference)
-
- self._theme_choices = Theme.objects.language()\
- .filter(filter_types)\
- .extra(select={'count': count_query})\
- # .order_by('-count', '-name')
- return self._theme_choices
-
- def get_tag_choices(self):
- tag_select = {}
- if getattr(self, '_tag_choices', None) is None:
- if Exposition in self.models and Conference in self.models:
- count_query = '({q1}) + ({q2})'.format(
- q1=tag_expo_count,
- q2=tag_conf_count)
- elif Exposition in self.models:
- count_query = tag_expo_count
- elif Conference in self.models:
- count_query = tag_conf_count
- self._tag_choices = Tag.objects.language()\
- .extra(select={'count': count_query})\
- # .order_by('-count', '-name')
- return self._tag_choices
-
@property
def lookup_kwargs(self):
if self._lookup_kwargs is None:
d = self.cleaned_data
self._lookup_kwargs = {}
+ self._related_fields = []
+ self._local_fields = []
if d.get('theme'):
- self._lookup_kwargs['theme'] = {
- 'theme__in': d.get('theme')
- }
+ self._related_fields.append('theme')
+ self._lookup_kwargs['theme__in'] = d.get('theme')
if d.get('tag'):
- self._lookup_kwargs['tag'] = {
- 'tag__in': d.get('tag'),
- }
+ self._related_fields.append('tag')
+ self._lookup_kwargs['tag__in'] = d.get('tag')
if d.get('country'):
- self._lookup_kwargs['country'] = {
- 'country_id__in': d.get('country'),
- }
+ self._lookup_kwargs['country_id__in'] = d.get('country')
if d.get('city'):
- self._lookup_kwargs['city'] = {
- 'city_id__in': d.get('city'),
- }
+ self._related_fields.append('city')
+ self._lookup_kwargs['city_id__in'] = d.get('city')
+ if d.get('members'):
+ self._local_fields.append('members')
+ self._lookup_kwargs['members__in'] = d.get('members')
+ if d.get('visitors'):
+ self._local_fields.append('visitors')
+ self._lookup_kwargs['visitors__in'] = d.get('visitors')
+ if d.get('price'):
+ self._local_fields.append('price')
+ self._lookup_kwargs['price__in'] = d.get('price')
return self._lookup_kwargs
- def filter(self, lookup_kwargs=None, qs=None):
+ # @property
+ # def lookup_args(self):
+ # if self._lookup_args is None:
+ # d = self.cleaned_data
+ # self._lookup_args = {}
+ # self._local_fields = []
+ # if d.get('members'):
+ # self._local_fields.append('city')
+ # return self._lookup_args
+
+ def filter(self, qs=None):
qs = qs or self.default_filter()
- lookup_kwargs = dict(ChainMap({}, *(lookup_kwargs or self.lookup_kwargs).values()))
- return qs.filter(**lookup_kwargs)
+ # lookup_kwargs = dict(ChainMap({}, *(lookup_kwargs or self.lookup_kwargs).values()))
+ return qs.filter(**self.lookup_kwargs)
def default_filter(self, load_all=True):
qs = RelatedSearchQuerySet().models(*self.models)
@@ -266,12 +202,9 @@ class FilterForm(forms.Form):
def recalculate_choices(self):
print(self._is_valid)
- if self._is_valid:
+ if self._is_valid and self.lookup_kwargs:
for field in ['theme', 'tag', 'city', 'country']:
- field_qs = self.default_filter(load_all=False)
- field_lookup_kwargs = self.lookup_kwargs.copy()
- if field in field_lookup_kwargs.keys():
- del field_lookup_kwargs[field]
+ # field_qs = self.default_filter(load_all=False)
# if not field_lookup_kwargs:
# continue
# field_qs = (x.id.split('.')[1:] for x in self.filter(qs=field_qs, lookup_kwargs=field_lookup_kwargs) if x.id)
@@ -279,7 +212,7 @@ class FilterForm(forms.Form):
# self.fields[field].queryset = self.get_theme_choices(field_qs)
values = ['pk', 'name']
order_by = []
- select = self.make_count_select(field, field_lookup_kwargs)
+ select = self.make_count_select(field)
qs = self.fields[field].queryset
for key in select.iterkeys():
values.append(key)
@@ -294,6 +227,9 @@ class FilterForm(forms.Form):
.order_by(*order_by)
print(self.fields[field].queryset.query)
+ for field in ['members', 'visitors', 'price']:
+ self.fields[field].choices = self.make_local_field_count(field) or self.fields[field].choices
+
for field in self.fields:
field = self.fields[field]
if hasattr(field, 'queryset'):
@@ -302,11 +238,120 @@ class FilterForm(forms.Form):
def make_ids_in_sql_format(self, values):
return tuple(values) if len(values) > 1 else '({})'.format(*values)
- def make_count_select(self, field, lookup_kwargs):
+ def make_joins_from_selected(self, field, model):
+ joins = []
+ where = []
+
+ # joins and where lookups in relations
+ for l_field in self._related_fields:
+ if l_field == field:
+ continue
+ _l_field, l_model, _direct, _m2m = model._meta.get_field_by_name(l_field)
+ values = self.cleaned_data[l_field]
+ if _m2m and _direct and isinstance(_l_field, ManyToManyField):
+ _format_kwargs = {
+ 'm2m_db_table': _l_field.m2m_db_table(),
+ 'm2m_column_name': _l_field.m2m_column_name(),
+ 'db_table': model._meta.db_table,
+ 'm2m_reverse_name': _l_field.m2m_reverse_name(),
+ 'ids': self.make_ids_in_sql_format(values),
+ }
+ joins.append(
+ ''' INNER JOIN `{m2m_db_table}` ON (`{db_table}`.`id` = `{m2m_db_table}`.`{m2m_column_name}`)'''\
+ .format(**_format_kwargs))
+ where.append(
+ '''`{m2m_db_table}`.`{m2m_reverse_name}` IN {ids}'''\
+ .format(**_format_kwargs))
+ elif not _m2m and _direct and isinstance(_l_field, ForeignKey):
+ _format_kwargs = {
+ 'db_table': model._meta.db_table,
+ 'attname': _l_field.column,
+ 'ids': self.make_ids_in_sql_format(values),
+ }
+ where.append(
+ '''`{db_table}`.`{attname}` IN {ids}'''\
+ .format(**_format_kwargs))
+
+ # joins and where lookups in local fields
+ for l_field in self._local_fields:
+ if l_field == field:
+ continue
+ val = self.cleaned_data[l_field]
+ _format_kwargs = {
+ 'db_table': model._meta.db_table,
+ 'attname': l_field,
+ 'val': self.make_ids_in_sql_format(val),
+ }
+ where.append(
+ '''`{db_table}`.`{attname}` IN {val}'''\
+ .format(**_format_kwargs))
+
+ return joins, where
+
+ def make_local_field_count(self, field):
+ # if 'members' not in self.lookup_kwargs:
+ sql = ''
+ selects = []
+ l_field = fields_mapping.get(field, field)
+ _values_mapping = values_mapping.get(l_field).items()
+ for model in self.models:
+ joins = []
+ where = []
+ group_by = ''
+
+ format_kwargs = {
+ 'db_table': model._meta.db_table,
+ 'l_field': l_field,
+ 'lang': self.lang,
+ }
+
+ cases = []
+ for key, val in _values_mapping:
+ cases.append(
+ ''' sum(case when (`{db_table}`.`{l_field}` = {val}) then 1 else 0 end) as '{key}' '''\
+ .format(key=key, val=val.get('value'), **format_kwargs)
+ )
+
+ select = \
+ ''' SELECT {cases} FROM `{db_table}_translation` INNER JOIN `{db_table}` ON (`{db_table}_translation`.`master_id` = `{db_table}`.`id`) '''\
+ .format(cases=', '.join(cases), **format_kwargs)
+
+ where.append(
+ ''' `{db_table}_translation`.`language_code` = '{lang}' '''\
+ .format(**format_kwargs)
+ )
+
+ _joins, _where = self.make_joins_from_selected(field, model)
+ joins.extend(_joins)
+ where.extend(_where)
+ where.append(self.make_default_where(db_table=model._meta.db_table))
+
+ selects.append(select + ''.join(joins) + ' where ' + ' and '.join(where) + group_by)
+
+ sql = ' union '.join(selects)
+ choices = []
+ if sql:
+ with connection.cursor() as c:
+ c.execute(sql)
+ mapper = namedtuple('Result', [col[0] for col in c.description])
+ data = [mapper(*raw) for raw in c.fetchall()]
+ for key, val in _values_mapping:
+ count = sum([getattr(x, key, 0) for x in data])
+ choices.append((val.get('value'), val.get('label') + ' ({count})'.format(count=count)))
+ return choices
+
+ # cursor.execute()
+
+ #""" SELECT sum(case when (`exposition_exposition`.`members` < 200) then 1 else 0 end) as 'N200', sum(case when (`exposition_exposition`.`members` >= 200 AND `exposition_exposition`.`members` <= 500) then 2 else 0 end) as 'N200500', sum(case when (`exposition_exposition`.`members` >= 500 AND `exposition_exposition`.`members` <= 1000) then 3 else 0 end) as 'N5001000', sum(case when (`exposition_exposition`.`members` >= 1000 AND `exposition_exposition`.`members` <= 2000) then 4 else 0 end) as 'N10002000', sum(case when (`exposition_exposition`.`members` >= 2000) then 5 else 0 end) as 'N2000'FROM `exposition_exposition_translation` INNER JOIN `exposition_exposition` ON (`exposition_exposition_translation`.`master_id` = `exposition_exposition`.`id`) WHERE `exposition_exposition_translation`.`language_code` = 'ru'union SELECT sum(case when (`conference_conference`.`members` < 200) then 1 else 0 end) as 'N200', sum(case when (`conference_conference`.`members` >= 200 AND `conference_conference`.`members` <= 500) then 1 else 0 end) as 'N200500', sum(case when (`conference_conference`.`members` >= 500 AND `conference_conference`.`members` <= 1000) then 1 else 0 end) as 'N5001000', sum(case when (`conference_conference`.`members` >= 1000 AND `conference_conference`.`members` <= 2000) then 1 else 0 end) as 'N10002000', sum(case when (`conference_conference`.`members` >= 2000) then 1 else 0 end) as 'N2000'FROM `conference_conference_translation` INNER JOIN `conference_conference` ON (`conference_conference_translation`.`master_id` = `conference_conference`.`id`) WHERE `conference_conference_translation`.`language_code` = 'ru' """
+
+ def make_default_where(self, **kwargs):
+ return ''' `{db_table}`.`is_published` = True '''.format(**kwargs)
+
+ def make_count_select(self, field):
count_selects = []
case = None
count = None
- print('looking {} {}'.format(field, lookup_kwargs))
+ print('looking {} {}'.format(field, self.lookup_kwargs))
for model in self.models:
_field, _model, direct, m2m = model._meta.get_field_by_name(field)
joins = []
@@ -328,7 +373,7 @@ class FilterForm(forms.Form):
'''SELECT COUNT(`{m2m_db_table}`.`{m2m_column_name}`) FROM `{m2m_db_table}` INNER JOIN `{db_table}` ON (`{m2m_db_table}`.`{m2m_column_name}` = `{db_table}`.`id`) '''\
.format(**format_kwargs)
where.append(
- ''' (`{m2m_rel_to_table}_translation`.`master_id` = `{m2m_db_table}`.`{m2m_reverse_name}`) AND `{m2m_rel_to_table}_translation`.`language_code` = '{lang}' AND `{db_table}`.`is_published` = True '''.format(**format_kwargs)
+ ''' (`{m2m_rel_to_table}_translation`.`master_id` = `{m2m_db_table}`.`{m2m_reverse_name}`) AND `{m2m_rel_to_table}_translation`.`language_code` = '{lang}' '''.format(**format_kwargs)
)
# ForeignKey
@@ -345,47 +390,27 @@ class FilterForm(forms.Form):
.format(**_format_kwargs)
# '''SELECT COUNT(`{db_table}`.`id`) FROM `{rel_db_table}` LEFT OUTER JOIN `{db_table}` ON (`{rel_db_table}`.`id` = `{db_table}`.`{attname}`)'''\
where.append(
- ''' `{db_table}`.`{attname}` = `{rel_db_table}_translation`.`master_id` AND `{rel_db_table}_translation`.`language_code` = '{lang}' AND `{db_table}`.`is_published` = True '''\
+ ''' `{db_table}`.`{attname}` = `{rel_db_table}_translation`.`master_id` AND `{rel_db_table}_translation`.`language_code` = '{lang}' '''\
.format(**_format_kwargs))
group_by = ''' GROUP BY `{rel_db_table}_translation`.`master_id` '''.format(**_format_kwargs)
# mark selected items (for ordering)
- if case is None and field in self.lookup_kwargs.keys():
- values = self.lookup_kwargs[field].values()[0]
+ # only for M2M and ForeignKey
+ if case is None and field in self._related_fields and direct\
+ and (isinstance(_field, ForeignKey) or isinstance(_field, ManyToManyField)):
+ values = self.cleaned_data[field]
case = \
''' CASE WHEN `{table}`.`master_id` in {ids} THEN 1 ELSE 0 END '''.format(
table=self.fields[field].queryset.model._meta.db_table,
ids=self.make_ids_in_sql_format(values))
- # joins and where lookups
- for l_field, lookups in lookup_kwargs.iteritems():
- _l_field, l_model, _direct, _m2m = model._meta.get_field_by_name(l_field)
- values = lookups.values()[0]
- if _m2m and _direct and isinstance(_l_field, ManyToManyField):
- _format_kwargs = {
- 'm2m_db_table': _l_field.m2m_db_table(),
- 'm2m_column_name': _l_field.m2m_column_name(),
- 'db_table': model._meta.db_table,
- 'm2m_reverse_name': _l_field.m2m_reverse_name(),
- 'ids': self.make_ids_in_sql_format(values),
- }
- joins.append(
- ''' INNER JOIN `{m2m_db_table}` ON (`{db_table}`.`id` = `{m2m_db_table}`.`{m2m_column_name}`)'''\
- .format(**_format_kwargs))
- where.append(
- '''`{m2m_db_table}`.`{m2m_reverse_name}` IN {ids}'''\
- .format(**_format_kwargs))
- elif not m2m and _direct and isinstance(_l_field, ForeignKey):
- _format_kwargs = {
- 'db_table': model._meta.db_table,
- 'attname': _l_field.column,
- 'ids': self.make_ids_in_sql_format(values),
- }
- where.append(
- '''`{db_table}`.`{attname}` IN {ids}'''\
- .format(**_format_kwargs))
- count_selects.append(select + ''.join(joins) + ' where ' + ' and '.join(where) + group_by)
+ # FILTER current by other values
+ _joins, _where = self.make_joins_from_selected(field, model)
+ joins.extend(_joins)
+ where.extend(_where)
+ where.append(self.make_default_where(db_table=model._meta.db_table))
+ count_selects.append(select + ''.join(joins) + ' where ' + ' and '.join(where) + group_by)
if len(count_selects) == 2:
count = '({}) + ({})'.format(*count_selects)
@@ -400,6 +425,68 @@ class FilterForm(forms.Form):
+### Делаем выборку по темам, сразу заполняя перевод и кол-во событиый
+## 1-й рабочий способ (без заполнения перевода)
+# """
+# SELECT
+# `theme_theme`.`id`,
+# (
+# SELECT COUNT(`exposition_exposition_theme`.`exposition_id`)
+# FROM `exposition_exposition_theme`
+# WHERE (`theme_theme`.`id` = `exposition_exposition_theme`.`theme_id`)
+# ) AS `e_count`,
+# (
+# SELECT COUNT(`conference_conference_theme`.`conference_id`)
+# FROM `conference_conference_theme`
+# WHERE (`theme_theme`.`id` = `conference_conference_theme`.`theme_id`)
+# ) AS `c_count`,
+# `theme_theme_translation`.`name` as `name`
+# FROM
+# `theme_theme`
+# GROUP BY `theme_theme`.`id`
+# ORDER BY NULL
+# """
+
+## 2-й рабочий способ (с заполнением перевода)
+## аттрибут перевода 'name' присвоен на 'name_t', чтобы не ругалось на неправильно заполненый перевод
+# theme_sql = \
+# """
+# SELECT
+# `theme_theme_translation`.`name` AS `name_t`,
+# `theme_theme_translation`.`master_id` AS `id`,
+# (
+# SELECT COUNT(`exposition_exposition_theme`.`exposition_id`)
+# FROM `exposition_exposition_theme`
+# WHERE (`theme_theme_translation`.`master_id` = `exposition_exposition_theme`.`theme_id`)
+# ) AS `e_count`,
+# (
+# SELECT COUNT(`conference_conference_theme`.`conference_id`)
+# FROM `conference_conference_theme`
+# WHERE (`theme_theme_translation`.`master_id` = `conference_conference_theme`.`theme_id`)
+# ) AS `c_count`
+# FROM
+# `theme_theme_translation`
+# WHERE (`theme_theme_translation`.`language_code` = 'ru')
+# GROUP BY `theme_theme_translation`.`name`
+# ORDER BY NULL
+# """
+# qs = Theme.objects.raw(theme_sql)
+# _theme_expo_count = '''SELECT COUNT(`exposition_exposition_theme`.`exposition_id`) FROM `exposition_exposition_theme` '''
+# theme_expo_count = _theme_expo_count + ''' WHERE (`theme_theme`.`id` = `exposition_exposition_theme`.`theme_id`) '''
+# theme_expo_count_selected = theme_expo_count + ''' WHERE (`theme_theme`.`id` = `exposition_exposition_theme`.`theme_id` AND `exposition_exposition_theme`.`exposition_id` in {ids})'''
+# _theme_conf_count = '''SELECT COUNT(`conference_conference_theme`.`conference_id`) FROM `conference_conference_theme` '''
+# theme_conf_count = _theme_conf_count + ''' WHERE (`theme_theme`.`id` = `conference_conference_theme`.`theme_id`) '''
+# theme_conf_count_selected = _theme_conf_count + ''' WHERE (`theme_theme`.`id` = `conference_conference_theme`.`theme_id` AND `conference_conference_theme`.`conference_id` in {ids})'''
+
+# tag_expo_count = '''SELECT COUNT(`exposition_exposition_tag`.`exposition_id`) FROM `exposition_exposition_tag` WHERE (`theme_tag`.`id` = `exposition_exposition_tag`.`tag_id`) '''
+# tag_conf_count = '''SELECT COUNT(`conference_conference_tag`.`conference_id`) FROM `conference_conference_tag` WHERE (`theme_tag`.`id` = `conference_conference_tag`.`tag_id`) '''
+
+
+# 3-й рабочий способ (с родным заполением перевода)
+# в ходе поиска решения, был найден и 4-й рабочий способ используя RawSQL, но он для Django >= 1.8
+# https://docs.djangoproject.com/en/1.9/ref/models/expressions/#raw-sql-expressions
+# from django.db.models.expressions import RawSQL
+
'''
SELECT
`city_city_translation`.`master_id`,
diff --git a/events/management/__init__.py b/events/management/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/events/management/commands/__init__.py b/events/management/commands/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/events/management/commands/update_events_filter_fields.py b/events/management/commands/update_events_filter_fields.py
new file mode 100644
index 00000000..affedc86
--- /dev/null
+++ b/events/management/commands/update_events_filter_fields.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+
+from django.core.management.base import NoArgsCommand
+from django.db.models import Q
+
+from exposition.models import Exposition
+from conference.models import Conference
+from events.common import members_mapping, visitors_mapping, price_mapping
+
+
+class Command(NoArgsCommand):
+ def handle_noargs(self, **options):
+ fields_updater_mapping = {
+ Exposition: [
+ {
+ 'from': 'members',
+ 'to': 'members_choice',
+ 'mapping': members_mapping
+ },
+ {
+ 'from': 'visitors',
+ 'to': 'visitors_choice',
+ 'mapping': visitors_mapping
+ },
+ {
+ 'from': 'min_closed_area',
+ 'to': 'price_choice',
+ 'mapping': price_mapping
+ },
+ ],
+ Conference: [
+ {
+ 'from': 'members',
+ 'to': 'members_choice',
+ 'mapping': members_mapping
+ },
+ {
+ 'from': 'visitors',
+ 'to': 'visitors_choice',
+ 'mapping': visitors_mapping
+ },
+ {
+ 'from': 'min_price',
+ 'to': 'price_choice',
+ 'mapping': price_mapping
+ },
+ ]
+
+ }
+
+ # loop over models
+ for model, fields in fields_updater_mapping.iteritems():
+ # loop over fields
+ for field in fields:
+ from_field = field.get('from')
+ to_field = field.get('to')
+ field_mapping = field.get('mapping')
+ # loop over every choice in field
+ for choice in field_mapping.itervalues():
+ _min = choice.get('min')
+ _max = choice.get('max')
+ value = choice.get('value')
+ exclude_kwargs = {to_field: value}
+ update_kwargs = {to_field: value}
+ q = Q()
+ if _min:
+ q &= Q(**{from_field + '__gte': _min})
+ if _max:
+ q &= Q(**{from_field + '__lte': _max})
+ model.objects.filter(q).exclude(**exclude_kwargs).update(**update_kwargs)
+
diff --git a/exposition/migrations/0003_auto__add_field_exposition_members_choice.py b/exposition/migrations/0003_auto__add_field_exposition_members_choice.py
new file mode 100644
index 00000000..ebbbaf7d
--- /dev/null
+++ b/exposition/migrations/0003_auto__add_field_exposition_members_choice.py
@@ -0,0 +1,620 @@
+# -*- 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):
+ # Adding field 'Exposition.members_choice'
+ db.add_column(u'exposition_exposition', 'members_choice',
+ self.gf('django.db.models.fields.PositiveSmallIntegerField')(null=True, blank=True),
+ keep_default=False)
+
+ # Adding field 'Exposition.visitors_choice'
+ db.add_column(u'exposition_exposition', 'visitors_choice',
+ self.gf('django.db.models.fields.PositiveSmallIntegerField')(null=True, blank=True),
+ keep_default=False)
+
+ # Adding field 'Exposition.price_choice'
+ db.add_column(u'exposition_exposition', 'price_choice',
+ self.gf('django.db.models.fields.PositiveSmallIntegerField')(null=True, blank=True),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'Exposition.members_choice'
+ db.delete_column(u'exposition_exposition', 'members_choice')
+
+ # Deleting field 'Exposition.visitors_choice'
+ db.delete_column(u'exposition_exposition', 'visitors_choice')
+
+ # Deleting field 'Exposition.price_choice'
+ db.delete_column(u'exposition_exposition', 'price_choice')
+
+
+ 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'}),
+ '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'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(2016, 8, 4, 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'}),
+ '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'}),
+ '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'},
+ '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(2016, 8, 4, 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.BigIntegerField', [], {'default': 'None'}),
+ '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', [], {}),
+ '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'}),
+ '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', [], {'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', [], {'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', [], {'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'}),
+ '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'}),
+ '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/exposition/models.py b/exposition/models.py
index f7a29879..1ccab6e8 100644
--- a/exposition/models.py
+++ b/exposition/models.py
@@ -21,6 +21,8 @@ from import_xls.model_utils import ExpoImportManager
from manager import ClientManager
from organiser.models import Organiser
from service.models import Service
+from events.common import MEMBERS, VISITORS, PRICE
+
AUDIENCE1 = ((None,_(u'Не выбрано')),
('experts', _(u'Специалисты')),
@@ -162,6 +164,15 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
paid_new = models.ForeignKey('expobanner.Paid', blank=True, null=True, on_delete=models.SET_NULL)
top = models.ForeignKey('expobanner.Top', blank=True, null=True, on_delete=models.SET_NULL)
main = models.ForeignKey('expobanner.MainPage', blank=True, null=True, on_delete=models.SET_NULL)
+
+ # fields for filter easy
+ members_choice = models.PositiveSmallIntegerField(
+ _(u'Участники'), choices=MEMBERS, blank=True, null=True)
+ visitors_choice = models.PositiveSmallIntegerField(
+ _(u'Посетители'), choices=VISITORS, blank=True, null=True)
+ price_choice = models.PositiveSmallIntegerField(
+ _(u'Минимальная цена'), choices=PRICE, blank=True, null=True)
+
#set manager of this model(fisrt manager is default)
objects = ExpoManager()
enable = ClientManager()
diff --git a/exposition/search_indexes.py b/exposition/search_indexes.py
index 0a427eb7..347253a1 100644
--- a/exposition/search_indexes.py
+++ b/exposition/search_indexes.py
@@ -24,6 +24,11 @@ class ExpositionIndex(indexes.SearchIndex, indexes.Indexable, ExpoSearchMixin):
catalog_name_en = indexes.CharField()
catalog_name_ru = indexes.CharField()
+ # fields for filter easy
+ members_choice = indexes.IntegerField()
+ visitors_choice = indexes.IntegerField()
+ price_choice = indexes.IntegerField()
+
def prepare_form_name(self, obj):
return None
@@ -41,4 +46,4 @@ class ExpositionIndex(indexes.SearchIndex, indexes.Indexable, ExpoSearchMixin):
return self.get_model().objects.filter(is_published=True)
def get_updated_field(self):
- return 'modified'
\ No newline at end of file
+ return 'modified'
diff --git a/functions/model_utils.py b/functions/model_utils.py
index 3686b0d1..79aee162 100644
--- a/functions/model_utils.py
+++ b/functions/model_utils.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
from operator import itemgetter
+from django.utils.translation import ugettext as _
def base_concrete_model(abstract, instance):
diff --git a/functions/search_mixin.py b/functions/search_mixin.py
index 2030f408..65a78964 100644
--- a/functions/search_mixin.py
+++ b/functions/search_mixin.py
@@ -62,4 +62,12 @@ class ExpoSearchMixin(object):
except:
return ''
+ def prepare_members_choice(self, obj):
+ return obj.members_choice or 0
+
+ def prepare_visitors_choice(self, obj):
+ return obj.visitors_choice or 0
+
+ def prepare_price_choice(self, obj):
+ return obj.price_choice or 0
diff --git a/schema_new.xml b/schema_new.xml
new file mode 100644
index 00000000..a5cc8484
--- /dev/null
+++ b/schema_new.xml
@@ -0,0 +1,206 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id
+
+
+ text
+
+
+
+
diff --git a/support/dev/settings.py b/support/dev/settings.py
index 346658da..32dba066 100644
--- a/support/dev/settings.py
+++ b/support/dev/settings.py
@@ -352,6 +352,7 @@ INSTALLED_APPS = (
'translator',
'webinar',
'meta',
+ 'events',
#django modules
'django_crontab',
'sorl.thumbnail', # for logos
diff --git a/support/prod/settings.py b/support/prod/settings.py
index 6897d14f..34af55bf 100644
--- a/support/prod/settings.py
+++ b/support/prod/settings.py
@@ -352,6 +352,7 @@ INSTALLED_APPS = (
'translator',
'webinar',
'meta',
+ 'events',
#django modules
'django_crontab',
'sorl.thumbnail', # for logos