Merge branch 'develop' of git.general-servers.com:expomap/expomap into develop

remotes/origin/1203
Nazar Kotjuk 11 years ago
commit 4bf1894e80
  1. 8
      accounts/admin.py
  2. 3
      accounts/models.py
  3. 20
      core/admin_urls.py
  4. 11
      core/forms.py
  5. 49
      core/models.py
  6. 17
      core/utils.py
  7. 47
      core/views.py
  8. 41
      expobanner/admin.py
  9. 2
      expobanner/forms.py
  10. 156
      expobanner/managers.py
  11. 651
      expobanner/models.py
  12. 146
      expobanner/templates/slider.html
  13. 148
      expobanner/templatetags/banner.py
  14. 26
      expobanner/urls.py
  15. 192
      expobanner/views.py
  16. 5
      exposition/models.py
  17. 6
      functions/admin_views.py
  18. 0
      logs/django_request.log
  19. 16
      logs/mylog.log
  20. 7056
      logs/mylog.log.1
  21. 12
      meta/admin.py
  22. 11
      meta/admin_urls.py
  23. 17
      meta/forms.py
  24. 80
      meta/models.py
  25. 11
      meta/views.py
  26. 1
      proj/admin_urls.py
  27. 30
      proj/decorators.py
  28. 3
      proj/settings.py
  29. 3
      proj/urls.py
  30. 2
      proj/views.py
  31. 2
      service/urls.py
  32. 1
      service/views.py
  33. 0
      specialist_catalog/__init__.py
  34. 20
      specialist_catalog/admin_urls.py
  35. 64
      specialist_catalog/forms.py
  36. 1
      specialist_catalog/management/__init__.py
  37. 1
      specialist_catalog/management/commands/__init__.py
  38. 34
      specialist_catalog/management/commands/create_city_page.py
  39. 33
      specialist_catalog/management/commands/create_country_page.py
  40. 97
      specialist_catalog/models.py
  41. 16
      specialist_catalog/tests.py
  42. 8
      specialist_catalog/urls.py
  43. 171
      specialist_catalog/views.py
  44. 1
      static/custom_js/place_city_ajax.js
  45. 93
      static/custom_js/specialist.js
  46. 120
      static/custom_js/specialist_catalog.js
  47. 167
      static/custom_js/wizard.js
  48. 21
      templates/admin/expobanner/main_list.html
  49. 10
      templates/admin/expobanner/main_stat.html
  50. 19
      templates/admin/expobanner/paid_list.html
  51. 7
      templates/admin/expobanner/paid_stat.html
  52. 15
      templates/admin/expobanner/top_list.html
  53. 142
      templates/admin/meta/create_seo_text.html
  54. 20
      templates/admin/meta/seo_confirm_delete.html
  55. 180
      templates/admin/page/new_page.html
  56. 20
      templates/admin/page/page_confirm_delete.html
  57. 14
      templates/admin/page/page_template_view.html
  58. 64
      templates/admin/specialist/catalog_all.html
  59. 11
      templates/admin/specialist/catalog_confirm_delete.html
  60. 203
      templates/admin/specialist/catalog_new.html
  61. 62
      templates/admin/specialist/feedback_all.html
  62. 11
      templates/admin/specialist/feedback_confirm_delete.html
  63. 79
      templates/admin/specialist/feedback_new.html
  64. 62
      templates/admin/specialist/specialist_all.html
  65. 11
      templates/admin/specialist/specialist_confirm_delete.html
  66. 79
      templates/admin/specialist/specialist_new.html
  67. 31
      templates/client/404_test.html
  68. 12
      templates/client/accounts/email_required.html
  69. 5
      templates/client/blank.html
  70. 5
      templates/client/includes/header.html
  71. 5
      templates/client/includes/meta.html
  72. 4
      templates/client/includes/seo_text.html
  73. 36
      templates/client/page/page_view.html
  74. 326
      templates/client/specialist_catalog/catalog_detailed.html
  75. 4
      templates/client/static_client/js/_modules/block.exposition.list.js
  76. 427
      templates/client/wizard/first_step.html
  77. 569
      templates/client/wizard/second_step.html
  78. 148
      templates/client/wizard/third_step.html
  79. 44
      templates/client/wizard/wizard.html
  80. 1
      theme/models.py
  81. 140
      wizard/forms.py
  82. 3
      wizard/models.py
  83. 15
      wizard/urls.py
  84. 168
      wizard/views.py

@ -13,14 +13,20 @@ from django.utils.translation import ugettext as _
from models import User from models import User
from forms import UserForm, UserCreationForm, ChangePasswordForm, EmailAnnouncementForm, UserFilterForm from forms import UserForm, UserCreationForm, ChangePasswordForm, EmailAnnouncementForm, UserFilterForm
#custom views #custom views
from functions.admin_views import AdminView, AdminListView
from django.views.generic import UpdateView from django.views.generic import UpdateView
from functions.admin_views import AdminView, AdminListView, paginate_results
class UserListView(AdminListView): class UserListView(AdminListView):
template_name = 'admin/accounts/user_list.html' template_name = 'admin/accounts/user_list.html'
form_class = UserFilterForm form_class = UserFilterForm
model = User model = User
def get_context_data(self, **kwargs):
context = super(UserListView, self).get_context_data(**kwargs)
qs = self.model.objects.all()
result = paginate_results(qs, page=self.request.GET.get('page'))
context['object_list'] = result
return context
class EditUser(UpdateView): class EditUser(UpdateView):
model = User model = User

@ -144,6 +144,9 @@ class User(AbstractBaseUser, PermissionsMixin):
class Meta: class Meta:
ordering=['-rating'] ordering=['-rating']
def is_organiser(self):
return bool(self.organiser)
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.

@ -1,10 +1,10 @@
from django.conf.urls import url, patterns from django.conf.urls import url, patterns
from views import NewPage, PageList, EditPage, DeletePage, PageDetailed from views import NewPage, PageList, EditPage, DeletePage, PageDetailed
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^new/$', NewPage.as_view(), name='new_page' ), url(r'^new/$', NewPage.as_view(), name='new_page' ),
url(r'^all/$', PageList.as_view(), name = 'page_list'), url(r'^all/$', PageList.as_view(), name = 'page_list'),
url(r'^edit/(?P<url>.*)/$', EditPage.as_view(), name='edit_page'), url(r'^edit/(?P<url>.*)/$', EditPage.as_view(), name='edit_page'),
url(r'^delete/(?P<url>.*)/$', DeletePage.as_view(), name='delete_page'), url(r'^delete/(?P<url>.*)/$', DeletePage.as_view(), name='delete_page'),
url(r'^(?P<url>.*)/$', PageDetailed.as_view(), name='page_view'), url(r'^(?P<url>.*)/$', PageDetailed.as_view(), name='page_view'),
) )

@ -61,21 +61,12 @@ class PageForm(TranslatableModelForm):
class Meta: class Meta:
model = Page model = Page
fields = ['url','title','h1','descriptions','keywords', 'body' ] fields = ['url','title','h1','descriptions','keywords', 'body']
widgets = { widgets = {
'body':CKEditorWidget, 'body':CKEditorWidget,
'keywords':Textarea, 'keywords':Textarea,
'descriptions':Textarea, 'descriptions':Textarea,
} }
def clean_url(self):
url = self.cleaned_data.get('url', None)
if url[0] == '/':
url = url[1:]
if url[-1] == '/':
url = url[:-1]
if ' ' in url:
url.replace(' ', '_')
return url

@ -4,7 +4,7 @@ from django.shortcuts import get_object_or_404
from django.db import models from django.db import models
from exposition.models import Exposition from exposition.models import Exposition
from settings.models import create_transl_fields import copy
from theme.models import Theme from theme.models import Theme
from country.models import Country from country.models import Country
from city.models import City from city.models import City
@ -114,24 +114,39 @@ class Page(TranslatableModel):
def get_absolute_url(self): def get_absolute_url(self):
return reverse('page_view', args=[self.url]) return reverse('page_view', args=[self.url])
def __init__(self, *args, **kwargs):
super(Page, self).__init__(*args, **kwargs)
self.cache_fields = ['h1', 'body','title', 'description', 'keywords']
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields}
self.is_new = True
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super(Page,self).save(*args, **kwargs) super(Page,self).save(*args, **kwargs)
self.initial_language = 'ru'
all_field_names = list(self._translated_field_names)
clear_f_n = [] new_values = {field: getattr(self, field) for field in self.cache_fields}
for field_name in all_field_names: langs = [code for code, _ in settings.LANGUAGES]
if field_name not in ['master', 'master_id',u'id', 'language_code']: if self.is_new:
clear_f_n.append(field_name) for lang in langs:
field_items = {field_name:getattr(self, field_name) for field_name in clear_f_n} if lang not in self.get_available_languages():
self.translate(lang)
langs = [lan[0] for lan in settings.LANGUAGES] for key, value in new_values.items():
for lang in langs: setattr(self, key, value)
if lang not in self.get_available_languages(): self.save_translations(self)
self.translate(lang) else:
for field in clear_f_n: translations = {obj.language_code:obj for obj in list(self.translations.all())}
setattr(self, field, field_items.get(field, '')) for lang in langs:
obj = super(Page,self).save(*args, **kwargs) if lang is not self.initial_language:
return obj tr = translations[lang]
for key, value in new_values.items():
#if u'%s' % getattr(self, key) is u'' or getattr(self, key) is u'%s' % self.var_cache[key]:
setattr(tr, key, value)
tr.save()
self.lazy_translation_getter(self.initial_language)
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields}
self.is_new = False
return self
def __unicode__(self): def __unicode__(self):
return self.url return self.url

@ -2,10 +2,6 @@
import xlwt import xlwt
import datetime import datetime
from exposition.models import Exposition
from conference.models import Conference
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
HEADER_STYLE = xlwt.easyxf('font: bold on') HEADER_STYLE = xlwt.easyxf('font: bold on')
@ -42,11 +38,13 @@ def get_column_cell(obj, name):
return ', '.join(unicode(x).strip() for x in attr.all()) return ', '.join(unicode(x).strip() for x in attr.all())
return attr return attr
def queryset_to_workbook(queryset, columns, header_style=None, default_style=None, cell_style_map=None): def queryset_to_workbook(queryset, columns, header_style=None, default_style=None, cell_style_map=None):
workbook = xlwt.Workbook() workbook = xlwt.Workbook()
report_date = datetime.date.today() report_date = datetime.date.today()
sheet_name = 'Export {0}'.format(report_date.strftime('%Y-%m-%d')) sheet_name = u'My calendar {0}'.format(report_date.strftime('%Y-%m-%d'))
sheet = workbook.add_sheet(sheet_name) sheet = workbook.add_sheet(sheet_name)
sheet.insert_bitmap('')
if not header_style: if not header_style:
header_style = HEADER_STYLE header_style = HEADER_STYLE
@ -57,14 +55,13 @@ def queryset_to_workbook(queryset, columns, header_style=None, default_style=Non
obj = queryset[0] obj = queryset[0]
for y, column in enumerate(columns): for i, column in enumerate(columns):
header_list=[u'Название события',u'Страна',u'Город',u'Место проведения', u'Дата начала', u'Дата окончания'] header_list=[u'#', u'Название события',u'Даты',u'Краткое описание',u'Место проведения', u'Заметка', u'Ссылка на событие']
sheet.write(0, i, header_list[i], header_style)
sheet.write(0, y, header_list[y], header_style)
for x, obj in enumerate(queryset, start=1): for x, obj in enumerate(queryset, start=1):
for y, column in enumerate(columns): for y, column in enumerate(columns):
value = get_column_cell(obj, column) value = getattr(obj, column)
style = default_style style = default_style
for value_type, cell_style in cell_style_map: for value_type, cell_style in cell_style_map:
if isinstance(value, value_type): if isinstance(value, value_type):

@ -1,5 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from country.models import Country from country.models import Country
from city.models import City from city.models import City
from place_exposition.models import PlaceExposition from place_exposition.models import PlaceExposition
@ -218,11 +217,14 @@ class PageList(ListView):
template_name = 'page_admin_list.html' template_name = 'page_admin_list.html'
model = Page model = Page
order = 'created' order = 'created'
from django import forms
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
class EditPage(UpdateView): class EditPage(UpdateView):
model = Page model = Page
template_name = 'new_page.html' template_name = 'admin/page/new_page.html'
form_class = PageForm form_class = PageForm
slug_url_kwarg = 'url' slug_url_kwarg = 'url'
slug_field = 'url' slug_field = 'url'
@ -233,7 +235,8 @@ class EditPage(UpdateView):
return context return context
def get_success_url(self): def get_success_url(self):
return HttpResponseRedirect('/admin/page/all/') return reverse_lazy('page_list')
class DeletePage(DeleteView): class DeletePage(DeleteView):
template_name = 'admin/page/page_confirm_delete.html' template_name = 'admin/page/page_confirm_delete.html'
@ -244,39 +247,47 @@ class DeletePage(DeleteView):
class PageDetailed(DetailView): class PageDetailed(DetailView):
model = Page model = Page
template_name = 'client/base_catalog.html' template_name = 'admin/page/page_template_view.html'
slug_field = 'url' slug_field = 'url'
slug_url_kwarg = 'url' slug_url_kwarg = 'url'
# ------------ XLS Export ---------------- # ------------ XLS Export ----------------
from django.http import HttpResponse from django.http import HttpResponse
from django.utils.translation import get_language
from .utils import queryset_to_workbook from .utils import queryset_to_workbook
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference from conference.models import Conference
def download_workbook(request): def download_workbook(request):
data = [(36539, 'expo'),(36602, 'expo'), (3033, 'conf'), (3053, 'conf')] lang = get_language()
data = [(36539, 'expo'),(36602, 'expo')]#, (3033, 'conf'), (3053, 'conf')]
qs = [] qs = []
for obj in data: for obj in data:
if obj[1] == 'expo': if obj[1] == 'expo':
qs.append(Exposition.objects.get(id=obj[0])) qs.append(Exposition.objects.language(lang).get(id=obj[0]))
if obj[1] == 'conf':
qs.append(Conference.objects.get(id=obj[0])) elif obj[1] == 'conf':
qs.append(Conference.objects.language(lang).get(id=obj[0]))
for i, obj in enumerate(qs, start=1):
setattr(obj, 'number', i)
setattr(obj, 'dates', u'%s - %s'%(obj.data_begin.strftime('%d %B %Y'),obj.data_end.strftime('%d %B %Y')))
setattr(obj, 'full_place', u'%s, %s, %s' % (obj.country, obj.city, getattr(obj.place, 'name', '')))
setattr(obj, 'link', u'expomap.ru%s'%obj.get_absolute_url())
columns = ( columns = (
'number',
'name', 'name',
'country.name', 'dates',
'city.name', 'main_title',
'place.name', 'full_place',
'data_begin', 'participation_note',
'data_end') 'link')
workbook = queryset_to_workbook(qs, columns) workbook = queryset_to_workbook(qs, columns)
response = HttpResponse(content_type='application/vnd.ms-excel') response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename="export.xls"' response['Content-Disposition'] = 'attachment; filename="My calendar.xls"'
workbook.save(response) workbook.save(response)
return response return response

@ -3,6 +3,7 @@ from django.views.generic import TemplateView, CreateView, ListView, UpdateView,
from django.conf import settings from django.conf import settings
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.db.models import Sum
from expobanner.models import URL, BannerGroup, Banner, Paid, MainPage, Top from expobanner.models import URL, BannerGroup, Banner, Paid, MainPage, Top
from expobanner.forms import UrlCreateForm, BannerCreateGroupForm, BannerCreateForm, BannerGroupUpdateForm,\ from expobanner.forms import UrlCreateForm, BannerCreateGroupForm, BannerCreateForm, BannerGroupUpdateForm,\
PaidCreateForm, PaidUpdateForm, TopCreateForm, BannerLinkCreateForm, MainCreateForm, MainUpdateForm, TopUpdateForm PaidCreateForm, PaidUpdateForm, TopCreateForm, BannerLinkCreateForm, MainCreateForm, MainUpdateForm, TopUpdateForm
@ -32,6 +33,7 @@ class CreateBanner(AbstractCreate):
model = Banner model = Banner
form_class = BannerCreateForm form_class = BannerCreateForm
class CreateLink(AbstractCreate): class CreateLink(AbstractCreate):
model = Banner model = Banner
form_class = BannerLinkCreateForm form_class = BannerLinkCreateForm
@ -67,6 +69,7 @@ class BannerList(AbstractList):
qs = qs.filter(group__isnull=False) qs = qs.filter(group__isnull=False)
return qs return qs
class LinkList(AbstractList): class LinkList(AbstractList):
model = Banner model = Banner
verbose = u'Список ссылок' verbose = u'Список ссылок'
@ -114,7 +117,10 @@ class PaidList(ListView):
paginate_by = settings.ADMIN_PAGINATION paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self): def get_queryset(self):
return self.model.objects.language().filter(paid_new__isnull=False) qs = self.model.objects.language().filter(paid_new__isnull=False).order_by('-paid_new__public')
if self.request.GET.get('onlypublic'):
qs = qs.filter(paid_new__public=True)
return qs
class PaidCreate(CreateView): class PaidCreate(CreateView):
@ -162,6 +168,18 @@ class PaidStat(DetailView):
model = Paid model = Paid
template_name = 'admin/expobanner/paid_stat.html' template_name = 'admin/expobanner/paid_stat.html'
def get_context_data(self, **kwargs):
context = super(PaidStat, self).get_context_data(**kwargs)
obj = self.object
context['all'] = obj.paidstat_set.aggregate(
official=Sum('official_clicks'),
ticket=Sum('tickets_clicks'),
participation=Sum('participation_clicks'),
catalog=Sum('catalog_clicks')
)
return context
# ---------------------------------- # ----------------------------------
class MainList(ListView): class MainList(ListView):
model = Exposition model = Exposition
@ -169,7 +187,10 @@ class MainList(ListView):
paginate_by = settings.ADMIN_PAGINATION paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self): def get_queryset(self):
return self.model.objects.language().filter(main__isnull=False) qs = self.model.objects.language().filter(main__isnull=False).order_by('-main__public')
if self.request.GET.get('onlypublic'):
qs = qs.filter(main__public=True)
return qs
class MainCreate(CreateView): class MainCreate(CreateView):
@ -202,6 +223,7 @@ def main_turn(request, pk, status):
return HttpResponseRedirect('/admin/expobanners/main/list/') return HttpResponseRedirect('/admin/expobanners/main/list/')
class MainStat(DetailView): class MainStat(DetailView):
model = MainPage model = MainPage
template_name = 'admin/expobanner/main_stat.html' template_name = 'admin/expobanner/main_stat.html'
@ -210,10 +232,16 @@ class MainStat(DetailView):
context = super(MainStat, self).get_context_data(**kwargs) context = super(MainStat, self).get_context_data(**kwargs)
obj = self.object obj = self.object
context['stats'] = obj.link.banner_stat.all() context['stats'] = obj.link.banner_stat.all()
context['all'] = obj.link.banner_stat.aggregate(
views=Sum('view'),
clicks=Sum('click'),
unique_clicks=Sum('unique_click'),
unique_views=Sum('unique_view')
)
return context return context
# ------------------------------------ # ------------------------------------
from datetime import date
class TopList(ListView): class TopList(ListView):
model = Exposition model = Exposition
@ -221,7 +249,10 @@ class TopList(ListView):
paginate_by = settings.ADMIN_PAGINATION paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self): def get_queryset(self):
return self.model.objects.language().filter(top__isnull=False) qs = self.model.objects.language().filter(top__isnull=False).order_by('-top__fr')
if self.request.GET.get('onlypublic'):
qs = qs.filter(top__fr__lte=date.today(), top__to__gte=date.today())
return qs
class TopCreate(CreateView): class TopCreate(CreateView):
@ -241,4 +272,4 @@ class TopUpdate(UpdateView):
context = super(TopUpdate, self).get_context_data(**kwargs) context = super(TopUpdate, self).get_context_data(**kwargs)
obj = self.object obj = self.object
context['exposition'] = obj.get_event() context['exposition'] = obj.get_event()
return context return context

@ -267,4 +267,4 @@ class TopUpdateForm(forms.ModelForm):
top.save() top.save()
self.save_m2m() self.save_m2m()
return top return top

@ -1,79 +1,79 @@
# -*- coding: utf-8 -* # -*- coding: utf-8 -*
from datetime import date from datetime import date
from random import choice, shuffle from random import choice, shuffle
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from django.core.cache import cache from django.core.cache import cache
class BiasedManager(models.Manager): class BiasedManager(models.Manager):
def by_time(self, **kwargs): def by_time(self, **kwargs):
all = super(BiasedManager, self).get_query_set().filter(**kwargs) all = super(BiasedManager, self).get_query_set().filter(**kwargs)
result = [] result = []
for i in all: for i in all:
for j in range(i.often): for j in range(i.often):
result.append(i) result.append(i)
return result return result
def one(self, **kwargs): def one(self, **kwargs):
return choice(self.by_time(**kwargs)) return choice(self.by_time(**kwargs))
def by_often(self, **kwargs): def by_often(self, **kwargs):
result = self.by_time(**kwargs) result = self.by_time(**kwargs)
shuffle(result) shuffle(result)
return result return result
def create_for_paid(self, expo, url, role): def create_for_paid(self, expo, url, role):
try: try:
name = str(expo.name) name = str(expo.name)
except UnicodeEncodeError, UnicodeDecodeError: except UnicodeEncodeError, UnicodeDecodeError:
name = expo.url name = expo.url
alt = u'%s_%s'%(name, role) alt = u'%s_%s'%(name, role)
return self.create(alt=alt, url=url, paid=True) return self.create(alt=alt, url=url, paid=True)
class BannerGroupCached(models.Manager): class BannerGroupCached(models.Manager):
def all(self): def all(self):
key = 'banner_group_all' key = 'banner_group_all'
result = cache.get(key) result = cache.get(key)
if not result: if not result:
result = list(self.filter(public=True)) result = list(self.filter(public=True))
cache.set(key, result, 90) cache.set(key, result, 90)
return result return result
def group_banners(self): def group_banners(self):
key = 'banner_group_banners' key = 'banner_group_banners'
result = cache.get(key) result = cache.get(key)
if not result: if not result:
groups = self.all() groups = self.all()
today = date.today() today = date.today()
result = {} result = {}
for group in groups: for group in groups:
result[group.slug] = list(group.banners.prefetch_related('urls', 'theme', 'country')\ result[group.slug] = list(group.banners.prefetch_related('urls', 'theme', 'country')\
.filter(public=True, fr__lte=today)\ .filter(public=True, fr__lte=today)\
.filter(Q(to__gte=today) | Q(to__isnull=True))) .filter(Q(to__gte=today) | Q(to__isnull=True)))
cache.set(key, result, 70) cache.set(key, result, 70)
return result return result
class URLCached(models.Manager): class URLCached(models.Manager):
def all(self): def all(self):
key = 'banner_url_all' key = 'banner_url_all'
result = cache.get(key) result = cache.get(key)
if not result: if not result:
result = list(self.filter(public=True)) result = list(self.filter(public=True))
cache.set(key, result, 150) cache.set(key, result, 150)
return result return result
class TopCached(models.Manager): class TopCached(models.Manager):
def all(self): def all(self):
key = 'expo_b_top_all' key = 'expo_b_top_all'
result = cache.get(key) result = cache.get(key)
if not result: if not result:
today = date.today() today = date.today()
result = list(self.prefetch_related('theme', 'country', 'excluded_tags', 'excluded_cities'). result = list(self.prefetch_related('theme', 'country', 'excluded_tags', 'excluded_cities').
filter(fr__lte=today).filter(Q(to__gte=today) | Q(to__isnull=True))) filter(fr__lte=today).filter(Q(to__gte=today) | Q(to__isnull=True)))
cache.set(key, result, 80) cache.set(key, result, 80)
return result return result

@ -1,323 +1,328 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import random import random
import hashlib import hashlib
from datetime import datetime, date from datetime import datetime, date
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.conf import settings from django.conf import settings
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.db.models.signals import post_save from django.db.models.signals import post_save
from .managers import BiasedManager, BannerGroupCached, URLCached, TopCached from .managers import BiasedManager, BannerGroupCached, URLCached, TopCached
from .mixins import StatMixin from .mixins import StatMixin
from theme.models import Theme from theme.models import Theme
from country.models import Country from country.models import Country
class URL(models.Model): class URL(models.Model):
title = models.CharField(verbose_name=u'Заголовок', max_length=256) title = models.CharField(verbose_name=u'Заголовок', max_length=256)
url = models.CharField(verbose_name=u'URL or URL RegEx', max_length=2048) url = models.CharField(verbose_name=u'URL or URL RegEx', max_length=2048)
regex = models.BooleanField(verbose_name=u'RegEx', default=False) regex = models.BooleanField(verbose_name=u'RegEx', default=False)
sites = models.ManyToManyField(Site, related_name='site_urls', verbose_name=_('Sites'), null=True, blank=True) sites = models.ManyToManyField(Site, related_name='site_urls', verbose_name=_('Sites'), null=True, blank=True)
public = models.BooleanField(verbose_name=u'Активный', default=True) public = models.BooleanField(verbose_name=u'Активный', default=True)
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
objects = models.Manager() objects = models.Manager()
cached = URLCached() cached = URLCached()
def __unicode__(self): def __unicode__(self):
return self.title return self.title
class Meta: class Meta:
ordering = ['-created_at'] ordering = ['-created_at']
verbose_name = _('URL') verbose_name = _('URL')
verbose_name_plural = _('URLs') verbose_name_plural = _('URLs')
def get_admin_url(self): def get_admin_url(self):
return '/admin/expobanners/banners/url/%d/edit/'%self.id return '/admin/expobanners/banners/url/%d/edit/'%self.id
class BannerGroup (models.Model): class BannerGroup (models.Model):
name = models.CharField(verbose_name=u'Имя', max_length=255) name = models.CharField(verbose_name=u'Имя', max_length=255)
slug = models.SlugField(verbose_name=u'URL', unique=True) slug = models.SlugField(verbose_name=u'URL', unique=True)
width = models.PositiveSmallIntegerField(verbose_name=u'Ширина', default=0) width = models.PositiveSmallIntegerField(verbose_name=u'Ширина', default=0)
height = models.PositiveSmallIntegerField(verbose_name=u'Высота', default=0) height = models.PositiveSmallIntegerField(verbose_name=u'Высота', default=0)
speed = models.PositiveSmallIntegerField(verbose_name=u'Скорость отображения', default=2000) speed = models.PositiveSmallIntegerField(verbose_name=u'Скорость отображения', default=2000)
public = models.BooleanField(verbose_name=u'Активная', default=True) public = models.BooleanField(verbose_name=u'Активная', default=True)
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
objects = models.Manager() objects = models.Manager()
cached = BannerGroupCached() cached = BannerGroupCached()
def size(self): def size(self):
return '%sx%s' % (self.width, self.height) return '%sx%s' % (self.width, self.height)
def __unicode__(self): def __unicode__(self):
return '%s - [%s x %s]' % (self.name, self.width, self.height) return '%s - [%s x %s]' % (self.name, self.width, self.height)
class Meta: class Meta:
ordering = ['name'] ordering = ['name']
verbose_name = _('Banner Group') verbose_name = _('Banner Group')
verbose_name_plural = _('Banner Groups') verbose_name_plural = _('Banner Groups')
def get_admin_url(self): def get_admin_url(self):
return '/admin/expobanners/banners/group/%d/edit/'%self.id return '/admin/expobanners/banners/group/%d/edit/'%self.id
class Banner(models.Model, StatMixin): class Banner(models.Model, StatMixin):
objects = BiasedManager() objects = BiasedManager()
title = models.CharField(verbose_name=u'Заголовок', max_length=255, blank=True) title = models.CharField(verbose_name=u'Заголовок', max_length=255, blank=True)
alt = models.CharField(verbose_name=_('Alt'), max_length=255) alt = models.CharField(verbose_name=_('Alt'), max_length=255)
text = models.TextField(verbose_name=u'Текст', blank=True, null=True) text = models.TextField(verbose_name=u'Текст', blank=True, null=True)
img = models.FileField(verbose_name=u'Картинка', upload_to='expo_upload', blank=True, null=True) img = models.FileField(verbose_name=u'Картинка', upload_to='expo_upload', blank=True, null=True)
url = models.CharField(verbose_name=u'URL', max_length=1024) url = models.CharField(verbose_name=u'URL', max_length=1024)
fr = models.DateField(default=date.today()) fr = models.DateField(default=date.today())
to = models.DateField(blank=True, null=True) to = models.DateField(blank=True, null=True)
theme = models.ManyToManyField(Theme, blank=True, null=True, verbose_name=u'Тематика') theme = models.ManyToManyField(Theme, blank=True, null=True, verbose_name=u'Тематика')
country = models.ManyToManyField(Country, blank=True, null=True, verbose_name=u'Страна') country = models.ManyToManyField(Country, blank=True, null=True, verbose_name=u'Страна')
sort = models.PositiveSmallIntegerField(verbose_name=u'Сорт', default=500) sort = models.PositiveSmallIntegerField(verbose_name=u'Сорт', default=500)
group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=u'Место', null=True, blank=True) group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=u'Место', null=True, blank=True)
often = models.PositiveSmallIntegerField( often = models.PositiveSmallIntegerField(
verbose_name=_('Often'), verbose_name=_('Often'),
help_text=_('A ten will display 10 times more often that a one.'), help_text=_('A ten will display 10 times more often that a one.'),
choices=[[i, i] for i in range(11)], choices=[[i, i] for i in range(11)],
default=1 default=1
) )
urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True) urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True)
html = models.BooleanField(verbose_name=_('HTML?'), default=False) html = models.BooleanField(verbose_name=_('HTML?'), default=False)
flash = models.BooleanField(verbose_name=_('Flash?'), default=False) flash = models.BooleanField(verbose_name=_('Flash?'), default=False)
popup = models.BooleanField(verbose_name=_('Popup?'), default=False) popup = models.BooleanField(verbose_name=_('Popup?'), default=False)
paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False) paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False)
link = models.BooleanField(verbose_name=_('Is simple link?'), default=False) link = models.BooleanField(verbose_name=_('Is simple link?'), default=False)
# for detecting popups # for detecting popups
cookie = models.CharField(max_length=30, blank=True, null=True, default=settings.DEFAULT_POPUP_COOKIE) cookie = models.CharField(max_length=30, blank=True, null=True, default=settings.DEFAULT_POPUP_COOKIE)
public = models.BooleanField(verbose_name=u'Активный', default=True) public = models.BooleanField(verbose_name=u'Активный', default=True)
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
stat_pswd = models.CharField(max_length=16) stat_pswd = models.CharField(max_length=16)
class Meta: class Meta:
ordering = ['-public'] ordering = ['-public']
def get_admin_url(self): def get_admin_url(self):
return '/admin/expobanners/banners/banner/%d/edit/'%self.id return '/admin/expobanners/banners/banner/%d/edit/'%self.id
def key(slef):
def key(slef): if hasattr(settings, 'SECRET_KEY'):
if hasattr(settings, 'SECRET_KEY'): key = str(datetime.now()) + settings.SECRET_KEY
key = str(datetime.now()) + settings.SECRET_KEY else:
else: key = str(datetime.now())
key = str(datetime.now()) return hashlib.md5(key).hexdigest()
return hashlib.md5(key).hexdigest()
def log(self, request, type):
def log(self, request, type): log = {
log = { 'type': type,
'type': type, 'banner': self,
'banner': self, 'group': self.group,
'group': self.group, 'ip': request.META.get('REMOTE_ADDR'),
'ip': request.META.get('REMOTE_ADDR'), 'user_agent': request.META.get('HTTP_USER_AGENT'),
'user_agent': request.META.get('HTTP_USER_AGENT'), 'page': request.META.get('HTTP_REFERER'),
'page': request.META.get('HTTP_REFERER'), }
}
if request.user.is_authenticated():
if request.user.is_authenticated(): log['user'] = request.user
log['user'] = request.user return Log.objects.create(**log)
return Log.objects.create(**log)
@models.permalink
@models.permalink def image(self):
def image(self): return ('banner_view', (), {'banner_id': self.pk, 'key': self.key()})
return ('banner_view', (), {'banner_id': self.pk, 'key': self.key()})
def impressions(self):
def impressions(self): return Log.objects.filter(banner=self.pk, type=0).count()
return Log.objects.filter(banner=self.pk, type=0).count()
def views(self):
def views(self): return Log.objects.filter(banner=self.pk, type=1).count()
return Log.objects.filter(banner=self.pk, type=1).count()
def clicks(self):
def clicks(self): return Log.objects.filter(banner=self.pk, type=2).count()
return Log.objects.filter(banner=self.pk, type=2).count()
def __unicode__(self):
def __unicode__(self): return self.title or self.alt
return self.title or self.alt
def get_absolute_url(self):
def get_absolute_url(self): if self.url == '#':
if self.url == '#': return self.url
return self.url else:
else: @models.permalink
@models.permalink def get_absolute_url(self):
def get_absolute_url(self): return ('banner_click', (), {'banner_id': self.pk, 'key': self.key()})
return ('banner_click', (), {'banner_id': self.pk, 'key': self.key()}) return get_absolute_url(self)
return get_absolute_url(self)
def get_click_link(self):
def get_click_link(self): return '/expo-b/click/%d/'%self.id
return '/expo-b/click/%d/'%self.id
class Meta:
class Meta: ordering = ['sort']
ordering = ['sort'] verbose_name = _('Banner')
verbose_name = _('Banner') verbose_name_plural = _('Banners')
verbose_name_plural = _('Banners')
class Log(models.Model):
class Log(models.Model): banner = models.ForeignKey(Banner, related_name='banner_logs')
banner = models.ForeignKey(Banner, related_name='banner_logs') group = models.ForeignKey(BannerGroup, related_name='group_logs', verbose_name=_('Group'), blank=True, null=True)
group = models.ForeignKey(BannerGroup, related_name='group_logs', verbose_name=_('Group'), blank=True, null=True) urls = models.ManyToManyField(URL, related_name='url_logs', verbose_name=_('URLs'), blank=True)
urls = models.ManyToManyField(URL, related_name='url_logs', verbose_name=_('URLs'), blank=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name='users', verbose_name=_('User'))
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name='users', verbose_name=_('User')) datetime = models.DateTimeField(verbose_name=_('Clicked At'), auto_now_add=True)
datetime = models.DateTimeField(verbose_name=_('Clicked At'), auto_now_add=True) ip = models.IPAddressField(verbose_name=_('IP'), null=True, blank=True)
ip = models.IPAddressField(verbose_name=_('IP'), null=True, blank=True) user_agent = models.CharField(verbose_name=_('User Agent'), max_length=1024, null=True, blank=True)
user_agent = models.CharField(verbose_name=_('User Agent'), max_length=1024, null=True, blank=True) page = models.URLField(verbose_name=_('Page'), null=True, blank=True)
page = models.URLField(verbose_name=_('Page'), null=True, blank=True) key = models.CharField(verbose_name=_('User Agent'), max_length=32, null=True, blank=True)
key = models.CharField(verbose_name=_('User Agent'), max_length=32, null=True, blank=True) TYPE_CHOICES = (
TYPE_CHOICES = ( (0, 'impressions'),
(0, 'impressions'), (1, 'view'),
(1, 'view'), (2, 'click')
(2, 'click') )
)
type = models.PositiveSmallIntegerField(verbose_name=_('Type'), max_length=1, default=0, choices=TYPE_CHOICES)
type = models.PositiveSmallIntegerField(verbose_name=_('Type'), max_length=1, default=0, choices=TYPE_CHOICES)
def __unicode__(self):
def __unicode__(self): return '%s - (%s)' % (self.banner, self.datetime)
return '%s - (%s)' % (self.banner, self.datetime)
class LogStat(models.Model):
class LogStat(models.Model): banner = models.ForeignKey(Banner, related_name='banner_stat', verbose_name=_('Banner'), blank=True)
banner = models.ForeignKey(Banner, related_name='banner_stat', verbose_name=_('Banner'), blank=True) group = models.ForeignKey(BannerGroup, related_name='group_stat', verbose_name=_('Group'), blank=True, null=True)
group = models.ForeignKey(BannerGroup, related_name='group_stat', verbose_name=_('Group'), blank=True, null=True) urls = models.ManyToManyField(URL, related_name='url_bloks', verbose_name=_('URLs'), null=True, blank=True)
urls = models.ManyToManyField(URL, related_name='url_bloks', verbose_name=_('URLs'), null=True, blank=True)
date = models.DateField(verbose_name=_('Data'))
date = models.DateField(verbose_name=_('Data')) view = models.PositiveIntegerField(verbose_name=_('Views'))
view = models.PositiveIntegerField(verbose_name=_('Views')) click = models.PositiveIntegerField(verbose_name=_('Clicks'))
click = models.PositiveIntegerField(verbose_name=_('Clicks')) unique_click = models.PositiveIntegerField(verbose_name=_('Unique Views'), blank=True, null=True)
unique_click = models.PositiveIntegerField(verbose_name=_('Unique Views'), blank=True, null=True) unique_view = models.PositiveIntegerField(verbose_name=_('Unique Clicks'))
unique_view = models.PositiveIntegerField(verbose_name=_('Unique Clicks'))
def __unicode__(self):
def __unicode__(self): return '%s - (%s)' % (self.banner, self.date)
return '%s - (%s)' % (self.banner, self.date)
class Meta:
ordering = ['-date']
# ------------------
class Paid(models.Model, StatMixin):
tickets = models.ForeignKey(Banner, related_name='paid_tickets') # ------------------
participation = models.ForeignKey(Banner, related_name='paid_participation') class Paid(models.Model, StatMixin):
official = models.ForeignKey(Banner, related_name='paid_official') tickets = models.ForeignKey(Banner, related_name='paid_tickets')
catalog = models.ForeignKey(Banner, related_name='paid_catalog') participation = models.ForeignKey(Banner, related_name='paid_participation')
logo = models.ImageField(upload_to='expo-b/paid', blank=True) official = models.ForeignKey(Banner, related_name='paid_official')
organiser = models.CharField(max_length=100, blank=True) catalog = models.ForeignKey(Banner, related_name='paid_catalog')
public = models.BooleanField(default=True, verbose_name=u'Активная') logo = models.ImageField(upload_to='expo-b/paid', blank=True)
stat_pswd = models.CharField(max_length=16) organiser = models.CharField(max_length=100, blank=True)
created = models.DateTimeField(auto_now_add=True) public = models.BooleanField(default=True, verbose_name=u'Активная')
modified = models.DateTimeField(auto_now=True) stat_pswd = models.CharField(max_length=16)
created = models.DateTimeField(auto_now_add=True)
class Meta: modified = models.DateTimeField(auto_now=True)
ordering = ['-public']
class Meta:
def get_event(self): ordering = ['-public']
try:
return self.exposition_set.all()[0] def get_event(self):
except IndexError: try:
return None return self.exposition_set.all()[0]
except IndexError:
return None
class PaidStat(models.Model):
paid = models.ForeignKey(Paid)
date = models.DateField(verbose_name=_('Date')) class PaidStat(models.Model):
page_views = models.PositiveIntegerField(default=0) paid = models.ForeignKey(Paid)
price_views = models.PositiveIntegerField(default=0) date = models.DateField(verbose_name=_('Date'))
catalog_views = models.PositiveIntegerField(default=0) page_views = models.PositiveIntegerField(default=0)
catalog_clicks = models.PositiveIntegerField(default=0) price_views = models.PositiveIntegerField(default=0)
tickets_clicks = models.PositiveIntegerField(default=0) catalog_views = models.PositiveIntegerField(default=0)
participation_clicks = models.PositiveIntegerField(default=0) catalog_clicks = models.PositiveIntegerField(default=0)
official_clicks = models.PositiveIntegerField(default=0) tickets_clicks = models.PositiveIntegerField(default=0)
participation_clicks = models.PositiveIntegerField(default=0)
official_clicks = models.PositiveIntegerField(default=0)
class Top(models.Model, StatMixin):
link = models.ForeignKey(Banner) class Meta:
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа') ordering = ['-date']
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция')
theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=u'Тематики')
excluded_tags = models.ManyToManyField('theme.Tag', blank=True, null=True, verbose_name=u'Исключить теги') class Top(models.Model, StatMixin):
country = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=u'Страны') link = models.ForeignKey(Banner)
excluded_cities = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=u'Исключить города') catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа')
fr = models.DateField(default=date.today(), verbose_name=u'Начало') position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция')
to = models.DateField(blank=True, null=True, verbose_name=u'Конец') theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=u'Тематики')
stat_pswd = models.CharField(max_length=16) excluded_tags = models.ManyToManyField('theme.Tag', blank=True, null=True, verbose_name=u'Исключить теги')
country = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=u'Страны')
objects = models.Manager() excluded_cities = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=u'Исключить города')
cached = TopCached() fr = models.DateField(default=date.today(), verbose_name=u'Начало')
to = models.DateField(blank=True, null=True, verbose_name=u'Конец')
class Meta: stat_pswd = models.CharField(max_length=16)
ordering = ['position']
objects = models.Manager()
def get_event(self): cached = TopCached()
try:
return self.exposition_set.all()[0] class Meta:
except IndexError: ordering = ['position']
return None
def get_event(self):
class TopStat(models.Model): try:
date = models.DateField() return self.exposition_set.all()[0]
theme = models.ForeignKey('theme.Theme', blank=True, null=True) except IndexError:
tag = models.ForeignKey('theme.Tag', blank=True, null=True) return None
country = models.ForeignKey('country.Country', blank=True, null=True)
city = models.ForeignKey('city.City', blank=True, null=True)
views = models.PositiveIntegerField(default=0) class TopStat(models.Model):
clicks = models.PositiveIntegerField(default=0) date = models.DateField()
theme = models.ForeignKey('theme.Theme', blank=True, null=True)
tag = models.ForeignKey('theme.Tag', blank=True, null=True)
class MainPage(models.Model, StatMixin): country = models.ForeignKey('country.Country', blank=True, null=True)
link = models.ForeignKey(Banner) city = models.ForeignKey('city.City', blank=True, null=True)
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') views = models.PositiveIntegerField(default=0)
public = models.BooleanField(default=True, verbose_name=u'Активная') clicks = models.PositiveIntegerField(default=0)
stat_pswd = models.CharField(max_length=16)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) class MainPage(models.Model, StatMixin):
link = models.ForeignKey(Banner)
class Meta: position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция')
ordering = ['-public'] public = models.BooleanField(default=True, verbose_name=u'Активная')
stat_pswd = models.CharField(max_length=16)
def get_event(self): created = models.DateTimeField(auto_now_add=True)
try: modified = models.DateTimeField(auto_now=True)
return self.exposition_set.all()[0]
except IndexError: class Meta:
return None ordering = ['-public']
def get_event(self):
def generatePassword(length=5): try:
""" return self.exposition_set.all()[0]
generate random password except IndexError:
""" return None
SYMBOLS = [',', '.', '?', '!', '-', '+', '1', '2', '3', '4', '5', '6', '7', '8',
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', def generatePassword(length=5):
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', """
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#'] generate random password
PASSWORD_LENGTH = length """
newPassword = [] SYMBOLS = [',', '.', '?', '!', '-', '+', '1', '2', '3', '4', '5', '6', '7', '8',
for i in range(PASSWORD_LENGTH): '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))]) 'm', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A',
return ''.join(newPassword) 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#']
PASSWORD_LENGTH = length
def generate_stat_pass(sender, **kwargs): newPassword = []
obj = kwargs['instance'] for i in range(PASSWORD_LENGTH):
if not obj.stat_pswd: newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))])
obj.stat_pswd = generatePassword() return ''.join(newPassword)
obj.save()
def generate_stat_pass(sender, **kwargs):
obj = kwargs['instance']
post_save.connect(generate_stat_pass, sender=Banner) if not obj.stat_pswd:
post_save.connect(generate_stat_pass, sender=Paid) obj.stat_pswd = generatePassword()
post_save.connect(generate_stat_pass, sender=Top) obj.save()
post_save.connect(generate_stat_pass, sender=Banner)
post_save.connect(generate_stat_pass, sender=Paid)
post_save.connect(generate_stat_pass, sender=Top)

@ -1,74 +1,74 @@
{% load thumbnail %} {% load thumbnail %}
{% if banners %} {% if banners %}
<div class="b-slider m-{{ group.slug }}" id="slider-{{ group.slug }}"> <div class="b-slider m-{{ group.slug }}" id="slider-{{ group.slug }}">
<ul class='b-slider-list'> <ul class='b-slider-list'>
{% for banner in banners %} {% for banner in banners %}
<li data-url='{{ banner.get_absolute_url }}' <li data-url='{{ banner.get_absolute_url }}'
class=' class='
b-slider-item b-slider-item
m-slider-item-{{ forloop.counter }} m-slider-item-{{ forloop.counter }}
{% if forloop.counter == 1 %} {% if forloop.counter == 1 %}
m-slider-current m-slider-current
{% endif %} {% endif %}
' '
data-slide='{{ forloop.counter }}' data-slide='{{ forloop.counter }}'
> >
<a href='{{ banner.get_absolute_url }}' class='b-slider-item__link'> <a href='{{ banner.get_absolute_url }}' class='b-slider-item__link'>
{% thumbnail banner.img group.size crop="top" as im %} {% thumbnail banner.img group.size crop="top" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" alt="{{ banner.alt }}" title="{{ banner.title }}" class='b-slider-item__img' data-view='{{ banner.image }}'> <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" alt="{{ banner.alt }}" title="{{ banner.title }}" class='b-slider-item__img' data-view='{{ banner.image }}'>
{% endthumbnail %} {% endthumbnail %}
<div class="b-slider-item__info_cover"> <div class="b-slider-item__info_cover">
<span class='b-slider-item__title'>{{ banner.title|safe }}</span> <span class='b-slider-item__title'>{{ banner.title|safe }}</span>
<span class='b-slider-item__text'>{{ banner.text|safe }}</span> <span class='b-slider-item__text'>{{ banner.text|safe }}</span>
</div> </div>
</a> </a>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
<ul class="b-slider-nav"> <ul class="b-slider-nav">
{% for banner in banners %} {% for banner in banners %}
<li class="b-slider-nav-button <li class="b-slider-nav-button
{% if forloop.counter == 1 %} {% if forloop.counter == 1 %}
m-slider-nav-current_button m-slider-nav-current_button
{% endif %} {% endif %}
" data-slide='{{ forloop.counter }}'> " data-slide='{{ forloop.counter }}'>
{{ forloop.counter }} {{ forloop.counter }}
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
<span data-direction="prev" class='b-slider-nav-prev'>&#9001;&nbsp;&nbsp;</span> <span data-direction="prev" class='b-slider-nav-prev'>&#9001;&nbsp;&nbsp;</span>
<span data-direction="next" class='b-slider-nav-next'>&nbsp;&nbsp;&#9002;</span> <span data-direction="next" class='b-slider-nav-next'>&nbsp;&nbsp;&#9002;</span>
</div> </div>
<script> <script>
(function() { (function() {
$('.m-{{ group.slug }}').bannersSlider({'auto_play': {{ group.speed }}, 'speed': {{ group.speed }}}); $('.m-{{ group.slug }}').bannersSlider({'auto_play': {{ group.speed }}, 'speed': {{ group.speed }}});
})(); })();
</script> </script>
<style> <style>
.m-{{ group.slug }} { .m-{{ group.slug }} {
width: {{ group.width }}px; width: {{ group.width }}px;
height: {{ group.height }}px; height: {{ group.height }}px;
} }
.m-{{ group.slug }} .b-slider-nav-prev, .m-{{ group.slug }} .b-slider-nav-prev,
.m-{{ group.slug }} .b-slider-nav-next { .m-{{ group.slug }} .b-slider-nav-next {
line-height: {{ group.height }}px; line-height: {{ group.height }}px;
} }
.m-{{ group.slug }} .b-slider-item, .m-{{ group.slug }} .b-slider-item,
.m-{{ group.slug }} .b-slider-list { .m-{{ group.slug }} .b-slider-list {
width: {{ group.width }}px; width: {{ group.width }}px;
height: {{ group.height }}px; height: {{ group.height }}px;
} }
</style> </style>
{% endif %} {% endif %}

@ -1,74 +1,74 @@
from ..models import Banner from ..models import Banner
from ..models import BannerGroup from ..models import BannerGroup
from ..models import URL from ..models import URL
from django import template from django import template
# For render tag # For render tag
from django.template import Context from django.template import Context
from django.template import Template from django.template import Template
import re import re
register = template.Library() register = template.Library()
@register.simple_tag(takes_context=True) @register.simple_tag(takes_context=True)
def banner_group(context, group, tpl='group.html'): def banner_group(context, group, tpl='group.html'):
try: try:
page_url = context['request'].path_info page_url = context['request'].path_info
site = context['request'].site site = context['request'].site
group = BannerGroup.objects.get(slug=group) group = BannerGroup.objects.get(slug=group)
good_urls = [] good_urls = []
for url in URL.objects.filter(public=True, sites__in=[site]): for url in URL.objects.filter(public=True, sites__in=[site]):
if url.regex: if url.regex:
url_re = re.compile(url.url) url_re = re.compile(url.url)
if url_re.findall(page_url): if url_re.findall(page_url):
good_urls.append(url) good_urls.append(url)
elif page_url == url.url: elif page_url == url.url:
good_urls.append(url) good_urls.append(url)
banners = Banner.objects.filter(public=True, group=group, urls__in=good_urls) banners = Banner.objects.filter(public=True, group=group, urls__in=good_urls)
except: except:
banners = False banners = False
group = False group = False
if(banners and group): if(banners and group):
context['banners'] = banners context['banners'] = banners
context['group'] = group context['group'] = group
t = template.loader.get_template(tpl) t = template.loader.get_template(tpl)
return t.render(template.Context(context)) return t.render(template.Context(context))
@register.simple_tag(takes_context=True) @register.simple_tag(takes_context=True)
def banner_one(context, banner_id, tpl='banner.html'): def banner_one(context, banner_id, tpl='banner.html'):
try: try:
page_url = context['request'].path_info page_url = context['request'].path_info
site = context['request'].site site = context['request'].site
good_urls = [] good_urls = []
for url in URL.objects.filter(public=True, sites__in=[site]): for url in URL.objects.filter(public=True, sites__in=[site]):
if url.regex: if url.regex:
url_re = re.compile(url.url) url_re = re.compile(url.url)
if url_re.findall(page_url): if url_re.findall(page_url):
good_urls.append(url) good_urls.append(url)
elif page_url == url.url: elif page_url == url.url:
good_urls.append(url) good_urls.append(url)
banner = Banner.objects.get(id=banner_id, public=True, urls__in=good_urls) banner = Banner.objects.get(id=banner_id, public=True, urls__in=good_urls)
except: except:
banner = False banner = False
context['banner'] = banner context['banner'] = banner
t = template.loader.get_template(tpl) t = template.loader.get_template(tpl)
return t.render(template.Context(context)) return t.render(template.Context(context))
# block render # block render
@register.simple_tag(takes_context=True) @register.simple_tag(takes_context=True)
def render(context, content): def render(context, content):
try: try:
tpl = Template(content) tpl = Template(content)
content = Context(context) content = Context(context)
return tpl.render(content) return tpl.render(content)
except: except:
return 'Render Error' return 'Render Error'

@ -1,13 +1,13 @@
from django.conf.urls import url from django.conf.urls import url
from expobanner.stat_views import * from expobanner.stat_views import *
from . import views from . import views
urlpatterns = [ urlpatterns = [
url(r'^click/(?P<banner_id>\d{1,4})/$', views.click, name='banner_click'), url(r'^click/(?P<banner_id>\d{1,4})/$', views.click, name='banner_click'),
#url(r'^view/(?P<banner_id>\d+)/$', views.view, name='banner_view'), #url(r'^view/(?P<banner_id>\d+)/$', views.view, name='banner_view'),
# #
url(r'^get-banners/$', views.get_banners), url(r'^get-banners/$', views.get_banners),
url(r'^get-tops/$', views.get_top), url(r'^get-tops/$', views.get_top),
url(r'^banner/(?P<pk>\d+)/stat/$', BannerStat.as_view(), name='banner_stat_client'), url(r'^banner/(?P<pk>\d+)/stat/$', BannerStat.as_view(), name='banner_stat_client'),
url(r'^paid/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='paid_stat_client'), url(r'^paid/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='paid_stat_client'),
] ]

@ -1,97 +1,97 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json import json
import re import re
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import redirect, get_object_or_404 from django.shortcuts import redirect, get_object_or_404
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.template import RequestContext from django.template import RequestContext
from .models import Banner, BannerGroup, URL, Top from .models import Banner, BannerGroup, URL, Top
from expobanner.utils import get_banner_by_params, get_client_ip, get_top_events, get_referer_view, set_cookie from expobanner.utils import get_banner_by_params, get_client_ip, get_top_events, get_referer_view, set_cookie
def click(request, banner_id): def click(request, banner_id):
banner = get_object_or_404(Banner, pk=banner_id) banner = get_object_or_404(Banner, pk=banner_id)
banner.log(request, 2) banner.log(request, 2)
return redirect(banner.url) return redirect(banner.url)
def view(request, banner_id): def view(request, banner_id):
banner = get_object_or_404(Banner, pk=banner_id) banner = get_object_or_404(Banner, pk=banner_id)
banner.log(request, 1) banner.log(request, 1)
return redirect(banner.img.url) return redirect(banner.img.url)
def get_banners(request): def get_banners(request):
url = get_referer_view(request, default='/') url = get_referer_view(request, default='/')
# get urls by current url # get urls by current url
urls = URL.cached.all() urls = URL.cached.all()
good_urls = [] good_urls = []
for u in urls: for u in urls:
if u.regex: if u.regex:
url_re = re.compile(u.url) url_re = re.compile(u.url)
if url_re.findall(url): if url_re.findall(url):
good_urls.append(u) good_urls.append(u)
elif url == u.url: elif url == u.url:
good_urls.append(u) good_urls.append(u)
# fill parameters dict # fill parameters dict
params = {'theme': request.GET.getlist('theme', []), params = {'theme': request.GET.getlist('theme', []),
'tag': request.GET.get('tag'), 'tag': request.GET.get('tag'),
'country': request.GET.get('country'), 'country': request.GET.get('country'),
'city': request.GET.get('city'), 'city': request.GET.get('city'),
'ip': get_client_ip(request)} 'ip': get_client_ip(request)}
group_banners = BannerGroup.cached.group_banners() group_banners = BannerGroup.cached.group_banners()
result = [] result = []
cookie = None cookie = None
# get banners for all groups # get banners for all groups
places = request.GET.getlist('places', []) places = request.GET.getlist('places', [])
for group, banners in group_banners.iteritems(): for group, banners in group_banners.iteritems():
if group not in places: if group not in places:
# on this page there is no such group # on this page there is no such group
continue continue
banner = get_banner_by_params(banners, good_urls, params, request) banner = get_banner_by_params(banners, good_urls, params, request)
if banner: if banner:
if banner.html: if banner.html:
text = banner.text text = banner.text
img = '' img = ''
alt = '' alt = ''
is_img = False is_img = False
else: else:
text = '' text = ''
try: try:
img = banner.img.url img = banner.img.url
except ValueError: except ValueError:
continue continue
alt = banner.alt alt = banner.alt
is_img = True is_img = True
result.append({'id': group, result.append({'id': group,
'url': banner.get_click_link(), 'url': banner.get_click_link(),
'is_html': banner.html, 'is_html': banner.html,
'is_flash': banner.flash, 'is_flash': banner.flash,
'is_img': is_img, 'is_img': is_img,
'is_popup': banner.popup, 'is_popup': banner.popup,
'img': img, 'img': img,
'alt': alt, 'alt': alt,
'text': text 'text': text
}) })
if banner.popup: if banner.popup:
cookie = banner.cookie cookie = banner.cookie
# add view log # add view log
banner.log(request, 1) banner.log(request, 1)
response = HttpResponse(json.dumps(result, indent=4), content_type='application/json') response = HttpResponse(json.dumps(result, indent=4), content_type='application/json')
if cookie: if cookie:
response = set_cookie(response, cookie, '1') response = set_cookie(response, cookie, '1')
return response return response
def get_top(request): def get_top(request):
params = {'theme': request.GET.getlist('theme', []), params = {'theme': request.GET.getlist('theme', []),
'tag': request.GET.get('tag'), 'tag': request.GET.get('tag'),
'country': request.GET.get('country'), 'country': request.GET.get('country'),
'city': request.GET.get('city'), 'city': request.GET.get('city'),
'catalog': request.GET.get('catalog')} 'catalog': request.GET.get('catalog')}
tops = Top.cached.all() tops = Top.cached.all()
events = get_top_events(tops, params, request) events = get_top_events(tops, params, request)
context = {'objects': events} context = {'objects': events}
return render_to_response('client/includes/exposition/expo_top.html', context, context_instance=RequestContext(request)) return render_to_response('client/includes/exposition/expo_top.html', context, context_instance=RequestContext(request))

@ -59,6 +59,8 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
data_end = models.DateField(verbose_name='Дата окончания') data_end = models.DateField(verbose_name='Дата окончания')
services = BitField(flags=flags) services = BitField(flags=flags)
# relations # relations
creator = models.ForeignKey('accounts.User', verbose_name=u'Создатель', on_delete=models.SET_NULL,
related_name='exposition_creator', blank=True, null=True)
country = models.ForeignKey('country.Country', verbose_name='Страна', on_delete=models.PROTECT, country = models.ForeignKey('country.Country', verbose_name='Страна', on_delete=models.PROTECT,
related_name='exposition_country') related_name='exposition_country')
city = models.ForeignKey('city.City', verbose_name='Город', on_delete=models.PROTECT, city = models.ForeignKey('city.City', verbose_name='Город', on_delete=models.PROTECT,
@ -164,9 +166,6 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
enable = ClientManager() enable = ClientManager()
imports = ExpoImportManager() imports = ExpoImportManager()
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('name', unicode(self.pk)) return self.lazy_translation_getter('name', unicode(self.pk))

@ -90,6 +90,7 @@ def paginate_results(qs, page=None):
return result return result
from hvad.models import TranslatableModel
class AdminListView(FormView): class AdminListView(FormView):
def get_form(self, form_class): def get_form(self, form_class):
@ -126,7 +127,10 @@ class AdminListView(FormView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(AdminListView, self).get_context_data(**kwargs) context = super(AdminListView, self).get_context_data(**kwargs)
qs = self.model.objects.language().all().order_by('name') if issubclass(self.model, TranslatableModel):
qs = self.model.objects.language('all').all().order_by('name')
else:
qs = self.model.objects.all().order_by('name')
result = paginate_results(qs, page=self.request.GET.get('page')) result = paginate_results(qs, page=self.request.GET.get('page'))
context['object_list'] = result context['object_list'] = result
return context return context

@ -0,0 +1,16 @@
2015-07-28 12:23:39,172 [DEBUG] django.db.backends: (0.001) SHOW TABLES; args=()
2015-07-28 12:23:39,175 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=()
2015-07-28 12:23:39,200 [DEBUG] django.db.backends: (0.002) SHOW TABLES; args=()
2015-07-28 12:23:39,201 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=()
2015-07-28 12:23:39,232 [DEBUG] django.db.backends: (0.001) SHOW TABLES; args=()
2015-07-28 12:23:39,233 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=()
2015-07-28 12:23:39,247 [DEBUG] django.db.backends: (0.001) SHOW TABLES; args=()
2015-07-28 12:23:39,248 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=()
2015-07-28 12:23:39,284 [DEBUG] django.db.backends: (0.001) SHOW TABLES; args=()
2015-07-28 12:23:39,285 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=()
2015-07-28 12:23:39,304 [DEBUG] django.db.backends: (0.001) SHOW TABLES; args=()
2015-07-28 12:23:39,305 [DEBUG] django.db.backends: (0.000) SELECT `service_service`.`id`, `service_service`.`url`, `service_service`.`currency`, `service_service`.`price`, `service_service`.`params`, `service_service`.`template`, `service_service`.`type`, `service_service`.`sort`, `service_service`.`main_page`, `service_service`.`meta_id` FROM `service_service`; args=()
2015-07-28 12:23:39,460 [DEBUG] root: Using default logger
2015-07-28 12:23:39,460 [DEBUG] root: Using default logger
2015-07-28 12:24:17,361 [DEBUG] django.db.backends: (0.001) SELECT `accounts_user`.`id`, `accounts_user`.`password`, `accounts_user`.`last_login`, `accounts_user`.`is_superuser`, `accounts_user`.`email`, `accounts_user`.`username`, `accounts_user`.`first_name`, `accounts_user`.`last_name`, `accounts_user`.`rating`, `accounts_user`.`url`, `accounts_user`.`is_active`, `accounts_user`.`is_staff`, `accounts_user`.`is_admin`, `accounts_user`.`date_joined`, `accounts_user`.`date_registered`, `accounts_user`.`date_modified`, `accounts_user`.`organiser_id`, `accounts_user`.`translator_id`, `accounts_user`.`company_id`, `accounts_user`.`position` FROM `accounts_user` WHERE `accounts_user`.`email` = 'vaniakov95@gmail.com' ; args=('vaniakov95@gmail.com',)
2015-07-28 12:24:25,526 [DEBUG] django.db.backends: (0.000) SELECT `accounts_user`.`id`, `accounts_user`.`password`, `accounts_user`.`last_login`, `accounts_user`.`is_superuser`, `accounts_user`.`email`, `accounts_user`.`username`, `accounts_user`.`first_name`, `accounts_user`.`last_name`, `accounts_user`.`rating`, `accounts_user`.`url`, `accounts_user`.`is_active`, `accounts_user`.`is_staff`, `accounts_user`.`is_admin`, `accounts_user`.`date_joined`, `accounts_user`.`date_registered`, `accounts_user`.`date_modified`, `accounts_user`.`organiser_id`, `accounts_user`.`translator_id`, `accounts_user`.`company_id`, `accounts_user`.`position` FROM `accounts_user` WHERE `accounts_user`.`email` = 'vaniakov95@gmail.com' ; args=('vaniakov95@gmail.com',)

File diff suppressed because one or more lines are too long

@ -1,13 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.shortcuts import render_to_response from django.http import HttpResponseRedirect
from django.http import HttpResponseRedirect, HttpResponse
from django.core.context_processors import csrf
from django.conf import settings from django.conf import settings
from django.forms.formsets import BaseFormSet, formset_factory # models and forms
from django.forms.models import modelformset_factory
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import login_required
#models and forms
from models import MetaSetting from models import MetaSetting
from forms import MetaForm, MetaFilterForm from forms import MetaForm, MetaFilterForm
from functions.admin_views import AdminListView, AdminView from functions.admin_views import AdminListView, AdminView
@ -45,7 +39,7 @@ class MetaView(AdminView):
data['keywords_%s' % code] = trans_obj.keywords data['keywords_%s' % code] = trans_obj.keywords
data['h1_%s' % code] = trans_obj.h1 data['h1_%s' % code] = trans_obj.h1
form =form_class(initial=data) form = form_class(initial=data)
return form return form
else: else:
return form_class() return form_class()

@ -1,16 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, url
from admin import MetaListView, MetaView from views import CreateSeoText, SeoTextList, EditSeoText, DeleteSeoText
from .views import CreateSeoText, SeoTextList, EditSeoText, DeleteSeoText from .admin import MetaListView, MetaView
urlpatterns = patterns('conference.admin',
urlpatterns = patterns('',
url(r'^seo/new/$', CreateSeoText.as_view(), name='seo_new'), url(r'^seo/new/$', CreateSeoText.as_view(), name='seo_new'),
url(r'^seo/all/$', SeoTextList.as_view(), name='seo_all'), url(r'^seo/all/$', SeoTextList.as_view(), name='seo_all'),
url(r'^seo/edit/(?P<pk>\d{1,5})/$', EditSeoText.as_view(), name='seo_edit'), url(r'^seo/edit/(?P<pk>\d{1,5})/$', EditSeoText.as_view(), name='seo_edit'),
url(r'^seo/delete/(?P<pk>\d{1,5})/$', DeleteSeoText.as_view(), name='seo_delete'), url(r'^seo/delete/(?P<pk>\d{1,5})/$', DeleteSeoText.as_view(), name='seo_delete'),
url(r'^all/$', MetaListView.as_view()), url(r'^all/$', MetaListView.as_view()),
#url(r'^change/(?P<url>.*)/$', 'conference_change'), url(r'^(?P<id>\d{1,6})/$', MetaView.as_view()),
url(r'^(?P<id>.*)/$', MetaView.as_view()),
url(r'^$', MetaView.as_view()), url(r'^$', MetaView.as_view()),
) )

@ -1,9 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from models import MetaSetting from models import MetaSetting, SeoText
from functions.translate import fill_with_signal from functions.translate import fill_with_signal
from functions.admin_forms import AdminFilterForm from functions.admin_forms import AdminFilterForm
from ckeditor.widgets import CKEditorWidget
from hvad.forms import TranslatableModelForm
class MetaForm(forms.Form): class MetaForm(forms.Form):
@ -14,7 +16,7 @@ class MetaForm(forms.Form):
create dynamical translated fields fields create dynamical translated fields fields
""" """
super(MetaForm, self).__init__(*args, **kwargs) super(MetaForm, self).__init__(*args, **kwargs)
#creates translated forms example: name_ru, name_en # 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 # len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
if len(settings.LANGUAGES) in range(10): if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES): for lid, (code, name) in enumerate(settings.LANGUAGES):
@ -44,17 +46,14 @@ class MetaForm(forms.Form):
fill_with_signal(MetaSetting, meta, data) fill_with_signal(MetaSetting, meta, data)
meta.save() meta.save()
class MetaFilterForm(AdminFilterForm): class MetaFilterForm(AdminFilterForm):
model = MetaSetting model = MetaSetting
from .models import SeoText
from ckeditor.widgets import CKEditorWidget
from hvad.forms import TranslatableModelForm
class SeoTextForm(TranslatableModelForm): class SeoTextForm(TranslatableModelForm):
# lang = forms.ChoiceField(choices=settings.LANGUAGES)
class Meta: class Meta:
model = SeoText model = SeoText
fields = ['url', 'title', 'body'] fields = ['url', 'title', 'page_title', 'description', 'body']
widgets = {'body':CKEditorWidget} widgets = {'body': CKEditorWidget}

@ -3,9 +3,15 @@ from django.db import models
from django.utils import translation from django.utils import translation
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from django.core.urlresolvers import reverse_lazy
from django.core.cache import cache
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from pymorphy.django_conf import default_morph as morph from pymorphy.django_conf import default_morph as morph
from functions.signal_handlers import post_save_handler from functions.signal_handlers import post_save_handler
import copy
# additional funcs # additional funcs
MONTHES = {'jan': _(u'январе'), 'feb': _(u'феврале'), 'mar': _(u'марте'), 'apr': _(u'апреле'), MONTHES = {'jan': _(u'январе'), 'feb': _(u'феврале'), 'mar': _(u'марте'), 'apr': _(u'апреле'),
@ -118,62 +124,70 @@ post_save.connect(post_save_handler, sender=MetaSetting)
# SEO - tests # # SEO - tests #
from django.db import models
from hvad.models import TranslatableModel, TranslatedFields
from django.conf import settings
from django.core.urlresolvers import reverse_lazy
from django.core.cache import cache
class SeoTextManager(TranslationManager): class SeoTextManager(TranslationManager):
cache_time = 120 cache_time = 120
def cache_get(self, *args, **kwargs): def cache_get(self, *args, **kwargs):
url = kwargs.get('url') url = kwargs.get('url')
lang = kwargs.get('lang')[:2] or translation.get_language()[:2] lang = kwargs.get('lang')[:2] or translation.get_language()[:2]
key = 'seo_text_cache' key = 'seo_text_cache'
result = cache.get(key) result = cache.get(key)
if result: if result:
return result.get(lang+'_' + url) return result.get("%s_%s" % (lang, url))
qs = list(SeoText.objects.language('all')) qs = list(SeoText.objects.language('all'))
value_dict = {obj.language_code+'_'+obj.url:obj for obj in qs} value_dict = {obj.language_code+'_'+obj.url: obj for obj in qs}
cache.set(key, value_dict, self.cache_time) cache.set(key, value_dict, self.cache_time)
return value_dict.get(lang+'_'+url) return value_dict.get("%s_%s" % (lang, url))
class SeoText(TranslatableModel): class SeoText(TranslatableModel):
url = models.CharField(max_length=50, unique=True, verbose_name=u"URL: www.expomap.ru")
url = models.CharField(max_length=50, unique=True)
translations = TranslatedFields( translations = TranslatedFields(
title=models.CharField(max_length=255), title=models.CharField(max_length=255, verbose_name=u"Заголовок"),
body=models.TextField() page_title=models.CharField(max_length=255, verbose_name=u"Тайтл страницы"),
description=models.CharField(max_length=1000, verbose_name=u"Дескрипшн"),
body=models.TextField(verbose_name=u"Текст")
) )
objects = SeoTextManager() objects = SeoTextManager()
def __init__(self, *args, **kwargs):
super(SeoText, self).__init__(*args, **kwargs)
self.cache_fields = ['title', 'body', 'page_title', 'description']
self.is_new = True
def get_absolute_url(self): def get_absolute_url(self):
return reverse_lazy('seo_all') return self.url
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super(SeoText,self).save(*args, **kwargs) super(SeoText, self).save(*args, **kwargs)
self.initial_language = 'ru'
all_field_names = list(self._translated_field_names)
clear_f_n = [] new_values = {field: getattr(self, field) for field in self.cache_fields}
for field_name in all_field_names: langs = [code for code, _ in settings.LANGUAGES]
if field_name not in ['master', 'master_id', u'id', 'language_code']: if self.is_new:
clear_f_n.append(field_name) for lang in langs:
field_items = {field_name:getattr(self, field_name) for field_name in clear_f_n} if lang not in self.get_available_languages():
self.translate(lang)
langs = [lan[0] for lan in settings.LANGUAGES] for key, value in new_values.items():
for lang in langs: setattr(self, key, value)
if lang not in self.get_available_languages(): self.save_translations(self)
self.translate(lang) else:
for field in clear_f_n: translations = {obj.language_code:obj for obj in list(self.translations.all())}
setattr(self, field, field_items.get(field, '')) for lang in langs:
super(SeoText,self).save(*args, **kwargs) if lang is not self.initial_language:
return SeoText tr = translations[lang]
for key, value in new_values.items():
#if u'%s' % getattr(self, key) is u'' or getattr(self, key) is u'%s' % self.var_cache[key]:
setattr(tr, key, value)
tr.save()
self.lazy_translation_getter(self.initial_language)
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields}
self.is_new = False
return self
def __unicode__(self): def __unicode__(self):
return self.url return self.url

@ -1,9 +1,9 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from . import settings
from django.views.generic import CreateView, UpdateView, DeleteView, ListView
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from models import MetaSetting from models import MetaSetting
from .forms import SeoTextForm, SeoText
from . import settings
class Meta(object): class Meta(object):
@ -189,10 +189,6 @@ class MetadataMixin(object):
return context return context
from django.views.generic import CreateView, UpdateView, DeleteView, ListView
from .models import SeoText
from .forms import SeoTextForm
class CreateSeoText(CreateView): class CreateSeoText(CreateView):
form_class = SeoTextForm form_class = SeoTextForm
@ -212,6 +208,7 @@ class EditSeoText(UpdateView):
template_name = "admin/meta/create_seo_text.html" template_name = "admin/meta/create_seo_text.html"
class DeleteSeoText(DeleteView): class DeleteSeoText(DeleteView):
model = SeoText model = SeoText
template_name = "admin/meta/seo_confirm_delete.html" template_name = "admin/meta/seo_confirm_delete.html"

@ -34,6 +34,7 @@ urlpatterns = required(
url(r'^settings/', include('settings.admin_urls')), url(r'^settings/', include('settings.admin_urls')),
url(r'^meta/', include('meta.admin_urls')), url(r'^meta/', include('meta.admin_urls')),
url(r'^import_xls/', include('import_xls.admin_urls')), url(r'^import_xls/', include('import_xls.admin_urls')),
url(r'^specialist_catalog/', include('specialist_catalog.admin_urls')),
url(r'^language/add/', 'directories.admin.language_add'), url(r'^language/add/', 'directories.admin.language_add'),
url(r'^currency/add/', 'directories.admin.currency_add'), url(r'^currency/add/', 'directories.admin.currency_add'),

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

@ -242,7 +242,6 @@ SOCIAL_AUTH_INACTIVE_USER_URL = '/inactive-user/'
SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True
from social.pipeline.social_auth import social_details
SOCIAL_AUTH_PIPELINE = ( SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.social_details', 'social.pipeline.social_auth.social_details',
'social.pipeline.social_auth.social_uid', 'social.pipeline.social_auth.social_uid',
@ -354,6 +353,8 @@ INSTALLED_APPS = (
'password_reset', # reset password 'password_reset', # reset password
'social.apps.django_app.default', # social auth 'social.apps.django_app.default', # social auth
'core', 'core',
'wizard',
'specialist_catalog',
) )

@ -29,6 +29,8 @@ sitemaps = {
handler404 = 'proj.views.error404' handler404 = 'proj.views.error404'
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^wizard/', include('wizard.urls')),
url(r'^acquire_email/$', 'registration.backends.default.views.acquire_email', name = 'acquire_email'),
url(r'^rss/', include('core.urls')), url(r'^rss/', include('core.urls')),
#url(r'^__debug__/', include(debug_toolbar.urls)), #url(r'^__debug__/', include(debug_toolbar.urls)),
url(r'^sitemap-(?P<section>.+)\.xml$', views.sitemap, {'sitemaps': sitemaps}), url(r'^sitemap-(?P<section>.+)\.xml$', views.sitemap, {'sitemaps': sitemaps}),
@ -53,6 +55,7 @@ urlpatterns = patterns('',
url(r'^', include('company.urls')), url(r'^', include('company.urls')),
url(r'^', include('photoreport.urls')), url(r'^', include('photoreport.urls')),
url(r'^', include('article.urls')), url(r'^', include('article.urls')),
url(r'^specialist/', include("specialist_catalog.urls")),
url(r'^country/', include('country.urls')), url(r'^country/', include('country.urls')),
url(r'^city/', include('city.urls')), url(r'^city/', include('city.urls')),
url(r'^organiser/', include('organiser.urls')), url(r'^organiser/', include('organiser.urls')),

@ -26,6 +26,7 @@ def clear_slashes(str_):
str_ = str_[:-1] str_ = str_[:-1]
return str_ return str_
def add_seo(request): def add_seo(request):
url = request.path url = request.path
lang = get_language() lang = get_language()
@ -38,6 +39,7 @@ def add_seo(request):
seo_text = None seo_text = None
return seo_text return seo_text
def expo_context(request): def expo_context(request):
banners_themes = [24, 34, 4] banners_themes = [24, 34, 4]
banner_tags = [141, 142, 143, 156, 206, 231, 232, 390, 391, 400, 457, 500, 536, 537, 539, 457, 500, 686, 715, 765, banner_tags = [141, 142, 143, 156, 206, 231, 232, 390, 391, 400, 457, 500, 536, 537, 539, 457, 500, 686, 715, 765,

@ -4,7 +4,7 @@ from views import ServiceView, CallBackListView, VisitListView, TranslationListV
ParticipationListView, RemoteListView,TicketsListView, Thanks ParticipationListView, RemoteListView,TicketsListView, Thanks
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'service/thanks/$', Thanks.as_view()), url(r'service/thanks/$', Thanks.as_view(), name = "service_thanks"),
url(r'service/com_rek/(?P<catalog>.*)/(?P<event_url>.*)/$', 'service.views.advertise'), url(r'service/com_rek/(?P<catalog>.*)/(?P<event_url>.*)/$', 'service.views.advertise'),
url(r'service/com_rek/$', 'service.views.advertise'), url(r'service/com_rek/$', 'service.views.advertise'),
url(r'service/(?P<url>.*)/$', ServiceView.as_view()), url(r'service/(?P<url>.*)/$', ServiceView.as_view()),

@ -46,7 +46,6 @@ class ServiceView(MetadataMixin, FormView):
def form_valid(self, form): def form_valid(self, form):
order = form.save(commit=False) order = form.save(commit=False)
order.save() order.save()
#messages.success(self.request, _(u'Ваш запрос был успешно отправлен'))
return HttpResponseRedirect(self.success_url) return HttpResponseRedirect(self.success_url)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from django.conf.urls import url, patterns
from .views import *
urlpatterns = patterns('',
url(r'^specialist/new/$', SpecialistCreateView.as_view(), name='specialist_new'),
url(r'^specialist/all/$', SpecialistListView.as_view(), name='specialist_all'),
url(r'^specialist/edit/(?P<pk>\d{1,4})/$', SpecialistUpdateView.as_view(), name='specialist_edit'),
url(r'^specialist/delete/(?P<pk>\d{1,4})/$', SpecialistDeleteView.as_view(), name='specialist_delete'),
url(r'^catalog/new/$', CatalogCreateView.as_view(), name='catalog_new'),
url(r'^catalog/all/$', CatalogListView.as_view(), name='catalog_all'),
url(r'^catalog/city/$', CatalogCityView.as_view(), name='catalog_city'),
url(r'^catalog/country/$', CatalogCountryView.as_view(), name='catalog_country'),
url(r'^catalog/edit/(?P<pk>\d{1,4})/$', CatalogUpdateView.as_view(), name='catalog_edit'),
url(r'^catalog/delete/(?P<pk>\d{1,4})/$', CatalogDeleteView.as_view(), name='catalog_delete'),
url(r'^catalog/(?P<catalog_pk>\d{1,4})/add_feedback/$', FeedbackCreateView.as_view(), name='feedback_new'),
#url(r'^catalog/(?P<pk>\d{1,4})/feedbacks/$', FeedbackListView.as_view(), name='feedback_all'),
url(r'^catalog/(?P<catalog_pk>\d{1,4})/feedback/(?P<id>\d{1,4})/$', FeedbackUpdateView.as_view(), name='feedback_edit'),
url(r'^feedback/delete/(?P<pk>\d{1,4})/$', FeedbackDeleteView.as_view(), name='feedback_delete'),
)

@ -0,0 +1,64 @@
# -*- coding: utf-8 -*-
from django import forms
from hvad.forms import TranslatableModelForm
from .models import Specialist, SpecialistCatalog, Feedback, City, Country
from ckeditor.widgets import CKEditorWidget
from django.utils.translation import get_language
country_choices = [(c.id, c.name) for c in Country.objects.all()]
lang_code = get_language()[:2]
default_text = u"Планируете посетить выставку в %s?" \
u" Мы предлагаем Вам подобрать переводчика именно под Ваши цели и потребности. " \
u"Специализируясь уже более 7 лет на предоставлении переводчиков на выставки и конференции " \
u"%s, мы можем предоставить профессионалов со знанием разных " \
u"языков на гибких для Вас условиях. Каждый заказ индивидуален для нас, " \
u"и итоговая цена зависит от вида перевода, тематики, срочности подбора " \
u"специалиста, города и объема работы."
default_title = u"Переводчики в %s"
class SpecialistCatalogForm(TranslatableModelForm):
class Meta:
model = SpecialistCatalog
fields = ['price', 'currency', 'logo_preview', 'main_descr', 'place_photo',
'specialists', 'city', 'country', 'type', 'title', 'benefits', 'big_cities']
widgets = {
'type': forms.Select(choices=(('1', 'Country'), ('2', 'City'))),
'city': forms.HiddenInput(attrs={'id': 'id_city'}),
'country': forms.Select(choices=country_choices, attrs={'id': 'id_country'}),
'main_descr': CKEditorWidget,
'benefits': CKEditorWidget,
'big_cities': CKEditorWidget,
}
def save(self, commit=True):
place = self.cleaned_data.get('city') or self.cleaned_data.get('country')
place_inflect = place.inflect or place.name
if not self.cleaned_data['title']:
self.cleaned_data['title'] = default_title % place_inflect
if not self.cleaned_data['main_descr']:
self.cleaned_data['main_descr'] = default_text % (place_inflect, place_inflect)
return super(SpecialistCatalogForm, self).save(commit=True)
class SpecialistForm(forms.ModelForm):
class Meta:
model = Specialist
fields = ['name','country', 'city', 'photo', 'languages']
widgets = {
'city': forms.HiddenInput(attrs={'id': 'id_city'}),
'country': forms.Select(choices=country_choices, attrs={'id': 'id_country'})
}
class FeedbackForm(forms.ModelForm):
class Meta:
model = Feedback
fields = ['company', 'name', 'text', 'logo', 'catalog']
widgets = {
'text':CKEditorWidget
}

@ -0,0 +1 @@
__author__ = 'dart_vaider'

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
from django.core.management.base import BaseCommand
from city.models import City
from specialist_catalog.models import SpecialistCatalog
default_text = u"Планируете посетить выставку в %s?" \
u" Мы предлагаем Вам подобрать переводчика именно под Ваши цели и потребности. " \
u"Специализируясь уже более 7 лет на предоставлении переводчиков на выставки и конференции " \
u"%s, мы можем предоставить профессионалов со знанием разных " \
u"языков на гибких для Вас условиях. Каждый заказ индивидуален для нас, " \
u"и итоговая цена зависит от вида перевода, тематики, срочности подбора " \
u"специалиста, города и объема работы."
default_title = u"Переводчики в %s"
default_logo = "specialist_catalog/logo_preview/default_logo.jpg"
default_cities = u"<ul><li>Лондон</li><li>Киев</li><li>Барселона</li></ul>"
class Command(BaseCommand):
def handle(self, *args, **options):
cities = list(City.objects.language('ru').order_by('id'))
for cty in cities:
name = cty.inflect or cty.name
sc = SpecialistCatalog(
type=2,
country=cty.country,
city=cty,
title=default_title % name,
main_descr=default_text % (name, name),
logo_preview=default_logo,
big_cities=default_cities,
)
sc.save()
print cty.url, " -> ", cty.country.url

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
from django.core.management.base import BaseCommand
from country.models import Country
from specialist_catalog.models import SpecialistCatalog
default_text = u"Планируете посетить выставку в %s?" \
u" Мы предлагаем Вам подобрать переводчика именно под Ваши цели и потребности. " \
u"Специализируясь уже более 7 лет на предоставлении переводчиков на выставки и конференции " \
u"%s, мы можем предоставить профессионалов со знанием разных " \
u"языков на гибких для Вас условиях. Каждый заказ индивидуален для нас, " \
u"и итоговая цена зависит от вида перевода, тематики, срочности подбора " \
u"специалиста, города и объема работы."
default_title = u"Переводчики в %s"
default_logo = "specialist_catalog/logo_preview/ukraine.gif"
default_cities = u"<ul><li>Лондон</li><li>Киев</li><li>Барселона</li></ul>"
lang = 'ru'
class Command(BaseCommand):
def handle(self, *args, **options):
countries = Country.objects.language('ru').order_by('name')
for cntry in countries:
name = cntry.inflect or cntry.name
sc = SpecialistCatalog(
type='1',
country=cntry,
title=default_title % name,
main_descr=default_text % (name, name),
logo_preview=default_logo,
big_cities=default_cities,
)
sc.save()
print "created for: %s" % cntry.url

@ -0,0 +1,97 @@
# -*- coding: utf-8 -*-
from django.db import models
from django.conf import settings
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from city.models import City
from country.models import Country
from django.core.urlresolvers import reverse_lazy
from django.utils.translation import get_language
import copy
# types of catalog
_country = 1
_city = 2
class Specialist(models.Model):
name = models.CharField(max_length=255, verbose_name=u"Полное имя", blank=False)
languages = models.CharField(max_length=255, verbose_name=u"Языки")
city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name=u"Город", blank=True)
country = models.ForeignKey(Country, on_delete=models.PROTECT, verbose_name=u"Страна")
photo = models.ImageField(verbose_name=u"Фото", upload_to="specialist_catalog/specialist_photo/", blank=True)
def __unicode__(self):
return u"%s" % self.name
class SpecialistCatalog(TranslatableModel):
price = models.IntegerField(verbose_name=u"Цена", default=200)
currency = models.CharField(max_length=255, verbose_name=u"Валюта", default=u"EUR")
logo_preview = models.ImageField(verbose_name=u"Логотип", blank=True, upload_to='specialist_catalog/logo_preview/')
place_photo = models.ImageField(verbose_name=u"Фото для города", blank=True, upload_to='specialist_catalog/place_photo/')
specialists = models.ManyToManyField(Specialist, verbose_name=u"Специалисты", blank=True)
city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name=u"Город", unique=True, blank=True)
country = models.ForeignKey(Country, on_delete=models.PROTECT, verbose_name=u"Страна", blank=False)
type = models.PositiveSmallIntegerField(verbose_name=u"Тип(Страна/Город)", default=2)
translations = TranslatedFields(
title=models.CharField(max_length=255, verbose_name=u"Заголовок"),
main_descr=models.CharField(max_length=1000, verbose_name=u"Краткое описание"),
benefits=models.CharField(max_length=2000, verbose_name=u"Преимущества"),
big_cities=models.TextField(verbose_name=u"Крупные города")
)
def __init__(self, *args, **kwargs):
super(SpecialistCatalog, self).__init__(*args, **kwargs)
self.cache_fields = ['title', 'main_descr', 'benefits']
self.is_new = True
def get_absolute_url(self):
global _country, _city
if self.type == _country:
return reverse_lazy('spec_catalog_country', kwargs={'slug': self.country.url})
return reverse_lazy('spec_catalog_city', kwargs={'slug': self.city.url})
def save(self, *args, **kwargs):
super(SpecialistCatalog, self).save(*args, **kwargs)
self.initial_language = get_language()[:2] or 'ru'
new_values = {field: getattr(self, field) for field in self.cache_fields}
langs = [code for code, _ in settings.LANGUAGES]
if self.is_new:
for lang in langs:
if lang not in self.get_available_languages():
self.translate(lang)
for key, value in new_values.items():
setattr(self, key, value)
self.save_translations(self)
else:
translations = {obj.language_code: obj for obj in list(self.translations.all())}
for lang in langs:
if lang is not self.initial_language:
tr = translations[lang]
for key, value in new_values.items():
#if u'%s' % getattr(tr, key) is u'%s' % self.var_cache[key]:
setattr(tr, key, value)
tr.save()
self.lazy_translation_getter(self.initial_language)
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields}
self.is_new = False
return self
def __unicode__(self):
return self.title
class Feedback(models.Model):
company = models.CharField(max_length=255, verbose_name=u"Название компании")
name = models.CharField(max_length=100, verbose_name=u"Имя")
text = models.CharField(max_length=5000, verbose_name=u"Текст отзыва")
logo = models.ImageField(verbose_name=u"Логотип компании", upload_to='specialist_catalog/feedback_logo/', blank=True)
catalog = models.ForeignKey(SpecialistCatalog, verbose_name=u"Страница", blank=False)
def __unicode__(self):
return "Feedback from %s" % self.company

@ -0,0 +1,16 @@
"""
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,8 @@
# -*- coding: utf-8 -*-
from django.conf.urls import url, patterns
from .views import CatalogDetailedView
urlpatterns = patterns('',
url(r'^city/(?P<slug>.*)/$', CatalogDetailedView.as_view(), {'type': 'city'}, name="spec_catalog_city"),
url(r'^country/(?P<slug>.*)/$', CatalogDetailedView.as_view(), {'type': 'country'}, name="spec_catalog_country"),
)

@ -0,0 +1,171 @@
# -*- coding: utf-8 -*-
from django.views.generic import CreateView, UpdateView, DeleteView, ListView, FormView, DetailView
from django.views.generic.detail import SingleObjectMixin
from .forms import *
from django.core.urlresolvers import reverse_lazy
from django.conf import settings
from django.shortcuts import get_object_or_404
from service.order_forms import TranslationForm
from django.http import HttpResponseRedirect
from django.utils.translation import get_language
# =========== ADMIN VIEWS ===========
# Specialist views
class SpecialistCreateView(CreateView):
form_class = SpecialistForm
model = Specialist
template_name = 'admin/specialist/specialist_new.html'
success_url = reverse_lazy("specialist_all")
class SpecialistListView(ListView):
model = Specialist
template_name = 'admin/specialist/specialist_all.html'
paginate_by = settings.ADMIN_PAGINATION
class SpecialistUpdateView(UpdateView):
form_class = SpecialistForm
model = Specialist
template_name = 'admin/specialist/specialist_new.html'
success_url = reverse_lazy("specialist_all")
def get_form(self, form_class):
form = super(SpecialistUpdateView, self).get_form(form_class)
form.fields['city'].widget.attrs['data-init-text'] = self.object.city.name
return form
class SpecialistDeleteView(DeleteView):
model = Specialist
template_name = 'admin/specialist/specialist_confirm_delete.html'
success_url = reverse_lazy("specialist_all")
# Catalog views
class CatalogCreateView(CreateView):
form_class = SpecialistCatalogForm
model = SpecialistCatalog
template_name = 'admin/specialist/catalog_new.html'
success_url = reverse_lazy("catalog_all")
class CatalogListView(ListView):
model = SpecialistCatalog
template_name = 'admin/specialist/catalog_all.html'
paginate_by = settings.ADMIN_PAGINATION
class CatalogCityView(ListView):
model = SpecialistCatalog
template_name = 'admin/specialist/catalog_all.html'
paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self):
qs = super(CatalogCityView, self).get_queryset()
return qs.filter(type=2)
class CatalogCountryView(ListView):
model = SpecialistCatalog
template_name = 'admin/specialist/catalog_all.html'
paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self):
qs = super(CatalogCountryView, self).get_queryset()
return qs.filter(type=1)
class CatalogUpdateView(UpdateView):
form_class = SpecialistCatalogForm
model = SpecialistCatalog
template_name = 'admin/specialist/catalog_new.html'
success_url = reverse_lazy("catalog_all")
def get_form(self, form_class):
form = super(CatalogUpdateView, self).get_form(form_class)
if self.object.type is 2: # city
form.fields['city'].widget.attrs['data-init-text'] = self.object.city.name
return form
class CatalogDeleteView(DeleteView):
model = SpecialistCatalog
template_name = 'admin/specialist/catalog_confirm_delete.html'
success_url = reverse_lazy("catalog_all")
# Feedback views
class FeedbackCreateView(CreateView):
form_class = FeedbackForm
model = Feedback
template_name = 'admin/specialist/feedback_new.html'
success_url = reverse_lazy("catalog_all")
def get_initial(self):
catalog = get_object_or_404(SpecialistCatalog, pk=self.kwargs.get('catalog_pk'))
return {'catalog': catalog}
class FeedbackUpdateView(UpdateView):
form_class = FeedbackForm
model = Feedback
template_name = 'admin/specialist/feedback_new.html'
success_url = reverse_lazy("catalog_all")
def get_initial(self):
catalog = get_object_or_404(SpecialistCatalog, pk=self.kwargs.get('catalog_pk'))
return {'catalog': catalog}
class FeedbackDeleteView(DeleteView):
model = Feedback
template_name = 'admin/specialist/feedback_confirm_delete.html'
success_url = reverse_lazy("catalog_all")
# ========= CLIENT VIEWS ============
lang = get_language()[:2]
class CatalogDetailedView(SingleObjectMixin, FormView):
model = SpecialistCatalog
form_class = TranslationForm
template_name = "client/specialist_catalog/catalog_detailed.html"
success_url = reverse_lazy("service_thanks")
def get_object(self, queryset=None):
if self.kwargs.get('type') is "country":
obj = self.model.objects.language(lang).get(country__url=self.kwargs.get('slug'))
else:
obj = self.model.objects.language(lang).get(city__url=self.kwargs.get('slug'))
self.object = obj
return obj
def get_context_data(self, **kwargs):
self.get_object()
context = super(CatalogDetailedView, self).get_context_data(**kwargs)
context['object'] = self.object
return context
def form_valid(self, form):
order = form.save(commit=False)
order.save()
return HttpResponseRedirect(self.success_url)
def get_initial(self):
obj = self.get_object()
init = {}
init['country'] = obj.country.name
if self.kwargs.get('type') is "city":
init['city'] = obj.city.name
return init

@ -14,6 +14,5 @@
$('#id_city').attr('disabled', false); $('#id_city').attr('disabled', false);
}); });
}); });
}); });

@ -0,0 +1,93 @@
/**
* Created by dev on 07.09.2015.
*/
$(document).ready(function () {
$('select').select2({
width: 'element',
allowClear: true
});
$('#id_country').change(function () {
$.get(
"/admin/ajax_city/", {'id': $(this).val()}, function (j) {
$('#id_city').html(j);
$('#id_city').attr('disabled', false);
});
});
$('#id_city').select2({
placeholder: "Город",
width: 300,
ajax: {
url: "/admin/city/search/",
dataType: "json",
quietMillis: 200,
data: function (term, page, country) {
var country = $('#id_country').val();
return {
term: term,
page: page,
country: country
};
},
results: function (data) {
var results = [];
$.each(data, function (index, item) {
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
},
initSelection: function (element, callback) {
var id = $(element).val();
var text = $(element).attr('data-init-text');
callback({id: id, text: text});
}
});
// displaying uploaded photo
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function (theFile) {
return function (e) {
document.getElementById('list').innerHTML = ['<img class="thumb" src="',
e.target.result, '" title="', escape(theFile.name), '"/>'].join('');
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
document.getElementById('id_photo').addEventListener('change', handleFileSelect, false);
document.getElementById('id_logo').addEventListener('change', handleFileSelect, false);
console.log("hello from new specialist view.js");
});

@ -0,0 +1,120 @@
/**
* Created by dev on 07.09.2015.
*/
$(document).ready(function () {
$('select').select2({
width: 'element',
allowClear: true
});
$('#id_country').change(function () {
$.get(
"/admin/ajax_city/", {'id': $(this).val()}, function (j) {
$('#id_city').html(j);
$('#id_city').attr('disabled', false);
});
});
$('#id_city').select2({
placeholder: "Город",
width: 300,
ajax: {
url: "/admin/city/search/",
dataType: "json",
quietMillis: 200,
data: function (term, page, country) {
var country = $('#id_country').val();
return {
term: term,
page: page,
country: country
};
},
results: function (data) {
var results = [];
$.each(data, function (index, item) {
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
},
initSelection: function (element, callback) {
var id = $(element).val();
var text = $(element).attr('data-init-text');
callback({id: id, text: text});
}
});
// displaying uploaded photo
function handleFileSelect1(evt) {
var files = evt.target.files; // FileList object
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function (theFile) {
return function (e) {
document.getElementById('list_picture').innerHTML = ['<img class="thumb" src="',
e.target.result, '" title="', escape(theFile.name), '"/>'].join('');
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
function handleFileSelect2(evt) {
var files = evt.target.files; // FileList object
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function (theFile) {
return function (e) {
document.getElementById('list_logo').innerHTML = ['<img class="thumb" src="',
e.target.result, '" title="', escape(theFile.name), '"/>'].join('');
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
document.getElementById('id_place_photo').addEventListener('change', handleFileSelect1, false);
document.getElementById('id_logo_preview').addEventListener('change', handleFileSelect2, false);
console.log("hello from new catalog view.js");
});

@ -0,0 +1,167 @@
/**
* Created by dev on 07.09.2015.
*/
$(document).ready(function () {
$('select').select2({
width: 'element',
allowClear: true
});
$('#id_country').change(function () {
$.get(
"/admin/ajax_city/", {'id': $(this).val()}, function (j) {
$('#id_city').html(j);
$('#id_city').attr('disabled', false);
});
});
$('#id_place').select2({
placeholder:"Место проведения",
widht: 400
});
$('#id_city').select2({
placeholder: "Город",
width: 300,
ajax: {
url: "/admin/city/search/",
dataType: "json",
quietMillis: 200,
data: function (term, page, country) {
var country = $('#id_country').val()
return {
term: term,
page: page,
country: country
};
},
results: function (data) {
var results = [];
$.each(data, function (index, item) {
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
},
initSelection: function (element, callback) {
var id = $(element).val();
var text = $(element).attr('data-init-text');
callback({id: id, text: text});
}
});
$('#id_0-periodic').select2({
placeholder: "Периодичность",
width: '350px'
});
$('#id_tag').select2({
placeholder: "Теги",
width: '350px',
multiple: true,
ajax: {
url: "/admin/theme/tag/search/",
dataType: "json",
quietMillis: 200,
multiple: true,
data: function (term, page, theme) {
var theme = $('#id_theme').serialize().replace(/0-theme/g, 'theme');
return {
term: term,
page: page,
theme: theme
};
},
results: function (data) {
var results = [];
$.each(data, function (index, item) {
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
},
initSelection: function (element, callback) {
var data = [];
$(element.val().split(",")).each(function (i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
callback(data);
}
});
// end selects
/*
*/
// theme change
$('#id_theme').change(function () {
$.get(
"/admin/ajax_tag/", {'id': $(this).serialize().replace(/0-theme/g, 'theme')}, function (data) {
var optionValues = [];
var getValues = [];
var selectedValues = [];
//push values sended from server in array
$.each(data, function (i, elem) {
getValues.push(elem[0].toString())
});
//delete options if they aren't in getvalues
//otherwise push it in array
//also push in array already selected values
$('#id_tag option').each(function () {
var check = $.inArray($(this), getValues);
if ($(this).is(':selected')) {
selectedValues.push($(this).val())
}
if (check == -1) {
$(this).remove()
}
else {
optionValues.push($(this).val());
}
});
//generate new options
//old options unchanged
var html = '';
$.each(data, function (i, elem) {
var check = $.inArray(elem[0].toString(), optionValues);
if (check == -1) {
html += '<option value="';
html += elem[0];
html += '">';
html += elem[1];
html += '</option>';
}
});
$('#id_tag').append(html);
//select previous selected values
$('#id_tag option').each(function () {
var check = $.inArray($(this).val(), selectedValues)
if (check != -1) {
$(this).attr('selected', 'selected');
}
});
});//end get
});//end change
console.log("hello from wizard.js");
});

@ -1,4 +1,4 @@
{% extends 'base.html' %} {% extends 'admin/base.html' %}
{% block body %} {% block body %}
@ -8,7 +8,14 @@
</div> </div>
<div class="box-content"> <div class="box-content">
{% block list_table %} {% block list_table %}
<a class="btn btn-success" href="{% url 'expobanner-create_main' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a> <div style="float:left;">
<a class="btn btn-success" href="{% url 'expobanner-create_main' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a>
</div>
<div style="float:right;">
<form method="get" id="form">
Только опубликование<input id="public" type="checkbox" name="onlypublic" value="true">
</form>
</div>
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
@ -36,5 +43,13 @@
{# pagination #} {# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %} {% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div> </div>
<script>
var cbox = $("#public");
var form = $("#form");
if(location.search != "")
cbox.attr('checked', true);
cbox.click(function(){
form.submit()
});
</script>
{% endblock %} {% endblock %}

@ -1,4 +1,4 @@
{% extends 'base.html' %} {% extends 'admin/base.html' %}
{% load static %} {% load static %}
{% block scripts %} {% block scripts %}
<script src="{% static 'js/jquery.dataTables.min.js' %}"></script> <script src="{% static 'js/jquery.dataTables.min.js' %}"></script>
@ -27,6 +27,14 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr>
<td><b>Всего</b></td>
<td>{{ all.views }}</td>
<td>{{ all.clicks }}</td>
<td>{{ all.unique_views}}</td>
<td>{{ all.unique_clicks }}</td>
</tr>
{% with stats=stats %} {% with stats=stats %}
{% for stat in stats %} {% for stat in stats %}
<tr> <tr>

@ -8,8 +8,13 @@
</div> </div>
<div class="box-content"> <div class="box-content">
{% block list_table %} {% block list_table %}
<a class="btn btn-success" href="{% url 'expobanner-create_paid' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a> <a class="btn btn-success" href="{% url 'expobanner-create_paid' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a>
<table class="table table-hover"> <div style="float:right;">
<form method="get" id="form">
Только опубликование<input id="public" type="checkbox" name="onlypublic" value="true">
</form>
</div>
<table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th>Выставка</th> <th>Выставка</th>
@ -34,5 +39,13 @@
{# pagination #} {# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %} {% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div> </div>
<script>
var cbox = $("#public");
var form = $("#form");
if(location.search != "")
cbox.attr('checked', true);
cbox.click(function(){
form.submit()
});
</script>
{% endblock %} {% endblock %}

@ -27,6 +27,13 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr>
<td><b>За весь период</b></td>
<td>{{ all.official }}</td>
<td>{{ all.ticket }}</td>
<td>{{ all.participation}}</td>
<td>{{ all.catalog }}</td>
</tr>
{% with stats=object.paidstat_set.all %} {% with stats=object.paidstat_set.all %}
{% for stat in stats %} {% for stat in stats %}
<tr> <tr>

@ -9,6 +9,11 @@
<div class="box-content"> <div class="box-content">
{% block list_table %} {% block list_table %}
<a class="btn btn-success" href="{% url 'expobanner-create_top' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a> <a class="btn btn-success" href="{% url 'expobanner-create_top' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a>
<div style="float:right;">
<form method="get" id="form">
Только активние <input id="public" type="checkbox" name="onlypublic" value="true">
</form>
</div>
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
@ -32,5 +37,13 @@
{# pagination #} {# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %} {% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div> </div>
<script>
var cbox = $("#public");
var form = $("#form");
if(location.search != "")
cbox.attr('checked', true);
cbox.click(function(){
form.submit()
});
</script>
{% endblock %} {% endblock %}

@ -1,63 +1,79 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load static %} {% load static %}
{# Displays article form #} {# Displays article form #}
{% block scripts %} {% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script> <script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #} {# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> <link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script> <script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script> <script src="{% static 'custom_js/make_select.js' %}"></script>
{# ajax #} {# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script> <script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script> <script src="{% static 'custom_js/select_tag.js' %}"></script>
{% endblock %} {% endblock %}
{% block body %} {% block body %}
{{ request.LANGUAGE_CODE }} {{ request.LANGUAGE_CODE }}
<form method="post" class="form-horizontal" > {% csrf_token %} <form method="post" class="form-horizontal" > {% csrf_token %}
<fieldset> <fieldset>
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2> <h2><i class="icon-pencil"></i> Основная информация</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{# url/slug #} {# url/slug #}
<div class="control-group {% if form.url.errors %}error{% endif %}"> <div class="control-group {% if form.url.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.url.label }}:</b></label> <label class="control-label"><b>{{ form.url.label }}:</b></label>
<div class="controls"> <div class="controls">
{{ form.langs }} {{ form.langs }}
{{ form.url }} {{ form.url }}<span class="help-inline"></span>
<span class="help-inline">{{ form.url.errors }}</span> <span class="help-inline">{{ form.url.errors }}</span>
</div> </div>
</div> </div>
{# title #} {# title #}
<div class="control-group {% if form.title.errors %}error{% endif %}"> <div class="control-group {% if form.title.errors %}error{% endif %}">
<label class="control-label">{{ form.title.label }}:</label> <label class="control-label">{{ form.title.label }}:</label>
<div class="controls"> <div class="controls">
{{ form.title }} {{ form.title }}
<span class="help-inline">{{ form.title.errors }}</span> <span class="help-inline">{{ form.title.errors }}</span>
</div> </div>
</div> </div>
{# body #} {# page title #}
<div class="control-group {% if form.body.errors %}error{% endif %}"> <div class="control-group {% if form.page_title.errors %}error{% endif %}">
<label class="control-label">{{ form.body.label }}:</label> <label class="control-label">{{ form.page_title.label }}:</label>
<div class="controls"> <div class="controls">
{{ form.body }} {{ form.page_title }}
<span class="help-inline">{{ form.body.errors }}</span> <span class="help-inline">{{ form.page_title.errors }}</span>
</div> </div>
</div> </div>
</div> {# description #}
</div> <div class="control-group {% if form.description.errors %}error{% endif %}">
<label class="control-label">{{ form.description.label }}:</label>
<div class="controls"> <div class="controls">
{{ form.description }}
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/meta/seo/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/> <span class="help-inline">{{ form.description.errors }}</span>
<input class="btn btn-large" type="reset" value="Отмена"> </div>
</div> </div>
</fieldset> {# body #}
</form> <div class="control-group {% if form.body.errors %}error{% endif %}">
<label class="control-label">{{ form.body.label }}:</label>
{% endblock %} <div class="controls">
{{ form.body }}
<span class="help-inline">{{ form.body.errors }}</span>
</div>
</div>
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/meta/seo/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/>
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{% endblock %}

@ -1,11 +1,11 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block sidebar %}{% endblock %} {% block sidebar %}{% endblock %}
{% block body %} {% block body %}
<form action="" method="post">{% csrf_token %} <form action="" method="post">{% csrf_token %}
<div class="controls"> <div class="controls">
<p>Вы точно хотите удалить seo-текст "{{ object.title }}" для страницы <a href = "{{ object.url }}"></a> ?</p> <p>Вы точно хотите удалить seo-текст "{{ object.title }}" для страницы <a href = "{{ object.url }}"></a> ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" /> <input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'seo_all' %}>Нет</a> <a class="btn btn-large btn-primary" href = {% url 'seo_all' %}>Нет</a>
</div> </div>
</form> </form>
{% endblock %} {% endblock %}

@ -1,90 +1,90 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load static %} {% load static %}
{# Displays article form #} {# Displays article form #}
{% block scripts %} {% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script> <script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #} {# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> <link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script> <script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script> <script src="{% static 'custom_js/make_select.js' %}"></script>
{# ajax #} {# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script> <script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script> <script src="{% static 'custom_js/select_tag.js' %}"></script>
{% endblock %} {% endblock %}
{% block body %} {% block body %}
{# Uses multilang.html template for translated fields #} {# Uses multilang.html template for translated fields #}
<form method="post" class="form-horizontal" > {% csrf_token %} <form method="post" action="" class="form-horizontal" > {% csrf_token %}
<fieldset> <fieldset>
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2> <h2><i class="icon-pencil"></i> Основная информация</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{# url/slug #} {# url/slug #}
{% if request.path == '/admin/page/new/' %} {# {% if request.path == '/admin/page/new/' %}#}
<div class="control-group {% if form.url.errors %}error{% endif %}"> <div class="control-group {% if form.url.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.url.label }}:</b></label> <label class="control-label"><b>{{ form.url.label }}:</b></label>
<div class="controls"> <div class="controls">
{{ form.langs }} {{ form.url }}
{{ form.url }} <span class="help-inline">{{ form.url.errors }}</span>
<span class="help-inline">{{ form.url.errors }}</span> </div>
</div> </div>
</div> {# {% endif %}#}
{% endif %}
{# h1 #} {# h1 #}
<div class="control-group {% if form.h1.errors %}error{% endif %} "> <div class="control-group {% if form.h1.errors %}error{% endif %} ">
<label class="control-label"><b>{{ form.h1.label }}:</b></label> <label class="control-label"><b>{{ form.h1.label }}:</b></label>
<div class="controls"> <div class="controls">
{{ form.h1 }} {{ form.h1 }}
<span class="help-inline">{{ form.h1.errors }}</span> <span class="help-inline">{{ form.h1.errors }}</span>
</div> </div>
</div> </div>
{# title #} {# title #}
<div class="control-group {% if form.title.errors %}error{% endif %}"> <div class="control-group {% if form.title.errors %}error{% endif %}">
<label class="control-label">{{ form.title.label }}:</label> <label class="control-label">{{ form.title.label }}:</label>
<div class="controls"> <div class="controls">
{{ form.title }} {{ form.title }}
<span class="help-inline">{{ form.title.errors }}</span> <span class="help-inline">{{ form.title.errors }}</span>
</div> </div>
</div> </div>
{# description #} {# description #}
<div class="control-group {% if form.descriptions.errors %}error{% endif %}"> <div class="control-group {% if form.descriptions.errors %}error{% endif %}">
<label class="control-label">{{ form.descriptions.label }}:</label> <label class="control-label">{{ form.descriptions.label }}:</label>
<div class="controls"> <div class="controls">
{{ form.descriptions }} {{ form.descriptions }}
<span class="help-inline">{{ form.descriptions.errors }}</span> <span class="help-inline">{{ form.descriptions.errors }}</span>
</div> </div>
</div> </div>
{# keywords #} {# keywords #}
<div class="control-group {% if form.keywords.errors %}error{% endif %}"> <div class="control-group {% if form.keywords.errors %}error{% endif %}">
<label class="control-label">{{ form.keywords.label }}:</label> <label class="control-label">{{ form.keywords.label }}:</label>
<div class="controls"> <div class="controls">
{{ form.keywords }} {{ form.keywords }}
<span class="help-inline">{{ form.keywords.errors }}</span> <span class="help-inline">{{ form.keywords.errors }}</span>
</div> </div>
</div> </div>
{# body #} {# body #}
<div class="control-group {% if form.body.errors %}error{% endif %}"> <div class="control-group {% if form.body.errors %}error{% endif %}">
<label class="control-label">{{ form.body.label }}:</label> <label class="control-label">{{ form.body.label }}:</label>
<div class="controls"> <div class="controls">
{{ form.body }} {{ form.body }}
<span class="help-inline">{{ form.body.errors }}</span> <span class="help-inline">{{ form.body.errors }}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="controls"> <div class="controls">
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/page/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/> <input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/page/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/>
<input class="btn btn-large" type="reset" value="Отмена"> <input class="btn btn-large" type="reset" value="Отмена">
</div> </div>
</fieldset> </fieldset>
</form> </form>
{% endblock %} {% endblock %}

@ -1,11 +1,11 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block sidebar %}{% endblock %} {% block sidebar %}{% endblock %}
{% block body %} {% block body %}
<form action="" method="post">{% csrf_token %} <form action="" method="post">{% csrf_token %}
<div class="controls"> <div class="controls">
<p>Вы точно хотите удалить страницу "{{ object }}"?</p> <p>Вы точно хотите удалить страницу "{{ object }}"?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" /> <input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'page_list' %}>Нет</a> <a class="btn btn-large btn-primary" href = {% url 'page_list' %}>Нет</a>
</div> </div>
</form> </form>
{% endblock %} {% endblock %}

@ -0,0 +1,14 @@
{% extends 'client/base_catalog.html' %}
{% load static %}
{% load i18n %}
{% load template_filters %}
{% block title %}{{ object.title }} {% endblock %}
{% block content_list %}
<div id="title">
{{ object.h1 }}
</div>
<div id="body">{{ object.body }}</div>
{% endblock %}

@ -0,0 +1,64 @@
{% extends 'base.html' %}
{% load thumbnail %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Все каталоги специалистов</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>&nbsp; </th>
<th>Заголовок</th>
<th>{% if request.path == "/admin/specialist_catalog/catalog/city/" %}Город{% elif request.path == "/admin/specialist_catalog/catalog/country/" %}Страна{% else %}Страна/Город{% endif %}</th>
<th>Количество специалистов</th>
<th>Link</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>
{% thumbnail item.logo_preview "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}</td>
<td>{{ item.title }}</td>
<td>{% if item.type == 1%}{{ item.country.name }}{% else %}{{ item.city.name }}{% endif %}</td>
<td>{{ item.specialists.count }}</td>
<td><a href="{{ item.get_absolute_url }}">Заценить</a></td>
<td class="center sorting_1">
<a class="btn-small btn-info" href='{% url "catalog_edit" item.id %}'>
Изменить
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href='{% url "catalog_delete" item.id %}'>
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href='{% url "catalog_new" %}'>
<i class="icon-plus-sign icon-white"></i> Хочу еще один </a>
</div>
<div class="pagination pagination-centered">
<ul>
{% if page_obj.has_previous %}
<li> <a href="?page={{ page_obj.previous_page_number }}"></a></li>
{% endif %}
{% if page_obj.has_next %}
<li><a href="?page={{ page_obj.next_page_number }}"></a></li>
{% endif %}
</ul>
</div>
</div>
{% endblock %}

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% block sidebar %}{% endblock %}
{% block body %}
<form action="" method="post">{% csrf_token %}
<div class="controls">
<p>Вы точно хотите удалить "{{ object.title }}" ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'catalog_all' %}>Нет</a>
</div>
</form>
{% endblock %}

@ -0,0 +1,203 @@
{% extends 'base.html' %}
{% load thumbnail %}
{% load static %}
{# Displays article form #}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects for city and country #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<style>
.thumb {
height: 75px;
border: 1px solid #000;
margin: 10px 5px 0 0;
}
</style>
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/specialist_catalog.js' %}"></script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Добавление каталога специалистов(переводчиков)</h2>
</div>
<div class="box-content">
{# title #}
<div class="control-group {% if form.title.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.title.label }}:</b></label>
<div class="controls">
{{ form.title }}<span class="help-inline"></span>
<span class="help-inline">{{ form.title.errors }}</span>
</div>
</div>
{# main_descr #}
<div class="control-group {% if form.main_descr.errors %}error{% endif %}">
<label class="control-label">{{ form.main_descr.label }}:</label>
<div class="controls">
{{ form.main_descr }}
<span class="help-inline">{{ form.main_descr.errors }}</span>
</div>
</div>
{# benefits #}
<div class="control-group {% if form.benefits.errors %}error{% endif %}">
<label class="control-label">{{ form.benefits.label }}:</label>
<div class="controls">
{{ form.benefits }}
<span class="help-inline">{{ form.benefits.errors }}</span>
</div>
</div>
{# big_cities #}
<div class="control-group {% if form.big_cities.errors %}error{% endif %}">
<label class="control-label">{{ form.big_cities.label }}:</label>
<div class="controls">
{{ form.big_cities }}
<span class="help-inline">{{ form.big_cities.errors }}</span>
</div>
</div>
{# price #}
<div class="control-group {% if form.price.errors %}error{% endif %}">
<label class="control-label">{{ form.price.label }}:</label>
<div class="controls">
{{ form.price }}{{ form.currency.label }}{{ form.currency }}
<span class="help-inline">{{ form.price.errors }}</span>
</div>
</div>
{# type #}
<div class="control-group {% if form.type.errors %}error{% endif %}">
<label class="control-label">{{ form.type.label }}:</label>
<div class="controls">
{{ form.type }}
<span class="help-inline">{{ form.type.errors }}</span>
</div>
</div>
{# country #}
<div class="control-group {% if form.country.errors %}error{% endif %}">
<label class="control-label">{{ form.country.label }}:</label>
<div class="controls">
{{ form.country }}
<span class="help-inline">{{ form.country.errors }}</span>
</div>
</div>
{# city #}
<div class="control-group {% if form.city.errors %}error{% endif %}">
<label class="control-label">{{ form.city.label }}(не обязательно):</label>
<div class="controls">
{{ form.city }}
<span class="help-inline">{{ form.city.errors }}</span>
</div>
</div>
{# specialists #}
<div class="control-group {% if form.specialists.errors %}error{% endif %}">
<label class="control-label">{{ form.specialists.label }}(не обязательно):</label>
<div class="controls">
{{ form.specialists }}<a class="btn " href="{% url 'specialist_new' %}">Довавить</a>
<span class="help-inline">{{ form.specialists.errors }}</span>
</div>
</div>
{# logo_preview #}
<div class="control-group {% if form.logo_preview.errors %}error{% endif %}">
<label class="control-label">{{ form.logo_preview.label }}:</label>
<div class="controls">
{{ form.logo_preview }} <output id="list_logo"></output>
<span class="help-inline">{{ form.logo_preview.errors }}</span>
</div>
</div>
{# place_photo #}
<div class="control-group {% if form.place_photo.errors %}error{% endif %}">
<label class="control-label">{{ form.place_photo.label }}:</label>
<div class="controls">
{{ form.place_photo }} <output id="list_picture"></output>
<span class="help-inline">{{ form.place_photo.errors }}</span>
</div>
</div>
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/specialist_catalog/catalog/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/>
<input class="btn btn-large" type="reset" value="Отмена">
<a class="btn btn-large" href="{% url 'catalog_all' %}">Чет передумал(а)</a>
</div>
</fieldset>
</form>
<!--Feedbacks block -->
{% if object.feedback_set.all %}
{% with object.feedback_set.all as feedbacks %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Отзывы для текущего каталога </h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>Логотип</th>
<th>Имя</th>
<th>Компания</th>
<th>Текст</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in feedbacks %}
<tr>
<td>
{% thumbnail item.logo "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}</td>
<td>{{ item.name }}</td>
<td>{{ item.company }}</td>
<td>{{ item.text }}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href='{% url "feedback_edit" catalog_pk=object.id id=item.id %}'>
Изменить
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href='{% url "feedback_delete" item.id %}'>
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href='{% url "feedback_new" object.id %}'>
<i class="icon-plus-sign icon-white"></i> Хочу еще один </a>
</div>
<div class="pagination pagination-centered">
<ul>
{% if page_obj.has_previous %}
<li><a href="?page={{ page_obj.previous_page_number }}"></a></li>
{% endif %}
{% if page_obj.has_next %}
<li><a href="?page={{ page_obj.next_page_number }}"></a></li>
{% endif %}
</ul>
</div>
</div>
{% endwith %}
{% elif object.id %}
Отзывов еще нет,
<a class="btn btn-success" href='{% url "feedback_new" catalog_pk=object.id%}'>
<i class="icon-plus-sign icon-white"></i> Добавить </a>
{% endif %}
{% endblock %}

@ -0,0 +1,62 @@
{% extends 'base.html' %}
{% load thumbnail %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Отзывы для %(calatolog)</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>Логотип </th>
<th>Имя</th>
<th>Компания</th>
<th>Текст</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>
{% thumbnail item.logo "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}</td>
<td>{{ item.name }}</td>
<td>{{ item.company }}</td>
<td>{{ item.text }}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href='{% url "feedback_edit" item.id %}'>
Изменить
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href='{% url "feedback_delete" item.id %}'>
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href='{% url "feedback_new" %}'>
<i class="icon-plus-sign icon-white"></i> Хочу еще один </a>
</div>
<div class="pagination pagination-centered">
<ul>
{% if page_obj.has_previous %}
<li> <a href="?page={{ page_obj.previous_page_number }}"></a></li>
{% endif %}
{% if page_obj.has_next %}
<li><a href="?page={{ page_obj.next_page_number }}"></a></li>
{% endif %}
</ul>
</div>
</div>
{% endblock %}

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% block sidebar %}{% endblock %}
{% block body %}
<form action="" method="post">{% csrf_token %}
<div class="controls">
<p>Вы точно хотите удалить "{{ object.name }}" ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'catalog_all' %}>Нет</a>
</div>
</form>
{% endblock %}

@ -0,0 +1,79 @@
{% extends 'base.html' %}
{% load static %}
{# Displays article form #}
{% block scripts %}
{# selects for city and country #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<style>
.thumb {
height: 75px;
border: 1px solid #000;
margin: 10px 5px 0 0;
}
</style>
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/specialist.js' %}?ad=ddd"></script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Добавление отз ва</h2>
</div>
<div class="box-content">
{# name #}
<div class="control-group {% if form.name.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.name.label }}:</b></label>
<div class="controls">
{{ form.name }}<span class="help-inline"></span>
<span class="help-inline">{{ form.name.errors }}</span>
</div>
</div>
{# company #}
<div class="control-group {% if form.company.errors %}error{% endif %}">
<label class="control-label">{{ form.company.label }}:</label>
<div class="controls">
{{ form.company }}
<span class="help-inline">{{ form.company.errors }}</span>
</div>
</div>
{# text #}
<div class="control-group {% if form.text.errors %}error{% endif %}">
<label class="control-label">{{ form.text.label }}:</label>
<div class="controls">
{{ form.text }}
<span class="help-inline">{{ form.text.errors }}</span>
</div>
</div>
{# catalog #}
<div class="control-group {% if form.catalog.errors %}error{% endif %}">
<label class="control-label">{{ form.catalog.label }}:</label>
<div class="controls">
{{ form.catalog }}
<span class="help-inline">{{ form.catalog.errors }}</span>
</div>
</div>
{# logo #}
<div class="control-group {% if form.logo.errors %}error{% endif %}">
<label class="control-label">{{ form.logo.label }}:</label>
<div class="controls">
{{ form.logo }} <output id="list"></output>
<span class="help-inline">{{ form.logo.errors }}</span>
</div>
</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>
{% endblock %}

@ -0,0 +1,62 @@
{% extends 'base.html' %}
{% load thumbnail %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список специалистов(переводчиков)</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>Фото </th>
<th>Имя</th>
<th>Город</th>
<th>Языки</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>
{% thumbnail item.photo "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}</td>
<td>{{ item.name }}</td>
<td>{{ item.city.name }}</td>
<td>{{ item.languages }}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href='{% url "specialist_edit" item.id %}'>
Изменить
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href='{% url "specialist_delete" item.id %}'>
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href='{% url "specialist_new" %}'>
<i class="icon-plus-sign icon-white"></i> Хочу еще </a>
</div>
<div class="pagination pagination-centered">
<ul>
{% if page_obj.has_previous %}
<li> <a href="?page={{ page_obj.previous_page_number }}"></a></li>
{% endif %}
{% if page_obj.has_next %}
<li><a href="?page={{ page_obj.next_page_number }}"></a></li>
{% endif %}
</ul>
</div>
</div>
{% endblock %}

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% block sidebar %}{% endblock %}
{% block body %}
<form action="" method="post">{% csrf_token %}
<div class="controls">
<p>Вы точно хотите удалить "{{ object.name }}" ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'specialist_all' %}>Нет</a>
</div>
</form>
{% endblock %}

@ -0,0 +1,79 @@
{% extends 'base.html' %}
{% load static %}
{# Displays article form #}
{% block scripts %}
{# selects for city and country #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<style>
.thumb {
height: 75px;
border: 1px solid #000;
margin: 10px 5px 0 0;
}
</style>
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/specialist.js' %}?ad=ddd"></script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %}
<fieldset>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Добавление специалиста(переводчика)</h2>
</div>
<div class="box-content">
{# name #}
<div class="control-group {% if form.name.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.name.label }}:</b></label>
<div class="controls">
{{ form.name }}<span class="help-inline"></span>
<span class="help-inline">{{ form.name.errors }}</span>
</div>
</div>
{# languages #}
<div class="control-group {% if form.languages.errors %}error{% endif %}">
<label class="control-label">{{ form.languages.label }}:</label>
<div class="controls">
{{ form.languages }}
<span class="help-inline">{{ form.languages.errors }}</span>
</div>
</div>
{# country #}
<div class="control-group {% if form.country.errors %}error{% endif %}">
<label class="control-label">{{ form.country.label }}:</label>
<div class="controls">
{{ form.country }}
<span class="help-inline">{{ form.country.errors }}</span>
</div>
</div>
{# city #}
<div class="control-group {% if form.city.errors %}error{% endif %}">
<label class="control-label">{{ form.city.label }}:</label>
<div class="controls">
{{ form.city }}
<span class="help-inline">{{ form.city.errors }}</span>
</div>
</div>
{# photo #}
<div class="control-group {% if form.photo.errors %}error{% endif %}">
<label class="control-label">{{ form.photo.label }}:</label>
<div class="controls">
{{ form.photo }} <output id="list"></output>
<span class="help-inline">{{ form.photo.errors }}</span>
</div>
</div>
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/specialist_catalog/specialist/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/>
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{% endblock %}

@ -0,0 +1,31 @@
{% extends 'base_catalog.html' %}
{% block content_list %}
<div class="page-title">
<h1>Запрашиваемая страница не найдена</h1>
</div>
<div class="m-article error-404">
<span class="figure">404:</span>
<p class="title">Возможно у нее изменился адрес или же она была удалена.<br> Воспользуйтесь поиском по названию, расширенной формой поиска или каталогом событий.</p>
<div class="clearfix"></div>
<hr/>
<section>
<h2>Каталог выставок</h2>
<ul class="items-list">
{% for item in expo_themes %}
<li><i class="fa fa-circle"></i><a href="/expo/theme/{{ item.url }}/">{{ item.name }}&nbsp;({{ item.expo_count }})</a></li>
{% endfor %}
</ul>
</section>
<hr/>
<section >
<h2>Каталог конференций</h2>
<ul class="items-list">
{% for item in conf_themes %}
<li><i class="fa fa-circle"></i><a href="/conference/theme/{{ item.url }}/">{{ item.name }}&nbsp;({{ item.conference_count }})</a></li>
{% endfor %}
</ul>
</section>
</div>
{% endblock %}

@ -1,7 +1,7 @@
{% extends 'client/blank.html' %} {% extends 'client/blank.html' %}
{% block main_part %} {% block main_part %}
<form method="post" action="{% url "require_email" %}">{% csrf_token %} <form method="post" action="{% url "require_email" %}">{% csrf_token %}
{{ form }} {{ form }}
<input type="submit" value="Send"> <input type="submit" value="Send">
</form> </form>
{% endblock %} {% endblock %}

@ -21,7 +21,7 @@ This template include basic anf main styles and js files,
<html class="no-js"> <!--<![endif]--> <html class="no-js"> <!--<![endif]-->
<!--if IE 8><script src="js/selectivizr-min.js"></script><![endif]--> <!--if IE 8><script src="js/selectivizr-min.js"></script><![endif]-->
<head> <head>
{% include 'includes/meta.html' %} {% include 'client/includes/meta.html' %}
<meta name="cmsmagazine" content="ca270688603566278c9006a1511705b1" /> <meta name="cmsmagazine" content="ca270688603566278c9006a1511705b1" />
<meta name="ktoprodvinul" content="7bf9e596b7b6707a" /> <meta name="ktoprodvinul" content="7bf9e596b7b6707a" />
<link rel="icon" href="{% static 'client/img/favicon.ico' %}" type="image/x-icon" /> <link rel="icon" href="{% static 'client/img/favicon.ico' %}" type="image/x-icon" />
@ -45,6 +45,9 @@ This template include basic anf main styles and js files,
<script src="{% static 'client/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js' %}"></script> <script src="{% static 'client/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js' %}"></script>
<script src="{% static 'client/js/vendor/jquery-1.10.1.min.js' %}"></script> <script src="{% static 'client/js/vendor/jquery-1.10.1.min.js' %}"></script>
<script src="{% static 'client/js/jquery-ui-1.10.4.custom.min.js' %}" type="text/javascript"></script> <script src="{% static 'client/js/jquery-ui-1.10.4.custom.min.js' %}" type="text/javascript"></script>
{% block head_scripts %}
{% endblock %}
{% if request.GET.debug == '1' %} {% if request.GET.debug == '1' %}
<script src="{% static 'client/js/_modules/block.common.js' %}"></script> <script src="{% static 'client/js/_modules/block.common.js' %}"></script>
{% else %} {% else %}

@ -11,11 +11,10 @@
<div class="header-body mcl"> <div class="header-body mcl">
<div class="header-top clearfix"> <div class="header-top clearfix">
<div class="ht-main"> <div class="ht-main">
{% if user.is_authenticated %} {% if user.is_authenticated %}
{% if user.organiser %} {% if user.is_organiser %}
<div class="add-link"><a class="l-button ico" href="#">{% trans 'добавить событие' %}</a></div> <div class="add-link"><a class="l-button ico" href="{% url "add_exposition" %}">добавить событие </a></div>
{% endif %} {% endif %}
{% endif %} {% endif %}

@ -2,7 +2,10 @@
{% load i18n %} {% load i18n %}
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
{% if meta %} {% if seotext %}
{% if seotext.description %}{% meta 'description' seotext.description %}{% endif %}
{% if seotext.page_title %}<title>{{ seotext.page_title }}</title>{% endif %}
{% elif meta %}
{% if meta.description %}{% meta 'description' meta.description %}{% endif %} {% if meta.description %}{% meta 'description' meta.description %}{% endif %}
{% if meta.keywords %}{% meta_list 'keywords' meta.keywords %}{% endif %} {% if meta.keywords %}{% meta_list 'keywords' meta.keywords %}{% endif %}
{% if meta.title %}<title>{{ meta.title }}</title>{% endif %} {% if meta.title %}<title>{{ meta.title }}</title>{% endif %}

@ -1,3 +1,3 @@
<div class="so-text"> <div class="seo-text">
<h2>{{ object.title }}</h2>{{ object.body|safe }} <h2>{{ object.title }}</h2>{{ object.body|safe }}
</div> </div>

@ -1,19 +1,19 @@
{% extends 'client/base_catalog.html' %} {% extends 'client/base_catalog.html' %}
{% load static %} {% load static %}
{% load i18n %} {% load i18n %}
{% block bread_scrumbs %} {% block bread_scrumbs %}
<div class="bread-crumbs"> <div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a> <a href="/">{% trans 'Главная страница' %}</a>
<strong>{{ object.main_title }}</strong> <strong>{{ object.main_title }}</strong>
</div> </div>
{% endblock %} {% endblock %}
{% block page_title %} {% block page_title %}
<h1>{{ object.h1 }}</h1> <h1>{{ object.h1 }}</h1>
{% endblock %} {% endblock %}
{% block page_body %} {% block page_body %}
{{ object.body|safe|striptags}} {{ object.body|safe|striptags}}
{% endblock %} {% endblock %}

@ -0,0 +1,326 @@
{% extends "client/base_catalog.html" %}
{% load static %}
{% load thumbnail %}
{% load i18n %}
{% block head_scripts %}
{% endblock %}
{% block page_body%}
<div class="page-body clearfix request-form rq-translator">
<div class="m-article">
<div class="item-wrap place clearfix">
<aside>
<div class="i-pict">
{% thumbnail object.logo_preview "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}
</div>
</aside>
<div class="i-info">
<header>
<div class="i-title">{{ object.title }}</div>
</header>
<div class="i-descr">
{{ object.main_descr }}
</div>
<hr/>
<div class="i-address map-opened country_map">
{# #}
<div class="i-map">
{% thumbnail object.place_photo "957x400" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}
</div>
{# <!-- позиция для карты задается в атрибуте data-coords -->#}
{# <div class="map-canvas" id="map-canvas" data-coords="55.751898,37.545172" ></div>#}
{# <div class="close-map"><a class="toggle-map" href="#">Скрыть карту</a></div>#}
{# #}
{# <header>#}
{# <div class="show-map show-map_1"><a class="toggle-map" href="#">Раскрыть карту</a></div>#}
{# </header>#}
</div>
</div>
</div>
{{ object.big_cities }}
<div class="country_towns">
<h4>Крупные города:</h4>
{{ object.big_cities }}
</div>
<hr />
<div class="i-services country_content">
<div class="i-descr">
<h4>Коротко о наших преимуществах:</h4>
<div style="margin-top:20px;">
{{ object.benefits|safe }}
</div>
</div>
</div>
{# ----------------------------------------- FORM ----------------------------------------------#}
<div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}>
<form method="post">{% csrf_token %}
<hr />
<div class="rq-form-sect">
<div class="rqf-title">{% trans 'Информация о переводе' %}</div>
<div class="mf-line cols-2 rq-trans">
<div class="mf-field">
{{ form.languages }}
</div>
<div class="mf-field">
{{ form.themes }}
</div>
</div>
<div class="mf-line">
<label>Занятость:</label>
<div class="mf-field rq-tickets-days rq-num">
{{ form.days }} {% trans 'дней' %}
</div>
<div class="mf-field rq-tickets-num rq-num">
{{ form.hours }} {% trans 'часов в день' %}
</div>
</div>
<div class="mf-line rq-p-days">
<label>{% trans 'Даты работы' %}:</label>
<div class="mf-field">
<div class="period">
<div class="pwf-field validate-field{% if form.fr.errors %} error-field{% endif %}">
<label>{% trans 'с' %}</label>
{{ form.fr }}
<div class="error-blob">
{{ form.fr.errors }}
</div>
</div>
<div class="pwf-field validate-field{% if form.to.errors %} error-field{% endif %}">
<label>{% trans 'по' %}</label>
{{ form.to }}
<div class="error-blob">
{{ form.to.errors }}
</div>
</div>
</div>
</div>
</div>
</div>
<hr />
<div class="rq-form-sect">
<div class="rqf-title">{% trans 'Ваши контактные данные' %}</div>
{% if not object %}
<div class="mf-line rq-person ">
<div class="mf-field validate-field{% if form.event.errors %} error-field{% endif %}">
{{ form.event }}
<div class="error-blob">
{{ form.event.errors }}
</div>
</div>
</div>
{% endif %}
<div class="mf-line rq-person">
<div class="mf-field validate-field{% if form.person_inf.errors %} error-field{% endif %}">
{{ form.person_inf }}
<div class="error-blob">
{{ form.person_inf.errors }}
</div>
</div>
</div>
<div class="mf-line cols-2 rq-place">
<div class="mf-field validate-field rq-country{% if form.country.errors %} error-field{% endif %}">
{{ form.country }}
<div class="error-blob">
{{ form.country.errors }}
</div>
</div>
<div class="mf-field validate-field rq-city{% if form.city.errors %} error-field{% endif %}">
{{ form.city }}
<div class="error-blob">
{{ form.city.errors }}
</div>
</div>
</div>
<div class="mf-line cols-2 rq-contacts">
<div class="mf-field validate-field rq-tel{% if form.phone.errors %} error-field{% endif %}">
{{ form.phone }}
<div class="error-blob">
{{ form.phone.errors }}
</div>
</div>
<div class="mf-field validate-field rq-mail{% if form.person.errors %} error-field{% endif %}">
{{ form.person }}
<div class="error-blob">
{{ form.person.errors }}
</div>
</div>
</div>
</div>
<hr />
<div class="rq-btn-wrap">
<div class="rq-order-button">
<div class="rqob-wrap">
<div class="rqob-button">
<button type="submit">{% trans 'отправить запрос' %}</button>
</div>
</div>
</div>
</div>
</form>
</div>
{# ----------------------------------------- END FORM -------------------------------------------#}
<div class="rq-btn-wrap rq-btn-to-hide rq-to-hide">
<div class="rqb-cols">
<div class="rqb-button">
<div class="rq-order-button">
<div class="rqob-wrap">
<div class="rqob-price">от {{ object.price }} {{ object.currency }} / день</div>
<div class="rqob-button">
<a class="ob-text" href="#">заказать услугу</a>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
{% if request.GET.debug == '1' %}
<script src="{% static 'client/js/_modules/page.translator.js' %}"></script>
{% else %}
<script src="{% static 'client/js_min/_modules/page.translator.min.js' %}"></script>
{% endif %}
<script>
EXPO.translator.init({});
</script>
{% with object.specialists.all as specialists %}
{% if specialists %}
<div class="i-staff">
<div class="sect-title">Наши специалисты</div>
<div class="i-staff-list">
<ul>
{% for spec in specialists %}
<li>
<a href="#">
<div class="sl-item clearfix">
<div class="sl-pict">
{% thumbnail spec.photo "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}
</div>
<div class="sl-info">
<div class="sl-info-wrap">
<div class="sl-name">{{ spec.name }}</div>
<div class="sl-position">{{ spec.languages }}</div>
</div>
</div>
</div>
</a>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
{% endwith %}
</div>
{% with object.feedback_set.all as feedbacks %}
{% if feedbacks %}
<div class="rq-to-hide">
<div class="s-comments">
<div class="sect-title">Отзывы клиентов:</div>
<div class="cat-list sc-comments">
{% for feedback in feedbacks %}
<div class="cl-item">
<div class="cl-item-wrap clearfix">
<div class="cli-pict">
{% thumbnail feedback.logo "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}
</div>
<div class="cli-info">
<div class="cli-top clearfix">
<header>
<div class="cli-title">{{ feedback.company }}</div>
</header>
</div>
<div class="sc-name">{{ feedback.name }}</div>
<div class="sc-text">
{{ feedback.text }}
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endif %}
{% endwith %}
</div>
{% endblock %}

@ -37,10 +37,10 @@ if (EXPO.exposition.list){
response, response,
self = this, self = this,
handler = function (data) { handler = function (data) {
if (data.success){ if (data.success) {
console.log('ok'); console.log('ok');
$(self.DOMbutton).addClass('active'); $(self.DOMbutton).addClass('active');
}else{ } else {
console.log('data not send'); console.log('data not send');
} }

@ -1,218 +1,209 @@
{% extends 'client/base_catalog.html' %} {% extends 'client/base_catalog.html' %}
{% load static %}
{% block content_list %}
{{ form.errors }} {% block head_scripts %}
<div class="page-body clearfix"> <script src="{% static 'js/select/select2.js' %}"></script>
<div class="set-sect p-form adm-form"> <script src="{% static 'custom_js/wizard.js' %}"></script>
<div class="set-sect-title clearfix"> {% endblock %}
{{ wizard.form.media }}
<h3>Шаг {{ wizard.steps.step1 }}. Основная информация</h3> {% block content_list %}
</div> {{ form.errors }}
<form action="" enctype="multipart/form-data" method="post">{% csrf_token %} <div class="page-body clearfix">
{{ wizard.management_form }} <div class="set-sect p-form adm-form">
{# {% if wizard.form.forms %}#} <div class="set-sect-title clearfix">
{# {{ wizard.form.management_form }}#} {{ wizard.form.media }}
{# {% for form in wizard.form.forms %}#} <h3>Шаг {{ wizard.steps.step1 }}. Основная информация</h3>
{# {{ form }}#} </div>
{# {% endfor %}#} <form action="" enctype="multipart/form-data" method="post">{% csrf_token %}
{# {% else %}#} {{ wizard.management_form }}
{% with wizard.form as form %} {% with wizard.form as form %}
<div class="adm-form-body"> <div class="adm-form-body">
<div class="mf-line "> <div class="mf-line ">
<div class="mf-field"> <div class="mf-field">
<label>Тематика:</label> <label>Тематика:</label>
{{ form.theme }} {{ form.theme }}
</div> </div>
<div class="mf-field"> <div class="mf-field">
<label>Теги:</label> <label>Теги:</label>
{{ form.tag }} {{ form.tag }}
</div> </div>
</div> </div>
<hr/> <hr/>
<h2>Описание выставки</h2> <h2>Описание выставки</h2>
<div class="mf-line"> <div class="mf-line">
<div class="mf-field"> <div class="mf-field">
{{ form.name }} {{ form.name }}
</div> </div>
</div> </div>
<div class="mf-line full-width"> <div class="mf-line full-width">
<div class="mf-field"> <div class="mf-field">
{{ form.main_title }} {{ form.main_title }}
</div> </div>
</div> </div>
<div class="mf-line full-width"> <div class="mf-line full-width">
<div class="mf-field"> <div class="mf-field">
{{ form.description }} {{ form.description }}
</div> </div>
</div> </div>
<hr/> <hr/>
<div id="dates-range" class="mf-line"> <div id="dates-range" class="mf-line">
<label class="h2">Даты проведения:</label> <label class="h2">Даты проведения:</label>
<div class="mf-field"> <div class="mf-field">
<div class="period"> <div class="period">
<div class="pwf-field"> <div class="pwf-field">
<label>с</label> <label>с</label>
{{ form.date_start }} {{ form.date_start }}
</div> </div>
<div class="pwf-field"> <div class="pwf-field">
<label>по</label> <label>по</label>
{{ form.date_end }} {{ form.date_end }}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<hr/> <hr/>
<div class="mfs-location"> <div class="mfs-location">
<h2>Локация</h2> <h2>Локация</h2>
<div class="mf-line"> <div class="mf-line">
<div class="mf-field"> <div class="mf-field">
<h3>Место проведения:</h3> <h3>Место проведения:</h3>
{{ form.place }} {{ form.place }}
</div> </div>
</div> </div>
<div class="mf-line"> <div class="mf-line">
<div class="mf-field"> <div class="mf-field">
<h3>Страна:</h3> <h3>Страна:</h3>
{{ form.country }} {{ form.country }}
</div> </div>
<div class="mf-field"> <div class="mf-field">
<h3>Город:</h3> <h3>Город:</h3>
{{ form.city }} {{ form.city }}
</div> </div>
</div> </div>
</div> </div>
<hr/> <hr/>
<div class="mfs-additional"> <div class="mfs-additional">
<h2>Дополнительная информация</h2> <h2>Дополнительная информация</h2>
<div class="mf-line mf-targets"> <div class="mf-line mf-targets">
<label>Аудитория:</label> <label>Аудитория:</label>
<div class="mf-field"> <div class="mf-field">
<div class="clearfix"> <div class="clearfix">
<div class="mff-col"> <div class="mff-col">
<label class="check">{{ form.audience1 }}специалисты</label> <label class="checkbox">{{ form.audience1 }}специалисты</label>
<label class="check">{{ form.audience2 }}специалисты и <label class="checkbox">{{ form.audience2 }}специалисты и
потребители</label> потребители</label>
<label class="check">{{ form.audience3 }}широкая публика</label> <label class="checkbox">{{ form.audience3 }}широкая публика</label>
</div> </div>
<div class="mff-col"> <div class="mff-col">
{{ form.periodic }} Периодичность:
</div> {{ form.periodic }}
</div> </div>
</div>
<hr/>
<hr/>
</div>
</div> </div>
</div>
<div class="mf-line mf-membership">
<label>Членства и знаки качества:</label> <div class="mf-line mf-membership">
<label>Членства и знаки качества:</label>
<div class="mf-field">
<label class="check">{{ form.membership1 }}Exporating</label> <div class="mf-field">
<label class="check">{{ form.membership2 }}RSVA</label> <label class="checkbox">{{ form.membership1 }}Exporating</label>
<label class="check">{{ form.membership3 }}UFI</label> <label class="checkbox">{{ form.membership2 }}RSVA</label>
<hr/> <label class="checkbox">{{ form.membership3 }}UFI</label>
</div> <hr/>
</div> </div>
</div>
<div class="mf-line mf-prod">
<div class="mf-field"> <div class="mf-line mf-prod">
{{ form.web_site }} <div class="mf-field">
{{ form.web_site }}
{{ form.products }}
{{ form.products }}
<hr/>
<hr/>
</div>
</div> </div>
</div>
<div class="mf-line mf-time">
<label>Время работы:</label> <div class="mf-line mf-time">
<label>Время работы:</label>
<div id="work-time" class="mf-field">
<div class="w-time"> <div id="work-time" class="mf-field">
{# <div class="w-time-day">#} <div class="w-time">
{# <select name="d01">#} <div class="w-time-wrap">
{# <option value="12.04.2014">12.04.2014</option>#} <label>c</label>
{# </select>#} {{ form.time_start }}
{# </div>#} </div>
<div class="w-time-wrap"> <div class="w-time-wrap">
<label>c</label> <label>до</label>
{{ form.time_start }} {{ form.time_end }}
</div> </div>
</div>
<div class="w-time-wrap"> </div>
<label>до</label> </div>
{{ form.time_end }}
</div> </div>
<hr/>
{# <label class="check"><input type="checkbox" class="w-time-switcher" name="c05" checked />Один график на все дни</label>#}
</div> <div class="mf-line mf-logo">
<label class="h2">Логотип:</label>
</div>
</div> <div class="mf-field">
<div class="input-file clearfix">
</div> {{ form.logo }}
<hr/> </div>
</div>
<div class="mf-line mf-logo"> </div>
<label class="h2">Логотип:</label>
<hr/>
<div class="mf-field"> </div>
<div class="input-file clearfix"> <div class="a-bot-buttons-line clearfix">
{{ form.logo }}
</div> <div class="abb-right">
</div> <input class="button big orange a-more" type="submit" value="Дале >"/>
</div> </div>
<hr/> </div>
</div>
<div class="a-bot-buttons-line clearfix"> </form>
<div class="abb-right"> {% endwith %}
<input class="button big orange a-more" type="submit" value="Дале >"/> </div>
</div>
<div class="set-sect p-form adm-form not-active">
</div> <div class="set-sect-title clearfix">
<h3>Шаг 2. Статистика и условия участия</h3>
</form> </div>
</div>
{% endwith %}
</div> <div class="set-sect p-form adm-form not-active">
<div class="set-sect-title clearfix">
<div class="set-sect p-form adm-form not-active"> <h3>Шаг 3. Добавление фото</h3>
<div class="set-sect-title clearfix"> </div>
<h3>Шаг 2. Статистика и условия участия</h3> </div>
</div>
</div> </div>
<hr/>
<div class="set-sect p-form adm-form not-active"> {% endblock %}
<div class="set-sect-title clearfix">
<h3>Шаг 3. Добавление фото</h3>
</div>
</div>
</div>
<hr/>
{# {% endif %}#}
{% endblock %}

@ -1,310 +1,261 @@
{% extends 'client/base_catalog.html' %} {% extends 'client/base_catalog.html' %}
{% load static %}
{% block content_list %}
{{ form.errors }}
<div class="page-title"> {% block head_scripts %}
<h1>Добавить событие</h1> <script src="{% static 'js/select/select2.js' %}"></script>
</div> <script>
<div class="page-body clearfix"> $(document).ready(function () {
{{ wizard.form.media }} $('select').select2({
<div class="set-sect p-form adm-form passed"> width: 'element',
<div class="set-sect-title clearfix"> allowClear: true
<h3>Шаг 1. Основная информация</h3> });
});
<div class="afh-right"> </script>
{% endblock %}
<a class="button icon-edit" href="#">изменить</a>
</div>
</div> {% block content_list %}
</div> {{ form.errors }}
<div class="page-title">
<h1>Добавить событие</h1>
</div>
<div class="set-sect p-form adm-form"> <div class="page-body clearfix">
<div class="set-sect-title clearfix"> <form action="" method="post">{% csrf_token %}
<h3>Шаг 2. Статистика и условия участия</h3>
{{ wizard.form.media }}
<div class="afh-right"> <div class="set-sect p-form adm-form passed">
<div class="sst-info"><b>+ 0,9 баллов</b> к рейтингу</div> <div class="set-sect-title clearfix">
</div> <h3>Шаг 1. Основная информация</h3>
</div>
<div class="afh-right">
<form action="" method="post">{% csrf_token %} <button name="wizard_goto_step" type="submit" class="button icon-edit"
{{ wizard.management_form }} value="{{ wizard.steps.prev }}">изменить
{% if wizard.form.forms %} </button>
{{ wizard.form.management_form }} </div>
{% for form in wizard.form.forms %} </div>
{{ form }} </div>
{% endfor %}
{% else %}
{% with wizard.form as form %} <div class="set-sect p-form adm-form">
<hr/> <div class="set-sect-title clearfix">
<h3>Шаг 2. Статистика и условия участия</h3>
<div class="mfs-additional mf-stat">
<div class="afh-right">
<div class="mf-line mf-prod mf-short-input"> <div class="sst-info"><b>+ 0,9 баллов</b> к рейтингу</div>
<label>Год основания:</label> </div>
{{ form.found_year }} </div>
<div class="mf-field">
{{ wizard.management_form }}
</div> {% if wizard.form.forms %}
</div> {{ wizard.form.management_form }}
{% for form in wizard.form.forms %}
<div class="mf-stat-item"> {{ form }}
{% endfor %}
<hr/> {% else %}
{% with wizard.form as form %}
<div class="mf-line mf-prod"> <hr/>
<label class="h3">Статистика за</label>
<div class="mfs-additional mf-stat">
<div class="mf-field">
<div class="mf-line mf-prod mf-short-input">
<div class="mf-year"> <label>Год основания:</label>
{{ form.statistic_year }} {{ form.found_year }}
</div> <div class="mf-field">
<div class="mf-stat-data"> </div>
</div>
<div class="sd-visitors">
{{ form.visitors }} <hr/>
</div>
<h2>Стоимость посещения и участия</h2>
<div class="sd-participants">
{{ form.partisipants }} <div class="e-price-wrap">
</div> <div class="epr-layout">
<div class="sd-area"> <div class="eprl-col">
{{ form.square }} <div class="eprl-col-wrap">
м²
</div> <div class="epr-subtitle">Стоимость билетов</div>
</div>
<div class="tp-wrap">
</div>
</div> <ul class="pr-list">
<div class="mf-line mf-prod mf-stat-countries"> <li>
<label>Страны:</label> {{ form.one_day }}
<select name="oneDayCurrency1">
<div class="mf-field"> <option value="rur">руб</option>
<option value="usd">usd</option>
<div class="csb-selected-items"></div> <option value="eur">eur</option>
<div class="csb-menu-wrap"> </select>
<div class="scroll-container csb-menu"> </li>
<div class="scroll-content clearfix">
{{ form.countries }} <li>
</div> {{ form.all_days }}
</div> <select name="allDaysCurrency1">
</div> <option value="rur">руб</option>
</div> <option value="usd">usd</option>
</div> <option value="eur">eur</option>
</select>
</div> </li>
<div class="mf-stat-add-button"> </ul>
<a class="button big icon-add" href="#">добавить данные за другой период</a>
</div> <div class="tp-descr">Предварительная регистрация</div>
</div> </div>
<hr/> <hr/>
<h2>Стоимость посещения и участия</h2> <div class="tp-wrap">
<div class="e-price-wrap"> <ul class="pr-list">
<div class="epr-layout">
<li>
<div class="eprl-col"> {{ form.pre_one_day }}
<div class="eprl-col-wrap"> <select name="oneDayCurrency2">
<option value="1">руб</option>
<div class="epr-subtitle">Стоимость билетов</div> <option value="2">usd</option>
<option value="3">eur</option>
<div class="tp-wrap"> </select>
</li>
<ul class="pr-list">
<li>
<li> {{ form.pre_all_days }}
{{ form.one_day }} <select name="allDaysCurrency2">
<select name="oneDayCurrency1"> <option value="1">руб</option>
<option value="rur">руб</option> <option value="2">usd</option>
<option value="usd">usd</option> <option value="3">eur</option>
<option value="eur">eur</option> </select>
</select> </li>
</li>
</ul>
<li>
{{ form.all_days }} <div class="tp-descr grey">Регистрация на&nbsp;стойке</div>
<select name="allDaysCurrency1">
<option value="rur">руб</option> </div>
<option value="usd">usd</option>
<option value="eur">eur</option> </div>
</select>
</li> </div>
</ul> <div class="eprl-col">
<div class="eprl-col-wrap">
<div class="tp-descr">Предварительная регистрация</div>
<div class="epr-subtitle">Стоимость аренды 1м²</div>
</div>
<ul class="pr-list">
<hr/>
<li>
<div class="tp-wrap"> {{ form.equiped }}
<select name="areaCurrency1">
<ul class="pr-list"> <option value="1">руб</option>
<option value="2">usd</option>
<li> <option value="3">eur</option>
{{ form.pre_one_day }} </select>
<select name="oneDayCurrency2"> </li>
<option value="1">руб</option>
<option value="2">usd</option> <li>
<option value="3">eur</option> {{ form.unequiped }}
</select> <select name="areaCurrency2">
</li> <option value="1">руб</option>
<option value="2">usd</option>
<li> <option value="3">eur</option>
{{ form.pre_all_days }} </select>
<select name="allDaysCurrency2"> </li>
<option value="1">руб</option>
<option value="2">usd</option> <li>
<option value="3">eur</option> {{ form.open_square }}
</select> <select name="areaCurrency3">
</li> <option value="1">руб</option>
<option value="2">usd</option>
</ul> <option value="3">eur</option>
</select>
<div class="tp-descr grey">Регистрация на&nbsp;стойке</div> </li>
</div> </ul>
</div> <hr/>
</div> <div class="mf-line mf-min-area">
<label>Минимальная площадь:</label>
<div class="eprl-col">
<div class="eprl-col-wrap"> <div class="mf-field">
{{ form.min_square }}
<div class="epr-subtitle">Стоимость аренды 1м²</div> м²
</div>
<ul class="pr-list"> </div>
<li> <hr/>
{{ form.equiped }}
<select name="areaCurrency1"> <div class="mf-line mf-reg-payment">
<option value="1">руб</option> <label>Регистрационный взнос:</label>
<option value="2">usd</option>
<option value="3">eur</option> <div class="mf-field">
</select> {{ form.registration_depos }}
</li> <select name="areaCurrency3">
<option value="1">руб</option>
<li> <option value="2">usd</option>
{{ form.unequiped }} <option value="3">eur</option>
<select name="areaCurrency2"> </select>
<option value="1">руб</option> </div>
<option value="2">usd</option> </div>
<option value="3">eur</option>
</select> <hr/>
</li>
<div class="mf-line mf-deadline">
<li> <label>Крайний срок подачи заявки:</label>
{{ form.open_square }}
<select name="areaCurrency3"> <div class="mf-field">
<option value="1">руб</option> <div class="period">
<option value="2">usd</option> <div class="pwf-field">
<option value="3">eur</option> {{ form.deadline_date }}
</select> </div>
</li> </div>
</div>
</ul> </div>
<hr/> </div>
</div>
<div class="mf-line mf-min-area">
<label>Минимальная площадь:</label> </div>
</div>
<div class="mf-field">
{{ form.min_square }} <hr/>
м²
</div> <div class="a-bot-buttons-line clearfix">
</div>
<div class="abb-left">
<hr/> <div class="mfpl-button-line">
{# <div class="mfpl-button">#}
<div class="mf-line mf-reg-payment"> {# <a class="button big grey a-more" href="#">пропустить этот шаг</a>#}
<label>Регистрационный взнос:</label> {# </div>#}
<div class="mf-field"> <div class="mfpl-text">
{{ form.registration_depos }} <p>более полная информация повышает рейтинг вашего мероприятия и позволяет
<select name="areaCurrency3"> ранжировать
<option value="1">руб</option> его выше других</p>
<option value="2">usd</option> </div>
<option value="3">eur</option> </div>
</select>
</div> </div>
</div> <button class="button big orange a-more" type="submit">Дале</button>
<hr/> </div>
<div class="mf-line mf-deadline"> </div>
<label>Крайний срок подачи заявки:</label> <div class="set-sect p-form adm-form passed">
<div class="set-sect-title clearfix">
<div class="mf-field"> <h3>Шаг 3. Добавление фото</h3>
<div class="period">
<div class="pwf-field">
{{ form.deadline_date }} </div>
</div> </div>
</div> </form>
</div> </div>
</div>
{% endwith %}
</div> {% endif %}
</div>
</div>
</div>
<hr/>
<div class="a-bot-buttons-line clearfix">
<div class="abb-left">
<div class="mfpl-button-line">
<div class="mfpl-button">
<a class="button big grey a-more" href="#">пропустить этот шаг</a>
</div>
<div class="mfpl-text">
<p>более полная информация повышает рейтинг вашего мероприятия и позволяет ранжировать
его выше других</p>
</div>
</div>
</div>
{% if wizard.steps.prev %}
<button class="button big orange a-more" name="wizard_goto_step" type="submit"
value="{{ wizard.steps.first }}">"first step"
</button>
<button class="button big orange a-more" name="wizard_goto_step" type="submit"
value="{{ wizard.steps.prev }}"> "prev step"
</button>
{% endif %}
<button class="button big orange a-more" type="submit" >Дале</button>
</div>
</form>
</div>
<div class="set-sect p-form adm-form passed">
<div class="set-sect-title clearfix">
<h3>Шаг 3. Добавление фото</h3>
<div class="afh-right">
<a class="button icon-edit" href="#">изменить</a>
</div>
</div>
</div>
</div>
{% endwith %}
{% endif %}
{% endblock %} {% endblock %}

@ -0,0 +1,148 @@
{% extends "client/base_catalog.html" %}
{% block styles %}
<style>
.thumb {
height: 175px;
border: 1px solid #000;
}
</style>
{% endblock %}
{% block content_list %}
{{ wizard.form.media }}
<div class="page-title">
<h1>Добавить событие</h1>
</div>
<div class="page-body clearfix">
<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
<div class="set-sect p-form adm-form passed">
<div class="set-sect-title clearfix">
<h3>Шаг 1. Основная информация</h3>
<div class="afh-right">
<button name="wizard_goto_step" type="submit" class="button icon-edit"
value="{{ wizard.steps.first }}">изменить
</button>
</div>
</div>
</div>
<div class="set-sect p-form adm-form passed">
<div class="set-sect-title clearfix">
<h3>Шаг 2. Статистика и условия участия</h3>
<div class="afh-right">
<button name="wizard_goto_step" type="submit" class="button icon-edit"
value="{{ wizard.steps.prev }}">изменить
</button>
</div>
</div>
</div>
<div class="set-sect p-form adm-form">
<div class="set-sect-title clearfix">
<h3>Шаг 3. Добавление фото</h3>
<div class="afh-right">
<div class="sst-info"><b>+ 1,2 балла</b> к рейтингу</div>
</div>
</div>
{{ form.errors }}
{{ wizard.management_form }}
{% if wizard.form.forms %}
{{ wizard.form.management_form }}
{% for form in wizard.form.forms %}
{{ form }}
{% endfor %}
{% else %}
{% with wizard.form as form %}
<hr/>
<div class="mf-photos-list">
<div class="mfpl-button-line">
<div class="mfpl-button">
{{ form.attachments }}
</div>
<div class="mfpl-text">
<p>более полная информация повышает рейтинг вашего мероприятия и позволяет
ранжировать его выше других</p>
</div>
</div>
</div>
<ul id="list"></ul>
<div class="a-bot-buttons-line clearfix">
<div class="abb-left">
<button class="button big grey a-more" type="submit">пропустить этот шаг</button>
</div>
<div class="abb-right">
<button id="next" class="button big orange a-more" type="submit">далее</button>
</div>
<div id="res"> </div>
</div>
{% endwith %}
{% endif %}
</div>
</form>
</div>
<!-- for response debugging -->
{% comment %} <script>
$("#next").click(function(e){
e.preventDefault();
$.ajax({url: '/wizard/ajax/', success: function(result){
$("#res").html(result);
}});
});
</script>{% endcomment %}
<script type="text/javascript">
var cnt = 0;
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function (theFile) {
return function (e) {
// Render thumbnail.
var div = document.createElement('div');
div.innerHTML = ['<li><div class="mfpli-pict"> <img class="thumb" src="', e.target.result,
'" title="', theFile.name,
'"/></div>', '<div class="mfpli-body"> <div class="mf-line full-width"> <div class="mf-field"> <textarea name="pdescr_',
cnt.toString(), '" cols="30" rows="10" placeholder="Описание"></textarea></div></div>',
'</li>'].join('');
cnt +=1 ;
document.getElementById('list').insertBefore(div, null);
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>
{% endblock %}

@ -1,23 +1,23 @@
{% extends 'client/base_catalog.html' %} {% extends 'client/base_catalog.html' %}
{% block content_list %} {% block content_list %}
{{ wizard.form.media }} {{ wizard.form.media }}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p> <p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %} <form action="" method="post">{% csrf_token %}
<table> <table>
{{ wizard.management_form }} {{ wizard.management_form }}
{% if wizard.form.forms %} {% if wizard.form.forms %}
{{ wizard.form.management_form }} {{ wizard.form.management_form }}
{% for form in wizard.form.forms %} {% for form in wizard.form.forms %}
{{ form }} {{ form }}
{% endfor %} {% endfor %}
{% else %} {% else %}
{{ wizard.form }} {{ wizard.form }}
{% endif %} {% endif %}
</table> </table>
{% if wizard.steps.prev %} {% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}"> "first step" </button> <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}"> "first step" </button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}"> "prev step"</button> <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}"> "prev step"</button>
{% endif %} {% endif %}
<input type="submit" value= "submit"/> <input type="submit" value= "submit"/>
</form> </form>
{% endblock %} {% endblock %}

@ -246,7 +246,6 @@ def pre_save_handler(sender, **kwargs):
if not obj.url: if not obj.url:
obj.url = ''.join([random.choice(string.ascii_lowercase) for n in xrange(8)]) obj.url = ''.join([random.choice(string.ascii_lowercase) for n in xrange(8)])
pre_save.connect(pre_save_handler, sender=Theme)
pre_save.connect(pre_save_handler, sender=Tag) pre_save.connect(pre_save_handler, sender=Tag)
post_save.connect(post_save_handler, sender=Theme) post_save.connect(post_save_handler, sender=Theme)

@ -1,65 +1,75 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
from theme.models import Theme, Tag from theme.models import Theme
from place_exposition.models import PlaceExposition from place_exposition.models import PlaceExposition
from city.models import City from country.models import Country
from country.models import Country from multiupload.fields import MultiFileField, MultiFileInput
choices = ((0, ''), (1.0, u'Ежегодно'), (2.0, u'2 раза в год'), (3.0, u'3 раза в год'), (4.0, u'4 раза в год'),
(5.0, u'5 раз в год'), (0.5, u'Раз в 2 года'), ( choices = ((0, ''), (1.0, u'Ежегодно'), (2.0, u'2 раза в год'), (3.0, u'3 раза в год'), (4.0, u'4 раза в год'),
0.33, u'Раз в 3 года'), (0.25, u'Раз в 4 года')) (5.0, u'5 раз в год'), (0.5, u'Раз в 2 года'), (
0.33, u'Раз в 3 года'), (0.25, u'Раз в 4 года'))
class ExpoForm1(forms.Form): places = [(item.id, item.name) for item in PlaceExposition.objects.language().all()]
""" places.insert(0,('', 'Не выбрано'))
main information about exposition
"""
theme = forms.ModelChoiceField(queryset=Theme.objects.filter(id=50)) class ExpoForm1(forms.Form):
tag = forms.ModelChoiceField(queryset=Tag.objects.filter(id=50)) """
name = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Введите название выставки"})) main information about exposition
main_title = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Краткое описание выставки (необязательно)"})) """
description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Полное описание выставки", 'cols':30, 'rows':10})) name = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Введите название выставки"}))
date_start = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateFrom', 'placeholder':'дд.мм.гг'})) main_title = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Краткое описание выставки (необязательно)"}))
date_end = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateTo','placeholder':'дд.мм.гг'})) description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Полное описание выставки", 'cols':30, 'rows':10}))
country = forms.ModelChoiceField(queryset=Country.objects.filter(id=50)) date_start = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateFrom', 'placeholder':'дд.мм.гг'}))
city = forms.ModelChoiceField(queryset=City.objects.language('ru').filter(id=900052419)) date_end = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateTo','placeholder':'дд.мм.гг'}))
place = forms.ModelChoiceField(queryset=PlaceExposition.objects.filter(id=50))
audience1 = forms.BooleanField(required=False) country = forms.ChoiceField(label=u'Страна', choices=[(c.id, c.name) for c in Country.objects.all()], widget=forms.Select(attrs={'id':'id_country'}))
audience2 = forms.BooleanField(required=False) theme = forms.MultipleChoiceField(label='Тематики', choices=[(item.id, item.name) for item in Theme.objects.language().all()], widget=forms.SelectMultiple(attrs={'id':'id_theme'}))
audience3 = forms.BooleanField(required=False) place = forms.ChoiceField(label=u'Место проведения', required=False, choices=places, widget=forms.Select(attrs={'id':'id_place'}))
periodic = forms.ChoiceField(choices=choices) city = forms.CharField(label=u'Город', widget=forms.HiddenInput(attrs={'id':'id_city'}))
membership1= forms.BooleanField(required=False) tag = forms.CharField(label=u'Теги', widget=forms.HiddenInput(attrs={'id':'id_tag'}), required=False)
membership2= forms.BooleanField(required=False)
membership3= forms.BooleanField(required=False) audience1 = forms.BooleanField(required=False)
web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"})) audience2 = forms.BooleanField(required=False)
products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10})) audience3 = forms.BooleanField(required=False)
time_start = forms.TimeField() periodic = forms.ChoiceField(choices=choices, required=False)
time_end = forms.TimeField() membership1 = forms.BooleanField(required=False)
logo = forms.ImageField(widget=forms.FileInput(attrs={'class':"button big icon-clip"}), required=False) membership2 = forms.BooleanField(required=False)
membership3 = forms.BooleanField(required=False)
web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"}))
class ExpoForm2(forms.Form): products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10}))
""" time_start = forms.TimeField()
statistics time_end = forms.TimeField()
""" logo = forms.ImageField(widget=forms.FileInput(attrs={'class':"button big icon-clip"}), required=False)
found_year = forms.IntegerField()
statistic_year = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'введите год'}))
visitors = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'количество посетителей'})) class ExpoForm2(forms.Form):
partisipants = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'количество учасников'})) """
square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'площадь'})) statistics
countries = forms.ModelChoiceField(queryset=Country.objects.filter(id=50)) """
found_year = forms.IntegerField()
# ticket price # ticket price
pre_one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'})) pre_one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'}))
pre_all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'})) pre_all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'}))
one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'})) one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'}))
all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'})) all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'}))
# rent price # rent price
equiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'оборудованная площадь'})) equiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'оборудованная площадь'}))
unequiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'необорудованная площадь'})) unequiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'необорудованная площадь'}))
open_square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'открытая площадь'})) open_square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'открытая площадь'}))
min_square = forms.FloatField() min_square = forms.FloatField()
registration_depos = forms.FloatField() registration_depos = forms.FloatField()
deadline_date = forms.DateField(widget=forms.TextInput(attrs={'placeholder':'дд.мм.гг'})) deadline_date = forms.DateField(widget=forms.TextInput(attrs={'placeholder':'дд.мм.гг'}))
class ExpoForm3(forms.Form):
"""
photos from last expositions
"""
attachments = MultiFileField(min_num=0, max_num=6, max_file_size=1024*1024*5, widget=MultiFileInput(
attrs={'class':'button big icon-camera', 'value': u'выберите фотографии', 'id': 'files'}
))

@ -1,3 +0,0 @@
from django.db import models
# Create your models here.

@ -1,8 +1,7 @@
from django.conf.urls import patterns from django.conf.urls import patterns, url
from .views import ExpoWizard
from wizard.forms import ExpoForm1, ExpoForm2 from .forms import ExpoForm1, ExpoForm2,ExpoForm3
from wizard.views import ExpoWizard
formlist = [ExpoForm1,ExpoForm2, ExpoForm3]
urlpatterns = patterns('',
(r'^$', ExpoWizard.as_view([ExpoForm1, ExpoForm2])) urlpatterns = patterns('', url(r'^$', ExpoWizard.as_view(formlist), name = 'add_exposition'))
)

@ -1,64 +1,125 @@
from django.shortcuts import render_to_response
from django.contrib.formtools.wizard.views import SessionWizardView from django.contrib.formtools.wizard.views import SessionWizardView
from django.core.files.storage import default_storage, FileSystemStorage from django.core.files.storage import FileSystemStorage
from django.http import HttpResponseRedirect, HttpResponseForbidden
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.core.exceptions import PermissionDenied
import os import os
from proj import settings from photologue.models import Photo
from wizard import forms from exposition.models import Exposition
from exposition.models import Exposition, Statistic
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
from accounts.models import User
from country.models import Country
from city.models import City
from place_exposition.models import PlaceExposition
from theme.models import Tag, Theme
class LoginRequiredMixin(object):
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
if not request.user.organiser:
raise PermissionDenied
return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
# defining different template for every form # defining different template for every form
TEMPLATES = {'0':'client/wizard/first_step.html', '1':'client/wizard/second_step.html'} TEMPLATES = {
'0': 'client/wizard/first_step.html',
'1': 'client/wizard/second_step.html',
'2': 'client/wizard/third_step.html'
}
class ExpoWizard(LoginRequiredMixin, SessionWizardView):
"""main view that handle all data from 3 forms(steps) and finally create an Exposition"""
class ExpoWizard(SessionWizardView): # storing temporary files during upload
location=os.path.join(settings.MEDIA_ROOT, 'temp', 'files') location = os.path.join(settings.MEDIA_ROOT, 'temp')
file_storage = FileSystemStorage(location, settings.MEDIA_URL) file_storage = FileSystemStorage(location, settings.MEDIA_URL)
SUCCESS_URL = "/"
def get_template_names(self):
return [TEMPLATES[self.steps.current]]
def done(self, form_list, **kwargs): def done(self, form_list, **kwargs):
upload_file = form_list[0].cleaned_data['logo'] # getting data and files
upload_logo = form_list[0].cleaned_data.get('logo')
upload_images = self.request.FILES.getlist(u'2-attachments')
data = self.get_all_cleaned_data() data = self.get_all_cleaned_data()
expo = Exposition.objects.language('ru').create(
name = data.get('name'), # creating new exposition
data_begin = data.get('date_start'), lang = self.request.LANGUAGE_CODE
data_end = data.get('date_end'), expo = Exposition.objects.language(lang).create(
main_title = data.get('main_title'), name=data.get('name'),
description = data.get('description'), data_begin=data.get('date_start'),
products = data.get('products'), data_end=data.get('date_end'),
country = data.get('country', 1), main_title=data.get('main_title'),
city = data.get('city', 1), description=data.get('description'),
place = data.get('place', 1), products=data.get('products'),
periodic = data.get('periodic'),
web_page = data.get('web_site'), country=Country.objects.language(lang).get(id=data.get('country')),
logo = data.get('logo'), city=City.objects.language(lang).get(id=data.get('city')),
place=PlaceExposition.objects.language(lang).get(id=data.get('place')),
foundation_year = data.get('found_year'),
area = data.get('square'), periodic=data.get('periodic'),
price_day = '%i %s'%(data.get('one_day'), self.request.POST['oneDayCurrency1']), web_page=data.get('web_site'),
price_all = '%i %s'%(data.get('all_days'), self.request.POST['allDaysCurrency1']), logo=data.get('logo'),
price_day_bar = '%i %s'%(data.get('pre_one_day'),self.request.POST['oneDayCurrency1']),
price_all_bar = '%i %s'%(data.get('pre_all_days'),self.request.POST['allDaysCurrency1']), foundation_year=data.get('found_year'),
area=data.get('square'),
min_area = data.get('min_square'), price_day=data.get('one_day'),
registration_payment = data.get('registration_depos'), price_all=data.get('all_days'),
application_deadline = data.get('deadline_date'), price_day_bar=data.get('pre_one_day'),
min_closed_area = data.get('unequiped'), price_all_bar=data.get('pre_all_days'),
min_open_area = data.get('open_square'),
min_closed_equipped_area = data.get('equiped'), min_area=data.get('min_square'),
url = translit_with_separator(data.get('name')), registration_payment=data.get('registration_depos'),
quality_label= 0, application_deadline=data.get('deadline_date'),
audience = 0 min_closed_area=data.get('unequiped'),
min_open_area=data.get('open_square'),
min_closed_equipped_area=data.get('equiped'),
url=translit_with_separator(data.get('name')),
quality_label=0,
audience=0,
creator=User.objects.get(id=self.request.user.id)
) )
expo.tag = [data.get('tag')] # adding photo to gallery
expo.theme = [data.get('theme')] photos = []
for i, photo in enumerate(upload_images):
photos.append(Photo.objects.language(self.request.LANGUAGE_CODE).create(
image=photo,
title=data.get(u'pdescr_%i' % i, photo.name))
)
for photo in photos:
expo.upload_photo(photo)
expo.tag = Tag.objects.language(lang).filter(id__in=data.get('tag').split(','))
expo.theme = Theme.objects.language(lang).filter(id__in=data.get('theme'))
# setting bit fields audience and quality_label
self.set_flags(expo, data)
expo.save()
# remove temporary files if it has any
if upload_logo:
self.file_storage.delete(upload_logo.name)
if upload_images:
for f in upload_images:
self.file_storage.delete(f.name)
return HttpResponseRedirect(self.SUCCESS_URL)
@staticmethod
def set_flags(expo, data):
if data['membership1']: if data['membership1']:
expo.quality_label = (expo.quality_label| Exposition.quality_label.exporating) expo.quality_label = (expo.quality_label | Exposition.quality_label.exporating)
if data['membership2']: if data['membership2']:
expo.quality_label = (expo.quality_label| Exposition.quality_label.rsva) expo.quality_label = (expo.quality_label | Exposition.quality_label.rsva)
if data['membership3']: if data['membership3']:
expo.quality_label = (expo.quality_label| Exposition.quality_label.ufi) expo.quality_label = (expo.quality_label | Exposition.quality_label.ufi)
if data['audience1']: if data['audience1']:
expo.audience = (expo.audience | Exposition.audience.experts) expo.audience = (expo.audience | Exposition.audience.experts)
@ -67,23 +128,4 @@ class ExpoWizard(SessionWizardView):
if data['audience3']: if data['audience3']:
expo.audience = expo.audience | (getattr(Exposition.audience, 'general public')) expo.audience = expo.audience | (getattr(Exposition.audience, 'general public'))
expo.save()
Statistic.objects.language().create(
exposition = expo,
year = data.get('statistic_year'),
visitors = data.get('visitors'),
members = data.get('partisipants'),
countries = data.get('countries'),
area = data.get('square')
)
if upload_file:
self.file_storage.delete(upload_file.name)
return render_to_response('done.html', {
'form_data': [form.cleaned_data for form in form_list],
})
def get_template_names(self):
return [TEMPLATES[self.steps.current]]

Loading…
Cancel
Save