merge conflict

remotes/origin/HEAD
ya_dim4ik 9 years ago
commit 5355c34362
  1. 2
      Makefile
  2. 9
      README.md
  3. 0
      apps/__init__.py
  4. 50
      apps/accounts/admin.py
  5. 2
      apps/accounts/admin_urls.py
  6. 45
      apps/accounts/forms.py
  7. 17
      apps/accounts/models.py
  8. 4
      apps/accounts/urls.py
  9. 27
      apps/accounts/views.py
  10. 114
      apps/article/admin.py
  11. 152
      apps/article/forms.py
  12. 55
      apps/article/models.py
  13. 8
      apps/city/admin.py
  14. 3
      apps/city/urls.py
  15. 11
      apps/city/views.py
  16. 17
      apps/company/admin.py
  17. 7
      apps/company/admin_urls.py
  18. 6
      apps/company/signals.py
  19. 3
      apps/conference/admin_urls.py
  20. 5
      apps/conference/forms.py
  21. 30
      apps/conference/models.py
  22. 16
      apps/conference/tests.py
  23. 2
      apps/conference/tests/__init__.py
  24. 0
      apps/conference/tests/test_forms.py
  25. 292
      apps/conference/tests/test_models.py
  26. 100
      apps/conference/tests/test_views.py
  27. 28
      apps/conference/urls.py
  28. 42
      apps/core/forms.py
  29. 8
      apps/core/simple_index_view.py
  30. 27
      apps/core/utils.py
  31. 130
      apps/core/views.py
  32. 2
      apps/events/models.py
  33. 8
      apps/events/urls.py
  34. 7
      apps/expobanner/admin.py
  35. 5
      apps/exposition/forms.py
  36. 631
      apps/exposition/migrations/0002_auto__del_field_exposition_audience.py
  37. 25
      apps/exposition/models.py
  38. 2
      apps/functions/model_mixin.py
  39. 1
      apps/import_xls/utils.py
  40. 1
      apps/meta/admin.py
  41. 25
      apps/meta/forms.py
  42. 5
      apps/place_conference/models.py
  43. 5
      apps/place_exposition/models.py
  44. 1
      apps/place_exposition/urls.py
  45. 24
      apps/place_exposition/views.py
  46. 3
      apps/theme/admin.py
  47. 7
      apps/theme/forms.py
  48. 80
      apps/theme/migrations/0002_auto__del_field_themetranslation_keywords__del_field_themetranslation_.py
  49. 6
      apps/theme/models.py
  50. 3
      proj/admin.py
  51. 16
      proj/decorators.py
  52. 5
      proj/middleware.py
  53. 16
      proj/settings.py
  54. 6
      proj/views.py
  55. 22
      static/custom_js/main.js
  56. 186
      templates/c_admin/article/article_add.html
  57. 69
      templates/c_admin/article/article_all.html
  58. 2
      templates/c_admin/article/article_confirm_delete.html
  59. 93
      templates/c_admin/article/blog_form.html
  60. 2
      templates/c_admin/expobanner/link_list.html
  61. 1
      templates/c_admin/includes/admin_nav.html
  62. 31
      templates/c_admin/proj/settings.html
  63. 12
      templates/c_admin/theme/theme_add.html
  64. 150
      templates/client/city/city.html
  65. 2
      templates/client/exposition/catalog_theme.html
  66. 2
      templates/client/includes/meta.html
  67. 101
      templates/client/includes/place/place_list.html
  68. 2
      templates/client/place/place_detail.html

@ -41,7 +41,7 @@ compilemessages:
-@ipython manage.py compilemessages -@ipython manage.py compilemessages
collectstatic: collectstatic:
@ipython manage.py collectstatic --noinput @ipython manage.py collectstatic
user: user:
-@ipython manage.py createsuperuser -@ipython manage.py createsuperuser

@ -23,6 +23,15 @@ DATABASES = {
'HOST': '', 'HOST': '',
'PORT': '', 'PORT': '',
'TEST_CHARSET': 'utf8', 'TEST_CHARSET': 'utf8',
},
'test': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test_expomap',
'USER': 'root',
'PASSWORD': '1',
'HOST': '',
'PORT': '',
'TEST_CHARSET': 'utf8',
} }
} }

@ -20,8 +20,6 @@ from django.views.generic import DeleteView, TemplateView, UpdateView
from django.views.generic.dates import DateMixin, MonthMixin, YearMixin from django.views.generic.dates import DateMixin, MonthMixin, YearMixin
from forms import ( from forms import (
ChangePasswordForm, ChangePasswordForm,
EmailAnnouncementForm,
UserCreationForm,
UserFilterForm, UserFilterForm,
UserForm UserForm
) )
@ -55,13 +53,6 @@ class UserListView(AdminListView):
return context return context
class EditUser(UpdateView):
model = User
form_class = UserForm
success_url = '/admin/accounts/all'
template_name = 'user_change.html'
def user_change(request, url): def user_change(request, url):
""" """
Return form of user and post it on the server. Return form of user and post it on the server.
@ -116,47 +107,6 @@ def user_change(request, url):
return render_to_response('user_change.html', context) return render_to_response('user_change.html', context)
def create_admin(request):
if request.POST:
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_admin = False
user.save()
return HttpResponseRedirect('/admin/accounts/all')
else:
form = UserCreationForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('create_admin.html', args)
def create_md5(request):
if request.POST:
form = UserCreationForm(request.POST)
if form.is_valid():
user = User()
user.email = request.POST['email']
user.first_name = request.POST['first_name']
user.last_name = request.POST['last_name']
user.password = md5(request.POST['password2']).hexdigest()
user.is_admin = True
user.save()
return HttpResponseRedirect('/admin/accounts/all')
else:
form = UserCreationForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('create_admin.html', args)
def generatePassword(): def generatePassword():
""" """

@ -3,7 +3,7 @@ from django.conf.urls import patterns, url
from django.core.urlresolvers import reverse_lazy from django.core.urlresolvers import reverse_lazy
from functions.custom_views import SimpleObjectChangeView from functions.custom_views import SimpleObjectChangeView
from .admin import AccountsStatistic, DeleteAccount, EditUser, UserListView from .admin import AccountsStatistic, DeleteAccount, UserListView
from .models import User from .models import User
attrs = { attrs = {

@ -29,43 +29,6 @@ def clean_relation_field(inst, field_name, model):
return None return None
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label=_(u'Пароль'), widget=forms.PasswordInput(render_value=False))
password2 = forms.CharField(label=_(u'Повторите пароль'), widget=forms.PasswordInput(render_value=False))
class Meta:
model = User
fields = ('email', 'first_name', 'last_name')
def clean_email(self):
"""
checking if user already exist
"""
email = self.cleaned_data.get('email')
try:
User.objects.get(email=email)
except User.DoesNotExist:
return email
raise forms.ValidationError(_(u'Пользователь с таким email уже существует'))
def clean_password2(self):
password1 = self.cleaned_data.get('password1')
password2 = self.cleaned_data.get('password2')
if password1 and password2 and password1 != password2:
raise forms.ValidationError(_(u'Пароли не совпадают'))
return password2
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data['password2'])
if commit:
user.save()
return user
class UserForm(forms.ModelForm): class UserForm(forms.ModelForm):
# email = forms.EmailField(widget=forms.TextInput(attrs={'disabled' : True}), required=False) # email = forms.EmailField(widget=forms.TextInput(attrs={'disabled' : True}), required=False)
country = forms.ChoiceField(label=_(u'Страна'), choices=[(item.id, item.name) for item in Country.objects.language().all()], country = forms.ChoiceField(label=_(u'Страна'), choices=[(item.id, item.name) for item in Country.objects.language().all()],
@ -196,14 +159,6 @@ class ChangePasswordForm(forms.Form):
return data return data
class EmailAnnouncementForm(forms.Form):
data = [(1, _(u'Получать приглашения, сообщения и другую корреспонденцию от пользователей Expomap')),
(2, _(u'Получать обзор событий')),
(3, _(u'Получать новости'))]
announcement = forms.MultipleChoiceField(choices=data, widget=forms.CheckboxSelectMultiple())
url_regex = re.compile('^\w*$') url_regex = re.compile('^\w*$')
class RegistrationCompleteForm(forms.ModelForm): class RegistrationCompleteForm(forms.ModelForm):
country = forms.ModelChoiceField(label=_(u'Страна'), queryset=Country.objects.all(), country = forms.ModelChoiceField(label=_(u'Страна'), queryset=Country.objects.all(),

@ -11,6 +11,7 @@ from django.db.models.loading import get_model
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
from functions.model_mixin import GetURLorPK from functions.model_mixin import GetURLorPK
@ -140,16 +141,12 @@ class User(AbstractBaseUser, PermissionsMixin, GetURLorPK):
log = UserLog.objects.filter(user_id=self.pk)[0] log = UserLog.objects.filter(user_id=self.pk)[0]
return log return log
def get_full_name(self): def get_full_name(self):
""" """
Returns the first_name plus the last_name, with a space in between. Returns the first_name plus the last_name, with a space in between.
""" """
return u'%s %s'%(self.first_name, self.last_name) return u'%s %s'%(self.first_name, self.last_name)
def set_url(self, st):
self.url = translit_with_separator(u'%s'%st)
def __unicode__(self): def __unicode__(self):
return self.email return self.email
@ -166,9 +163,6 @@ class User(AbstractBaseUser, PermissionsMixin, GetURLorPK):
def has_perm(self, perm, obj=None): def has_perm(self, perm, obj=None):
return True return True
def has_module_perms(self, app_label):
return True
def get_expositions_number(self): def get_expositions_number(self):
# 1 query # 1 query
return self.exposition_users.all().count() return self.exposition_users.all().count()
@ -181,15 +175,6 @@ class User(AbstractBaseUser, PermissionsMixin, GetURLorPK):
# 1 query # 1 query
return self.seminar_users.all().count() return self.seminar_users.all().count()
def get_webinars_number(self):
# 1 query
return self.webinar_users.all().count()
def get_events_number(self):
# 4 query
n = self.get_expositions_number() + self.get_conferences_number() + self.get_seminars_number() + self.get_webinars_number()
return n
def get_permanent_url(self): def get_permanent_url(self):
if self.url: if self.url:
return '/%s/' % self.url return '/%s/' % self.url

@ -9,7 +9,6 @@ from views import (
Feed, Feed,
HomeView, HomeView,
MailingSettings, MailingSettings,
# MailingSettingsUnsubscribe,
NameView, NameView,
PhoneView, PhoneView,
ProfileCompanyView, ProfileCompanyView,
@ -22,8 +21,7 @@ from views import (
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^profile/company/$', login_required(ProfileCompanyView.as_view())), url(r'^profile/company/$', login_required(ProfileCompanyView.as_view())),
url(r'^profile/mailing/$', MailingSettings.as_view(), name='accounts-mailing_settings'), url(r'^profile/mailing/$', login_required(MailingSettings.as_view()), name='accounts-mailing_settings'),
# url(r'^profile/mailing/unsubscribe/$', MailingSettingsUnsubscribe.as_view(), name='accounts-mailing_settings_unsubscribe'),
url(r'^profile/settings/$', login_required(SettingsView.as_view()), name='accounts_settings'), url(r'^profile/settings/$', login_required(SettingsView.as_view()), name='accounts_settings'),
url(r'^profile/calendar/remove/$', 'accounts.views.remove_from_calendar'), url(r'^profile/calendar/remove/$', 'accounts.views.remove_from_calendar'),
url(r'^profile/calendar/export/$', 'core.views.download_workbook'), url(r'^profile/calendar/export/$', 'core.views.download_workbook'),

@ -30,7 +30,7 @@ from company.edit_forms import NameForm as CompNameForm, HomeForm as CompHomeFor
from emencia.django.newsletter.forms import SubscribeSettingsForm, MailingSettingsForm from emencia.django.newsletter.forms import SubscribeSettingsForm, MailingSettingsForm
from emencia.django.newsletter.models import Contact, ContactSettings from emencia.django.newsletter.models import Contact, ContactSettings
from .forms import ChangePasswordForm, EmailAnnouncementForm, FeedFilterForm from .forms import ChangePasswordForm, FeedFilterForm
from .models import User from .models import User
from .edit_forms import AvatarForm, NameForm, HomeForm, WorkForm, AboutCompanyForm, PhoneForm, EmailForm,\ from .edit_forms import AvatarForm, NameForm, HomeForm, WorkForm, AboutCompanyForm, PhoneForm, EmailForm,\
WebPageForm, SocialForm, AboutForm WebPageForm, SocialForm, AboutForm
@ -136,13 +136,11 @@ class MailingSettings(GetUserMixin, ContextMixin, AjaxableResponseMixin, CreateU
'checked_th': list(instance.themes.values_list('pk', flat=True)), 'checked_th': list(instance.themes.values_list('pk', flat=True)),
'contact': instance, 'contact': instance,
}) })
elif not self.request.user.is_authenticated(): if self.request.GET.get('unsibscribe') and instance.subscriber:
raise HttpResponseForbidden() instance.unsubscribe()
if self.request.GET.get('unsibscribe') and instance.subscriber: self.extra_ctx.update({'unsubscribe_success': True})
instance.unsubscribe() elif not instance.subscriber:
self.extra_ctx.update({'unsubscribe_success': True}) self.extra_ctx.update({'unsubscribed': True})
elif not instance.subscriber:
self.extra_ctx.update({'unsubscribed': True})
return instance return instance
def form_valid(self, form): def form_valid(self, form):
@ -159,19 +157,6 @@ class MailingSettings(GetUserMixin, ContextMixin, AjaxableResponseMixin, CreateU
return super(MailingSettings, self).form_invalid(form) return super(MailingSettings, self).form_invalid(form)
#
# class MailingSettingsUnsubscribe(GetUserMixin, RedirectView):
# url = reverse_lazy('accounts-mailing_settings')
#
# def get(self, request, *args, **kwargs):
# contact = self.get_user()
# if contact is None:
# return HttpResponseForbidden()
# if contact.subscriber:
# contact.unsubscribe()
# return super(MailingSettingsUnsubscribe, self).get(request, *args, **kwargs)
class CalendarView(TemplateView): class CalendarView(TemplateView):
""" """
display template with user calendar(one month) display template with user calendar(one month)

@ -14,7 +14,7 @@ from ckeditor.widgets import CKEditorWidget
from sorl.thumbnail.admin.current import AdminImageWidget from sorl.thumbnail.admin.current import AdminImageWidget
#models and forms #models and forms
from .forms import ArticleForm, ArticleDeleteForm, NewsForm from .forms import NewsForm
from .models import Article, Author from .models import Article, Author
from theme.models import Tag from theme.models import Tag
@ -48,101 +48,6 @@ class ArticleDeleteView(DeleteView):
return "/admin/article/%s/all/" % type return "/admin/article/%s/all/" % type
def article_all(request):
"""
Return list of all articles with pagination
"""
return objects_list(request, Article, 'article_all.html')
@login_required
def article_copy(request, url):
article = Article.objects.safe_get(slug=url)
if not article:
return HttpResponseRedirect(get_referer(request))
else:
article.clone()
return HttpResponseRedirect(get_referer(request))
def article_add(request):
"""
Return form of article and post it on the server.
If form is posted redirect on the page of all articles.
"""
#get organiser from current user
init_data = {'author':request.user.organiser}
#choices field which will be filled by ajax
choices = {'tag': Tag}
return add_object_with_file(request, ArticleForm, 'article_add.html', '/admin/article/all',
choices, init_data)
def article_delete(request, url):
return delete_object(request, Article, ArticleDeleteForm, url, '/admin/article/all')
@login_required
def article_change(request, url):
"""
Return form and fill it with existing Article object data.
If form is posted redirect on the page of all articles.
"""
try:
#check if article_id exists else redirect to the list of cities
article = Article.objects.get(slug=url)
file_form = FileModelForm(initial={'model': 'article.Article'})
article_id = getattr(article, 'id')
except:
return HttpResponseRedirect('/admin/article/all')
if request.POST:
form = ArticleForm(request.POST)
#set choices filled by ajax
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()]
if form.is_valid():
form.save(getattr(article, 'id'))
return HttpResponseRedirect('/admin/article/all')
else:
data = {}
#fill form with data from database
data['author'] = article.author
data['theme'] = [item.id for item in article.theme.all()]
data['tag'] = [item.id for item in article.tag.all()]
#hidden field
data['article_id'] = article_id
#data from translated fields
for code, name in settings.LANGUAGES:
obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields
data['main_title_%s' % code] = obj.main_title
data['preview_%s' % code] = obj.preview
data['description_%s' % code] = obj.description
data['title_%s' % code] = obj.title
data['keywords_%s' % code] = obj.keywords
data['descriptions_%s' % code] = obj.descriptions
#fill form
form = ArticleForm(initial=data)
#set choices filled by ajax
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])]
args = {}
args.update(csrf(request))
args['form'] = form
args['languages'] = settings.LANGUAGES
args['file_form'] = file_form
#get list of files which connected with specific model object
args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(article), object_id=getattr(article, 'id'))
args['obj_id'] = getattr(article, 'id')
return render_to_response('article_add.html', args)
#----------------------- #-----------------------
from django.views.generic import FormView from django.views.generic import FormView
from functions.custom_views import ListView from functions.custom_views import ListView
@ -206,6 +111,7 @@ class BlogView(FormView):
data['main_title_%s' % code] = obj.main_title data['main_title_%s' % code] = obj.main_title
data['preview_%s' % code] = obj.preview data['preview_%s' % code] = obj.preview
data['description_%s' % code] = obj.description data['description_%s' % code] = obj.description
data['short_description_%s' % code] = obj.short_description
data['title_%s' % code] = obj.title data['title_%s' % code] = obj.title
data['keywords_%s' % code] = obj.keywords data['keywords_%s' % code] = obj.keywords
data['descriptions_%s' % code] = obj.descriptions data['descriptions_%s' % code] = obj.descriptions
@ -230,7 +136,7 @@ class BlogView(FormView):
class NewsList(ListView): class NewsList(ListView):
model = Article model = Article
template_name = 'article/article_admin_list.html' template_name = 'c_admin/article/article_admin_list.html'
paginate_by = 20 paginate_by = 20
def get_queryset(self): def get_queryset(self):
@ -247,17 +153,3 @@ class NewsView(BlogView):
template_name = 'c_admin/article/blog_form.html' template_name = 'c_admin/article/blog_form.html'
success_url = '/admin/article/news/all/' success_url = '/admin/article/news/all/'
obj = None obj = None
"""
from django.views.generic import CreateView
from models import Blog
from forms import BlogForm
class BlogCreate(CreateView):
model = Blog
form_class = BlogForm
template_name = 'c_admin/blog/blog_add.html'
"""

@ -116,7 +116,6 @@ class BlogForm(_BlogForm):
return article return article
class NewsForm(_BlogForm): class NewsForm(_BlogForm):
type = Article.news type = Article.news
exposition = forms.CharField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False) exposition = forms.CharField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False)
@ -154,157 +153,6 @@ class NewsForm(_BlogForm):
return None return None
class ArticleForm(forms.Form):
"""
Create Article form for creating conference
__init__ uses for dynamic creates fields
save function saves data in Article object. If it doesnt exist create new object
"""
#users that have organiser profile
author = forms.ModelChoiceField(label=_(u'Автор'),queryset=User.objects.exclude(organiser__isnull=True))
key = forms.CharField(required=False, widget=forms.HiddenInput())
theme = forms.ModelMultipleChoiceField(label=_(u'Тематики'), queryset=Theme.objects.all())
#creates select input with empty choices cause it will be filled with ajax
tag = forms.MultipleChoiceField(label=_(u'Теги'), required=False)
article_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
"""
super(ArticleForm, self).__init__(*args, **kwargs)
#creates translated forms example: name_ru, name_en
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required)
self.fields['preview_%s' % code] = forms.CharField(label=_(u'Превью'), required=required, widget=CKEditorWidget)
self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=required, widget=CKEditorWidget)
#meta data
self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Дескрипшен'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Кейвордс'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
def save(self, id=None):
"""
change Article object with id = id
N/A add new Article object
usage: form.save(obj) - if change article
form.save() - if add article
"""
data = self.cleaned_data
#create new Article object or get exists
if not id:
article = Article()
else:
article = Article.objects.get(id=id)
#clear manytomany relations
article.theme.clear()
article.tag.clear()
if data.get('author'):
article.user = User.objects.get(id=data['author'].id)#.id cause select uses queryset
#create slug field from russian language
if not getattr(article, 'slug'):
article.slug = translit_with_separator(data['main_title_ru'].strip()).lower()
# fill translated fields and save object
fill_with_signal(Article, article, data)
# fill manytomany fields
for item in data['theme']:
article.theme.add(item.id)#.id cause select uses queryset
for item in data['tag']:
article.tag.add(item)
article.save()
#save files
check_tmp_files(article, data['key'])
def clean(self):
id = self.cleaned_data.get('article_id')
main_title_ru = self.cleaned_data.get('main_title_ru')
article = Article.objects.filter(url=translit_with_separator(main_title_ru))
if article and str(article[0].id) != id:
msg = _(u'Статья с таким названием уже существует')
self._errors['main_title_ru'] = ErrorList([msg])
del self.cleaned_data['main_title_ru']
return self.cleaned_data
class ArticleDeleteForm(forms.ModelForm):
url = forms.CharField(widget=forms.HiddenInput())
class Meta:
model = Article
fields = ('url',)
#----------------------------------
"""
from models import Blog
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
exclude = ('created', 'modified', 'creator', 'theme', 'tag')
def __init__(self, *args, **kwargs):
super(BlogForm, self).__init__(*args, **kwargs)
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required)
self.fields['preview_%s' % code] = forms.CharField(label='Превью', required=required, widget=CKEditorWidget)
self.fields['description_%s' % code] = forms.CharField(label='Описание', required=required, widget=CKEditorWidget)
#meta data
self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
"""
class ArticleFilterForm(forms.Form):
theme = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False,
choices=[(item.id, item.name) for item in Theme.objects.language().distinct()])
tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False)
'''
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
"""
super(ArticleFilterForm, self).__init__(*args, **kwargs)
ids = [item['theme_id'] for item in list(Article.objects.blogs().values('theme_id').distinct())]
self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False,
choices=[(item.id, item.name) for item in Theme.objects.language().filter(id__in=ids)])
'''
class BlogFilterForm(forms.Form): class BlogFilterForm(forms.Form):
tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False)

@ -107,21 +107,6 @@ class Article(TranslatableModel):
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('main_title', self.pk) return self.lazy_translation_getter('main_title', self.pk)
def translation_model(self):
return self._meta.translations_model
def publish(self):
"""
set publish date. uses when publish date is none
"""
self.in_sitemap = True
if not self.publish_date:
# save time only first time
self.publish_date = now()
self.save()
return self
def get_event(self): def get_event(self):
""" """
get event connected to article get event connected to article
@ -137,17 +122,8 @@ class Article(TranslatableModel):
# If no slug is provided, generates one before saving. # If no slug is provided, generates one before saving.
if not self.slug: if not self.slug:
self.slug = self.generate_unique_slug() self.slug = self.generate_unique_slug()
# Set the description field on save.
# if self.gen_description:
# self.description = strip_tags(self.description_from_content())
super(Article, self).save(*args, **kwargs) super(Article, self).save(*args, **kwargs)
def description_from_content(self):
"""
"""
# place for logic
return ''
def generate_unique_slug(self): def generate_unique_slug(self):
""" """
Create a unique slug by passing the result of get_slug() to Create a unique slug by passing the result of get_slug() to
@ -173,37 +149,6 @@ class Article(TranslatableModel):
""" """
return u'%s' % self.lazy_translation_getter('main_title', self.pk) return u'%s' % self.lazy_translation_getter('main_title', self.pk)
def _get_next_or_previous_by_publish_date(self, is_next, **kwargs):
"""
Retrieves next or previous object by publish date. We implement
our own version instead of Django's so we can hook into the
published manager and concrete subclasses.
"""
arg = "publish_date__gt" if is_next else "publish_date__lt"
order = "publish_date" if is_next else "-publish_date"
lookup = {arg: self.publish_date}
concrete_model = base_concrete_model(Article, self)
try:
queryset = concrete_model.objects.published
except AttributeError:
queryset = concrete_model.objects.all
try:
return queryset(**kwargs).filter(**lookup).order_by(order)[0]
except IndexError:
pass
def get_next_by_publish_date(self, **kwargs):
"""
Retrieves next object by publish date.
"""
return self._get_next_or_previous_by_publish_date(True, **kwargs)
def get_previous_by_publish_date(self, **kwargs):
"""
Retrieves previous object by publish date.
"""
return self._get_next_or_previous_by_publish_date(False, **kwargs)
def admin_url(self): def admin_url(self):
""" """
returns url for admin pages returns url for admin pages

@ -21,13 +21,6 @@ from functions.admin_views import AdminListView
from functions.http import JsonResponse from functions.http import JsonResponse
def city_all(request):
"""
return list of all cities with pagination
"""
return objects_list(request, City, 'city_all.html')
def city_add(request): def city_add(request):
""" """
Return form of city and post it on the server. Return form of city and post it on the server.
@ -35,6 +28,7 @@ def city_add(request):
""" """
return add_object_with_file(request, CityForm, 'city_add.html', '/admin/city/all') return add_object_with_file(request, CityForm, 'city_add.html', '/admin/city/all')
def city_delete(request, url): def city_delete(request, url):
return delete_object(request, City, CityDeleteForm, url, '/admin/city/all/') return delete_object(request, City, CityDeleteForm, url, '/admin/city/all/')

@ -1,9 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from views import CityView
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'get-city/', 'city.views.get_city'), url(r'get-city/', 'city.views.get_city'),
# commented for good times
#url(r'(?P<slug>.*)', CityView.as_view()),
) )

@ -7,15 +7,6 @@ from models import City
from settings.views import get_by_lang from settings.views import get_by_lang
class CityView(DetailView):
"""
this view is not used yet
"""
model = City
slug_field = 'url'
template_name = 'client/city/city.html'
def get_city(request): def get_city(request):
""" """
returns filtered cities in current language in json format returns filtered cities in current language in json format
@ -39,4 +30,4 @@ def get_city(request):
return HttpResponse(json.dumps(result, indent=4), content_type='application/json') return HttpResponse(json.dumps(result, indent=4), content_type='application/json')
else: else:
return HttpResponse('not ajax') return HttpResponse('not ajax')

@ -19,23 +19,6 @@ from theme.models import Tag
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
def company_all(request):
"""
Return list of all companies with pagination
"""
return objects_list(request, Company, 'company_all.html')
def company_add(request):
"""
Return form of company and post it on the server.
If form is posted redirect on the page of all companies.
"""
return add_object_with_file(request, CompanyForm,
'company_add.html', '/admin/company/all/',
{'city': City, 'tag': Tag})
def company_delete(request, url): def company_delete(request, url):
return delete_object(request, Company, return delete_object(request, Company,
CompanyDeleteForm, url, '/admin/company/all') CompanyDeleteForm, url, '/admin/company/all')

@ -27,11 +27,4 @@ urlpatterns = patterns('company.admin',
url(r'^(?P<url>.*)/$', CompanyView.as_view()), url(r'^(?P<url>.*)/$', CompanyView.as_view()),
url(r'^$', CompanyView.as_view()), url(r'^$', CompanyView.as_view()),
# url(r'^add.*/$', 'company_add'),
# url(r'^delete/(?P<url>.*)/$', 'company_delete'),
# url(r'^change/(?P<url>.*)/$', 'company_change'),
# url(r'^all/$', 'company_all'),
# url(r'^all/$', CompanyListView.as_view()),
) )

@ -1,6 +0,0 @@
# -*- coding: utf-8 -*-
from django.db.models.signals import post_save
from models import Company
from functions.signal_handlers import post_save_handler
#post_save.connect(post_save_handler, sender=Company)

@ -3,7 +3,8 @@ from django.conf.urls import patterns, include, url
from admin import ConferenceListView, ConferenceView from admin import ConferenceListView, ConferenceView
urlpatterns = patterns('conference.admin', urlpatterns = patterns('conference.admin',
url(r'^upload-photo/(?P<conf_id>.*)/$', 'upload_conference_photo'), url(r'^upload-photo/(?P<conf_id>.*)/$', 'upload_conference_photo',
name='conference_upload_photo'),
url(r'^delete/(?P<url>.*)$', 'conference_delete'), url(r'^delete/(?P<url>.*)$', 'conference_delete'),
url(r'^copy/$', 'conf_copy'), url(r'^copy/$', 'conf_copy'),
url(r'^all/$', ConferenceListView.as_view(), name='admin-conference-all'), url(r'^all/$', ConferenceListView.as_view(), name='admin-conference-all'),

@ -8,7 +8,7 @@ from django.utils.translation import ugettext as _
#models #models
from .models import flags as FLAGS from .models import flags as FLAGS
from events.models import TargetAudience from events.models import TargetAudience
from models import Conference, TimeTable, CURRENCY, Statistic, BIT_AUDIENCE, Speaker from models import Conference, TimeTable, CURRENCY, Statistic, Speaker
from country.models import Country from country.models import Country
from city.models import City from city.models import City
from theme.models import Theme, Tag from theme.models import Theme, Tag
@ -44,7 +44,8 @@ class ConferenceCreateForm(forms.Form):
(4.0, _(u'4 раза в год')), (5.0, _(u'5 раз в год')), (0.5, _(u'Раз в 2 года')),(0.33, _(u'Раз в 3 года')), (4.0, _(u'4 раза в год')), (5.0, _(u'5 раз в год')), (0.5, _(u'Раз в 2 года')),(0.33, _(u'Раз в 3 года')),
(0.25, _(u'Раз в 4 года')), (0.2, _(u'Раз в 5 лет'))) (0.25, _(u'Раз в 4 года')), (0.2, _(u'Раз в 5 лет')))
# public = [(item1, item2) for item1, item2 in BIT_AUDIENCE] # public = [(i, i) for i in
# TargetAudience.objects.all().values_list('title', flat=True)]
currencies = [(item, item) for item in CURRENCY] currencies = [(item, item) for item in CURRENCY]

@ -34,7 +34,6 @@ flags = ['catalog', 'translator', 'participation', 'remote', 'tickets', 'visit',
CURRENCY = settings.CURRENCY CURRENCY = settings.CURRENCY
BIT_AUDIENCE = settings.BIT_AUDIENCE
class Conference(TranslatableModel, EventMixin, ExpoMixin): class Conference(TranslatableModel, EventMixin, ExpoMixin):
""" """
@ -116,7 +115,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
#translated fields #translated fields
translations = TranslatedFields( translations = TranslatedFields(
name = models.CharField(verbose_name=_(u'Название'), max_length=255), name=models.CharField(verbose_name=_(u'Название'), max_length=255),
main_title=models.TextField(verbose_name=_(u'Краткое описание'), blank=True), main_title=models.TextField(verbose_name=_(u'Краткое описание'), blank=True),
description=models.TextField(verbose_name=_(u'Описание'), blank=True), description=models.TextField(verbose_name=_(u'Описание'), blank=True),
main_themes=models.TextField(verbose_name=_(u'Основные темы'), blank=True), main_themes=models.TextField(verbose_name=_(u'Основные темы'), blank=True),
@ -180,31 +179,28 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
# else: # else:
# return [] # return []
def get_audience(self):
return self.audience.all()
def get_news_url(self): def get_news_url(self):
return reverse_lazy('news_conference', kwargs={'slug': self.url}) return reverse_lazy('news_conference', kwargs={'slug': self.url})
def get_catalog_url(self): def get_catalog_url(self):
return '/conference/' return '/conference/'
def get_audience(self):
checked = [item for item, bool in self.audience if bool==True]
audience = []
for k, v in BIT_AUDIENCE:
for item in checked:
if item == k:
audience.append(v)
return ', '.join(audience)
def get_calendar_url(self): def get_calendar_url(self):
return '/conference-add-calendar/%s/'%self.id return reverse_lazy('conference_add_calendar', args=[self.id])
def get_visit_url(self): def get_visit_url(self):
return '/conference-visit/%s/'%self.id return reverse_lazy(
'events:event_visit', args=['conference', self.id]
)
def get_note_url(self): def get_note_url(self):
return '/conference/add-note/%s/'%self.url return reverse_lazy(
'conference_add_note',
args=[self.url]
)
def get_note_by_user(self, user_id): def get_note_by_user(self, user_id):
note = self.note.filter(user__id=user_id) note = self.note.filter(user__id=user_id)
@ -226,7 +222,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
return names + ' ' + titles + ' ' + themes + ' ' + tags return names + ' ' + titles + ' ' + themes + ' ' + tags
def upload_photo_url(self): def upload_photo_url(self):
return '/admin/conference/upload-photo/%s/' % self.id return reverse_lazy('conference_upload_photo', args=[self.id])
def clicks(self): def clicks(self):
return self.paid_new.tickets.clicks() + self.paid_new.official.clicks() return self.paid_new.tickets.clicks() + self.paid_new.official.clicks()

@ -1,16 +0,0 @@
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)

@ -0,0 +1,2 @@
# from .test_models import *
from .test_views import *

@ -0,0 +1,292 @@
import datetime
from accounts.models import User
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse, NoReverseMatch
from django.test import TestCase
from expobanner.models import Paid, Banner
from note.models import Note
from service.models import Service
from stats_collector.models import ObjectStats
from theme.models import Tag, Theme
from ..models import Conference, Speaker, Statistic, TimeTable
from city.models import City
from country.models import Country
from events.models import TargetAudience
class ConferenceTest(TestCase):
def setUp(self):
self.conference = Conference.objects.create(
name='New Conference',
data_begin=datetime.datetime.now(),
data_end=datetime.timedelta(24)+datetime.datetime.now(),
country=Country.objects.all()[0],
city=City.objects.all()[0],
url='new-conference',
services=b'0001000'
)
def test_a_conference_create(self):
conference_count = Conference.objects.all().count()
Conference.objects.create(
name='New Conference',
data_begin=datetime.datetime.now(),
data_end=datetime.timedelta(24)+datetime.datetime.now(),
country=Country.objects.all()[0],
city=City.objects.all()[0]
)
new_conference_count = Conference.objects.all().count()
self.assertEqual(conference_count + 1, new_conference_count)
def test_save_conference_info(self):
name = 'New Conference'
datetime_now = datetime.datetime.now()
data_begin = datetime_now
data_end = datetime.timedelta(24) + datetime_now
country = Country.objects.all()[0]
city = City.objects.all()[0]
new_conference = Conference.objects.create(
name=name,
data_begin=data_begin,
data_end=data_end,
country=country,
city=city
)
self.assertEqual(name, new_conference.name)
self.assertEqual(data_begin, new_conference.data_begin)
self.assertEqual(data_end, new_conference.data_end)
self.assertEqual(country, new_conference.country)
self.assertEqual(city, new_conference.city)
def test_method_unicode(self):
self.assertEqual(
str(self.conference),
self.conference.lazy_translation_getter(
'name', unicode(self.conference.pk))
)
def test_method_get_services(self):
services = [item for item, bool in self.conference.services if bool]
qs = Service.objects.language()
qs = qs.filter(url__in=services)
self.assertEqual(
sorted(self.conference.get_services(), key=lambda x: x.pk),
sorted(list(qs), key=lambda x: x.pk)
)
def test_method_get_news_url(self):
self.assertEqual(
self.conference.get_news_url(),
reverse('news_conference', kwargs={'slug': self.conference.url})
)
def test_method_get_audience(self):
self.assertFalse(self.conference.get_audience())
self.conference.audience.add(
TargetAudience.objects.create(title='All'))
audience = TargetAudience.objects.filter(title='All')[0]
self.assertIn(audience, self.conference.get_audience())
def test_method_get_calendar_url(self):
self.assertEqual(
self.conference.get_calendar_url(),
reverse('conference_add_calendar', args=[self.conference.id])
)
def test_method_get_visit_url(self):
self.assertEqual(
self.conference.get_visit_url(),
reverse(
'events:event_visit',
args=['conference', self.conference.id]
)
)
def test_method_get_note_url(self):
self.assertEqual(
self.conference.get_note_url(),
reverse('conference_add_note', args=[self.conference.url])
)
def test_method_get_note_by_user(self):
user = User.objects.all()[0]
self.assertEqual(self.conference.get_note_by_user(user.id), '')
text = 'Great'
ct = ContentType.objects.get_for_model(self.conference)
object_id = self.conference.id
Note.objects.create(
content_type=ct, object_id=object_id,
user=user, text=text
)
self.assertEqual(self.conference.get_note_by_user(user.id), text)
def test_method_tags(self):
self.assertFalse(self.conference.tags())
theme = Theme.objects.create(
name='Theme name', main_title='Theme title'
)
tag = Tag.objects.create(
name='Tag name', main_title='Tag title', theme=theme
)
self.conference.tag.add(tag)
self.assertIn(tag, self.conference.tags())
def test_method_get_index_text(self):
self.assertIn(
self.conference.name,
self.conference.get_index_text()
)
title = 'Conf Title'
self.conference.main_title = title
self.conference.save()
self.assertIn(title, self.conference.get_index_text())
theme_name = 'Theme name'
theme = Theme.objects.create(
name=theme_name, main_title='Theme title'
)
tag_name = 'Tag name'
tag = Tag.objects.create(
name=tag_name, main_title='Tag title', theme=theme
)
self.conference.tag.add(tag)
self.assertIn(tag_name, self.conference.get_index_text())
self.conference.theme.add(theme)
self.assertIn(theme_name, self.conference.get_index_text())
def test_method_upload_photo_url(self):
self.assertEqual(
reverse('conference_upload_photo', args=[self.conference.id]),
self.conference.upload_photo_url()
)
def test_method_clicks(self):
with self.assertRaises(AttributeError):
self.conference.clicks()
ticket_url = 'ticket_url/'
ticket = Banner.objects.create_for_paid(
self.conference, ticket_url, 'tickets')
official_url = 'official_url/'
official = Banner.objects.create_for_paid(
self.conference, official_url, 'official')
paid = Paid.objects.create(
tickets=ticket, official=official, catalog=ticket)
self.conference.paid_new = paid
self.conference.save()
self.assertEqual(self.conference.clicks(), 0)
self.client.get(ticket.get_click_link())
self.assertEqual(self.conference.clicks(), 1)
self.client.get(official.get_click_link())
self.assertEqual(self.conference.clicks(), 2)
def test_method_get_paid_change_url(self):
try:
self.conference.get_paid_change_url()
except NoReverseMatch:
pass
ticket = Banner.objects.create_for_paid(
self.conference, 'ticket_url', 'tickets')
official = Banner.objects.create_for_paid(
self.conference, 'official_url', 'official')
paid = Paid.objects.create(
tickets=ticket, official=official, catalog=official)
self.conference.paid_new = paid
self.conference.save()
self.assertEqual(
self.conference.get_paid_change_url(),
reverse('confbanner-update_paid',
args=[self.conference.paid_new.id])
)
def test_method_get_objectstat_views(self):
self.assertEqual(
self.conference.get_objectstat_views(),
sum(ObjectStats.objects.filter(
conference=self.conference).values_list('value', flat=True))
)
class SpeakerTest(TestCase):
def test_create_speaker(self):
speacers = Speaker.objects.all().count()
Speaker.objects.create(fullname='Hgangu Piter')
speacers_plus_one = Speaker.objects.all().count()
self.assertEqual(speacers + 1, speacers_plus_one)
def test_method_unicode(self):
fullname = 'Hgangu Piter'
speaker = Speaker.objects.create(fullname=fullname)
self.assertEqual(str(speaker), fullname)
class StatisticTest(TestCase):
def test_create_statistic(self):
stats = Statistic.objects.all().count()
conf = Conference.objects.create(
name='New Conference',
data_begin=datetime.datetime.now(),
data_end=datetime.timedelta(24)+datetime.datetime.now(),
country=Country.objects.all()[0],
city=City.objects.all()[0]
)
Statistic.objects.create(
conference=conf,
year=datetime.datetime.now().year,
countries='Monaco'
)
stats_plus_one = Statistic.objects.all().count()
self.assertEqual(stats + 1, stats_plus_one)
class TimeTableTest(TestCase):
def test_create_timetable(self):
tables = TimeTable.objects.all().count()
conf = Conference.objects.create(
name='New Conference',
data_begin=datetime.datetime.now(),
data_end=datetime.timedelta(24) + datetime.datetime.now(),
country=Country.objects.all()[0],
city=City.objects.all()[0]
)
TimeTable.objects.create(
conference=conf,
begin=datetime.datetime.now(),
end=datetime.timedelta(24) + datetime.datetime.now(),
name='All times'
)
tables_plus_one = TimeTable.objects.all().count()
self.assertEqual(
tables + 1, tables_plus_one
)

@ -0,0 +1,100 @@
# -*- coding: utf-8 -*-
from city.models import City
from country.models import Country
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.utils.translation import ugettext as _
from functions.views_help import get_side_items
class ConferenceByTest(object):
"""Функционал 'абстрактного' класса ConferenceBy"""
def setUp(self):
self.response = self.client.get(self.url)
def test_template(self):
self.assertTemplateUsed(
self.response,
'client/conference/conference_by.html'
)
def test_is_available(self):
self.assertEqual(self.response.status_code, 200)
def test_titles(self):
self.assertContains(self.response, self.title1)
self.assertContains(self.response, self.title2)
def test_link(self):
link = '/conference/%s' % (self.catalog, )
self.assertContains(self.response, link)
def test_queryset(self):
obj_list = self.response.context[-1].get('object_list')
for obj in obj_list:
self.assertContains(
self.response, obj.name
)
self.assertContains(
self.response, obj.url
)
class CanFilterAndSidePopular(object):
"""Функционал can_filter and side_popular in get_context_data"""
def test_can_filter(self):
text = 'ВЫБРАТЬ ПО КРИТЕРИЯМ:'
can_filter = self.response.context[-1].get('can_filter', None)
if can_filter is False:
self.assertNotContains(self.response, text)
elif can_filter is True:
self.assertContains(self.response, text)
def test_side_popular(self):
side_popular = get_side_items('conf', self.model)
for popular in side_popular:
self.assertContains(self.response, popular.get('url'))
self.assertContains(self.response, popular.get('name'))
class ConferenceByCountryTest(ConferenceByTest, CanFilterAndSidePopular, TestCase):
url = reverse('conference_country')
title1 = _(u'По странам')
title2 = _(u'Коференции мира по странам')
catalog = 'country/'
model = Country
class ConferenceByThemeTest(ConferenceByTest, TestCase):
url = reverse('conference_theme')
title1 = _(u'По тематикам')
title2 = _(u'Коференции мира по тематикам')
catalog = 'theme/'
class ConferenceByTagTest(ConferenceByTest, TestCase):
url = reverse('conference_tag')
title1 = _(u'По тегам')
title2 = _(u'Коференции мира по тегам')
catalog = 'tag/'
class ConferenceByCityTest(ConferenceByTest, CanFilterAndSidePopular, TestCase):
url = reverse('conference_city')
title1 = _(u'По городам')
title2 = _(u'Коференции мира по городам')
catalog = 'city/'
model = City
class ConferenceCatalogTest(object):
def test_template(self):
self.assertTemplateUsed(
self.response,
'client/conference/catalog.html'
)
# class ConferenceCountryCatalogTest(ConferenceCatalogTest, TestCase):
# def setUp(self):
# url = reverse('conference_country_catalog', args=[])
# self.response = self.client.get(url)

@ -23,21 +23,33 @@ from .views import (
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^conference/add-note/(?P<slug>[^/]*)/$', 'conference.views.add_note'), url(
url(r'^conference-add-calendar/(?P<id>\d+)/$', 'conference.views.conference_add_calendar'), r'^conference/add-note/(?P<slug>[^/]*)/$',
'conference.views.add_note',
name='conference_add_note'
),
url(r'^conference-add-calendar/(?P<id>\d+)/$',
'conference.views.conference_add_calendar',
name='conference_add_calendar'
),
# url(r'^conference-visit/(?P<id>\d+)/$', 'conference.views.conference_visit'), # url(r'^conference-visit/(?P<id>\d+)/$', 'conference.views.conference_visit'),
# search # search
url(r'^conference/search/', ExpositionSearchView.as_view()), url(r'^conference/search/', ExpositionSearchView.as_view()),
# country catalog # country catalog
url(r'^conference/country/$', ConferenceByCountry.as_view(), {'meta_id':51}), url(r'^conference/country/$',
url(r'^conference/country/(?P<slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/page/(?P<page>\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':25}), ConferenceByCountry.as_view(), {'meta_id':51},
name='conference_country'),
url(r'^conference/country/(?P<slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/page/(?P<page>\d+)/$',
ConferenceCountryCatalog.as_view(), {'meta_id':25},
name='conference_country_catalog'),
url(r'^conference/country/(?P<slug>[^/]*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':24}), url(r'^conference/country/(?P<slug>[^/]*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':24}),
url(r'^conference/country/(?P<slug>[^/]*)/page/(?P<page>\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':23}), url(r'^conference/country/(?P<slug>[^/]*)/page/(?P<page>\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':23}),
url(r'^conference/country/(?P<slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/$', ConferenceCountryCatalog.as_view(), {'meta_id':25}), url(r'^conference/country/(?P<slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/$', ConferenceCountryCatalog.as_view(), {'meta_id':25}),
url(r'^conference/country/(?P<slug>[^/]*)/(?P<year>\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':24}), url(r'^conference/country/(?P<slug>[^/]*)/(?P<year>\d+)/$', ConferenceCountryCatalog.as_view(), {'meta_id':24}),
url(r'^conference/country/(?P<slug>[^/]*)/$', ConferenceCountryCatalog.as_view(), {'meta_id':23}, name='conf_country'), url(r'^conference/country/(?P<slug>[^/]*)/$', ConferenceCountryCatalog.as_view(), {'meta_id':23}, name='conf_country'),
# city catalog # city catalog
url(r'^conference/city/$', ConferenceByCity.as_view(), {'meta_id':52}), url(r'^conference/city/$',
ConferenceByCity.as_view(), {'meta_id':52}, name='conference_city'),
url(r'^conference/city/(?P<slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/page/(?P<page>\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':28}), url(r'^conference/city/(?P<slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/page/(?P<page>\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':28}),
url(r'^conference/city/(?P<slug>[^/]*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':27}), url(r'^conference/city/(?P<slug>[^/]*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':27}),
url(r'^conference/city/(?P<slug>[^/]*)/page/(?P<page>\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':26}), url(r'^conference/city/(?P<slug>[^/]*)/page/(?P<page>\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':26}),
@ -45,7 +57,8 @@ urlpatterns = patterns('',
url(r'^conference/city/(?P<slug>[^/]*)/(?P<year>\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':27}), url(r'^conference/city/(?P<slug>[^/]*)/(?P<year>\d+)/$', ConferenceCityCatalog.as_view(), {'meta_id':27}),
url(r'^conference/city/(?P<slug>[^/]*)/$', ConferenceCityCatalog.as_view(), {'meta_id':26}, name='conf_city'), url(r'^conference/city/(?P<slug>[^/]*)/$', ConferenceCityCatalog.as_view(), {'meta_id':26}, name='conf_city'),
# theme catalog # theme catalog
url(r'^conference/theme/$', ConferenceByTheme.as_view(), {'meta_id':50}), url(r'^conference/theme/$',
ConferenceByTheme.as_view(), {'meta_id':50}, name='conference_theme'),
url(r'^conference/theme/(?P<slug>[^/]*)/country/(?P<country_slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/page/(?P<page>\d+)/$', ConferenceThemeCatalog.as_view()), url(r'^conference/theme/(?P<slug>[^/]*)/country/(?P<country_slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/page/(?P<page>\d+)/$', ConferenceThemeCatalog.as_view()),
url(r'^conference/theme/(?P<slug>[^/]*)/country/(?P<country_slug>[^/]*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceThemeCatalog.as_view()), url(r'^conference/theme/(?P<slug>[^/]*)/country/(?P<country_slug>[^/]*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceThemeCatalog.as_view()),
url(r'^conference/theme/(?P<slug>[^/]*)/country/(?P<country_slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/$', ConferenceThemeCatalog.as_view()), url(r'^conference/theme/(?P<slug>[^/]*)/country/(?P<country_slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/$', ConferenceThemeCatalog.as_view()),
@ -69,7 +82,8 @@ urlpatterns = patterns('',
url(r'^conference/theme/(?P<slug>[^/]*)/(?P<year>\d+)/$', ConferenceThemeCatalog.as_view(), {'meta_id':30}), url(r'^conference/theme/(?P<slug>[^/]*)/(?P<year>\d+)/$', ConferenceThemeCatalog.as_view(), {'meta_id':30}),
url(r'^conference/theme/(?P<slug>[^/]*)/$', ConferenceThemeCatalog.as_view(), {'meta_id':29}), url(r'^conference/theme/(?P<slug>[^/]*)/$', ConferenceThemeCatalog.as_view(), {'meta_id':29}),
# tag catalog # tag catalog
url(r'^conference/tag/$', ConferenceByTag.as_view(), {'meta_id':50}), url(r'^conference/tag/$',
ConferenceByTag.as_view(), {'meta_id':50}, name='conference_tag'),
url(r'^conference/tag/(?P<slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/page/(?P<page>\d+)/$', ConferenceTagCatalog.as_view(), {'meta_id':34}), url(r'^conference/tag/(?P<slug>[^/]*)/(?P<year>\d+)/(?P<month>[^/]*)/page/(?P<page>\d+)/$', ConferenceTagCatalog.as_view(), {'meta_id':34}),
url(r'^conference/tag/(?P<slug>[^/]*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceTagCatalog.as_view(), {'meta_id':33}), url(r'^conference/tag/(?P<slug>[^/]*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceTagCatalog.as_view(), {'meta_id':33}),
url(r'^conference/tag/(?P<slug>[^/]*)/page/(?P<page>\d+)/$', ConferenceTagCatalog.as_view(), {'meta_id':32}), url(r'^conference/tag/(?P<slug>[^/]*)/page/(?P<page>\d+)/$', ConferenceTagCatalog.as_view(), {'meta_id':32}),

@ -10,48 +10,6 @@ from haystack.query import SearchQuerySet, EmptySearchQuerySet
from hvad.forms import TranslatableModelForm from hvad.forms import TranslatableModelForm
from models import Page from models import Page
class PlaceSearchForm(forms.Form):
q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False)
def search(self):
q = self.cleaned_data.get('q')
w = self.cleaned_data.get('w')
if not q and not w:
return EmptySearchQuerySet()
sqs = SearchQuerySet().models(PlaceExposition, PlaceConference)
if q:
sqs = sqs.auto_query(q)
if w:
sqs = sqs.filter(where__contains=w)
return sqs
class CallbackForm(forms.Form):
callback_phone = forms.CharField()
def clean_callback_phone(self):
phone = self.cleaned_data['callback_phone']
phone_str = self.cleaned_data['callback_phone']
deduct = ('-','(',')','.',' ')
for elem in deduct:
phone = phone.replace(elem, '')
if phone.isdigit():
return phone_str
else:
raise forms.ValidationError(_(u'Введите правильный телефон'))
def send(self):
phone = self.cleaned_data['callback_phone']
send_mail(phone, phone, None, [settings.CALLBACK_EMAIL])
# ------------------ Page Form -----------------------
from django.conf import settings from django.conf import settings
from django.forms import Textarea from django.forms import Textarea
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget

@ -13,11 +13,11 @@ from settings.models import LandingComment, ParticipationComment
class AdvertisingView(MetadataMixin, TemplateView): class AdvertisingView(MetadataMixin, TemplateView):
template_name = 'simple_pages/advertising.html' template_name = 'client/simple_pages/advertising.html'
class AdvertisingViewLanding(JitterCacheMixin, AdvertisingView): class AdvertisingViewLanding(JitterCacheMixin, AdvertisingView):
template_name = 'simple_pages/advertising_landing.html' template_name = 'client/simple_pages/advertising_landing.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(AdvertisingViewLanding, self).get_context_data(**kwargs) context = super(AdvertisingViewLanding, self).get_context_data(**kwargs)
@ -26,7 +26,7 @@ class AdvertisingViewLanding(JitterCacheMixin, AdvertisingView):
class ParticipationViewLanding(JitterCacheMixin, MetadataMixin, FormView): class ParticipationViewLanding(JitterCacheMixin, MetadataMixin, FormView):
template_name = 'simple_pages/participation_landing.html' template_name = 'client/simple_pages/participation_landing.html'
form_class = ParticipationLandingForm form_class = ParticipationLandingForm
def get_initial(self): def get_initial(self):
@ -61,7 +61,7 @@ class ParticipationViewLanding(JitterCacheMixin, MetadataMixin, FormView):
class AboutView(MetadataMixin, TemplateView): class AboutView(MetadataMixin, TemplateView):
template_name = 'simple_pages/about.html' template_name = 'client/simple_pages/about.html'
def callback(request): def callback(request):

@ -33,33 +33,6 @@ CELL_STYLE_MAP = (
) )
def multi_getattr(obj, attr, default=None):
attributes = attr.split(".")
for i in attributes:
try:
obj = getattr(obj, i)
except AttributeError:
if default:
return default
else:
return '-'
return obj
def get_column_cell(obj, name):
try:
attr = multi_getattr(obj, name)
except ObjectDoesNotExist:
return ''
if hasattr(attr, '_meta'):
# A Django Model (related object)
return unicode(attr).strip()
elif hasattr(attr, 'all'):
# A Django queryset (ManyRelatedManager)
return ', '.join(unicode(x).strip() for x in attr.all())
return attr
def queryset_to_workbook(queryset, columns, report_date = None): def queryset_to_workbook(queryset, columns, report_date = None):
# localization # localization

@ -9,136 +9,6 @@ from django.core.urlresolvers import reverse_lazy
from functions.views_help import split_params from functions.views_help import split_params
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
class PlaceListView(ListView):
paginate_by = 10
params = None
single_page = False
template_name = 'place_catalog_test.html'
model = 'places'
order = 'data_begin'
def get_params(self):
model_names = {'places': _(u'Места')}
model_alternative_name = {'places': 'place'}
params = [{'type':'model', 'url':self.model, 'name': model_names.get(self.model),
'alternative_name': model_alternative_name.get(self.model)}]
st = self.kwargs.get('params')
if st:
params = params + split_params(st)
return params
def get_queryset(self):
pl_ex = PlaceExposition.objects.all()
pl_conf = PlaceConference.objects.all()
params = self.get_params()
for param in params:
if param.get('type') == 'country':
country = Country.objects.safe_get(url=param.get('url'))
if country:
param['name'] = country.name
pl_ex = pl_ex.filter(country=country)
pl_conf = pl_conf.filter(country=country)
if param.get('type') == 'city':
city = City.objects.safe_get(url=param.get('url'))
if city:
param['name'] = city.name
pl_ex = pl_ex.filter(city=city)
pl_conf = pl_conf.filter(city=city)
if param.get('type') == 'place':
pl_ex = pl_ex.filter(url=param.get('url'))
if pl_ex:
query = pl_ex
else:
query = pl_conf.filter(url=param.get('url'))
self.single_page = True
if query:
param['name'] = query[0].name
#if self.request:
# views = query[0].views
# query.update(views=views+1)
self.params = params
return query
self.params = params
return list(pl_ex) + list(pl_conf)
def get_context_data(self, **kwargs):
context = super(PlaceListView, self).get_context_data(**kwargs)
context['filter'] = self.params
context['single_page'] = self.single_page
context['search_form'] = self.search_form
context['search_action'] = '/places/search/'
context['type'] = 'places search'
return context
class PlacePhotoView(PlaceListView):
paginate_by = 12
template_name = 'place/place_photo.html'
obj = None
def get_queryset(self):
pl_ex = PlaceExposition.objects.all()
pl_conf = PlaceConference.objects.all()
params = self.get_params()
for param in params:
if param.get('type') == 'country':
country = Country.objects.safe_get(url=param.get('url'))
if country:
param['name'] = country.name
pl_ex = pl_ex.filter(country=country)
pl_conf = pl_conf.filter(country=country)
if param.get('type') == 'city':
city = City.objects.safe_get(url=param.get('url'))
if city:
param['name'] = city.name
pl_ex = pl_ex.filter(city=city)
pl_conf = pl_conf.filter(city=city)
if param.get('type') == 'place':
pl_ex = pl_ex.filter(url=param.get('url'))
if pl_ex:
query = pl_ex
else:
query = pl_conf.filter(url=param.get('url'))
self.single_page = True
if query:
param['name'] = query[0].name
#if self.request:
# views = query[0].views
# query.update(views=views+1)
params.append({'type':'photo', 'name':_(u'Фото')})
self.params = params
self.obj = query[0]
return query[0].photogallery.photos.all()
self.params = params
return list(pl_ex) + list(pl_conf)
def get_context_data(self, **kwargs):
context = super(PlacePhotoView, self).get_context_data(**kwargs)
context['object'] = self.obj
return context
# --------------------- Page views ------------------------
from forms import PageForm from forms import PageForm
from models import Page from models import Page

@ -10,4 +10,4 @@ class TargetAudience(models.Model):
title = models.CharField(_(u'Название'), max_length=200) title = models.CharField(_(u'Название'), max_length=200)
def __unicode__(self): def __unicode__(self):
return unicode(self.title) return unicode(self.title)

@ -13,5 +13,9 @@ events_urlpatterns = patterns('',
urlpatterns = ( urlpatterns = (
url(r'^events/', include(events_urlpatterns)), url(r'^events/', include(events_urlpatterns)),
url(r'^(?P<event_type>(exposition|conference))-visit/(?P<id>\d+)/$', event_visit), url(
) r'^(?P<event_type>(exposition|conference))-visit/(?P<id>\d+)/$',
event_visit,
name='event_visit'
),
)

@ -125,14 +125,9 @@ class BannerList(AbstractList):
class LinkList(AbstractList): class LinkList(AbstractList):
model = Banner
verbose = _(u'Список ссылок') verbose = _(u'Список ссылок')
template_name = 'c_admin/expobanner/link_list.html' template_name = 'c_admin/expobanner/link_list.html'
queryset = Banner.objects.filter(link=True).order_by('-created_at')
def get_queryset(self):
qs = super(LinkList, self).get_queryset()
qs = qs.filter(link=True).order_by('-created_at')
return qs
class CustomerList(AbstractList): class CustomerList(AbstractList):

@ -6,7 +6,8 @@ from django.forms.util import ErrorList
from django.core.validators import validate_email, URLValidator from django.core.validators import validate_email, URLValidator
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
#models #models
from models import Exposition, TimeTable, TmpTimeTable, AUDIENCE1, CURRENCY, Statistic, BIT_AUDIENCE from events.models import TargetAudience
from models import Exposition, TimeTable, TmpTimeTable, CURRENCY, Statistic
from theme.models import Tag from theme.models import Tag
from country.models import Country from country.models import Country
from theme.models import Theme from theme.models import Theme
@ -35,7 +36,7 @@ class ExpositionCreateForm(forms.Form):
PERIODIC = ((0, _(u'Не выбрано')), (1.0, _(u'Ежегодно')), (2.0, _(u'2 раза в год')), (3.0, _(u'3 раза в год')), PERIODIC = ((0, _(u'Не выбрано')), (1.0, _(u'Ежегодно')), (2.0, _(u'2 раза в год')), (3.0, _(u'3 раза в год')),
(4.0, _(u'4 раза в год')), (5.0, _(u'5 раз в год')), (0.5, _(u'Раз в 2 года')),(0.33, _(u'Раз в 3 года')), (4.0, _(u'4 раза в год')), (5.0, _(u'5 раз в год')), (0.5, _(u'Раз в 2 года')),(0.33, _(u'Раз в 3 года')),
(0.25, _(u'Раз в 4 года')), (0.2, _(u'Раз в 5 лет'))) (0.25, _(u'Раз в 4 года')), (0.2, _(u'Раз в 5 лет')))
public = [(item1, item2) for item1, item2 in BIT_AUDIENCE] public = [(i, i) for i in TargetAudience.objects.all().values_list('title', flat=True)]
currencies = [(item, item) for item in CURRENCY] currencies = [(item, item) for item in CURRENCY]
data_begin = forms.DateField(label=_(u'Дата начала'), input_formats=['%Y-%m-%d', '%d.%m.%Y']) data_begin = forms.DateField(label=_(u'Дата начала'), input_formats=['%Y-%m-%d', '%d.%m.%Y'])

@ -0,0 +1,631 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Deleting field 'Exposition.audience'
db.delete_column(u'exposition_exposition', 'audience')
# Adding M2M table for field audience on 'Exposition'
m2m_table_name = db.shorten_name(u'exposition_exposition_audience')
db.create_table(m2m_table_name, (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('exposition', models.ForeignKey(orm[u'exposition.exposition'], null=False)),
('targetaudience', models.ForeignKey(orm[u'events.targetaudience'], null=False))
))
db.create_unique(m2m_table_name, ['exposition_id', 'targetaudience_id'])
def backwards(self, orm):
# Adding field 'Exposition.audience'
db.add_column(u'exposition_exposition', 'audience',
self.gf('django.db.models.fields.BigIntegerField')(default=1),
keep_default=False)
# Removing M2M table for field audience on 'Exposition'
db.delete_table(db.shorten_name(u'exposition_exposition_audience'))
models = {
u'accounts.user': {
'Meta': {'ordering': "['-rating']", 'object_name': 'User'},
'blocked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'company': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'users'", 'null': 'True', 'to': u"orm['company.Company']"}),
'date_joined': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'date_registered': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '255', 'db_index': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_admin': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'organiser': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['organiser.Organiser']", 'unique': 'True', 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'position': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'rating': ('django.db.models.fields.IntegerField', [], {'default': '100'}),
'readonly': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'translator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['translator.Translator']", 'blank': 'True', 'unique': 'True'}),
'url': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'})
},
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'city.city': {
'Meta': {'unique_together': '()', 'object_name': 'City', 'index_together': '()'},
'code_IATA': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['directories.Iata']", 'null': 'True', 'blank': 'True'}),
'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'cities'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'old_url': ('django.db.models.fields.CharField', [], {'max_length': '55'}),
'phone_code': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'population': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'})
},
u'company.company': {
'Meta': {'ordering': "['-rating', 'id']", 'unique_together': '()', 'object_name': 'Company', 'index_together': '()'},
'address': ('functions.custom_fields.LocationField', [], {'blank': 'True'}),
'blocked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'city': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}),
'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'created_company'", 'null': 'True', 'to': u"orm['accounts.User']"}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'facebook': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
'foundation': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'linkedin': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
'rating': ('django.db.models.fields.IntegerField', [], {'default': '100'}),
'staff_number': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
'tag': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['theme.Tag']"}),
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['theme.Theme']"}),
'twitter': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'url': ('django.db.models.fields.SlugField', [], {'max_length': '255'}),
'vk': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'country.area': {
'Meta': {'ordering': "['translations__name']", 'unique_together': '()', 'object_name': 'Area', 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
u'country.country': {
'Meta': {'ordering': "['translations__name']", 'unique_together': '()', 'object_name': 'Country', 'index_together': '()'},
'area': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Area']"}),
'big_cities': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'cities'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['city.City']"}),
'capital': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'capital'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}),
'country_code': ('django.db.models.fields.CharField', [], {'max_length': '2'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'currency': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['directories.Currency']", 'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'language': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['directories.Language']", 'null': 'True', 'blank': 'True'}),
'latitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}),
'longitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'old_url': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '55'}),
'phone_code': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'population': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
'teritory': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'time_delivery': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
'timezone': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'})
},
u'directories.currency': {
'Meta': {'unique_together': '()', 'object_name': 'Currency', 'index_together': '()'},
'code': ('django.db.models.fields.CharField', [], {'max_length': '3'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
u'directories.iata': {
'Meta': {'object_name': 'Iata'},
'airport': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'code': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
u'directories.language': {
'Meta': {'unique_together': '()', 'object_name': 'Language', 'index_together': '()'},
'code': ('django.db.models.fields.CharField', [], {'max_length': '2'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
u'events.targetaudience': {
'Meta': {'ordering': "['title']", 'object_name': 'TargetAudience'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'title_en': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'title_ru': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
u'expobanner.banner': {
'Meta': {'ordering': "['sort']", 'object_name': 'Banner'},
'alt': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'cookie': ('django.db.models.fields.CharField', [], {'default': "'expo_b_default_popup'", 'max_length': '30', 'null': 'True', 'blank': 'True'}),
'country': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['country.Country']", 'null': 'True', 'blank': 'True'}),
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'customer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Customer']", 'null': 'True', 'blank': 'True'}),
'flash': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2017, 2, 1, 0, 0)'}),
'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'banners'", 'null': 'True', 'to': u"orm['expobanner.BannerGroup']"}),
'html': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'img': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'link': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'often': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '1', 'null': 'True', 'blank': 'True'}),
'paid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'popup': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'sort': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '500'}),
'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
'text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Theme']", 'null': 'True', 'blank': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'to': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'url': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'urls': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'url_banners'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['expobanner.URL']"})
},
u'expobanner.bannergroup': {
'Meta': {'ordering': "['name']", 'object_name': 'BannerGroup'},
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'height': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
'speed': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '2000'}),
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'})
},
u'expobanner.customer': {
'Meta': {'ordering': "['name']", 'object_name': 'Customer'},
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
},
u'expobanner.mainpage': {
'Meta': {'ordering': "['-public']", 'object_name': 'MainPage'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'link': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Banner']"}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'position': ('django.db.models.fields.PositiveIntegerField', [], {'default': '2', 'null': 'True', 'blank': 'True'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'})
},
u'expobanner.paid': {
'Meta': {'ordering': "['-public']", 'object_name': 'Paid'},
'catalog': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_catalog'", 'to': u"orm['expobanner.Banner']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'kind': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '1', 'db_index': 'True'}),
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'official': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_official'", 'to': u"orm['expobanner.Banner']"}),
'organiser': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'participants_list': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'paid_participants_list'", 'null': 'True', 'to': u"orm['expobanner.Banner']"}),
'participation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_participation'", 'null': 'True', 'to': u"orm['expobanner.Banner']"}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
'tickets': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_tickets'", 'to': u"orm['expobanner.Banner']"})
},
u'expobanner.top': {
'Meta': {'ordering': "['position']", 'object_name': 'Top'},
'base_catalog': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'catalog': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
'cities': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'top_in_set'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['city.City']"}),
'country': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['country.Country']", 'null': 'True', 'blank': 'True'}),
'excluded_cities': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['city.City']", 'null': 'True', 'blank': 'True'}),
'excluded_tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Tag']", 'null': 'True', 'blank': 'True'}),
'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2017, 2, 1, 0, 0)'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'link': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Banner']"}),
'months': ('functions.custom_fields.MonthMultiSelectField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}),
'position': ('django.db.models.fields.PositiveIntegerField', [], {'default': '2', 'null': 'True', 'blank': 'True'}),
'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Theme']", 'null': 'True', 'blank': 'True'}),
'to': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
'years': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'})
},
u'expobanner.url': {
'Meta': {'ordering': "['-created_at']", 'object_name': 'URL'},
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'regex': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'sites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'site_urls'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['sites.Site']"}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'url': ('django.db.models.fields.CharField', [], {'max_length': '2048'})
},
u'exposition.exposition': {
'Meta': {'unique_together': '()', 'object_name': 'Exposition', 'index_together': '()'},
'application_deadline': ('django.db.models.fields.DateField', [], {'null': 'True'}),
'area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'audience': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['events.TargetAudience']", 'null': 'True', 'symmetrical': 'False'}),
'bad_url': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'canceled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'canceled_by_administrator': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'city': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'exposition_city'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}),
'company': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['company.Company']"}),
'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'exposition_country'", 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'exposition_creator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['accounts.User']"}),
'currency': ('functions.custom_fields.EnumField', [], {'default': "'RUB'", 'values': "('RUB', 'USD', 'EUR', 'RMB', 'GBP', 'AED', 'SGD', 'TRY', 'CZK', 'CHF', 'SEK', 'LKR', 'UAH', 'IDR', 'PLN', 'JPY')"}),
'data_begin': ('django.db.models.fields.DateField', [], {'db_index': 'True'}),
'data_end': ('django.db.models.fields.DateField', [], {}),
'discount': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'expohit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'foundation_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'main': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.MainPage']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'main_page': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}),
'max_closed_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'max_closed_equipped_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'max_open_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'members': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'members_choice': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'min_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'min_closed_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'min_closed_equipped_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'min_open_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'min_stand_size': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'moved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'org': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'organiser': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_organisers'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['organiser.Organiser']"}),
'paid_new': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Paid']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'periodic': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
'photogallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'place': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'exposition_place'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['place_exposition.PlaceExposition']"}),
'place_alt': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'price_catalog': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'price_choice': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'price_choice_eur': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'price_eur': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'price_rub': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'quality_label': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
'rating': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'registration_link': ('django.db.models.fields.URLField', [], {'max_length': '255', 'blank': 'True'}),
'registration_payment': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
'tag': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_tags'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['theme.Tag']"}),
'tax': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'exposition_themes'", 'symmetrical': 'False', 'to': u"orm['theme.Theme']"}),
'top': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Top']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'users': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_users'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['accounts.User']"}),
'views': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
'visitors': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'visitors_choice': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
},
u'exposition.expositiontranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ExpositionTranslation', 'db_table': "u'exposition_exposition_translation'", 'index_together': '()'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'descriptions': ('django.db.models.fields.CharField', [], {'max_length': '250'}),
'discount_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keywords': ('django.db.models.fields.CharField', [], {'max_length': '250'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'main_title': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['exposition.Exposition']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'participation_note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'pre_condition': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'price_all': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'price_all_bar': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'price_day': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'price_day_bar': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'products': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'stand_condition': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'stat_countries': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'time': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '250'}),
'visit_note': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
},
u'exposition.statistic': {
'Meta': {'unique_together': '()', 'object_name': 'Statistic', 'index_together': '()'},
'area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'countries_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'exposition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'statistic'", 'to': u"orm['exposition.Exposition']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'members': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'visitors': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'year': ('django.db.models.fields.PositiveIntegerField', [], {})
},
u'exposition.statistictranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'StatisticTranslation', 'db_table': "u'exposition_statistic_translation'", 'index_together': '()'},
'countries': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['exposition.Statistic']"})
},
u'exposition.timetable': {
'Meta': {'unique_together': '()', 'object_name': 'TimeTable', 'index_together': '()'},
'begin': ('django.db.models.fields.DateTimeField', [], {}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'end': ('django.db.models.fields.DateTimeField', [], {}),
'exposition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'business_program'", 'to': u"orm['exposition.Exposition']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'timetable_organiser': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['organiser.Organiser']", 'null': 'True', 'blank': 'True'})
},
u'exposition.timetabletranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'TimeTableTranslation', 'db_table': "u'exposition_timetable_translation'", 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['exposition.TimeTable']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'place': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'programe': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'speaker': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
},
u'exposition.tmptimetable': {
'Meta': {'unique_together': '()', 'object_name': 'TmpTimeTable', 'index_together': '()'},
'begin': ('django.db.models.fields.DateTimeField', [], {}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'end': ('django.db.models.fields.DateTimeField', [], {}),
'exposition': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['exposition.Exposition']", 'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'timetable_organiser': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['organiser.Organiser']", 'null': 'True', 'blank': 'True'})
},
u'exposition.tmptimetabletranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'TmpTimeTableTranslation', 'db_table': "u'exposition_tmptimetable_translation'", 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['exposition.TmpTimeTable']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'place': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'programe': ('django.db.models.fields.TextField', [], {}),
'speaker': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
},
u'file.filemodel': {
'Meta': {'unique_together': '()', 'object_name': 'FileModel', 'index_together': '()'},
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'file_path': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
'file_type': ('functions.custom_fields.EnumField', [], {'default': "'PDF'", 'values': "('PDF', 'DOC', 'TXT', 'OTHER', 'JPG', 'BMP', 'PNG', 'GIF')", 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'img_height': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'img_width': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'purpose': ('functions.custom_fields.EnumField', [], {'default': "'photo'", 'values': "['photo', 'flat', 'logo', 'map', 'scheme teritory', 'diplom', 'preview', 'preview2']"})
},
u'note.note': {
'Meta': {'object_name': 'Note'},
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'text': ('django.db.models.fields.TextField', [], {}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounts.User']"})
},
u'organiser.organiser': {
'Meta': {'unique_together': '()', 'object_name': 'Organiser', 'index_together': '()'},
'active': ('django.db.models.fields.NullBooleanField', [], {'default': '0', 'null': 'True', 'blank': 'True'}),
'address': ('functions.custom_fields.LocationField', [], {'null': 'True', 'blank': 'True'}),
'city': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['city.City']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}),
'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Country']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'events_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'facebook': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
'foundation': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'linkedin': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
'place_conference': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'organiser_place_conference'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['place_conference.PlaceConference']"}),
'place_exposition': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'organiser_place_exposition'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['place_exposition.PlaceExposition']"}),
'rating': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'staff_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'tag': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Tag']", 'null': 'True', 'blank': 'True'}),
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Theme']", 'null': 'True', 'blank': 'True'}),
'twitter': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'url': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'}),
'vk': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
},
u'photologue.gallery': {
'Meta': {'ordering': "['-date_added']", 'unique_together': '()', 'object_name': 'Gallery', 'index_together': '()'},
'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'photos': ('sortedm2m.fields.SortedManyToManyField', [], {'blank': 'True', 'related_name': "'galleries'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['photologue.Photo']"}),
'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '200'}),
'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'})
},
u'photologue.photo': {
'Meta': {'ordering': "['sort']", 'unique_together': '()', 'object_name': 'Photo', 'index_together': '()'},
'crop_from': ('django.db.models.fields.CharField', [], {'default': "'center'", 'max_length': '10', 'blank': 'True'}),
'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_related'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '200'}),
'sort': ('django.db.models.fields.PositiveIntegerField', [], {'default': '10', 'null': 'True', 'db_index': 'True'}),
'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}),
'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['photologue.UserMark']", 'null': 'True', 'symmetrical': 'False'}),
'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'})
},
u'photologue.photoeffect': {
'Meta': {'object_name': 'PhotoEffect'},
'background_color': ('django.db.models.fields.CharField', [], {'default': "'#FFFFFF'", 'max_length': '7'}),
'brightness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}),
'color': ('django.db.models.fields.FloatField', [], {'default': '1.0'}),
'contrast': ('django.db.models.fields.FloatField', [], {'default': '1.0'}),
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'filters': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
'reflection_size': ('django.db.models.fields.FloatField', [], {'default': '0'}),
'reflection_strength': ('django.db.models.fields.FloatField', [], {'default': '0.6'}),
'sharpness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}),
'transpose_method': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'})
},
u'photologue.usermark': {
'Meta': {'object_name': 'UserMark'},
'height': ('django.db.models.fields.PositiveSmallIntegerField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'left': ('django.db.models.fields.PositiveSmallIntegerField', [], {}),
'top': ('django.db.models.fields.PositiveSmallIntegerField', [], {}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'marks'", 'to': u"orm['accounts.User']"}),
'width': ('django.db.models.fields.PositiveSmallIntegerField', [], {})
},
u'place_conference.placeconference': {
'Meta': {'unique_together': '()', 'object_name': 'PlaceConference', 'index_together': '()'},
'address': ('functions.custom_fields.LocationField', [], {}),
'amount_halls': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'banquet_hall': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'catering': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'city': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'place_conferences'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}),
'conference_call': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Country']", 'on_delete': 'models.PROTECT'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'exp_hall_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'exposition_hall': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
'foundation_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'hotel': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'multimedia_equipment': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
'top': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Top']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'total_capacity': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'translate_equipment': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'type': ('functions.custom_fields.EnumField', [], {'default': "'Convention centre'", 'values': "['Convention centre', 'Exposition centre']"}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
'video_link': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'views': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
'virtual_tour': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'web_page': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'wifi': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'})
},
u'place_exposition.placeexposition': {
'Meta': {'ordering': "['-rating', 'id']", 'unique_together': '()', 'object_name': 'PlaceExposition', 'index_together': '()'},
'address': ('functions.custom_fields.LocationField', [], {}),
'bank': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'business_centre': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'cafe': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'children_room': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'city': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'place_expositions'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}),
'closed_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'conference_centre': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Country']", 'on_delete': 'models.PROTECT'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'disabled_service': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'event_in_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
'foundation_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}),
'mobile_application': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'online_registration': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'open_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'parking': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'partner': ('django.db.models.fields.NullBooleanField', [], {'default': '0', 'null': 'True', 'blank': 'True'}),
'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}),
'photogallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'press_centre': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'rating': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'terminals': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'top': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Top']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
'total_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'total_halls': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'total_pavilions': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'type': ('functions.custom_fields.EnumField', [], {'default': "'Exposition complex'", 'values': "['Exposition complex', 'Convention centre', 'Exposition centre']"}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'views': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
'virtual_tour': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'web_page': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'wifi': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'})
},
u'sites.site': {
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'theme.tag': {
'Meta': {'unique_together': '()', 'object_name': 'Tag', 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'theme': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'on_delete': 'models.PROTECT', 'to': u"orm['theme.Theme']"}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'})
},
u'theme.theme': {
'Meta': {'unique_together': '()', 'object_name': 'Theme', 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'main_page_conf': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}),
'main_page_expo': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}),
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'types': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'})
},
u'translator.translator': {
'Meta': {'unique_together': '()', 'object_name': 'Translator', 'index_together': '()'},
'birth': ('django.db.models.fields.DateField', [], {}),
'car': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'gender': ('functions.custom_fields.EnumField', [], {'default': "'male'", 'values': "('male', 'female')"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
}
}
complete_apps = ['exposition']

@ -13,6 +13,7 @@ from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver from django.dispatch import receiver
from django.utils import translation from django.utils import translation
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from events.models import TargetAudience
from functions.custom_fields import EnumField from functions.custom_fields import EnumField
from functions.db import db_table_exists from functions.db import db_table_exists
from functions.model_mixin import EventMixin, ExpoMixin from functions.model_mixin import EventMixin, ExpoMixin
@ -25,18 +26,6 @@ from organiser.models import Organiser
from service.models import Service, LinkedService from service.models import Service, LinkedService
from events.common import MEMBERS, VISITORS, PRICE, PRICE_EUR from events.common import MEMBERS, VISITORS, PRICE, PRICE_EUR
AUDIENCE1 = ((None,_(u'Не выбрано')),
('experts', _(u'Специалисты')),
('experts and consumers', _(u'Специалисты и потребители')),
('general public', _(u'Широкая публика'))
)
AUDIENCE = (None,'experts', 'experts and consumers', 'general public')
BIT_AUDIENCE = settings.BIT_AUDIENCE
CURRENCY = settings.CURRENCY CURRENCY = settings.CURRENCY
# check if table exist and create flags if true # check if table exist and create flags if true
@ -137,7 +126,7 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
#about #about
periodic = models.FloatField(verbose_name=_(u'Переодичность'), blank=True, null=True) periodic = models.FloatField(verbose_name=_(u'Переодичность'), blank=True, null=True)
audience = BitField(flags=[k for k, v in BIT_AUDIENCE]) audience = models.ManyToManyField(TargetAudience, null=True)
web_page = models.CharField(verbose_name=_(u'Вебсайт'), max_length=255, blank=True) web_page = models.CharField(verbose_name=_(u'Вебсайт'), max_length=255, blank=True)
foundation_year = models.PositiveIntegerField(verbose_name=_(u'Год основания'), blank=True, null=True) foundation_year = models.PositiveIntegerField(verbose_name=_(u'Год основания'), blank=True, null=True)
area = models.PositiveIntegerField(verbose_name=_(u'Площадь'), blank=True, null=True) area = models.PositiveIntegerField(verbose_name=_(u'Площадь'), blank=True, null=True)
@ -241,16 +230,6 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
def statistic_exists(self): def statistic_exists(self):
return Statistic.objects.filter(exposition=self).exists() return Statistic.objects.filter(exposition=self).exists()
def get_audience(self):
checked = [item for item, bool in self.audience if bool==True]
audience = []
for k, v in BIT_AUDIENCE:
for item in checked:
if item == k:
audience.append(unicode(v))
return ', '.join(audience)
def get_periodic(self): def get_periodic(self):
periodic = {0: '', 1.0: _(u'Ежегодно'), 2.0: _(u'2 раза в год'), 3.0: _(u'3 раза в год'), periodic = {0: '', 1.0: _(u'Ежегодно'), 2.0: _(u'2 раза в год'), 3.0: _(u'3 раза в год'),
4.0: _(u'4 раза в год'), 5.0: _(u'5 раз в год'), 0.5: _(u'Раз в 2 года'), 4.0: _(u'4 раза в год'), 5.0: _(u'5 раз в год'), 0.5: _(u'Раз в 2 года'),

@ -256,7 +256,7 @@ class EventMixin(object):
if not isinstance(getattr(self, '_get_services_detail', None), list): if not isinstance(getattr(self, '_get_services_detail', None), list):
# excluded = ['visit', 'tickets'] # excluded = ['visit', 'tickets']
# country_ids = [item for item, bool in self.country.services if bool==True] # country_ids = [item for item, bool in self.country.services if bool==True]
services = [item for item, bool in self.services if bool==True] services = [item for item, bool in self.services if bool]
qs = Service.objects.language() qs = Service.objects.language()
if excluded is not None: if excluded is not None:
qs = qs.exclude(url__in=excluded) qs = qs.exclude(url__in=excluded)

@ -13,7 +13,6 @@ from country.models import Country
from city.models import City from city.models import City
from theme.models import Theme, Tag from theme.models import Theme, Tag
from functions.files import get_alternative_filename from functions.files import get_alternative_filename
from exposition.models import BIT_AUDIENCE
from accounts.models import User from accounts.models import User
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _

@ -13,6 +13,7 @@ class MetaListView(AdminListView):
form_class = MetaFilterForm form_class = MetaFilterForm
model = MetaSetting model = MetaSetting
class MetaView(AdminView): class MetaView(AdminView):
form_class = MetaForm form_class = MetaForm
model = MetaSetting model = MetaSetting

@ -48,8 +48,31 @@ class MetaForm(forms.Form):
meta.save() meta.save()
class MetaFilterForm(AdminFilterForm): class MetaFilterForm(forms.Form):
model = MetaSetting model = MetaSetting
exact_name = forms.CharField(label=_(u'Название'), required=False)
name = forms.CharField(label=_(u'Часть названия'), required=False)
def filter(self):
"""
return filtered queryset
form must be cleaned before calling this method
"""
model = self.model
data = self.cleaned_data
name = data['name']
exact_name = data['exact_name']
if exact_name:
qs = model.objects.filter(translations__title=name).distinct()
return qs
qs = model.objects.all()
if name:
qs = qs.filter(translations__title__icontains=name).distinct()
return qs
class SeoTextForm(TranslatableModelForm): class SeoTextForm(TranslatableModelForm):

@ -2,6 +2,7 @@
from django.db import models from django.db import models
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from django.db.models.signals import post_save, pre_save from django.db.models.signals import post_save, pre_save
from django.utils import timezone
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from functions.custom_fields import EnumField from functions.custom_fields import EnumField
from functions.custom_fields import LocationField from functions.custom_fields import LocationField
@ -107,8 +108,8 @@ class PlaceConference(TranslatableModel, ExpoMixin):
return '/places' return '/places'
def get_events_number(self): def get_events_number(self):
exp = Conference.objects.filter(place=self) return Conference.objects.filter(place=self,
return len(exp) data_begin__gt=timezone.now()).count()
def events(self): def events(self):
events = Conference.objects.filter(place=self)[:6] events = Conference.objects.filter(place=self)[:6]

@ -4,6 +4,7 @@ from django.db.models import Q
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from django.db.models.signals import post_save, pre_save from django.db.models.signals import post_save, pre_save
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.utils import timezone
from functools import partial from functools import partial
from django.conf import settings from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
@ -255,8 +256,8 @@ class PlaceExposition(TranslatableModel, ExpoMixin):
return duplicate return duplicate
def get_events_number(self): def get_events_number(self):
exp = Exposition.objects.filter(place=self) return Exposition.objects.filter(place=self,
return len(exp) data_begin__gt=timezone.now()).count()
class Hall(TranslatableModel): class Hall(TranslatableModel):

@ -45,6 +45,7 @@ urlpatterns = patterns(
url( url(
r'^(?P<slug>.*)/expositions/$', r'^(?P<slug>.*)/expositions/$',
PlaceExpositionListView.as_view(), PlaceExpositionListView.as_view(),
{'meta_id': 94},
name='place_exposition_list' name='place_exposition_list'
), ),
url( url(

@ -10,11 +10,12 @@ from django.template import RequestContext
from django.utils import translation from django.utils import translation
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.views.generic import DetailView, FormView from django.views.generic import DetailView, FormView
from django.utils import timezone
from functions.cache_mixin import CacheMixin, JitterCacheMixin from functions.cache_mixin import CacheMixin, JitterCacheMixin
from functions.custom_views import ListView from functions.custom_views import ListView
from meta.views import MetadataMixin from meta.views import MetadataMixin
from place_conference.models import PlaceConference from place_conference.models import PlaceConference
from exposition.models import Exposition
from .models import PlaceExposition from .models import PlaceExposition
@ -131,15 +132,12 @@ class PlaceList(JitterCacheMixin, MetadataMixin, ListView):
paginate_by = settings.CLIENT_PAGINATION paginate_by = settings.CLIENT_PAGINATION
template_name = 'client/place/place_list.html' template_name = 'client/place/place_list.html'
def get_queryset(self): def get_queryset(self):
#qs = super(PlaceList, self).get_queryset().order_by('-rating') qs = PlaceExposition.objects.language().select_related('country', 'city').order_by('-rating')
qs= PlaceExposition.objects.language().select_related('country', 'city').all().order_by('-rating') conf_qs = PlaceConference.objects.language().select_related('country', 'city')
conf_qs = PlaceConference.objects.language().all()
return list(qs)+list(conf_qs) return list(qs)+list(conf_qs)
class PlaceCatalogBy(JitterCacheMixin, MetadataMixin, ListView): class PlaceCatalogBy(JitterCacheMixin, MetadataMixin, ListView):
cache_range = [60*30, 60*60] cache_range = [60*30, 60*60]
template_name = 'client/place/catalog_by.html' template_name = 'client/place/catalog_by.html'
@ -232,20 +230,28 @@ class PlaceCityCatalog(PlaceCatalog):
return context return context
class PlaceExpositionListView(ListView): class PlaceExpositionListView(MetadataMixin, ListView):
""" """
Представление перечня событий относительно места. Представление перечня событий относительно места.
Переход на эту страницу происходит со страницы подробного просмотра Переход на эту страницу происходит со страницы подробного просмотра
места, по ссылке "Все события" места, по ссылке "Все события"
""" """
template_name = 'client/place/place_exposition_list.html' template_name = 'client/place/place_exposition_list.html'
# cache_range = settings.CACHE_RANGE
def get_object(self): def get_object(self):
slug = self.kwargs.get('slug') slug = self.kwargs.get('slug')
return get_object_or_404(PlaceExposition, url=slug) self.object = get_object_or_404(PlaceExposition, url=slug)
return self.object
def get_queryset(self): def get_queryset(self):
return self.get_object().exposition_place.all() return Exposition.objects.filter(
place=self.get_object(), data_begin__gte=timezone.now()
).select_related(
'country', 'city'
).prefetch_related(
'tag'
)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
ctx = super(PlaceExpositionListView, self).get_context_data(**kwargs) ctx = super(PlaceExpositionListView, self).get_context_data(**kwargs)

@ -95,9 +95,6 @@ def theme_change(request, theme_id=None):
data['name_%s'%code] = obj.name data['name_%s'%code] = obj.name
data['description_%s'%code] = obj.description data['description_%s'%code] = obj.description
data['main_title_%s'%code] = obj.main_title data['main_title_%s'%code] = obj.main_title
data['title_%s'%code] = obj.title
data['keywords_%s'%code] = obj.keywords
data['descriptions_%s'%code] = obj.descriptions

@ -30,13 +30,6 @@ class ThemeForm(forms.Form):
self.fields['name_%s' % code] = forms.CharField(label=_(u'Название'), required=required) self.fields['name_%s' % code] = forms.CharField(label=_(u'Название'), required=required)
self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required) self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required)
self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=False, widget=CKEditorWidget)#with saving form self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=False, widget=CKEditorWidget)#with saving form
#meta data
self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Description'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Keywords'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
def save(self, id=None): def save(self, id=None):
data = self.cleaned_data data = self.cleaned_data

@ -0,0 +1,80 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Deleting field 'ThemeTranslation.keywords'
db.delete_column(u'theme_theme_translation', 'keywords')
# Deleting field 'ThemeTranslation.title'
db.delete_column(u'theme_theme_translation', 'title')
# Deleting field 'ThemeTranslation.descriptions'
db.delete_column(u'theme_theme_translation', 'descriptions')
def backwards(self, orm):
# Adding field 'ThemeTranslation.keywords'
db.add_column(u'theme_theme_translation', 'keywords',
self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True),
keep_default=False)
# Adding field 'ThemeTranslation.title'
db.add_column(u'theme_theme_translation', 'title',
self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True),
keep_default=False)
# Adding field 'ThemeTranslation.descriptions'
db.add_column(u'theme_theme_translation', 'descriptions',
self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True),
keep_default=False)
models = {
u'theme.tag': {
'Meta': {'unique_together': '()', 'object_name': 'Tag', 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'theme': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'on_delete': 'models.PROTECT', 'to': u"orm['theme.Theme']"}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'})
},
u'theme.tagtranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'TagTranslation', 'db_table': "u'theme_tag_translation'", 'index_together': '()'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'descriptions': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keywords': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'main_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.Tag']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '250', 'blank': 'True'})
},
u'theme.theme': {
'Meta': {'unique_together': '()', 'object_name': 'Theme', 'index_together': '()'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'main_page_conf': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}),
'main_page_expo': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}),
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}),
'types': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}),
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'})
},
u'theme.themetranslation': {
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'ThemeTranslation', 'db_table': "u'theme_theme_translation'", 'index_together': '()'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
'main_title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['theme.Theme']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
}
}
complete_apps = ['theme']

@ -47,11 +47,7 @@ class Theme(TranslatableModel):
translations = TranslatedFields( translations = TranslatedFields(
name = models.CharField(max_length=255), name = models.CharField(max_length=255),
main_title = models.CharField(max_length=255), main_title = models.CharField(max_length=255),
description = models.TextField(blank=True), description = models.TextField(blank=True)
#-----meta data
title = models.CharField(max_length=255, blank=True),
descriptions = models.CharField(max_length=255, blank=True),
keywords = models.CharField(max_length=255, blank=True),
) )
main_page_conf = models.PositiveIntegerField(default=0, db_index=True) main_page_conf = models.PositiveIntegerField(default=0, db_index=True)

@ -28,6 +28,7 @@ def ajax_city(request):
objects = City.objects.language().filter(country=request.GET['id']).order_by('name') objects = City.objects.language().filter(country=request.GET['id']).order_by('name')
return render_to_response('select.html', {'objects': objects}) return render_to_response('select.html', {'objects': objects})
def ajax_tag(request): def ajax_tag(request):
""" """
@ -127,14 +128,12 @@ def ajax_post_stat(request, obj_id=None):
def ajax_delete_stat(request, id): def ajax_delete_stat(request, id):
redirect_to = request.META.get('HTTP_REFERER') redirect_to = request.META.get('HTTP_REFERER')
if id: if id:
try: try:
Statistic.objects.get(id=id).delete() Statistic.objects.get(id=id).delete()
except Statistic.DoesNotExist: except Statistic.DoesNotExist:
pass pass
return HttpResponseRedirect(redirect_to) return HttpResponseRedirect(redirect_to)

@ -1,16 +0,0 @@
from functools import wraps
from django.template import RequestContext
from django.shortcuts import render_to_response
def render_to(tpl):
def decorator(func):
@wraps(func)
def wrapper(request, *args, **kwargs):
out = func(request, *args, **kwargs)
if isinstance(out, dict):
out = render_to_response(tpl, out, RequestContext(request))
return out
return wrapper
return decorator

@ -52,8 +52,6 @@ class Referer(object):
for key, val in data_exists.iteritems(): for key, val in data_exists.iteritems():
if val: if val:
if key == 'search': if key == 'search':
print(request.session.get('search', []))
print(request.session.get('search', []))[-2:]
search = request.session.get('search', [])[-2:] search = request.session.get('search', [])[-2:]
search.append(val) search.append(val)
request.session['search'] = search request.session['search'] = search
@ -112,9 +110,6 @@ def check_places(slug):
# https://gist.github.com/b1/3155460 # https://gist.github.com/b1/3155460
""" spaceless middleware
MIDDLEWARE_CLASSES += ('core_utils.middleware.SpacelessMiddleware',)
"""
class SpacelessMiddleware(object): class SpacelessMiddleware(object):
""" trim spaces between tags if not in DEBUG """ """ trim spaces between tags if not in DEBUG """
def process_response(self, request, response): def process_response(self, request, response):

@ -2,10 +2,11 @@
# Django settings for proj project. # Django settings for proj project.
import os import os
import sys import sys
import django import raven
from django.utils.translation import ugettext_lazy as _
from ConfigParser import ConfigParser from ConfigParser import ConfigParser
import django
from django.utils.translation import ugettext_lazy as _
DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__))
SITE_ROOT = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0] SITE_ROOT = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0]
@ -398,7 +399,7 @@ INSTALLED_APPS = (
'south', 'south',
'rosetta', 'rosetta',
'widget_tweaks', 'widget_tweaks',
# 'raven.contrib.django.raven_compat', 'raven.contrib.django.raven_compat',
) )
CRONJOBS = [ CRONJOBS = [
@ -526,12 +527,13 @@ PERIODIC = {
} }
# sentry # sentry
# RAVEN_CONFIG = { RAVEN_CONFIG = {
# 'dsn': 'http://eb7e4b632b3543f487386cbe9151b174:0b148a7ed13643c88d3a6b014c3a4f65@sentry.oldmin.org/2', 'dsn': 'http://474617c96350412d80735900c6717b9a:330285c9034947a181cbae8b52bb15d8@88.198.17.35:9000/3',
# } 'release': raven.fetch_git_sha(os.path.dirname(os.pardir)),
}
try: try:
from local import * from proj.local import *
except ImportError, e: except ImportError, e:
pass pass

@ -21,12 +21,6 @@ from emencia.django.newsletter.forms import SubscribeAssideForm
from django.db.models.loading import get_model from django.db.models.loading import get_model
def clear_slashes(str_):
if str_[0] == r'/':
str_ = str_[1:]
if str_[-1] == r'/':
str_ = str_[:-1]
return str_
def add_seo(request): def add_seo(request):
url = request.path url = request.path

@ -235,7 +235,7 @@ $(document).ready(function(){
return false; return false;
}); });
// end on-of events // end on-of events
if( $("#id_city" ).length && $("#id_city" ).is('select') ) { if( $("#id_city" ).length ) {
$('#id_city').select2({ $('#id_city').select2({
placeholder: "Город", placeholder: "Город",
width: 'element', width: 'element',
@ -491,16 +491,16 @@ $(document).ready(function(){
}); });
}); });
/* FIXME: Проверить все select2 */ /* FIXME: Проверить инициализацию всех select2 */
// if($('select').length){ if($('select').length){
// try{ try{
// $('select').select2({ $('select').select2({
// width: 'element', width: 'element',
// allowClear: true allowClear: true
//
// }); });
// } catch (e){} } catch (e){}
// } }

@ -1,186 +0,0 @@
{% extends 'base.html' %}
{% load static %}
{# Displays article form #}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
{% endblock %}
{% block body %}
{# Uses multilang.html template for translated fields #}
<form method="post" class="form-horizontal" name="form2" id="form2"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>{% if obj_id %} Изменить {% else %} Добавить {% endif %}статью</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# Hidden input uses for comparing with TmpFile objects #}
{{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.article_id }}
{# main_title #}
{% include 'c_admin/forms/multilang.html' with field='main_title' form=form languages=languages %}
{# theme #}
<div class="control-group {% if form.theme.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.theme.label }}:</b></label>
<div class="controls">
{{ form.theme }}
<span class="help-inline">{{ form.theme.errors }}</span>
</div>
</div>
{# tag #}
<div class="control-group {% if form.tag.errors %}error{% endif %}">
<label class="control-label">{{ form.tag.label }}:</label>
<div class="controls">
{{ form.tag }}
<span class="help-inline">{{ form.tag.errors }}</span>
</div>
</div>
{# preview #}
{% include 'c_admin/forms/multilang.html' with field='preview' form=form languages=languages %}
{# author #}
<div class="control-group {% if form.author.errors %}error{% endif %}">
<label class="control-label">{{ form.author.label }}:</label>
<div class="controls">
{{ form.author }}
<span class="help-inline">{{ form.author.errors }}</span>
</div>
</div>
{# description #}
{% include 'c_admin/forms/multilang.html' with field='description' form=form languages=languages %}
{# keywords #}
{% include 'c_admin/forms/multilang.html' with field='keywords' form=form languages=languages %}
{# title #}
{% include 'c_admin/forms/multilang.html' with field='title' form=form languages=languages %}
{# descriptions #}
{% include 'c_admin/forms/multilang.html' with field='descriptions' form=form languages=languages %}
</div>
</div>
<div class="box span8" id="file">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Файлы</h2>
</div>
<div class="box-content">
{# button that shows modal window with file form #}
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">Добавить файл</a>
{# this div shows list of files and refreshes when new file added #}
<div id="file_list">
<table class="table table-hover">
<thead>
<tr>
<td>id</td>
<td>Файл</td>
<td>Имя</td>
<td>Назначение</td>
<td></td>
</tr>
</thead>
<tbody>
{% for file in files %}
<tr>
<td>{{ file.id }}</td>
<td><img src="{{ file.file_path.url }}"></td>
<td>{{ file.file_name }}</td>
<td>{{ file.purpose }}</td>
<td>
<button class="btn btn-danger delete_file" value="{{ file.id }}">
<i class="icon-trash icon-white"></i> Удалить
</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Добавить">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{# modal window #}
<div class="modal hide fade" id="myModal" >
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" id="close">&times;</button>
<h3>Добавить файл</h3>
</div>
<div id="form_body">
<div class="modal-body">
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="file_form" id="file_form" > {% csrf_token %}
{# hidden inputs uses for comparing with Article form key#}
{{ file_form.key }}
{{ file_form.model }}
<input type="hidden" id="obj_id" value="{{ obj_id }}">
{# file_path #}
<div class="control-group{% if file_form.file_path.errors %}error{% endif %}">
<label class="control-label"><b>{{ file_form.file_path.label }}:</b></label>
<div class="controls">{{ file_form.file_path }}
<span class="help-inline">{{ file_form.file_path.errors }}</span>
</div>
</div>
{# file purpose #}
<div class="control-group{% if file_form.purpose.errors %}error{% endif %}">
<label class="control-label"><b>{{ file_form.purpose.label }}:</b></label>
<div class="controls">{{ file_form.purpose }}
<span class="help-inline">{{ file_form.purpose.errors }}</span>
</div>
</div>
{# file_name #}
{% with field='file_name' form=file_form languages=languages %}
{% include 'c_admin/forms/multilang.html' %}
{% endwith %}
{# file_description #}
{% with field='description' form=file_form languages=languages %}
{% include 'c_admin/forms/multilang.html' %}
{% endwith %}
</div>
<div class="modal-footer">
<div class="controls">
<input class="btn btn-primary" type="submit" value="Добавить">
<input type="reset" class="btn" value="Отменить" data-dismiss="modal">
</form>
</div>
</div>
</div>
</div>
{% endblock %}

@ -1,69 +0,0 @@
{% extends 'base.html' %}
{% block body %}
{% comment %}
Displays lists of all articles in the table
and creating buttons which can change each article
{% endcomment %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список статей</h2>
</div>
<div class="box-content">
<form class='form-search'>
{{ search_form.search_name }}
<button type="submit" class="btn">Найти</button>
</form>
<table class="table table-hover">
<thead>
<tr>
<th>Заголовок</th>
<th>Автор</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in objects %}
<tr>
<td>{{ item.main_title }}</td>
<td>{% ifnotequal item.user None %}{{ item.user }} {% endifnotequal %}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href="/admin/article/change/{{ item.url|lower }}">
Изменить
</a>
</td>
<td class="center sorting_1">
<a class="btn-small btn-inverse" href="/admin/article/copy/{{ item.url|lower }}">
Копировать
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href="/admin/article/delete/{{ item.url }}/">
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="/admin/article/add"><i class="icon-plus-sign icon-white"></i> Добавить статью</a>
</div>
<div class="pagination pagination-centered">
<ul>
{% if objects.has_previous %}
<li> <a href="?page={{ objects.previous_page_number }}"></a></li>
{% endif %}
{% if objects.has_next %}
<li><a href="?page={{ objects.next_page_number }}"></a></li>
{% endif %}
</ul>
</div>
</div>
{% endblock %}

@ -8,4 +8,4 @@
<a class="btn btn-large btn-primary" href = "/admin/article/blog/all">Нет</a> <a class="btn btn-large btn-primary" href = "/admin/article/blog/all">Нет</a>
</div> </div>
</form> </form>
{% endblock %} {% endblock %}

@ -1,34 +1,35 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load static i18n %} {% load static %}
{% load i18n %}
{% block scripts %} {# Displays article form #}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #} {% block scripts %}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script> <script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# ajax #} {# selects #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script> <link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'custom_js/select_tag.js' %}"></script> <script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
{# ajax #}
<link href="{% static 'js/datetimepicker/css/datetimepicker.css' %}" rel="stylesheet"/> <script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'js/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script> <script src="{% static 'custom_js/select_tag.js' %}"></script>
<script>
$(document).ready(function(){
$('#id_publish_date').datetimepicker({ <link href="{% static 'js/datetimepicker/css/datetimepicker.css' %}" rel="stylesheet"/>
todayHighlight: true, <script src="{% static 'js/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script>
format : 'yyyy-mm-dd', <script>
minView:2 $(document).ready(function(){
}); $('#id_publish_date').datetimepicker({
todayHighlight: true,
}); format : 'yyyy-mm-dd',
</script> minView:2
});
<link rel="stylesheet" href="{% static 'jQuery-filer/css/jquery.filer.css' %}">
<link rel="stylesheet" href="{% static 'jQuery-filer/css/jquery.filer-dragdropbox-theme.css' %}"> });
<script src="{% static 'jQuery-filer/js/jquery.filer.js' %}"></script>
<script src="{% static 'jQuery-filer/js/init.js' %}"></script> </script>
{% endblock %}
{% endblock %}
{% block body %} {% block body %}
{{ form.errors }} {{ form.errors }}
@ -132,9 +133,38 @@
</div> </div>
</div> </div>
<div class="box span8" id="file">
<div class="box-header well">
<h2><i class="icon-pencil"></i> {% trans "Файлы" %}</h2>
</div>
<div class="box-content">
{% if article %}
{# button that shows modal window with file form #}
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">{% trans "Добавить файл" %}</a>
{% else %}
<p>{% trans "Файлы можно добавлять только после введения основных данных" %}</p>
{% endif %}
{# this div shows list of files and refreshes when new file added #}
<div id="file_list">
<table class="table table-hover">
{% include 'c_admin/includes/filegallery.html' with object=article model='article.Article' %} <thead>
<tr>
<td>{% trans "id" %}</td>
<td>{% trans "Файл" %}</td>
<td>{% trans "Имя" %}</td>
<td>{% trans "Назначение" %}</td>
<td></td>
</tr>
</thead>
<tbody>
{% include 'file_list.html' with files=files %}
</tbody>
</table>
</div>
</div>
</div>
{% if form.draft %} {% if form.draft %}
<div class="box span8"> <div class="box span8">
<div class="control-group {% if form.draft.errors %}error{% endif %}"> <div class="control-group {% if form.draft.errors %}error{% endif %}">
@ -154,6 +184,7 @@
</fieldset> </fieldset>
</form> </form>
{% include 'c_admin/includes/file_form.html' with file_form=file_form object=article %}
{% endblock %} {% endblock %}

@ -35,7 +35,7 @@
{% endblock %} {% endblock %}
</div> </div>
{# pagination #} {# pagination #}
{% include 'c_admin/includes/admin_pagination.html' with page_obj=object_list %} {% include 'c_admin/includes/admin_pagination.html' %}
</div> </div>
<a href="{% url 'expobanner-baneers_control' %}">{% trans "Назад к управлению баннерами" %}</a> <a href="{% url 'expobanner-baneers_control' %}">{% trans "Назад к управлению баннерами" %}</a>
{% endblock %} {% endblock %}

@ -52,6 +52,7 @@
<li><a href="{% url 'settings_default_description' %}">{% trans 'Описание по умолчанию' %}</a></li> <li><a href="{% url 'settings_default_description' %}">{% trans 'Описание по умолчанию' %}</a></li>
<li><a href="/admin/meta/all/">Мета</a></li> <li><a href="/admin/meta/all/">Мета</a></li>
<li><a href="/admin/meta/seo/all/">Список seo-текстов</a></li>
<li><a href="/admin/rosetta/">Перевод</a></li> <li><a href="/admin/rosetta/">Перевод</a></li>
<li><a href="{% url 'redirects-list' %}">Редиректы</a></li> <li><a href="{% url 'redirects-list' %}">Редиректы</a></li>

@ -1,31 +0,0 @@
{% extends 'base.html' %}
{% load static %}
{% block body %}
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i> Настройки</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основные настройки</h2>
</div>
<div class="box-content">
{# key #}
{% with field='hall_capacity_tmpl' form=form languages=languages %}
{% include 'c_admin/forms/multilang.html' %}
{% endwith %}
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Добавить">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{% endblock %}

@ -42,18 +42,6 @@
{% with field='description' form=form languages=languages %} {% with field='description' form=form languages=languages %}
{% include 'c_admin/forms/multilang.html' %} {% include 'c_admin/forms/multilang.html' %}
{% endwith %} {% endwith %}
{# keywords #}
{% with field='keywords' form=form languages=languages %}
{% include 'c_admin/forms/multilang.html' %}
{% endwith %}
{# title #}
{% with field='title' form=form languages=languages %}
{% include 'c_admin/forms/multilang.html' %}
{% endwith %}
{# descriptions #}
{% with field='descriptions' form=form languages=languages %}
{% include 'c_admin/forms/multilang.html' %}
{% endwith %}
</div> </div>
</div> </div>

@ -1,150 +0,0 @@
{% extends 'base_catalog.html' %}
{% load static %}
{% load i18n %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<strong>{{ object.name }}</strong>
</div>
{% endblock %}
{% block page_title %}
{% endblock %}
{% if object.get_events %}
{% block head_scripts %}
{% include "client/includes/banners/tops_head_js.html" %}
{% endblock head_scripts %}
{% endif %}
{% block content_list %}
<div class="m-article">
<div class="item-wrap place clearfix">
<aside>
<div class="i-pict">
{% include 'client/includes/show_logo.html' with obj=object %}
</div>
</aside>
<div class="i-info">
<header>
<h1 class="i-title">{{ object.name }}</h1>
</header>
<table class="country_table">
<tr>
<td>
<ul>
{% if object.population %}
<li><strong>{% trans 'Население' %}:</strong><span>{{ object.population }} {% trans 'человек' %}</span></li>
{% endif %}
{% if object.code_IATA %}
<li>Код IATA:<span>{{ object.code_IATA.code }}</span></li>
{% endif %}
{% if object.phone_code %}
<li>{% trans 'Телефонный код' %}:<span>+{{ object.phone_code }}</span></li>
{% endif %}
{% if object.transport %}
<li><i>{% trans 'Транспорт' %}:</i><span>{{ object.transport }}</span></li>
{% endif %}
</ul>
</td>
</tr>
</table>
<div class="i-address map-opened country_map">
<div class="i-map">
<!-- позиция для карты задается в атрибуте data-coords -->
<div class="map-canvas" id="map-canvas" data-coords="{{ object.latitude|stringformat:'f' }},{{ object.longitude|stringformat:'f' }}" ></div>
<div class="close-map"><a class="toggle-map" href="#">{% trans 'Скрыть карту' %}</a></div>
</div>
<header>
<div class="show-map show-map_1"><a class="toggle-map" href="#">{% trans 'Раскрыть карту' %}</a></div>
</header>
</div>
</div>
</div>
<table class="map_info_block">
{% if object.famous_places %}
<tr>
<th>{% trans 'Должны посетить' %}:</th>
<td class="width_1">
{{ object.famous_places }}
</td>
</tr>
{% endif %}
{% if object.shoping %}
<tr>
<th>{% trans 'Шоппинг' %}:</th>
<td class="width_1">
{{ object.shoping }}
</td>
</tr>
{% endif %}
</table>
{% if object.description %}
<hr />
<div class="i-services country_content">
<h2 class="sect-title">{% trans "Описание" %}</h2>
<div class="i-descr">
{{ object.description }}
</div>
</div>
{% endif %}
{% if object.get_photos %}
<div class="i-photo-slides i-photo-slides_1">
<h2 class="sect-title">{% trans "Фотогалерея" %}</h2>
<div id="ps-photo-gallery" class="ps-photo-gallery swiper-container">
<ul class="swiper-wrapper">
<li class="swiper-slide"><img src="img/_del-temp/place-photo-1.jpg" alt="" /></li>
<li class="swiper-slide"><img src="img/_del-temp/event-photo-1.jpg" alt="" /></li>
</ul>
<div class="re-controls">
<a class="prev" href="#">&lt;</a>
<a class="next" href="#">&gt;</a>
</div>
</div>
</div>
{% endif %}
</div>
{% if object.get_events %}
<br>
<div class="i-events-list">
<div class="sect-title blog_link">
<a href="#" title="">{% trans 'События в' %} {{ object.name }}</a><a class="button more" href="{{ object.events_catalog }}">{% trans 'Все события' %}</a>
</div>
{% include 'includes/exposition/exposition_list.html' with object_list=object.get_events %}
</div>
{% endif %}
{% if object.get_places %}
<br>
<div class="i-events-list">
<div class="sect-title blog_link">
<a href="#" title="">{% trans 'Места в' %} {{ object.name }}</a><a class="button more" href="{{ object.places_catalog }}">{% trans 'Все места' %}</a>
</div>
{% include 'includes/place/place_list.html' with object_list=object.get_places %}
</div>
{% endif %}
{% if object.get_organisers %}
<br>
<div class="i-events-list">
<div class="sect-title blog_link">
<a href="#" title="">{% trans 'Организаторы в' %} {{ object.name }}</a><a class="button more" href="#">{% trans 'Все организаторы' %} </a>
</div>
{% include 'includes/organiser/organiser_list.html' with object_list=object.get_organisers %}
</div>
{% endif %}
{% endblock %}

@ -56,7 +56,7 @@
{% block page_title %} {% block page_title %}
<div class="page-title"> <div class="page-title">
<h1>{% if meta %}{{ meta.h1 }}{% else %}{% trans 'Выставки' %}: <strong>{{ filter_object.name }}</strong>{% endif %}</h1> <h1>{% if meta %}{{ meta.h1 }}{% elif seo_text %}{{ seo_text.title }}{% else %}{% trans 'Выставки' %}: <strong>{{ filter_object.name }}</strong>{% endif %}</h1>
</div> </div>
{% include 'includes/exposition/catalog_filter_period.html' %} {% include 'includes/exposition/catalog_filter_period.html' %}

@ -32,6 +32,6 @@
{% else %} {% else %}
<title>{% block title_head %}{% trans 'Expomap — выставки, конференции, семинары' %}{% endblock %}</title> <title>{% block title_head %}{% trans 'Expomap — выставки, конференции, семинары' %}{% endblock %}</title>
<meta name="keywords" content=""> <meta name="keywords" content="">
<meta name="description" content=""> <meta name="description" content="">
{% endif %} {% endif %}

@ -1,61 +1,56 @@
{% load static %} {% load static i18n %}
{% load i18n %}
{% with objects=object_list %} {% include 'client/includes/banners/tops.html' %}
{% include 'client/includes/banners/tops.html' %} <ul class="cat-list cl-places">
<ul class="cat-list cl-places"> {% for object in object_list %}
{% for object in object_list %} <li class="cl-item">
<li class="cl-item"> <div class="cl-item-wrap clearfix">
<div class="cl-item-wrap clearfix"> <a target="_blank" href="{{ object.get_permanent_url }}">
<a target="_blank" href="{{ object.get_permanent_url }}"> <div class="cli-pict">
<div class="cli-pict"> {% include 'client/includes/show_logo.html' with obj=object %}
{% with obj=object %} </div>
{% include 'client/includes/show_logo.html' %} </a>
{% endwith %} <div class="cli-info">
</div> <div class="cli-top clearfix">
</a>
<div class="cli-info">
<div class="cli-top clearfix">
<header> <header>
<div class="cli-title"><a target="_blank" href="{{ object.get_permanent_url }}">{{ object.name|safe }}</a></div> <div class="cli-title"><a target="_blank" href="{{ object.get_permanent_url }}">{{ object.name|safe }}</a></div>
<!--<div class="cli-rate">{{ object.rating }}</div>--> {# <div class="cli-rate">{{ object.rating }}</div>#}
</header> </header>
<div class="cli-descr">{{ object.get_type }}</div> <div class="cli-descr">{{ object.get_type }}</div>
</div> </div>
<div class="cli-bot clearfix"> <div class="cli-bot clearfix">
{% if object.total_area %} {% if object.total_area %}
<div class="cli-dim">{{ object.total_area }} м2</div> <div class="cli-dim">{{ object.total_area }} м2</div>
{% endif %} {% endif %}
<div class="cli-place"><a href="/places/country/{{ object.country.url }}/">{{ object.country }}</a>, <a href="/places/city/{{ object.city.url }}/">{{ object.city }}</a> <div class="cli-place"><a href="/places/country/{{ object.country.url }}/">{{ object.country }}</a>, <a href="/places/city/{{ object.city.url }}/">{{ object.city }}</a>
</div>
</div>
</div> </div>
</div>
</div>
<div class="cli-buttons clearfix"> <div class="cli-buttons clearfix">
<div class="cli-m-buttons"> <div class="cli-m-buttons">
<a class="button icon-info" href="{{ object.get_permanent_url }}">{% trans 'описание' %}</a> <a class="button icon-info" href="{{ object.get_permanent_url }}">{% trans 'описание' %}</a>
{% if object.get_events_number %} {% if object.get_events_number %}
<a class="button green icon-list" href="#">{% trans 'события' %} ({{ object.get_events_number }})</a> <a class="button green icon-list" href="{% url 'place_exposition_list' object.url %}">{% trans 'события' %} ({{ object.get_events_number }})</a>
{% endif %} {% endif %}
{% if object.photogallery %} {% if object.photogallery %}
<a class="button blue icon-photo" href="{{ object.get_permanent_url }}photo/">{% trans 'фото' %}</a> <a class="button blue icon-photo" href="{{ object.get_permanent_url }}photo/">{% trans 'фото' %}</a>
{% endif %} {% endif %}
</div> </div>
<div class="cli-s-buttons"> <div class="cli-s-buttons">
<a class="button blue2 lc" target="_blank" href="http://www.booking.com/searchresults.html?aid={{ book_aid }}&city={{ object.city.id }}">{% trans 'Найти отели поблизости' %}</a> <a class="button blue2 lc" target="_blank" href="http://www.booking.com/searchresults.html?aid={{ book_aid }}&city={{ object.city.id }}">{% trans 'Найти отели поблизости' %}</a>
</div>
</div> </div>
</li> </div>
{% if forloop.counter == 5 or objects|length < 5 %} </li>
{% include 'client/includes/banners/catalog_inner_2.html' %} {% if forloop.counter == 5 or object_list|length < 5 %}
{% endif %} {% include 'client/includes/banners/catalog_inner_2.html' %}
{% endif %}
{% if forloop.counter == 10 %} {% if forloop.counter == 10 %}
{% include 'client/includes/banners/catalog_inner.html' %} {% include 'client/includes/banners/catalog_inner.html' %}
{%endif %} {%endif %}
{% endfor %} {% endfor %}
</ul> </ul>
{% endwith %}

@ -114,7 +114,7 @@
</div> </div>
{% endif %} {% endif %}
{# TODO: request optization #} {# TODO: request optimization #}
{% if object.halls.count %} {% if object.halls.count %}
<div class="eni-areas clearfix"> <div class="eni-areas clearfix">
<div class="enis-col"> <div class="enis-col">

Loading…
Cancel
Save