diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py deleted file mode 100644 index 9a8ee31f..00000000 --- a/accounts/migrations/0001_initial.py +++ /dev/null @@ -1,538 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'User' - db.create_table(u'accounts_user', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('password', self.gf('django.db.models.fields.CharField')(max_length=128)), - ('last_login', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), - ('is_superuser', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('email', self.gf('django.db.models.fields.EmailField')(unique=True, max_length=255, db_index=True)), - ('first_name', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('last_name', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('url', self.gf('django.db.models.fields.SlugField')(max_length=50, blank=True)), - ('is_active', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('is_staff', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('is_admin', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('date_joined', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), - ('date_registered', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), - ('date_modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), - ('organiser', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['organiser.Organiser'], unique=True, null=True, on_delete=models.PROTECT, blank=True)), - ('translator', self.gf('django.db.models.fields.related.ForeignKey')(related_name='user', null=True, on_delete=models.PROTECT, to=orm['translator.Translator'], blank=True, unique=True)), - ('country', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='users', null=True, on_delete=models.PROTECT, to=orm['country.Country'])), - ('city', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['city.City'], null=True, on_delete=models.PROTECT, blank=True)), - ('company', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='users', null=True, on_delete=models.PROTECT, to=orm['company.Company'])), - ('phone', self.gf('django.db.models.fields.BigIntegerField')(null=True, blank=True)), - ('position', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), - ('about', self.gf('django.db.models.fields.TextField')(blank=True)), - ('avatar', self.gf('django.db.models.fields.files.ImageField')(max_length=100, blank=True)), - ('web_page', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), - ('social', self.gf('django.db.models.fields.TextField')(blank=True)), - ('skype', self.gf('django.db.models.fields.CharField')(max_length=50, blank=True)), - ('title', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), - ('descriptions', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), - ('keywords', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), - )) - db.send_create_signal(u'accounts', ['User']) - - # Adding M2M table for field groups on 'User' - m2m_table_name = db.shorten_name(u'accounts_user_groups') - db.create_table(m2m_table_name, ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('user', models.ForeignKey(orm[u'accounts.user'], null=False)), - ('group', models.ForeignKey(orm[u'auth.group'], null=False)) - )) - db.create_unique(m2m_table_name, ['user_id', 'group_id']) - - # Adding M2M table for field user_permissions on 'User' - m2m_table_name = db.shorten_name(u'accounts_user_user_permissions') - db.create_table(m2m_table_name, ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('user', models.ForeignKey(orm[u'accounts.user'], null=False)), - ('permission', models.ForeignKey(orm[u'auth.permission'], null=False)) - )) - db.create_unique(m2m_table_name, ['user_id', 'permission_id']) - - # Adding model 'Calendar' - db.create_table(u'accounts_calendar', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['accounts.User'], unique=True)), - )) - db.send_create_signal(u'accounts', ['Calendar']) - - # Adding M2M table for field expositions on 'Calendar' - m2m_table_name = db.shorten_name(u'accounts_calendar_expositions') - db.create_table(m2m_table_name, ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('calendar', models.ForeignKey(orm[u'accounts.calendar'], null=False)), - ('exposition', models.ForeignKey(orm[u'exposition.exposition'], null=False)) - )) - db.create_unique(m2m_table_name, ['calendar_id', 'exposition_id']) - - # Adding M2M table for field conferences on 'Calendar' - m2m_table_name = db.shorten_name(u'accounts_calendar_conferences') - db.create_table(m2m_table_name, ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('calendar', models.ForeignKey(orm[u'accounts.calendar'], null=False)), - ('conference', models.ForeignKey(orm[u'conference.conference'], null=False)) - )) - db.create_unique(m2m_table_name, ['calendar_id', 'conference_id']) - - # Adding M2M table for field seminars on 'Calendar' - m2m_table_name = db.shorten_name(u'accounts_calendar_seminars') - db.create_table(m2m_table_name, ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('calendar', models.ForeignKey(orm[u'accounts.calendar'], null=False)), - ('seminar', models.ForeignKey(orm[u'seminar.seminar'], null=False)) - )) - db.create_unique(m2m_table_name, ['calendar_id', 'seminar_id']) - - # Adding M2M table for field webinars on 'Calendar' - m2m_table_name = db.shorten_name(u'accounts_calendar_webinars') - db.create_table(m2m_table_name, ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('calendar', models.ForeignKey(orm[u'accounts.calendar'], null=False)), - ('webinar', models.ForeignKey(orm[u'webinar.webinar'], null=False)) - )) - db.create_unique(m2m_table_name, ['calendar_id', 'webinar_id']) - - - def backwards(self, orm): - # Deleting model 'User' - db.delete_table(u'accounts_user') - - # Removing M2M table for field groups on 'User' - db.delete_table(db.shorten_name(u'accounts_user_groups')) - - # Removing M2M table for field user_permissions on 'User' - db.delete_table(db.shorten_name(u'accounts_user_user_permissions')) - - # Deleting model 'Calendar' - db.delete_table(u'accounts_calendar') - - # Removing M2M table for field expositions on 'Calendar' - db.delete_table(db.shorten_name(u'accounts_calendar_expositions')) - - # Removing M2M table for field conferences on 'Calendar' - db.delete_table(db.shorten_name(u'accounts_calendar_conferences')) - - # Removing M2M table for field seminars on 'Calendar' - db.delete_table(db.shorten_name(u'accounts_calendar_seminars')) - - # Removing M2M table for field webinars on 'Calendar' - db.delete_table(db.shorten_name(u'accounts_calendar_webinars')) - - - models = { - u'accounts.calendar': { - 'Meta': {'object_name': 'Calendar'}, - 'conferences': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['conference.Conference']", 'null': 'True', 'symmetrical': 'False'}), - 'expositions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['exposition.Exposition']", 'null': 'True', 'symmetrical': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'seminars': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['seminar.Seminar']", 'null': 'True', 'symmetrical': 'False'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['accounts.User']", 'unique': 'True'}), - 'webinars': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['webinar.Webinar']", 'null': 'True', 'symmetrical': 'False'}) - }, - u'accounts.user': { - 'Meta': {'object_name': 'User'}, - 'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'avatar': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), - 'city': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['city.City']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), - 'company': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'users'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['company.Company']"}), - 'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'users'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}), - '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'}), - 'descriptions': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', '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'}), - 'keywords': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - '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'}), - 'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'position': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'skype': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), - 'social': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - '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'}), - 'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': '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': {'object_name': 'City'}, - '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'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - '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': {'object_name': 'Company'}, - 'address': ('functions.custom_fields.LocationField', [], {'blank': 'True'}), - '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'}), - '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'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'social': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - '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']"}), - 'url': ('django.db.models.fields.SlugField', [], {'max_length': '50'}), - 'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) - }, - u'conference.conference': { - 'Meta': {'object_name': 'Conference'}, - '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', [], {'to': u"orm['city.City']", 'on_delete': 'models.PROTECT'}), - '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', [], {'to': u"orm['country.Country']", 'on_delete': 'models.PROTECT'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'currency': ('functions.custom_fields.EnumField', [], {'default': "'RUB'"}), - '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'}), - 'max_price': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'members': ('django.db.models.fields.PositiveIntegerField', [], {'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'}), - 'organiser': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference_organisers'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['organiser.Organiser']"}), - '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']"}), - 'quality_label': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), - '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': '50'}), - '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', [], {'null': 'True'}), - 'visitors': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', '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': {'object_name': 'Area'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - u'country.country': { - 'Meta': {'object_name': 'Country'}, - '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'}), - 'language': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['directories.Language']", 'null': 'True', 'blank': 'True'}), - 'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - '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': {'object_name': 'Currency'}, - 'currency': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 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': '50'}), - 'code': ('django.db.models.fields.CharField', [], {'max_length': '5'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - u'directories.language': { - 'Meta': {'object_name': 'Language'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'language': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'exposition.exposition': { - 'Meta': {'object_name': 'Exposition'}, - 'application_deadline': ('django.db.models.fields.DateField', [], {'null': 'True'}), - 'audience': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), - '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', [], {'to': u"orm['city.City']", 'on_delete': 'models.PROTECT'}), - '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', [], {'to': u"orm['country.Country']", 'on_delete': 'models.PROTECT'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'currency': ('functions.custom_fields.EnumField', [], {'default': "'RUB'"}), - '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'}), - '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'}), - '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'}), - 'organiser': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_organisers'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['organiser.Organiser']"}), - 'periodic': ('django.db.models.fields.FloatField', [], {'null': 'True', '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']"}), - 'price_all': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'price_all_bar': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'price_catalog': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'price_day': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'price_day_bar': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'quality_label': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), - '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']"}), - 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), - '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', 'null': 'True'}), - 'visitors': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) - }, - u'file.filemodel': { - 'Meta': {'object_name': 'FileModel'}, - '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'", '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'"}) - }, - u'organiser.organiser': { - 'Meta': {'object_name': 'Organiser'}, - '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'}), - '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'}), - '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']"}), - 'social': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - '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'}), - 'url': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), - 'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) - }, - u'place_conference.placeconference': { - 'Meta': {'object_name': 'PlaceConference'}, - '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', [], {'to': u"orm['city.City']", 'on_delete': 'models.PROTECT'}), - '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'}), - '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'"}), - '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', [], {'null': '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': "['translations__name']", 'object_name': 'PlaceExposition'}, - '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', [], {'to': u"orm['city.City']", 'on_delete': 'models.PROTECT'}), - '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'}), - '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'}), - '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'}), - 'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'press_centre': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), - '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'"}), - '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', [], {'null': 'True'}), - 'web_page': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), - 'wifi': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}) - }, - u'seminar.seminar': { - 'Meta': {'object_name': 'Seminar'}, - 'address': ('functions.custom_fields.LocationField', [], {'blank': 'True'}), - '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', [], {'to': u"orm['city.City']", 'on_delete': 'models.PROTECT'}), - 'company': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'seminar_companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['company.Company']"}), - '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'}), - 'currency': ('functions.custom_fields.EnumField', [], {'default': "'RUB'"}), - 'data_begin': ('django.db.models.fields.DateTimeField', [], {}), - 'data_end': ('django.db.models.fields.DateTimeField', [], {}), - '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'}), - 'max_price': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'members': ('django.db.models.fields.PositiveIntegerField', [], {'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'}), - 'organiser': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'seminar_organisers'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['organiser.Organiser']"}), - 'quality_label': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), - 'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), - 'tag': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'seminar_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': "'seminar_themes'", 'symmetrical': 'False', 'to': u"orm['theme.Theme']"}), - 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), - 'users': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'seminar_users'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['accounts.User']"}), - 'views': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), - 'visitors': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) - }, - u'theme.tag': { - 'Meta': {'object_name': 'Tag'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - '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': {'ordering': "['translations__name']", 'object_name': 'Theme'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'types': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), - 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}) - }, - u'translator.translator': { - 'Meta': {'object_name': 'Translator'}, - 'birth': ('django.db.models.fields.DateField', [], {}), - 'car': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'gender': ('functions.custom_fields.EnumField', [], {'default': "'male'"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - u'webinar.webinar': { - 'Meta': {'object_name': 'Webinar'}, - 'canceled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'canceled_by_administrator': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'company': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'webinar_companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['company.Company']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'currency': ('functions.custom_fields.EnumField', [], {'default': "'RUB'"}), - 'data_begin': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}), - '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'}), - 'max_price': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'members': ('django.db.models.fields.PositiveIntegerField', [], {'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'}), - 'organiser': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'webinar_organisers'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['organiser.Organiser']"}), - 'quality_label': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), - 'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), - 'tag': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'webinar_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': "'webinar_themes'", 'symmetrical': 'False', 'to': u"orm['theme.Theme']"}), - 'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), - 'users': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'webinar_users'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['accounts.User']"}), - 'views': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}), - 'visitors': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) - } - } - - complete_apps = ['accounts'] \ No newline at end of file diff --git a/city/models.py b/city/models.py index 2d4360c2..4026dfe0 100644 --- a/city/models.py +++ b/city/models.py @@ -15,8 +15,6 @@ from functions.models_methods import ExpoManager flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] - - class City(TranslatableModel): """ Create City model @@ -25,7 +23,6 @@ class City(TranslatableModel): """ objects = ExpoManager() - services = BitField(flags=flags) url = models.SlugField(unique=True) diff --git a/company/management/__init__.py b/company/management/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/company/management/__init__.py @@ -0,0 +1 @@ + diff --git a/company/management/commands/__init__.py b/company/management/commands/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/company/management/commands/__init__.py @@ -0,0 +1 @@ + diff --git a/company/management/commands/company_from_old_db.py b/company/management/commands/company_from_old_db.py new file mode 100644 index 00000000..44976daa --- /dev/null +++ b/company/management/commands/company_from_old_db.py @@ -0,0 +1,95 @@ +from django.core.management.base import BaseCommand, CommandError +from company.models import Company +from theme.models import Theme, Tag +from accounts.models import User +from functions.form_check import translit_with_separator +import datetime + +import MySQLdb +from MySQLdb.cursors import DictCursor + +def convert_to_int(st): + if not st: + return None + deduct = ('-','(',')','.',' ') + for elem in deduct: + st = st.replace(elem, '') + if st.isdigit(): + return int(st) + else: + return None + +class Command(BaseCommand): + def handle(self, *args, **options): + db = MySQLdb.connect(host="localhost", + user="root", + passwd="qazedc", + db="expomap_ru", + charset='utf8', + cursorclass=DictCursor) + + cursor = db.cursor() + sql = "select * from customers_company" + cursor.execute(sql) + + res = cursor.fetchall() + + + for c in res: + + phone = convert_to_int(c.get('phone')) + fax = convert_to_int(c.get('fax')) + url = c['url'] + if not url: + url = translit_with_separator(c.get('title')) + + + company = Company(id=c['company_id'], url=url, phone=phone, fax=fax, + email=c.get('email'), web_page=c.get('website'), twitter=c.get('twitter', '')) + + company.translate('ru') + company.name = c.get('title') + company.specialization = c.get('specialize') + company.description = c.get('about') + company.address_inf = c.get('adress') + print('not_saved: %s'%c['title']) + company.save() + user_id = c['customers_id'] + print('saved: %s'%str(company)) + user = User.objects.safe_get(id=user_id) + if user: + user.company = company + if not user.last_login: + now = datetime.datetime.now() + user.last_login = now + + user.save() + + theme = None + theme_id = c.get('theme') + if theme_id: + try: + theme = Theme.objects.get(id=theme_id) + except Theme.DoesNotExist: + continue + company.theme.add(theme) + + if not theme: + continue + + tags = c.get('tags') + if tags: + tags = tags.split(',') + if tags: + for tag_id in tags: + try: + tag = Tag.objects.get(id=tag_id) + except Tag.DoesNotExist: + continue + if tag.theme == theme: + company.tag.add(tag) + else: + continue + + #print(str(type(res[0]['phone']))) + print('success') \ No newline at end of file diff --git a/company/models.py b/company/models.py index 9d05f3a3..279a1ca2 100644 --- a/company/models.py +++ b/company/models.py @@ -3,13 +3,12 @@ from django.db import models from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from django.contrib.contenttypes import generic # +from django.utils.translation import ugettext as _ from functions.custom_fields import LocationField from functions.models_methods import ExpoManager from functions.model_mixin import ExpoMixin - - class Company(TranslatableModel, ExpoMixin): """ Create Company model @@ -20,7 +19,7 @@ class Company(TranslatableModel, ExpoMixin): objects = ExpoManager() files = generic.GenericRelation('file.FileModel', content_type_field='content_type', object_id_field='object_id') - url = models.SlugField() + url = models.SlugField(max_length=255) #relations creator = models.ForeignKey('accounts.User', verbose_name='Создатель', related_name='created_company', blank=True, null=True) @@ -39,7 +38,10 @@ class Company(TranslatableModel, ExpoMixin): fax = models.BigIntegerField(verbose_name='Факс', blank=True, null=True) web_page = models.CharField(verbose_name='Веб-сайт',max_length=255, blank=True) email = models.EmailField(verbose_name='Email', blank=True) - social = models.TextField(verbose_name='Социальные страници', blank=True) + facebook = models.URLField(verbose_name=_(u'Facebook'), blank=True) + twitter = models.URLField(verbose_name=_(u'Twitter'), blank=True) + linkedin = models.URLField(verbose_name=_(u'LinkedIn'), blank=True) + vk = models.URLField(verbose_name=_(u'В контакте'), blank=True) foundation = models.PositiveIntegerField(verbose_name='Год основания', blank=True, null=True) #translation fields translations = TranslatedFields( diff --git a/company/search_indexes.py b/company/search_indexes.py new file mode 100644 index 00000000..6bfe6f7c --- /dev/null +++ b/company/search_indexes.py @@ -0,0 +1,19 @@ +from haystack import indexes +from models import Company + +class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable): + text = indexes.CharField(document=True, use_template=True) + where = indexes.MultiValueField() + def prepare_where(self, obj): + country = [tr.name for tr in obj.country.translations.all()] + city = [tr.name for tr in obj.city.translations.all()] + + return country + city + + def get_model(self): + return Company + + def index_queryset(self, using=None): + + return self.get_model().objects.filter() + diff --git a/conference/models.py b/conference/models.py index a56c30f6..44b985dd 100644 --- a/conference/models.py +++ b/conference/models.py @@ -11,14 +11,14 @@ from functions.db import db_table_exists #custom functions from functions.custom_fields import EnumField from functions.models_methods import ExpoManager -from functions.model_mixin import EventMixin +from functions.model_mixin import EventMixin, ExpoMixin # check if table exist and create flags if true flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] CURRENCY = ('RUB', 'USD', 'EUR') -class Conference(TranslatableModel, EventMixin): +class Conference(TranslatableModel, EventMixin, ExpoMixin): """ Create Conference model diff --git a/conference/search_indexes.py b/conference/search_indexes.py new file mode 100644 index 00000000..1a1efec0 --- /dev/null +++ b/conference/search_indexes.py @@ -0,0 +1,20 @@ +from haystack import indexes +from models import Conference + + +class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable): + text = indexes.CharField(document=True, use_template=True) + where = indexes.MultiValueField() + def prepare_where(self, obj): + country = [tr.name for tr in obj.country.translations.all()] + city = [tr.name for tr in obj.city.translations.all()] + + return country + city + + def get_model(self): + return Conference + + def index_queryset(self, using=None): + + return self.get_model().objects.filter(is_published=True) + diff --git a/core/views.py b/core/views.py index e2702dbf..3edc0f0d 100644 --- a/core/views.py +++ b/core/views.py @@ -10,6 +10,36 @@ from django.utils.translation import ugettext as _ from forms import PlaceSearchForm +from functions.search_forms import EventSearchForm +from haystack.query import EmptySearchQuerySet + +class EventSearchView(ListView): + paginate_by = 2 + template_name = 'exposition/search.html' + search_form = EventSearchForm + + + def get_queryset(self): + if self.request.GET: + form = self.search_form(self.request.GET) + if form.is_valid(): + return form.search() + else: + return EmptySearchQuerySet() + else: + return EmptySearchQuerySet() + + + def get_context_data(self, **kwargs): + context = super(EventSearchView, self).get_context_data(**kwargs) + context['search_form'] = EventSearchForm(self.request.GET) + queries = self.request.GET.copy() + if queries.has_key('page'): + del queries['page'] + context['queries'] = queries + context['search_action'] = '/events/search/' + + return context class PlaceSearchView(ListView): paginate_by = 2 diff --git a/country/models.py b/country/models.py index 78fdb263..fde98425 100644 --- a/country/models.py +++ b/country/models.py @@ -37,6 +37,9 @@ class Area(TranslatableModel): name = models.CharField(max_length=255), ) + def __unicode__(self): + return self.lazy_translation_getter('name', unicode(self.pk)) + class Country(TranslatableModel): """ Create Country model diff --git a/exposition/models.py b/exposition/models.py index 767796c8..e71678a7 100644 --- a/exposition/models.py +++ b/exposition/models.py @@ -13,7 +13,7 @@ from organiser.models import Organiser from functions.custom_fields import EnumField from functions.signal_handlers import post_save_handler, pre_save_handler from functions.models_methods import ExpoManager -from functions.model_mixin import EventMixin +from functions.model_mixin import EventMixin, ExpoMixin AUDIENCE1 = ((None,_(u'Не выбрано')), ('experts', _(u'Специалисты')), @@ -33,7 +33,7 @@ CURRENCY = ('RUB', 'USD', 'EUR') flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] -class Exposition(TranslatableModel, EventMixin): +class Exposition(TranslatableModel, EventMixin, ExpoMixin): """ Create Exposition model @@ -137,6 +137,10 @@ class Exposition(TranslatableModel, EventMixin): def __unicode__(self): return self.lazy_translation_getter('name', unicode(self.pk)) + def get_index_text(self): + names = [tr.name for tr in self.translations.all()] + return names + def get_audience(self): checked = [item for item, bool in self.audience if bool==True] audience = [] diff --git a/exposition/search_indexes.py b/exposition/search_indexes.py index 43e8333a..6c85cc24 100644 --- a/exposition/search_indexes.py +++ b/exposition/search_indexes.py @@ -1,15 +1,20 @@ -""" from haystack import indexes from models import Exposition -class ExpositionIndex(indexes.SearchIndex, indexes.Indexable): - text = indexes.CharField(document=True) +class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable): + text = indexes.CharField(document=True, use_template=True) + where = indexes.MultiValueField() + def prepare_where(self, obj): + country = [tr.name for tr in obj.country.translations.all()] + city = [tr.name for tr in obj.city.translations.all()] + return country + city def get_model(self): return Exposition def index_queryset(self, using=None): - return self.get_model().objects.filter() -""" \ No newline at end of file + + return self.get_model().objects.filter(is_published=True) + diff --git a/functions/custom_fields.py b/functions/custom_fields.py index 4d57b0b4..8bde64e8 100644 --- a/functions/custom_fields.py +++ b/functions/custom_fields.py @@ -20,6 +20,9 @@ from south.modelsinspector import add_introspection_rules add_introspection_rules([], ["^functions\.custom_fields\.EnumField", "^functions\.custom_fields\.LocationField"]) +# dont delete + + class EnumField(models.Field): """ A field class that maps to MySQL's ENUM type. diff --git a/functions/forms.py b/functions/forms.py index 59fb9355..4bff664f 100644 --- a/functions/forms.py +++ b/functions/forms.py @@ -2,7 +2,6 @@ from django import forms from django.utils.translation import ugettext_lazy as _ from theme.models import Theme - from haystack.query import SearchQuerySet class AdminSearchForm(forms.Form): @@ -10,15 +9,25 @@ class AdminSearchForm(forms.Form): class ThemeSearch(forms.Form): - event = forms.MultipleChoiceField(required=False,widget=forms.CheckboxSelectMultiple, choices=[(0, _(u'выставки')), - (1, _(u'конференции')), - (2, _(u'семинары')), - (3, _(u'вебинары'))]) - theme = forms.ModelMultipleChoiceField(required=False, queryset=Theme.objects.all(), + event = forms.MultipleChoiceField(required=False, + widget=forms.CheckboxSelectMultiple(attrs={'class': 'topicChecks'}), + choices=[('exposition', _(u'выставки')), + ('conference', _(u'конференции')), + ('seminar', _(u'семинары')), + ('webinar', _(u'вебинары'))]) + theme = forms.ModelMultipleChoiceField(required=False, queryset=[], widget=forms.CheckboxSelectMultiple) +from country.models import Area +class PlaceSearch(forms.Form): + r = forms.ModelMultipleChoiceField(queryset=Area.objects.all(), required=False, + widget=forms.CheckboxSelectMultiple()) + c = forms.CharField(widget=forms.CheckboxSelectMultiple(), required=False) + t = forms.CharField(widget=forms.CheckboxSelectMultiple()) + + class AbstractSearch(forms.Form): q = forms.CharField(label=_(u'Поиск'), required=False) w = forms.CharField(label=_(u'Где'), required=False) diff --git a/functions/model_mixin.py b/functions/model_mixin.py index 5b4749c0..2420d27e 100644 --- a/functions/model_mixin.py +++ b/functions/model_mixin.py @@ -2,6 +2,11 @@ from service.models import Service import calendar as python_calendar class ExpoMixin(object): + + def get_index_text(self): + names = [tr.name for tr in self.translations.all()] + return names + def get_logo(self): logo = self.files.filter(purpose='logo') diff --git a/functions/search_forms.py b/functions/search_forms.py new file mode 100644 index 00000000..e1ffc89a --- /dev/null +++ b/functions/search_forms.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from django import forms +from django.utils.translation import ugettext_lazy as _ +from haystack.query import EmptySearchQuerySet, SearchQuerySet + +from exposition.models import Exposition +from conference.models import Conference +from seminar.models import Seminar +from webinar.models import Webinar + +class EventSearchForm(forms.Form): + q = forms.CharField(label=_(u'Поиск'), required=False) + w = forms.CharField(label=_(u'Где'), required=False) + + def search(self): + + if not self.is_valid(): + return EmptySearchQuerySet() + q = self.cleaned_data.get('q') + w = self.cleaned_data.get('w') + + if not q and not w: + return EmptySearchQuerySet() + sqs = SearchQuerySet().models(Exposition, Conference, Seminar, Webinar) + + if q: + sqs = sqs.auto_query(q) + if w: + sqs = sqs.filter(where__contains=w) + + return sqs + diff --git a/functions/signal_handlers.py b/functions/signal_handlers.py index f9a1d8f4..d2a49d65 100644 --- a/functions/signal_handlers.py +++ b/functions/signal_handlers.py @@ -5,6 +5,7 @@ from functions.form_check import translit_with_separator def pre_save_handler(sender, **kwargs): obj = kwargs['instance'] + if obj.language_code =='en': try: name = getattr(obj, 'name') @@ -12,6 +13,7 @@ def pre_save_handler(sender, **kwargs): except AttributeError: pass + if not obj.url: obj.url = ''.join([random.choice(string.ascii_lowercase) for n in xrange(8)]) diff --git a/import_xls/excel_settings.py b/import_xls/excel_settings.py index 62e9d1cd..8dd2c359 100644 --- a/import_xls/excel_settings.py +++ b/import_xls/excel_settings.py @@ -402,11 +402,11 @@ place_exp_sett = { u'Адрес':{u'field': u'adress', u'func': unicode}, u'Тел.':{u'field': u'phone', u'func': to_phone}, u'Факс':{u'field': u'fax', u'func': to_phone}, - u'Фото':{u'field': u'photo', u'func': save_photo, u'method': True},#сделать - u'Лого':{u'field': u'logo', u'func': save_file, u'method': True, u'purpose': 'logo'},#сделать + u'Фото':{u'field': u'photo', u'func': save_photo, u'method': True}, + u'Лого':{u'field': u'logo', u'func': save_file, u'method': True, u'purpose': 'logo'}, u'Веб-сайт':{u'field': u'web_page', u'func': unicode}, u'Email':{u'field': u'email', u'func': unicode}, - u'Карта проезда':{u'field': u'map', u'func': save_file, u'method': True, u'purpose': 'map'},#сделать + u'Карта проезда':{u'field': u'map', u'func': save_file, u'method': True, u'purpose': 'map'}, u'Виртуальный тур':{u'field': u'virtual_tour', u'func': to_url}, u'Год основания':{u'field': u'foundation_year', u'func': to_int}, u'Количество мероприятий в год':{u'field': u'event_in_year', u'func': to_int}, @@ -414,7 +414,7 @@ place_exp_sett = { u'Закрытая выставочная площадь, кв. м.':{u'field': u'closed_area', u'func': to_int}, u'Открытая выставочная площадь, кв. м.':{u'field': u'open_area', u'func': to_int}, u'Количество павильонов':{u'field': u'total_pavilions', u'func': to_int}, - u'Площадь павильонов/залов (по номерам)':{u'field': u'halls', u'func': save_halls, u'method': True},#!!! + u'Площадь павильонов/залов (по номерам)':{u'field': u'halls', u'func': save_halls, u'method': True}, u'Конференц-залы':{u'field': u'total_halls', u'func': to_int}, u'Схема территории':{u'field': u'scheme', u'func': save_file, u'method': True, u'purpose': 'scheme teritory'},#сделать u'Банк/Банкоматы/Обмен валюты':{u'field': u'bank', u'func': bool}, @@ -431,6 +431,78 @@ place_exp_sett = { u'Мобильное приложение':{u'field': u'mobile_application', u'func': bool}, } +event_sett = { + u'ID':{u'field': u'id', u'func': to_int}, + u'Название':{u'field': u'name', u'func': unicode}, + u'Краткое описание':{u'field': u'main_title', u'func': unicode}, + u'Дата начала:(YYYY-MM-DD)':{u'field': u'data_begin', u'func': to_date}, + u'Дата окончания:(YYYY-MM-DD)':{u'field': u'data_end', u'func': to_date}, + u'Страна':{u'field': u'country', u'func': to_country}, + u'Город':{u'field': u'city', u'func': to_city, 'extra_values': 'country'}, + u'Место проведения':{u'field': u'place', u'func': unicode},##### + u'ID Тематики':{u'field': u'theme', u'func': to_theme}, + u'Теги':{u'field': u'tag', u'func': to_tag}, + u'Организатор №1':{u'field': u'organiser', u'func': to_tag},#### + u'Организатор №2':{u'field': u'organiser', u'func': to_tag},#### + u'Описание события':{u'field': u'description', u'func': unicode}, + u'Периодичность':{u'field': u'periodic', u'func': unicode},### + u'Аудитория':{u'field': u'audience', u'func': to_audience}, + u'Логотип':{u'field': u'logo', u'func': save_file, u'method': True, u'purpose': 'logo'}, + u'Официальный веб-сайт':{u'field': u'web_page', u'func': to_url}, + u'Экспонируемые продукты':{u'field': u'products', u'func': unicode}, + u'Время работы':{u'field': u'time', u'func': unicode}, + u'Валюта':{u'field': u'currency', u'func': unicode}, + # + u'Посетители_билет (1 день)':{u'field': u'price_day', u'func': to_int}, + u'Посетители_билет (все дни)':{u'field': u'price_all', u'func': to_int}, + u'Условия':{u'field': u'periodic', u'func': unicode}, + #u'Посетители_билет (1 день)':{u'field': u'price_day_bar', u'func': to_int},##?? + #u'Посетители_билет (все дни)':{u'field': u'price_all_bar', u'func': to_int},##?? + #u'Условия':{u'field': u'periodic', u'func': unicode},##?? + #u'Примечание':{u'field': u'periodic', u'func': unicode}, + u'Каталог':{u'field': u'price_catalog', u'func': to_int}, + u'Налог включен':{u'field': u'tax', u'func': bool}, + u'Год основания':{u'field': u'foundation_year', u'func': to_int}, + #u'Данные за год':{u'field': u'periodic', u'func': to_int}, + u'Посетители':{u'field': u'visitors', u'func': to_int}, + u'Участники':{u'field': u'members', u'func': to_int}, + #u'Страны':{u'field': u'periodic', u'func': unicode},##?? + u'Площадь':{u'field': u'periodic', u'func': to_int}, + u'Min_Raw кв.м.':{u'field': u'min_closed_area', u'func': to_int}, + u'Max_Raw кв.м.':{u'field': u'max_closed_area', u'func': to_int}, + u'Min_Pack кв.м.':{u'field': u'min_closed_equipped_area', u'func': to_int}, + u'Max_Pack кв.м.':{u'field': u'max_closed_equipped_area', u'func': to_int}, + u'Открытая площадь':{u'field': u'max_open_area', u'func': to_int}, + u'Мин. Площадь кв.м.':{u'field': u'min_open_area', u'func': to_int}, + u'Регистрационный взнос':{u'field': u'registration_payment', u'func': to_int}, + #u'Примечание':{u'field': u'periodic', u'func': unicode}, + u'Крайний срок подачи заявки':{u'field': u'application_deadline', u'func': to_date}, + u'UFI':{u'field': u'quality_label', u'func': bool},## + u'РСВЯ':{u'field': u'quality_label', u'func': bool},## + u'EXPORATING':{u'field': u'quality_label', u'func': bool},## + u'Отменена':{u'field': u'canceled', u'func': bool}, + u'ExpoHIT':{u'field': u'expohit', u'func': bool}, + u'Фото':{u'field': u'photo', u'func': save_photo, u'method': True}, + + + + + + + + + + + + + + + + + + # +} + import_settings={ 'name': {'func': unicode}, 'url': {'func': unicode}, diff --git a/accounts/migrations/__init__.py b/organiser/management/__init__.py similarity index 100% rename from accounts/migrations/__init__.py rename to organiser/management/__init__.py diff --git a/organiser/management/commands/__init__.py b/organiser/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/organiser/management/commands/organiser_from_old_db.py b/organiser/management/commands/organiser_from_old_db.py new file mode 100644 index 00000000..ce0e2b19 --- /dev/null +++ b/organiser/management/commands/organiser_from_old_db.py @@ -0,0 +1,108 @@ +from django.core.management.base import BaseCommand, CommandError +from organiser.models import Organiser +from theme.models import Theme, Tag +from functions.form_check import translit_with_separator + +import MySQLdb +from MySQLdb.cursors import DictCursor + +def convert_to_int(st): + if not st: + return None + deduct = ('-','(',')','.',' ') + for elem in deduct: + st = st.replace(elem, '') + if st.isdigit(): + return int(st) + else: + return None + + +class Command(BaseCommand): + def handle(self, *args, **options): + db = MySQLdb.connect(host="localhost", + user="root", + passwd="qazedc", + db="expomap_ru", + charset='utf8', + cursorclass=DictCursor) + + cursor = db.cursor() + + + + sql = """SELECT DISTINCT(customers_company) as name, specialize, otrasly as theme, tags, adress, + phone, fax, email, website, twitter, about, customers_company.url + FROM customers + LEFT JOIN customers_company + ON customers.customers_company=customers_company.title + WHERE customers_status = 4 + """ + + cursor.execute(sql) + + res = cursor.fetchall() + + + for o in res: + if not o.get('name'): + continue + phone = convert_to_int(o.get('phone')) + fax = convert_to_int(o.get('fax')) + url = o['url'] + if not url: + url = translit_with_separator(o.get('name')) + + if isinstance(o['email'], unicode): + + organiser = Organiser(url=url, phone=phone, fax=fax, email=o.get('email', ''), + twitter=o.get('twitter', '') + ) + + organiser.translate('ru') + organiser.name = o.get('name') + organiser.specialization = o.get('specialize') + organiser.address_inf = o.get('adress') + organiser.description = o.get('about') + + if organiser.name: + print('not_saved: %s'%o['name']) + organiser.save() + print('saved: %s'%str(organiser)) + + theme = None + theme_id = o.get('theme') + if theme_id: + try: + theme = Theme.objects.get(id=theme_id) + except Theme.DoesNotExist: + continue + organiser.theme.add(theme) + + if not theme: + continue + + tags = o.get('tags') + if tags: + tags = tags.split(',') + if tags: + for tag_id in tags: + try: + tag = Tag.objects.get(id=tag_id) + except Tag.DoesNotExist: + continue + if tag.theme == theme: + organiser.tag.add(tag) + else: + continue + + else: + organiser = Organiser(url=translit_with_separator(o['name'])) + organiser.translate('ru') + organiser.name = o['name'] + if organiser.name: + organiser.save() + print(organiser) + + print('success') + diff --git a/organiser/models.py b/organiser/models.py index 55b4f464..10532826 100644 --- a/organiser/models.py +++ b/organiser/models.py @@ -7,6 +7,7 @@ from django.db.models.signals import post_save #custom functions from functions.signal_handlers import post_save_handler from functions.custom_fields import LocationField +from django.utils.translation import ugettext as _ class OrganiserManager(TranslationManager): def safe_get(self, **kwargs): @@ -27,7 +28,7 @@ class Organiser(TranslatableModel): #set manager of this model objects = OrganiserManager() - url = models.SlugField(verbose_name='URL', blank=True) + url = models.SlugField(verbose_name='URL', blank=True, max_length=255) #relations country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True, on_delete=models.PROTECT) @@ -42,7 +43,10 @@ class Organiser(TranslatableModel): fax = models.BigIntegerField(verbose_name='Факс', blank=True, null=True) web_page = models.CharField(verbose_name='Веб-сайт',max_length=255, blank=True) email = models.EmailField(verbose_name='Email', blank=True) - social = models.TextField(verbose_name='Социальные страницы', blank=True) + facebook = models.URLField(verbose_name=_(u'Facebook'), blank=True) + twitter = models.URLField(verbose_name=_(u'Twitter'), blank=True) + linkedin = models.URLField(verbose_name=_(u'LinkedIn'), blank=True) + vk = models.URLField(verbose_name=_(u'В контакте'), blank=True) foundation = models.PositiveIntegerField(verbose_name='Год основания', blank=True, null=True) events_number = models.PositiveIntegerField(verbose_name='Количество мероприятий', blank=True, null=True) staff_number = models.PositiveIntegerField(verbose_name='Количество сотрудников', blank=True, null=True) diff --git a/place_conference/models.py b/place_conference/models.py index edaa50f8..06577ab9 100644 --- a/place_conference/models.py +++ b/place_conference/models.py @@ -11,9 +11,11 @@ import copy from django.utils.translation import ugettext as _ from conference.models import Conference +from functions.model_mixin import ExpoMixin + CONFERENCE_TYPE = (('Convention centre', 'Конгресс-центр'), ('Exposition centre', 'Конференц зал'),) -class PlaceConference(TranslatableModel): +class PlaceConference(TranslatableModel, ExpoMixin): """ Create PlaceConference model diff --git a/place_conference/search_indexes.py b/place_conference/search_indexes.py new file mode 100644 index 00000000..461f46c8 --- /dev/null +++ b/place_conference/search_indexes.py @@ -0,0 +1,20 @@ +from haystack import indexes +from models import PlaceConference + + +class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable): + text = indexes.CharField(document=True, use_template=True) + where = indexes.MultiValueField() + def prepare_where(self, obj): + country = [tr.name for tr in obj.country.translations.all()] + city = [tr.name for tr in obj.city.translations.all()] + + return country + city + + def get_model(self): + return PlaceConference + + def index_queryset(self, using=None): + + return self.get_model().objects.filter() + diff --git a/place_exposition/models.py b/place_exposition/models.py index 5e3e6d78..9952ad42 100644 --- a/place_exposition/models.py +++ b/place_exposition/models.py @@ -11,6 +11,7 @@ from functions.custom_fields import EnumField, LocationField from functions.signal_handlers import post_save_handler, pre_save_handler from functions.models_methods import ExpoManager import copy +from functions.model_mixin import ExpoMixin from exposition.models import Exposition from place_conference.models import PlaceConference @@ -18,7 +19,7 @@ from place_conference.models import PlaceConference EXPOSITION_TYPE = (('Exposition complex', u'Выставочный комплекс'), ('Convention centre', u'Конгрессно-выставочный центр'), ('Exposition centre', u'Выставочный центр'),) -class PlaceExposition(TranslatableModel): +class PlaceExposition(TranslatableModel, ExpoMixin): """ Create PlaceConference model diff --git a/place_exposition/search_indexes.py b/place_exposition/search_indexes.py index 9235ffbf..26708af0 100644 --- a/place_exposition/search_indexes.py +++ b/place_exposition/search_indexes.py @@ -1,8 +1,5 @@ from haystack import indexes from models import PlaceExposition -from django.conf import settings - - class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable): @@ -14,14 +11,6 @@ class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable): return country + city - """ - translations = indexes.MultiValueField() - - def prepare_translations(self, obj): - - return [tr.name for tr in obj.translations.all()] - """ - def get_model(self): return PlaceExposition diff --git a/proj/settings.py b/proj/settings.py index 54e2b4e1..33295da1 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -159,7 +159,7 @@ TEMPLATE_CONTEXT_PROCESSORS = ( 'social.apps.django_app.context_processors.backends', 'social.apps.django_app.context_processors.login_redirect', 'django_messages.context_processors.inbox', - "settings.settings.expo_context" + "proj.views.expo_context" ) #LOGIN_REDIRECT_URL = '/' diff --git a/proj/urls.py b/proj/urls.py index 1b4239b0..e48639d8 100644 --- a/proj/urls.py +++ b/proj/urls.py @@ -2,11 +2,10 @@ from django.conf.urls import patterns, include, url from views import AdvertisingView -from core.views import PlaceListView, PlacePhotoView, PlaceSearchView +from core.views import PlaceListView, PlacePhotoView, PlaceSearchView, EventSearchView from views import MainPageView - urlpatterns = patterns('', url(r'^$', MainPageView.as_view()), url(r'^', include('accounts.urls')), @@ -22,6 +21,7 @@ urlpatterns = patterns('', url(r'^messages/', include('django_messages.urls')), url(r'^advertising/$', AdvertisingView.as_view()), + url(r'^events/search/$', EventSearchView.as_view()), url(r'^places/search/$', PlaceSearchView.as_view()), url(r'^places/(?P.*)/photo/$', PlacePhotoView.as_view()), url(r'^places/(?P.*)/(?P\d+)/$', PlaceListView.as_view()), diff --git a/proj/views.py b/proj/views.py index f5ced3b9..0d6992af 100644 --- a/proj/views.py +++ b/proj/views.py @@ -8,6 +8,12 @@ from news.models import News from article.models import Article from django.views.generic import TemplateView +from functions.forms import ThemeSearch, PlaceSearch +from functions.search_forms import EventSearchForm +def expo_context(request): + cont = {'theme_search_form': ThemeSearch(), 'place_search_form': PlaceSearch()} + return cont + class MainPageView(TemplateView): template_name = 'index.html' @@ -23,9 +29,12 @@ class MainPageView(TemplateView): args = {'events': events, 'exposition_themes': exposition_themes, 'conference_themes': conference_themes, 'seminar_themes': seminar_themes, - 'news_list': news_list, 'articles': articles} + 'news_list': news_list, 'articles': articles, 'search_form': EventSearchForm, + 'search_action': '/events/search/'} + context.update(args) + return context diff --git a/seminar/models.py b/seminar/models.py index f03fc11c..c5e9eaa0 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -11,14 +11,14 @@ from functions.db import db_table_exists from functions.custom_fields import EnumField from functions.custom_fields import LocationField from functions.models_methods import ExpoManager -from functions.model_mixin import EventMixin +from functions.model_mixin import EventMixin, ExpoMixin # check if table exist and create flags if true flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] CURRENCY = ('RUB', 'USD', 'EUR') -class Seminar(TranslatableModel, EventMixin): +class Seminar(TranslatableModel, EventMixin, ExpoMixin): """ Create Seminar model diff --git a/seminar/search_indexes.py b/seminar/search_indexes.py new file mode 100644 index 00000000..425bedaa --- /dev/null +++ b/seminar/search_indexes.py @@ -0,0 +1,20 @@ +from haystack import indexes +from models import Seminar + + +class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable): + text = indexes.CharField(document=True, use_template=True) + where = indexes.MultiValueField() + def prepare_where(self, obj): + country = [tr.name for tr in obj.country.translations.all()] + city = [tr.name for tr in obj.city.translations.all()] + + return country + city + + def get_model(self): + return Seminar + + def index_queryset(self, using=None): + + return self.get_model().objects.filter() + diff --git a/settings/settings.py b/settings/settings.py index b404b40c..93c4b9e8 100644 --- a/settings/settings.py +++ b/settings/settings.py @@ -1,11 +1,9 @@ -from functions.forms import ThemeSearch +from functions.forms import ThemeSearch, PlaceSearch + -def expo_context(request): - cont = {'theme_search_form': ThemeSearch()} - return cont date_formats = ['%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' '%Y-%m-%d %H:%M', # '2006-10-25 14:30' diff --git a/static/client/css/main.css b/static/client/css/main.css index 4909304a..966f988e 100644 --- a/static/client/css/main.css +++ b/static/client/css/main.css @@ -2088,27 +2088,30 @@ button.icon-save:before { background: none; } -.sf-field-wrap .sf-autocomplete { +.sf-autocomplete { position: relative; - z-index: 0; + z-index: 3048; height: 40px; - margin-top: -40px; + display: none; +} +.sf-autocomplete.show { + display: block; } -.sf-field-wrap .sf-autocomplete .sfa-wrap { +.sf-autocomplete .sfa-wrap { position: absolute; left: 0; width: 100%; top: 0; background: #fff; - padding: 40px 20px 20px 20px; + padding: 20px 20px 20px 20px; overflow: hidden; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; -webkit-box-shadow: 0 0 0 3px rgba(0, 0, 0, .2); -moz-box-shadow: 0 0 0 3px rgba(0, 0, 0, .2); box-shadow: 0 0 0 3px rgba(0, 0, 0, .2); @@ -2124,13 +2127,13 @@ button.icon-save:before { } -.sf-field-wrap:first-child .sf-autocomplete .sfa-wrap { +.sf-autocomplete .sfa-wrap { -webkit-border-radius: 4px 0 4px 4px; -moz-border-radius: 4px 0 4px 4px; border-radius: 4px 0 4px 4px; } -.sf-field-wrap .sf-autocomplete .sfa-wrap.show { +.sf-autocomplete .sfa-wrap.show { visibility: visible; } @@ -3945,12 +3948,12 @@ form.s-message { } -.c-select-box .csb-menu .places-list { +.c-select-box .csb-menu .places-list, .c-select-box .csb-menu .topics-list { width: 260px; float: left; } -.c-select-box .csb-menu .places-list > ul > li > a { +.c-select-box .csb-menu .places-list > ul > li > a, .c-select-box .csb-menu .topics-list > ul > li > a { display: inline-block; border-bottom: 1px dashed; text-decoration: none; @@ -3959,17 +3962,18 @@ form.s-message { } .c-select-box .csb-menu .places-list > ul > li.active > a, -.c-select-box .csb-menu .places-list > ul > li.active > label { +.c-select-box .csb-menu .places-list > ul > li.active > label, .c-select-box .csb-menu .topics-list > ul > li.active > a, +.c-select-box .csb-menu .topics-list > ul > li.active > label { color: #ff6600; } -.c-select-box .csb-menu .places-list > ul ul { +.c-select-box .csb-menu .places-list > ul ul, .c-select-box .csb-menu .topics-list > ul ul { margin: 5px 0 15px 10px; font-size: 16px; display: none; } -.c-select-box .csb-menu .places-list > ul li.active ul { +.c-select-box .csb-menu .places-list > ul li.active ul, .c-select-box .csb-menu .topics-list > ul li.active > ul { display: block; } @@ -9914,4 +9918,14 @@ a.order-button:hover .ob-text, padding-bottom: 5px; width: 65%; +} + +.fancybox-inner { + overflow: visible!important; +} +#pw-subj { + min-height: 480px; +} +#mCSB_1 { + min-height: 188px; } \ No newline at end of file diff --git a/static/client/js/main.js b/static/client/js/main.js index 8d0f7965..879d966b 100644 --- a/static/client/js/main.js +++ b/static/client/js/main.js @@ -171,6 +171,7 @@ function addError(inputId, msg){ /* Нестандартное оформление для поля select */ $.fn.customSelect = function () { return $(this).each(function() { + var $this = $(this); var $options = $this.children('option'); var numberOfOptions = $this.children('option').length; @@ -218,6 +219,9 @@ function addError(inputId, msg){ $styledSelect.on('click', function(e) { e.stopPropagation(); //$('div.styledSelect.active').each(function() { + $('div.styledSelect.active').each(function() { + $(this).removeClass('active').next('.options').hide(); + }); $('div.custom-select-wrap.active').not(this).each(function() { $(this).removeClass('active').next('.options').hide(); }); @@ -290,18 +294,91 @@ function addError(inputId, msg){ /* Обработка autocomplete в полях поиска * используется jQuery UI Autocomplete * */ - var data = [ - { label: 'Машпром 2013', type: '', category: 'События' }, - { label: 'Маркетинг, реклама, PR', type: '', category: 'Тематики:' }, - { label: 'Машиностроение, автоматизация, робототехника', type: '', category: 'Тематики:' }, - { label: 'Маркетинг, реклама, PR', type: '', category: 'Тематики:' }, - { label: 'Маркеты', type: '', category: 'Теги:' }, - { label: 'Маркетинг', type: 'выставки', category: 'Теги:' }, - { label: 'Маркетинг', type: 'конференции', category: 'Теги:' }, - { label: 'Магазины', type: '', category: 'Теги:' }, - { label: 'Маркетинг', type: '', category: 'Теги:' } - ]; + $('input.topicChecks').each(function() { + + if ($(this).prop('checked')==false) { + + $('li.level1.'+$(this).val()+'').each(function() { + $(this).find('>label.active').first().trigger('click'); + $(this).find('ul li label.active').trigger('click'); + $(this).hide().addClass('noAC').find('li').each(function() { + $(this).addClass('noAC'); + }); + }) + } + else { + $('li.level1.'+$(this).val()+'').each(function() { + $(this).fadeIn(); + $(this).removeClass('noAC').find('.noAC').each(function() { + $(this).removeClass('noAC'); + }); + + }); + }; + }); + var data=[]; + function rebuildTopicsAC() { + data=[]; + $('.topics-list').find('li:not(.noAC)').each( + function() { + if ($(this).find('a').text().length>0) { + data.push({sid: $(this).find('>label span input').attr('value'),type: $(this).attr('data-type'), category: '', label: $(this).find('>a').text()}); + } + else { + data.push({sid: $(this).find('>label span input').attr('value'),type: $(this).attr('data-type'), category: $(this).parents().eq(1).find('>a').text()+':', label: $(this).text() }); + } + + } + ); + + $('input[type="text"].topicAC').each(function () { + var $input = $(this); + var $iWrap = $($input.parent()); + var $acWrap = $('
'); + var $acSect = $acWrap.find('.sfa-wrap'); + $iWrap.parent().append(''); + $acWrap.appendTo($iWrap); + + $input.catcomplete({ + appendTo: $acSect, + delay: 0, + source: data, + open: function () { + $acSect.addClass('show').parent().addClass('show'); + }, + close: function () { + $acSect.removeClass('show').parent().removeClass('show'); + }, + select: function( event, ui ) { + //var item_to_select=ui.item.label; + var input_ID=ui.item.sid; + $('#top_ac_hidden').val(ui.item.id); + if ($('input[value="'+input_ID+'"]').parents().eq(1).hasClass('active')) { + $('#ac_animes_t').css({'opacity':0,'display':'block'}).animate({opacity:1}, 500, function() { + setTimeout(function() { + $('#ac_animes_t').stop().animate({opacity:0}, 500, function() { + $('#ac_animes_t').css({'display':'none'}) + }); + }, 1000); + }); + } + else { + $('input[value="'+input_ID+'"]').parents().eq(1).trigger('click'); + } + $(this).val(''); + return false; + } + }).data( 'customCatcomplete' )._renderItem = function( ul, item ) { + var descr = item.type != '' ? ' (' + item.type + ')' : ''; + return $( '
  • ' ) + .append( '' + item.label + descr + '' ) + .appendTo( ul ); + }; + }); + }; + rebuildTopicsAC(); +/* $('input[type="text"].autocomplete').each(function () { var $input = $(this); var $iWrap = $input.closest('.sf-field-wrap'); @@ -331,7 +408,7 @@ function addError(inputId, msg){ .appendTo( ul ); }; }); - +*/ /* Галереи-слайдеры на главной * использован плагин Swiper * http://www.idangero.us/sliders/swiper/api.php @@ -751,7 +828,8 @@ function addError(inputId, msg){ enable: false }, advanced:{ - updateOnContentResize: true + updateOnContentResize: true, + autoScrollOnFocus: false } }); }); @@ -928,13 +1006,41 @@ function addError(inputId, msg){ } }); + $('input.topicChecks').change(function() { + + if ($(this).prop('checked')==false) { + + $('li.level1.'+$(this).val()+'').each(function() { + var s_ID='s'+$(this).find('>label span input').attr('value'); + $('.csb-selected.show div#'+s_ID).parent().removeClass('show'); + $(this).find('>label.active').first().trigger('click'); + $(this).find('ul li label.active').trigger('click'); + $(this).hide().addClass('noAC').find('li').each(function() { + $(this).addClass('noAC'); + }); + rebuildTopicsAC(); + }) + } + else { + $('li.level1.'+$(this).val()+'').each(function() { + $(this).fadeIn(); + $(this).removeClass('noAC').find('.noAC').each(function() { + $(this).removeClass('noAC'); + }); + + }); + rebuildTopicsAC(); + }; + + }); + $('div.c-select-box').each(function () { var $sb = $(this); var $showContainer = $sb.children('div.csb-selected-items'); var $selected = $(''); var $checks = $sb.find('input[type="checkbox"]'); var $qSelClear = $sb.find('div.q-sel > a.clear'); - var $smSwitchers = $sb.find('.places-list li > a'); + var $smSwitchers = $sb.find('.places-list li > a, .places-list ul li ul li label a, .topics-list li > a, .topics-list ul li ul li label a'); if (!$sb.hasClass('disabled')) { $checks @@ -948,19 +1054,26 @@ function addError(inputId, msg){ var $clear = $elShow.find('a.csbs-del'); $elText.text(labelText); + $elShow.find('>div').prop('id','s'+$label.find('input').prop('value')); $clear.on('click', function () { - $checks.eq(index).prop('checked', false); - $label.removeClass('active'); + $elShow.removeClass('show'); if ($showContainer.children('.show').length < 1 ) { $showContainer.removeClass('show'); } + var li_ID=$(this).parent().find('div').attr('id').substring(1); + $('.places-list, .topics-list').find('label:contains("'+$(this).parent().find('.csbs-text').text()+'")').each(function() { + if ($(this).find('input').attr('value')==li_ID) { + $(this).trigger('click'); + } + }); + return false; }); $showContainer.append($elShow); if ($el.is(':checked')) { $label.addClass('active'); - $elShow.addClass('show'); + } if (!$showContainer.hasClass('show') && $showContainer.children('.show').length > 0) { $showContainer.addClass('show'); @@ -970,25 +1083,217 @@ function addError(inputId, msg){ var $el = $(this); var $label = $el.closest('label'); var $showEls = $showContainer.children(); - var index = $checks.index(this); + console.log('#s'+$label.find('span input').attr('value')); + var index = $checks.index(this); $el.trigger('blur'); + + if ($el.is(':checked')) { $label.addClass('active'); $showEls.eq(index).addClass('show'); + } else { $label.removeClass('active'); + $el.prop('checked', false); + $showEls.eq(index).removeClass('show'); } if ($showContainer.children('.show').length > 0) { - $showContainer.addClass('show'); + + $showContainer.addClass('show'); } else { $showContainer.removeClass('show'); } + // Если сменился чекбокс области + if ($el.parents().eq(2).is('.level2')) { + // Выделяем все города + if ($el.is(':checked')) { + $el.parents().eq(2).addClass('full'); + $el.parents().eq(2).find('ul li label').each( + function() { + $(this).addClass('active'); + $(this).find('input[type="checkbox"]').prop('checked', true); + var s_ID='s'+$(this).find('span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().removeClass('show'); + } + ); + } else { + // Если сняли метку с области - снимаем метки с городов области + + $el.parents().eq(2).removeClass('full'); + $el.parents().eq(4).find('input[type="checkbox"]').first().prop('checked', false); + $el.parents().eq(4).find('.custom-radio-check').first().removeClass('active'); + + $el.parents().eq(3).find('li.level2.full').each(function () { + var s_ID='s'+$(this).find('label span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().addClass('show'); + } + ); + var s_ID='s'+$el.parents().eq(4).find('label span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().removeClass('show'); + console.log('n222'); + $el.parents().eq(4).find('label').first().removeClass('active'); + $el.parents().eq(4).find('label span input[type="checkbox"]').first().prop('checked', false); + $el.parents().eq(2).find('ul li label.active').each( + function() { + $(this).removeClass('active'); + $(this).find('input[type="checkbox"]').prop('checked', false); + } + ); + } + } + else { + // Если сменился чекбокс страны + if ($el.parents().eq(2).is('.level1')) { + // Поставили метку - отмечаем все обласи + if ($el.is(':checked')) { + if ((($label.parents().eq(1).find('li .custom-radio-check.active').length)>=($label.parents().eq(1).find('li .custom-radio-check').length))) { + $label.parents().eq(2).find('label').addClass('active'); + $label.parents().eq(2).find('label span input[type="checkbox"]').prop('checked', true); + } else {}; + // И все города в областях + $el.parents().eq(2).find('ul li.level2').addClass('full'); + if ($el.parents().eq(2).find('ul li.level2').length>0) { + $el.parents().eq(2).find('ul li.level2 label').each( + function() { + $(this).addClass('active'); + $(this).find('input[type="checkbox"]').prop('checked', true); + var s_ID='s'+$(this).find('span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().removeClass('show'); + } + ); + } else { + $el.parents().eq(2).find('li label').each( + function() { + $(this).addClass('active'); + $(this).find('input[type="checkbox"]').prop('checked', true); + var s_ID='s'+$(this).find('span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().removeClass('show'); + + } + ); + } + } else { + // Сняли метку - снимаем метки дочерних элементов + $el.parents().eq(2).find('ul li.level2').removeClass('full'); + if ((($label.parents().eq(1).find('li .custom-radio-check.active').length)<($label.parents().eq(1).find('li .custom-radio-check').length))) { + $label.removeClass('active'); + $label.find('span input[type="checkbox"]').prop('checked', false); + } else {}; + if ($el.parents().eq(2).find('ul li.level2').length>0) { + $el.parents().eq(2).find('ul li.level2 label.active').each( + function() { + $(this).removeClass('active'); + $(this).find('input[type="checkbox"]').prop('checked', false); + } + ); } else { + $el.parents().eq(2).find('li label.active').each( + function() { + $(this).removeClass('active'); + $(this).find('input[type="checkbox"]').prop('checked', false); + } + ); + + } + } + } + else { + // Если сменился чекбокс последнего города и область не отмечена - выделить всю область + if ((($label.parents().eq(1).find('li .custom-radio-check.active').length)>=($label.parents().eq(1).find('li .custom-radio-check').length))&&($el.not(':checked'))) { + $label.parents().eq(2).find('input[type="checkbox"]').first().parents().eq(1).addClass('active'); + $label.parents().eq(2).find('input[type="checkbox"]').first().parents().eq(2).addClass('full'); + $label.parents().eq(2).find('input[type="checkbox"]').first().prop('checked', true); + var s_ID='s'+$label.parents().eq(2).find('input[type="checkbox"]').first().attr('value'); + $showContainer.find('#'+s_ID).parent().addClass('show'); + + $label.parents().eq(1).find('.custom-radio-check').each(function () { + $(this).addClass('active'); + var s_ID='s'+$(this).find('span input').first().attr('value'); + console.log('ttt'); + $showContainer.find('#'+s_ID).parent().removeClass('show'); + }); + + } else { + // Область была отмечена, сняли метку города - снимаем метку области + $label.parents().eq(2).find('label').first().removeClass('active'); + if ($label.parents().eq(2).hasClass('level2')) { + $el.parents().eq(6).find('input[type="checkbox"]').first().prop('checked', false); + $el.parents().eq(6).find('.custom-radio-check').first().removeClass('active'); + } else {}; + + $label.parents().eq(2).find('input[type="checkbox"]').first().parents().eq(2).removeClass('full'); + $label.parents().eq(2).find('input[type="checkbox"]').first().prop('checked', false); + var s_ID='s'+$label.parents().eq(2).find('input[type="checkbox"]').first().attr('value'); + $showContainer.find('#'+s_ID).parent().removeClass('show'); + + + + $label.parents().eq(1).find('.custom-radio-check.active').each(function () { + var s_ID='s'+$(this).find('span input').attr('value'); + $showContainer.find('#'+s_ID).parent().addClass('show'); + + console.log('1'); + }); + if ($label.parents().eq(4).hasClass('level1')) { + $label.parents().eq(3).find('li.level2.full').each(function () { + var s_ID='s'+$(this).find('label span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().addClass('show'); + console.log('2'); + }); + var s_ID='s'+$label.parents().eq(4).find('label span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().removeClass('show'); + } else {}; + + }; + }; + }; + if ($label.parents().eq(2).hasClass('level1')) { + // Для областей/городов, чей родитель - страна + $label.parents().eq(2).find('>ul').each(function () { + // Если есть области и они все уже выделены - сокращаем список тегов областей до тега страны + if ((($(this).find('li.level2.full').length)>=($(this).find('li.level2').length))&&($(this).find('li.level2').length>0)) { + $el.parents().eq(4).find('input[type="checkbox"]').first().prop('checked', true); + $el.parents().eq(4).find('.custom-radio-check').first().addClass('active'); + $(this).find('li.level2.full').each(function () { + var s_ID='s'+$(this).find('label span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().removeClass('show'); + console.log('3'); + } + ); + var s_ID='s'+$label.parents().eq(3).find('li.level1 label span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().addClass('show'); + console.log('4'); + + } else {}; + }); + } else { + // То же самое только для городов, чей родитель область, а затем страна + if ($label.parents().eq(4).hasClass('level1')) { + $label.parents().eq(4).find('>ul').each(function() { + if ((($(this).find('li.level2.full').length)>=($(this).find('li.level2').length))&&($(this).find('li.level2').length>0)) { + $el.parents().eq(6).find('input[type="checkbox"]').first().prop('checked', true); + $el.parents().eq(6).find('.custom-radio-check').first().addClass('active'); + $(this).find('li.level2.full').each(function () { + var s_ID='s'+$(this).find('label span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().removeClass('show'); + } + ); + var s_ID='s'+$label.parents().eq(5).find('li.level1 label span input').first().attr('value'); + $showContainer.find('#'+s_ID).parent().addClass('show'); + console.log('5'); + } else {}; + }); + } else {}; + }; + + + + }); } - + $qSelClear.on('click', function () { $checks.prop('checked', false).trigger('change'); return false; diff --git a/templates/client/blank.html b/templates/client/blank.html index 1ffe8320..aae6ca5c 100644 --- a/templates/client/blank.html +++ b/templates/client/blank.html @@ -35,6 +35,7 @@ This template include basic anf main styles and js files, + @@ -111,7 +112,7 @@ This template include basic anf main styles and js files, - + diff --git a/templates/client/exposition/search.html b/templates/client/exposition/search.html new file mode 100644 index 00000000..a0409a88 --- /dev/null +++ b/templates/client/exposition/search.html @@ -0,0 +1,30 @@ +{% extends 'base_catalog.html' %} +{% load i18n %} +{% load template_filters %} + +{% block bread_scrumbs %} + +{% endblock %} + +{% block page_title %} +
    +

    {% trans 'Поиск' %}:

    +
    +{% endblock %} + +{% block content_list %} + {% with query=object_list %} + {% include 'includes/exposition/search_result.html' %} + {% endwith %} +{% endblock %} + +{% block paginator %} + + {% with page_obj=page_obj queries=queries %} + {% include 'includes/search_paginator.html' %} + {% endwith %} + +{% endblock %} \ No newline at end of file diff --git a/templates/client/includes/exposition/search_result.html b/templates/client/includes/exposition/search_result.html new file mode 100644 index 00000000..a994aee7 --- /dev/null +++ b/templates/client/includes/exposition/search_result.html @@ -0,0 +1,120 @@ +{% load static %} +{% load i18n %} +{% load template_filters %} + + + diff --git a/templates/client/includes/search_paginator.html b/templates/client/includes/search_paginator.html new file mode 100644 index 00000000..7d3a262f --- /dev/null +++ b/templates/client/includes/search_paginator.html @@ -0,0 +1,45 @@ +{% load i18n %} +{% load template_filters %} + +{% if page_obj.paginator.num_pages > 1 %} + +{% endif %} \ No newline at end of file diff --git a/templates/client/index.html b/templates/client/index.html index 16b624d0..39e1968a 100644 --- a/templates/client/index.html +++ b/templates/client/index.html @@ -72,29 +72,29 @@
    -
    +
    - -
    + +
    {{ search_form.q }}
    - -
    + +
    {{ search_form.w }}
    - +
    -
    Тематика: Не важно
    -
    Место: Не важно
    -
    Период: Не важно
    +
    {% trans 'Тематика' %}: {% trans 'Не важно' %}
    +
    {% trans 'Место' %}: {% trans 'Не важно' %}
    +
    {% trans 'Период' %}: {% trans 'Не важно' %}
    diff --git a/templates/client/place/search.html b/templates/client/place/search.html index 153fec59..9e74cccf 100644 --- a/templates/client/place/search.html +++ b/templates/client/place/search.html @@ -25,46 +25,7 @@ {% block paginator %} - {% if page_obj.paginator.num_pages > 1 %} - - {% endif %} + {% with page_obj=page_obj queries=queries %} + {% include 'includes/search_paginator.html' %} + {% endwith %} {% endblock %} \ No newline at end of file diff --git a/templates/client/popups/place.html b/templates/client/popups/place.html index cd78c6a7..00708bbd 100644 --- a/templates/client/popups/place.html +++ b/templates/client/popups/place.html @@ -9,26 +9,66 @@
    -
    {% trans 'Выберите страну из списка' %}
    +
    + + + +
      -
    • +
    • Россия
        -
      • -
      • -
      • -
      • +
      • Область 1 +
          +
        • +
        • +
        • +
        • +
        +
      • +
      • Область 2 +
          +
        • +
        • +
        • +
        • +
        +
      • +
      • Область 3 +
          +
        • +
        • +
        • +
        • +
        +
    • -
    • -
    • -
    • -
    • -
    • -
    • +
    • СНГ (исключая Россию) +
        +
      • +
      • +
      • +
      • +
      • +
      +
    • +
    • Европа +
        +
      • +
      • +
      • +
      • +
      +
    • + {% for value, text in place_search_form.r.field.choices %} +
    • + {% endfor %}
    @@ -45,6 +85,7 @@
    +
    diff --git a/templates/client/popups/theme.html b/templates/client/popups/theme.html index 2d8afc56..e2bd09a8 100644 --- a/templates/client/popups/theme.html +++ b/templates/client/popups/theme.html @@ -9,9 +9,10 @@
    + {% for val, choice in theme_search_form.event.field.choices %}
    - +
    {% endfor %}
    diff --git a/templates/client/search/indexes/company/company_text.txt b/templates/client/search/indexes/company/company_text.txt new file mode 100644 index 00000000..297ca690 --- /dev/null +++ b/templates/client/search/indexes/company/company_text.txt @@ -0,0 +1,3 @@ +{% for text in object.get_index_text %} + {{ text }} +{% endfor %} \ No newline at end of file diff --git a/templates/client/search/indexes/conference/conference_text.txt b/templates/client/search/indexes/conference/conference_text.txt new file mode 100644 index 00000000..297ca690 --- /dev/null +++ b/templates/client/search/indexes/conference/conference_text.txt @@ -0,0 +1,3 @@ +{% for text in object.get_index_text %} + {{ text }} +{% endfor %} \ No newline at end of file diff --git a/templates/client/search/indexes/exposition/exposition_text.txt b/templates/client/search/indexes/exposition/exposition_text.txt new file mode 100644 index 00000000..297ca690 --- /dev/null +++ b/templates/client/search/indexes/exposition/exposition_text.txt @@ -0,0 +1,3 @@ +{% for text in object.get_index_text %} + {{ text }} +{% endfor %} \ No newline at end of file diff --git a/templates/client/search/seminar/seminar_text.txt b/templates/client/search/seminar/seminar_text.txt new file mode 100644 index 00000000..297ca690 --- /dev/null +++ b/templates/client/search/seminar/seminar_text.txt @@ -0,0 +1,3 @@ +{% for text in object.get_index_text %} + {{ text }} +{% endfor %} \ No newline at end of file diff --git a/templates/client/search/webinar/webinar_text.txt b/templates/client/search/webinar/webinar_text.txt new file mode 100644 index 00000000..297ca690 --- /dev/null +++ b/templates/client/search/webinar/webinar_text.txt @@ -0,0 +1,3 @@ +{% for text in object.get_index_text %} + {{ text }} +{% endfor %} \ No newline at end of file diff --git a/theme/management/__init__.py b/theme/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/theme/management/commands/__init__.py b/theme/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/theme/management/commands/tag_from_old_db.py b/theme/management/commands/tag_from_old_db.py new file mode 100644 index 00000000..c2c6cd61 --- /dev/null +++ b/theme/management/commands/tag_from_old_db.py @@ -0,0 +1,55 @@ +from django.core.management.base import BaseCommand, CommandError +from theme.models import Tag, Theme + +import MySQLdb +from MySQLdb.cursors import DictCursor + +class Command(BaseCommand): + def handle(self, *args, **options): + db = MySQLdb.connect(host="localhost", + user="root", + passwd="qazedc", + db="expomap_ru", + charset='utf8', + cursorclass=DictCursor) + + cursor = db.cursor() + # id 3732 duplicate tag with bad name(2 spaces) + sql = "SELECT * FROM tags WHERE id != 3732" + + + + cursor.execute(sql) + res = cursor.fetchall() + + for t in res: + theme_id=t['category_id'] + + # check if theme id exist + try: + Theme.objects.get(id=theme_id) + except Theme.DoesNotExist: + continue + + # check duplicate name + ex_tags = Tag.objects.language('ru').filter(name=t['title']) + if ex_tags: + # track if tag with current theme exist + find_theme = False + for ex_tag in ex_tags: + if ex_tag.theme_id == theme_id: + find_theme = True + if find_theme: + continue + + tag = Tag(id=t['id'], theme_id=theme_id) + tag.translate('ru') + tag.name = t.get('title', '') + tag.main_title = t.get('title', '') + + tag.save() + print(tag) + + print('success') + + diff --git a/theme/management/commands/theme_from_old_db.py b/theme/management/commands/theme_from_old_db.py new file mode 100644 index 00000000..ac313b89 --- /dev/null +++ b/theme/management/commands/theme_from_old_db.py @@ -0,0 +1,47 @@ +from django.core.management.base import BaseCommand, CommandError +from theme.models import Theme + +import MySQLdb +from MySQLdb.cursors import DictCursor + + +class Command(BaseCommand): + def handle(self, *args, **options): + db = MySQLdb.connect(host="localhost", + user="root", + passwd="qazedc", + db="expomap_ru", + charset='utf8', + cursorclass=DictCursor) + + cursor = db.cursor() + + sql = """SELECT * FROM categories + LEFT JOIN categories_description + ON categories.categories_id=categories_description.categories_id + """ + + cursor.execute(sql) + res = cursor.fetchall() + + + for th in res: + theme = Theme(id=th['categories_id'], url=th['url'], types=0) + if th['expo']: + theme.types.exposition = True + if th['conference']: + theme.types.conference = True + + theme.translate('ru') + theme.name = th.get('categories_name', '') + theme.main_title = th.get('categories_heading_title', '') + theme.description = th.get('categories_description', '') + theme.title = th.get('categories_meta_title', '') + theme.descriptions = th.get('categories_meta_description', '') + theme.keywords = th.get('categories_meta_keywords', '') + if theme.name: + theme.save() + print(theme) + + + print('success') diff --git a/theme/models.py b/theme/models.py index 6617f9cd..6ba1dd56 100644 --- a/theme/models.py +++ b/theme/models.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- from django.db import models -from django.utils.translation import ugettext_lazy as _ from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from bitfield import BitField import copy @@ -32,13 +31,13 @@ class Theme(TranslatableModel): types = BitField([k for k, v in FLAGS]) #translated fields translations = TranslatedFields( - name = models.CharField(max_length=100), - main_title = models.CharField(max_length=100), + name = models.CharField(max_length=255), + main_title = models.CharField(max_length=255), description = models.TextField(blank=True), #-----meta data - title = models.CharField(max_length=250, blank=True), - descriptions = models.CharField(max_length=250, blank=True), - keywords = models.CharField(max_length=250, blank=True), + title = models.CharField(max_length=255, blank=True), + descriptions = models.CharField(max_length=255, blank=True), + keywords = models.CharField(max_length=255, blank=True), ) main_page = models.PositiveIntegerField(default=0, db_index=True) @@ -148,9 +147,30 @@ class Tag(TranslatableModel): from django.db.models.signals import post_save, pre_save -from functions.signal_handlers import post_save_handler, pre_save_handler +from functions.signal_handlers import post_save_handler +from functions.form_check import translit_with_separator +import random, string + + +def pre_save_handler(sender, **kwargs): + obj = kwargs['instance'] + + if obj.language_code =='en': + try: + name = getattr(obj, 'name') + obj.url = translit_with_separator(name) + except AttributeError: + pass + + tags = Tag.objects.filter(url=obj.url).exclude(id=obj.id) + if tags: + obj.url = obj.theme.url+'-'+ obj.url + + if not obj.url: + obj.url = ''.join([random.choice(string.ascii_lowercase) for n in xrange(8)]) pre_save.connect(pre_save_handler, sender=Theme) pre_save.connect(pre_save_handler, sender=Tag) + post_save.connect(post_save_handler, sender=Theme) post_save.connect(post_save_handler, sender=Tag) diff --git a/webinar/models.py b/webinar/models.py index 9372ce7d..653dfa66 100644 --- a/webinar/models.py +++ b/webinar/models.py @@ -10,7 +10,7 @@ from django.contrib.contenttypes import generic # from functions.custom_fields import EnumField from functions.models_methods import ExpoManager -from functions.model_mixin import EventMixin +from functions.model_mixin import EventMixin, ExpoMixin # check if table exist and create flags if true flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] @@ -18,7 +18,7 @@ flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('ser CURRENCY = ('RUB', 'USD', 'EUR') -class Webinar(TranslatableModel, EventMixin): +class Webinar(TranslatableModel, EventMixin, ExpoMixin): """ Create Webinar model diff --git a/webinar/search_indexes.py b/webinar/search_indexes.py new file mode 100644 index 00000000..96b3c6fe --- /dev/null +++ b/webinar/search_indexes.py @@ -0,0 +1,20 @@ +from haystack import indexes +from models import Webinar + + +class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable): + text = indexes.CharField(document=True, use_template=True) + where = indexes.MultiValueField() + def prepare_where(self, obj): + country = [tr.name for tr in obj.country.translations.all()] + city = [tr.name for tr in obj.city.translations.all()] + + return country + city + + def get_model(self): + return Webinar + + def index_queryset(self, using=None): + + return self.get_model().objects.filter() +