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

remotes/origin/1203
Nazar Kotjuk 10 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 forms import UserForm, UserCreationForm, ChangePasswordForm, EmailAnnouncementForm, UserFilterForm
#custom views
from functions.admin_views import AdminView, AdminListView
from django.views.generic import UpdateView
from functions.admin_views import AdminView, AdminListView, paginate_results
class UserListView(AdminListView):
template_name = 'admin/accounts/user_list.html'
form_class = UserFilterForm
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):
model = User

@ -144,6 +144,9 @@ class User(AbstractBaseUser, PermissionsMixin):
class Meta:
ordering=['-rating']
def is_organiser(self):
return bool(self.organiser)
def get_full_name(self):
"""
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 views import NewPage, PageList, EditPage, DeletePage, PageDetailed
urlpatterns = patterns('',
url(r'^new/$', NewPage.as_view(), name='new_page' ),
url(r'^all/$', PageList.as_view(), name = 'page_list'),
url(r'^edit/(?P<url>.*)/$', EditPage.as_view(), name='edit_page'),
url(r'^delete/(?P<url>.*)/$', DeletePage.as_view(), name='delete_page'),
url(r'^(?P<url>.*)/$', PageDetailed.as_view(), name='page_view'),
)
from django.conf.urls import url, patterns
from views import NewPage, PageList, EditPage, DeletePage, PageDetailed
urlpatterns = patterns('',
url(r'^new/$', NewPage.as_view(), name='new_page' ),
url(r'^all/$', PageList.as_view(), name = 'page_list'),
url(r'^edit/(?P<url>.*)/$', EditPage.as_view(), name='edit_page'),
url(r'^delete/(?P<url>.*)/$', DeletePage.as_view(), name='delete_page'),
url(r'^(?P<url>.*)/$', PageDetailed.as_view(), name='page_view'),
)

@ -61,21 +61,12 @@ class PageForm(TranslatableModelForm):
class Meta:
model = Page
fields = ['url','title','h1','descriptions','keywords', 'body' ]
fields = ['url','title','h1','descriptions','keywords', 'body']
widgets = {
'body':CKEditorWidget,
'keywords':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 exposition.models import Exposition
from settings.models import create_transl_fields
import copy
from theme.models import Theme
from country.models import Country
from city.models import City
@ -114,24 +114,39 @@ class Page(TranslatableModel):
def get_absolute_url(self):
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):
super(Page,self).save(*args, **kwargs)
all_field_names = list(self._translated_field_names)
clear_f_n = []
for field_name in all_field_names:
if field_name not in ['master', 'master_id',u'id', 'language_code']:
clear_f_n.append(field_name)
field_items = {field_name:getattr(self, field_name) for field_name in clear_f_n}
langs = [lan[0] for lan in settings.LANGUAGES]
for lang in langs:
if lang not in self.get_available_languages():
self.translate(lang)
for field in clear_f_n:
setattr(self, field, field_items.get(field, ''))
obj = super(Page,self).save(*args, **kwargs)
return obj
self.initial_language = '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(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):
return self.url

@ -2,10 +2,6 @@
import xlwt
import datetime
from exposition.models import Exposition
from conference.models import Conference
from django.core.exceptions import ObjectDoesNotExist
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 attr
def queryset_to_workbook(queryset, columns, header_style=None, default_style=None, cell_style_map=None):
workbook = xlwt.Workbook()
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.insert_bitmap('')
if not 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]
for y, column in enumerate(columns):
header_list=[u'Название события',u'Страна',u'Город',u'Место проведения', u'Дата начала', u'Дата окончания']
sheet.write(0, y, header_list[y], header_style)
for i, column in enumerate(columns):
header_list=[u'#', u'Название события',u'Даты',u'Краткое описание',u'Место проведения', u'Заметка', u'Ссылка на событие']
sheet.write(0, i, header_list[i], header_style)
for x, obj in enumerate(queryset, start=1):
for y, column in enumerate(columns):
value = get_column_cell(obj, column)
value = getattr(obj, column)
style = default_style
for value_type, cell_style in cell_style_map:
if isinstance(value, value_type):

@ -1,5 +1,4 @@
# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from country.models import Country
from city.models import City
from place_exposition.models import PlaceExposition
@ -218,11 +217,14 @@ class PageList(ListView):
template_name = 'page_admin_list.html'
model = Page
order = 'created'
from django import forms
from django.http import HttpResponseRedirect
class EditPage(UpdateView):
model = Page
template_name = 'new_page.html'
template_name = 'admin/page/new_page.html'
form_class = PageForm
slug_url_kwarg = 'url'
slug_field = 'url'
@ -233,7 +235,8 @@ class EditPage(UpdateView):
return context
def get_success_url(self):
return HttpResponseRedirect('/admin/page/all/')
return reverse_lazy('page_list')
class DeletePage(DeleteView):
template_name = 'admin/page/page_confirm_delete.html'
@ -244,39 +247,47 @@ class DeletePage(DeleteView):
class PageDetailed(DetailView):
model = Page
template_name = 'client/base_catalog.html'
template_name = 'admin/page/page_template_view.html'
slug_field = 'url'
slug_url_kwarg = 'url'
# ------------ XLS Export ----------------
from django.http import HttpResponse
from django.utils.translation import get_language
from .utils import queryset_to_workbook
from exposition.models import Exposition
from conference.models import Conference
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 = []
for obj in data:
if obj[1] == 'expo':
qs.append(Exposition.objects.get(id=obj[0]))
if obj[1] == 'conf':
qs.append(Conference.objects.get(id=obj[0]))
qs.append(Exposition.objects.language(lang).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 = (
'number',
'name',
'country.name',
'city.name',
'place.name',
'data_begin',
'data_end')
'dates',
'main_title',
'full_place',
'participation_note',
'link')
workbook = queryset_to_workbook(qs, columns)
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)
return response

@ -3,6 +3,7 @@ from django.views.generic import TemplateView, CreateView, ListView, UpdateView,
from django.conf import settings
from django.http import HttpResponseRedirect
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.forms import UrlCreateForm, BannerCreateGroupForm, BannerCreateForm, BannerGroupUpdateForm,\
PaidCreateForm, PaidUpdateForm, TopCreateForm, BannerLinkCreateForm, MainCreateForm, MainUpdateForm, TopUpdateForm
@ -32,6 +33,7 @@ class CreateBanner(AbstractCreate):
model = Banner
form_class = BannerCreateForm
class CreateLink(AbstractCreate):
model = Banner
form_class = BannerLinkCreateForm
@ -67,6 +69,7 @@ class BannerList(AbstractList):
qs = qs.filter(group__isnull=False)
return qs
class LinkList(AbstractList):
model = Banner
verbose = u'Список ссылок'
@ -114,7 +117,10 @@ class PaidList(ListView):
paginate_by = settings.ADMIN_PAGINATION
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):
@ -162,6 +168,18 @@ class PaidStat(DetailView):
model = Paid
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):
model = Exposition
@ -169,7 +187,10 @@ class MainList(ListView):
paginate_by = settings.ADMIN_PAGINATION
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):
@ -202,6 +223,7 @@ def main_turn(request, pk, status):
return HttpResponseRedirect('/admin/expobanners/main/list/')
class MainStat(DetailView):
model = MainPage
template_name = 'admin/expobanner/main_stat.html'
@ -210,10 +232,16 @@ class MainStat(DetailView):
context = super(MainStat, self).get_context_data(**kwargs)
obj = self.object
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
# ------------------------------------
from datetime import date
class TopList(ListView):
model = Exposition
@ -221,7 +249,10 @@ class TopList(ListView):
paginate_by = settings.ADMIN_PAGINATION
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):
@ -241,4 +272,4 @@ class TopUpdate(UpdateView):
context = super(TopUpdate, self).get_context_data(**kwargs)
obj = self.object
context['exposition'] = obj.get_event()
return context
return context

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

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

@ -1,323 +1,328 @@
# -*- coding: utf-8 -*-
import random
import hashlib
from datetime import datetime, date
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from django.contrib.sites.models import Site
from django.db.models.signals import post_save
from .managers import BiasedManager, BannerGroupCached, URLCached, TopCached
from .mixins import StatMixin
from theme.models import Theme
from country.models import Country
class URL(models.Model):
title = models.CharField(verbose_name=u'Заголовок', max_length=256)
url = models.CharField(verbose_name=u'URL or URL RegEx', max_length=2048)
regex = models.BooleanField(verbose_name=u'RegEx', default=False)
sites = models.ManyToManyField(Site, related_name='site_urls', verbose_name=_('Sites'), null=True, blank=True)
public = models.BooleanField(verbose_name=u'Активный', default=True)
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
objects = models.Manager()
cached = URLCached()
def __unicode__(self):
return self.title
class Meta:
ordering = ['-created_at']
verbose_name = _('URL')
verbose_name_plural = _('URLs')
def get_admin_url(self):
return '/admin/expobanners/banners/url/%d/edit/'%self.id
class BannerGroup (models.Model):
name = models.CharField(verbose_name=u'Имя', max_length=255)
slug = models.SlugField(verbose_name=u'URL', unique=True)
width = models.PositiveSmallIntegerField(verbose_name=u'Ширина', default=0)
height = models.PositiveSmallIntegerField(verbose_name=u'Высота', default=0)
speed = models.PositiveSmallIntegerField(verbose_name=u'Скорость отображения', default=2000)
public = models.BooleanField(verbose_name=u'Активная', default=True)
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
objects = models.Manager()
cached = BannerGroupCached()
def size(self):
return '%sx%s' % (self.width, self.height)
def __unicode__(self):
return '%s - [%s x %s]' % (self.name, self.width, self.height)
class Meta:
ordering = ['name']
verbose_name = _('Banner Group')
verbose_name_plural = _('Banner Groups')
def get_admin_url(self):
return '/admin/expobanners/banners/group/%d/edit/'%self.id
class Banner(models.Model, StatMixin):
objects = BiasedManager()
title = models.CharField(verbose_name=u'Заголовок', max_length=255, blank=True)
alt = models.CharField(verbose_name=_('Alt'), max_length=255)
text = models.TextField(verbose_name=u'Текст', 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)
fr = models.DateField(default=date.today())
to = models.DateField(blank=True, null=True)
theme = models.ManyToManyField(Theme, 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)
group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=u'Место', null=True, blank=True)
often = models.PositiveSmallIntegerField(
verbose_name=_('Often'),
help_text=_('A ten will display 10 times more often that a one.'),
choices=[[i, i] for i in range(11)],
default=1
)
urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True)
html = models.BooleanField(verbose_name=_('HTML?'), default=False)
flash = models.BooleanField(verbose_name=_('Flash?'), default=False)
popup = models.BooleanField(verbose_name=_('Popup?'), default=False)
paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False)
link = models.BooleanField(verbose_name=_('Is simple link?'), default=False)
# for detecting popups
cookie = models.CharField(max_length=30, blank=True, null=True, default=settings.DEFAULT_POPUP_COOKIE)
public = models.BooleanField(verbose_name=u'Активный', default=True)
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
stat_pswd = models.CharField(max_length=16)
class Meta:
ordering = ['-public']
def get_admin_url(self):
return '/admin/expobanners/banners/banner/%d/edit/'%self.id
def key(slef):
if hasattr(settings, 'SECRET_KEY'):
key = str(datetime.now()) + settings.SECRET_KEY
else:
key = str(datetime.now())
return hashlib.md5(key).hexdigest()
def log(self, request, type):
log = {
'type': type,
'banner': self,
'group': self.group,
'ip': request.META.get('REMOTE_ADDR'),
'user_agent': request.META.get('HTTP_USER_AGENT'),
'page': request.META.get('HTTP_REFERER'),
}
if request.user.is_authenticated():
log['user'] = request.user
return Log.objects.create(**log)
@models.permalink
def image(self):
return ('banner_view', (), {'banner_id': self.pk, 'key': self.key()})
def impressions(self):
return Log.objects.filter(banner=self.pk, type=0).count()
def views(self):
return Log.objects.filter(banner=self.pk, type=1).count()
def clicks(self):
return Log.objects.filter(banner=self.pk, type=2).count()
def __unicode__(self):
return self.title or self.alt
def get_absolute_url(self):
if self.url == '#':
return self.url
else:
@models.permalink
def get_absolute_url(self):
return ('banner_click', (), {'banner_id': self.pk, 'key': self.key()})
return get_absolute_url(self)
def get_click_link(self):
return '/expo-b/click/%d/'%self.id
class Meta:
ordering = ['sort']
verbose_name = _('Banner')
verbose_name_plural = _('Banners')
class Log(models.Model):
banner = models.ForeignKey(Banner, related_name='banner_logs')
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)
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)
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)
page = models.URLField(verbose_name=_('Page'), null=True, blank=True)
key = models.CharField(verbose_name=_('User Agent'), max_length=32, null=True, blank=True)
TYPE_CHOICES = (
(0, 'impressions'),
(1, 'view'),
(2, 'click')
)
type = models.PositiveSmallIntegerField(verbose_name=_('Type'), max_length=1, default=0, choices=TYPE_CHOICES)
def __unicode__(self):
return '%s - (%s)' % (self.banner, self.datetime)
class LogStat(models.Model):
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)
urls = models.ManyToManyField(URL, related_name='url_bloks', verbose_name=_('URLs'), null=True, blank=True)
date = models.DateField(verbose_name=_('Data'))
view = models.PositiveIntegerField(verbose_name=_('Views'))
click = models.PositiveIntegerField(verbose_name=_('Clicks'))
unique_click = models.PositiveIntegerField(verbose_name=_('Unique Views'), blank=True, null=True)
unique_view = models.PositiveIntegerField(verbose_name=_('Unique Clicks'))
def __unicode__(self):
return '%s - (%s)' % (self.banner, self.date)
# ------------------
class Paid(models.Model, StatMixin):
tickets = models.ForeignKey(Banner, related_name='paid_tickets')
participation = models.ForeignKey(Banner, related_name='paid_participation')
official = models.ForeignKey(Banner, related_name='paid_official')
catalog = models.ForeignKey(Banner, related_name='paid_catalog')
logo = models.ImageField(upload_to='expo-b/paid', blank=True)
organiser = models.CharField(max_length=100, blank=True)
public = models.BooleanField(default=True, verbose_name=u'Активная')
stat_pswd = models.CharField(max_length=16)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-public']
def get_event(self):
try:
return self.exposition_set.all()[0]
except IndexError:
return None
class PaidStat(models.Model):
paid = models.ForeignKey(Paid)
date = models.DateField(verbose_name=_('Date'))
page_views = models.PositiveIntegerField(default=0)
price_views = models.PositiveIntegerField(default=0)
catalog_views = models.PositiveIntegerField(default=0)
catalog_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)
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа')
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'Исключить теги')
country = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=u'Страны')
excluded_cities = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=u'Исключить города')
fr = models.DateField(default=date.today(), verbose_name=u'Начало')
to = models.DateField(blank=True, null=True, verbose_name=u'Конец')
stat_pswd = models.CharField(max_length=16)
objects = models.Manager()
cached = TopCached()
class Meta:
ordering = ['position']
def get_event(self):
try:
return self.exposition_set.all()[0]
except IndexError:
return None
class TopStat(models.Model):
date = models.DateField()
theme = models.ForeignKey('theme.Theme', blank=True, null=True)
tag = models.ForeignKey('theme.Tag', blank=True, null=True)
country = models.ForeignKey('country.Country', blank=True, null=True)
city = models.ForeignKey('city.City', blank=True, null=True)
views = models.PositiveIntegerField(default=0)
clicks = models.PositiveIntegerField(default=0)
class MainPage(models.Model, StatMixin):
link = models.ForeignKey(Banner)
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция')
public = models.BooleanField(default=True, verbose_name=u'Активная')
stat_pswd = models.CharField(max_length=16)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-public']
def get_event(self):
try:
return self.exposition_set.all()[0]
except IndexError:
return None
def generatePassword(length=5):
"""
generate random password
"""
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',
'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
newPassword = []
for i in range(PASSWORD_LENGTH):
newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))])
return ''.join(newPassword)
def generate_stat_pass(sender, **kwargs):
obj = kwargs['instance']
if not obj.stat_pswd:
obj.stat_pswd = generatePassword()
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)
# -*- coding: utf-8 -*-
import random
import hashlib
from datetime import datetime, date
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from django.contrib.sites.models import Site
from django.db.models.signals import post_save
from .managers import BiasedManager, BannerGroupCached, URLCached, TopCached
from .mixins import StatMixin
from theme.models import Theme
from country.models import Country
class URL(models.Model):
title = models.CharField(verbose_name=u'Заголовок', max_length=256)
url = models.CharField(verbose_name=u'URL or URL RegEx', max_length=2048)
regex = models.BooleanField(verbose_name=u'RegEx', default=False)
sites = models.ManyToManyField(Site, related_name='site_urls', verbose_name=_('Sites'), null=True, blank=True)
public = models.BooleanField(verbose_name=u'Активный', default=True)
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
objects = models.Manager()
cached = URLCached()
def __unicode__(self):
return self.title
class Meta:
ordering = ['-created_at']
verbose_name = _('URL')
verbose_name_plural = _('URLs')
def get_admin_url(self):
return '/admin/expobanners/banners/url/%d/edit/'%self.id
class BannerGroup (models.Model):
name = models.CharField(verbose_name=u'Имя', max_length=255)
slug = models.SlugField(verbose_name=u'URL', unique=True)
width = models.PositiveSmallIntegerField(verbose_name=u'Ширина', default=0)
height = models.PositiveSmallIntegerField(verbose_name=u'Высота', default=0)
speed = models.PositiveSmallIntegerField(verbose_name=u'Скорость отображения', default=2000)
public = models.BooleanField(verbose_name=u'Активная', default=True)
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
objects = models.Manager()
cached = BannerGroupCached()
def size(self):
return '%sx%s' % (self.width, self.height)
def __unicode__(self):
return '%s - [%s x %s]' % (self.name, self.width, self.height)
class Meta:
ordering = ['name']
verbose_name = _('Banner Group')
verbose_name_plural = _('Banner Groups')
def get_admin_url(self):
return '/admin/expobanners/banners/group/%d/edit/'%self.id
class Banner(models.Model, StatMixin):
objects = BiasedManager()
title = models.CharField(verbose_name=u'Заголовок', max_length=255, blank=True)
alt = models.CharField(verbose_name=_('Alt'), max_length=255)
text = models.TextField(verbose_name=u'Текст', 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)
fr = models.DateField(default=date.today())
to = models.DateField(blank=True, null=True)
theme = models.ManyToManyField(Theme, 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)
group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=u'Место', null=True, blank=True)
often = models.PositiveSmallIntegerField(
verbose_name=_('Often'),
help_text=_('A ten will display 10 times more often that a one.'),
choices=[[i, i] for i in range(11)],
default=1
)
urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True)
html = models.BooleanField(verbose_name=_('HTML?'), default=False)
flash = models.BooleanField(verbose_name=_('Flash?'), default=False)
popup = models.BooleanField(verbose_name=_('Popup?'), default=False)
paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False)
link = models.BooleanField(verbose_name=_('Is simple link?'), default=False)
# for detecting popups
cookie = models.CharField(max_length=30, blank=True, null=True, default=settings.DEFAULT_POPUP_COOKIE)
public = models.BooleanField(verbose_name=u'Активный', default=True)
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
stat_pswd = models.CharField(max_length=16)
class Meta:
ordering = ['-public']
def get_admin_url(self):
return '/admin/expobanners/banners/banner/%d/edit/'%self.id
def key(slef):
if hasattr(settings, 'SECRET_KEY'):
key = str(datetime.now()) + settings.SECRET_KEY
else:
key = str(datetime.now())
return hashlib.md5(key).hexdigest()
def log(self, request, type):
log = {
'type': type,
'banner': self,
'group': self.group,
'ip': request.META.get('REMOTE_ADDR'),
'user_agent': request.META.get('HTTP_USER_AGENT'),
'page': request.META.get('HTTP_REFERER'),
}
if request.user.is_authenticated():
log['user'] = request.user
return Log.objects.create(**log)
@models.permalink
def image(self):
return ('banner_view', (), {'banner_id': self.pk, 'key': self.key()})
def impressions(self):
return Log.objects.filter(banner=self.pk, type=0).count()
def views(self):
return Log.objects.filter(banner=self.pk, type=1).count()
def clicks(self):
return Log.objects.filter(banner=self.pk, type=2).count()
def __unicode__(self):
return self.title or self.alt
def get_absolute_url(self):
if self.url == '#':
return self.url
else:
@models.permalink
def get_absolute_url(self):
return ('banner_click', (), {'banner_id': self.pk, 'key': self.key()})
return get_absolute_url(self)
def get_click_link(self):
return '/expo-b/click/%d/'%self.id
class Meta:
ordering = ['sort']
verbose_name = _('Banner')
verbose_name_plural = _('Banners')
class Log(models.Model):
banner = models.ForeignKey(Banner, related_name='banner_logs')
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)
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)
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)
page = models.URLField(verbose_name=_('Page'), null=True, blank=True)
key = models.CharField(verbose_name=_('User Agent'), max_length=32, null=True, blank=True)
TYPE_CHOICES = (
(0, 'impressions'),
(1, 'view'),
(2, 'click')
)
type = models.PositiveSmallIntegerField(verbose_name=_('Type'), max_length=1, default=0, choices=TYPE_CHOICES)
def __unicode__(self):
return '%s - (%s)' % (self.banner, self.datetime)
class LogStat(models.Model):
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)
urls = models.ManyToManyField(URL, related_name='url_bloks', verbose_name=_('URLs'), null=True, blank=True)
date = models.DateField(verbose_name=_('Data'))
view = models.PositiveIntegerField(verbose_name=_('Views'))
click = models.PositiveIntegerField(verbose_name=_('Clicks'))
unique_click = models.PositiveIntegerField(verbose_name=_('Unique Views'), blank=True, null=True)
unique_view = models.PositiveIntegerField(verbose_name=_('Unique Clicks'))
def __unicode__(self):
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')
official = models.ForeignKey(Banner, related_name='paid_official')
catalog = models.ForeignKey(Banner, related_name='paid_catalog')
logo = models.ImageField(upload_to='expo-b/paid', blank=True)
organiser = models.CharField(max_length=100, blank=True)
public = models.BooleanField(default=True, verbose_name=u'Активная')
stat_pswd = models.CharField(max_length=16)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-public']
def get_event(self):
try:
return self.exposition_set.all()[0]
except IndexError:
return None
class PaidStat(models.Model):
paid = models.ForeignKey(Paid)
date = models.DateField(verbose_name=_('Date'))
page_views = models.PositiveIntegerField(default=0)
price_views = models.PositiveIntegerField(default=0)
catalog_views = models.PositiveIntegerField(default=0)
catalog_clicks = models.PositiveIntegerField(default=0)
tickets_clicks = models.PositiveIntegerField(default=0)
participation_clicks = models.PositiveIntegerField(default=0)
official_clicks = models.PositiveIntegerField(default=0)
class Meta:
ordering = ['-date']
class Top(models.Model, StatMixin):
link = models.ForeignKey(Banner)
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа')
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'Исключить теги')
country = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=u'Страны')
excluded_cities = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=u'Исключить города')
fr = models.DateField(default=date.today(), verbose_name=u'Начало')
to = models.DateField(blank=True, null=True, verbose_name=u'Конец')
stat_pswd = models.CharField(max_length=16)
objects = models.Manager()
cached = TopCached()
class Meta:
ordering = ['position']
def get_event(self):
try:
return self.exposition_set.all()[0]
except IndexError:
return None
class TopStat(models.Model):
date = models.DateField()
theme = models.ForeignKey('theme.Theme', blank=True, null=True)
tag = models.ForeignKey('theme.Tag', blank=True, null=True)
country = models.ForeignKey('country.Country', blank=True, null=True)
city = models.ForeignKey('city.City', blank=True, null=True)
views = models.PositiveIntegerField(default=0)
clicks = models.PositiveIntegerField(default=0)
class MainPage(models.Model, StatMixin):
link = models.ForeignKey(Banner)
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция')
public = models.BooleanField(default=True, verbose_name=u'Активная')
stat_pswd = models.CharField(max_length=16)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-public']
def get_event(self):
try:
return self.exposition_set.all()[0]
except IndexError:
return None
def generatePassword(length=5):
"""
generate random password
"""
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',
'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
newPassword = []
for i in range(PASSWORD_LENGTH):
newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))])
return ''.join(newPassword)
def generate_stat_pass(sender, **kwargs):
obj = kwargs['instance']
if not obj.stat_pswd:
obj.stat_pswd = generatePassword()
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 %}
{% if banners %}
<div class="b-slider m-{{ group.slug }}" id="slider-{{ group.slug }}">
<ul class='b-slider-list'>
{% for banner in banners %}
<li data-url='{{ banner.get_absolute_url }}'
class='
b-slider-item
m-slider-item-{{ forloop.counter }}
{% if forloop.counter == 1 %}
m-slider-current
{% endif %}
'
data-slide='{{ forloop.counter }}'
>
<a href='{{ banner.get_absolute_url }}' class='b-slider-item__link'>
{% 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 }}'>
{% endthumbnail %}
<div class="b-slider-item__info_cover">
<span class='b-slider-item__title'>{{ banner.title|safe }}</span>
<span class='b-slider-item__text'>{{ banner.text|safe }}</span>
</div>
</a>
</li>
{% endfor %}
</ul>
<ul class="b-slider-nav">
{% for banner in banners %}
<li class="b-slider-nav-button
{% if forloop.counter == 1 %}
m-slider-nav-current_button
{% endif %}
" data-slide='{{ forloop.counter }}'>
{{ forloop.counter }}
</li>
{% endfor %}
</ul>
<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>
</div>
<script>
(function() {
$('.m-{{ group.slug }}').bannersSlider({'auto_play': {{ group.speed }}, 'speed': {{ group.speed }}});
})();
</script>
<style>
.m-{{ group.slug }} {
width: {{ group.width }}px;
height: {{ group.height }}px;
}
.m-{{ group.slug }} .b-slider-nav-prev,
.m-{{ group.slug }} .b-slider-nav-next {
line-height: {{ group.height }}px;
}
.m-{{ group.slug }} .b-slider-item,
.m-{{ group.slug }} .b-slider-list {
width: {{ group.width }}px;
height: {{ group.height }}px;
}
</style>
{% load thumbnail %}
{% if banners %}
<div class="b-slider m-{{ group.slug }}" id="slider-{{ group.slug }}">
<ul class='b-slider-list'>
{% for banner in banners %}
<li data-url='{{ banner.get_absolute_url }}'
class='
b-slider-item
m-slider-item-{{ forloop.counter }}
{% if forloop.counter == 1 %}
m-slider-current
{% endif %}
'
data-slide='{{ forloop.counter }}'
>
<a href='{{ banner.get_absolute_url }}' class='b-slider-item__link'>
{% 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 }}'>
{% endthumbnail %}
<div class="b-slider-item__info_cover">
<span class='b-slider-item__title'>{{ banner.title|safe }}</span>
<span class='b-slider-item__text'>{{ banner.text|safe }}</span>
</div>
</a>
</li>
{% endfor %}
</ul>
<ul class="b-slider-nav">
{% for banner in banners %}
<li class="b-slider-nav-button
{% if forloop.counter == 1 %}
m-slider-nav-current_button
{% endif %}
" data-slide='{{ forloop.counter }}'>
{{ forloop.counter }}
</li>
{% endfor %}
</ul>
<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>
</div>
<script>
(function() {
$('.m-{{ group.slug }}').bannersSlider({'auto_play': {{ group.speed }}, 'speed': {{ group.speed }}});
})();
</script>
<style>
.m-{{ group.slug }} {
width: {{ group.width }}px;
height: {{ group.height }}px;
}
.m-{{ group.slug }} .b-slider-nav-prev,
.m-{{ group.slug }} .b-slider-nav-next {
line-height: {{ group.height }}px;
}
.m-{{ group.slug }} .b-slider-item,
.m-{{ group.slug }} .b-slider-list {
width: {{ group.width }}px;
height: {{ group.height }}px;
}
</style>
{% endif %}

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

@ -1,13 +1,13 @@
from django.conf.urls import url
from expobanner.stat_views import *
from . import views
urlpatterns = [
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'^get-banners/$', views.get_banners),
url(r'^get-tops/$', views.get_top),
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'),
]
from django.conf.urls import url
from expobanner.stat_views import *
from . import views
urlpatterns = [
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'^get-banners/$', views.get_banners),
url(r'^get-tops/$', views.get_top),
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'),
]

@ -1,97 +1,97 @@
# -*- coding: utf-8 -*-
import json
import re
from django.http import HttpResponse
from django.shortcuts import redirect, get_object_or_404
from django.shortcuts import render_to_response
from django.template import RequestContext
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
def click(request, banner_id):
banner = get_object_or_404(Banner, pk=banner_id)
banner.log(request, 2)
return redirect(banner.url)
def view(request, banner_id):
banner = get_object_or_404(Banner, pk=banner_id)
banner.log(request, 1)
return redirect(banner.img.url)
def get_banners(request):
url = get_referer_view(request, default='/')
# get urls by current url
urls = URL.cached.all()
good_urls = []
for u in urls:
if u.regex:
url_re = re.compile(u.url)
if url_re.findall(url):
good_urls.append(u)
elif url == u.url:
good_urls.append(u)
# fill parameters dict
params = {'theme': request.GET.getlist('theme', []),
'tag': request.GET.get('tag'),
'country': request.GET.get('country'),
'city': request.GET.get('city'),
'ip': get_client_ip(request)}
group_banners = BannerGroup.cached.group_banners()
result = []
cookie = None
# get banners for all groups
places = request.GET.getlist('places', [])
for group, banners in group_banners.iteritems():
if group not in places:
# on this page there is no such group
continue
banner = get_banner_by_params(banners, good_urls, params, request)
if banner:
if banner.html:
text = banner.text
img = ''
alt = ''
is_img = False
else:
text = ''
try:
img = banner.img.url
except ValueError:
continue
alt = banner.alt
is_img = True
result.append({'id': group,
'url': banner.get_click_link(),
'is_html': banner.html,
'is_flash': banner.flash,
'is_img': is_img,
'is_popup': banner.popup,
'img': img,
'alt': alt,
'text': text
})
if banner.popup:
cookie = banner.cookie
# add view log
banner.log(request, 1)
response = HttpResponse(json.dumps(result, indent=4), content_type='application/json')
if cookie:
response = set_cookie(response, cookie, '1')
return response
def get_top(request):
params = {'theme': request.GET.getlist('theme', []),
'tag': request.GET.get('tag'),
'country': request.GET.get('country'),
'city': request.GET.get('city'),
'catalog': request.GET.get('catalog')}
tops = Top.cached.all()
events = get_top_events(tops, params, request)
context = {'objects': events}
# -*- coding: utf-8 -*-
import json
import re
from django.http import HttpResponse
from django.shortcuts import redirect, get_object_or_404
from django.shortcuts import render_to_response
from django.template import RequestContext
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
def click(request, banner_id):
banner = get_object_or_404(Banner, pk=banner_id)
banner.log(request, 2)
return redirect(banner.url)
def view(request, banner_id):
banner = get_object_or_404(Banner, pk=banner_id)
banner.log(request, 1)
return redirect(banner.img.url)
def get_banners(request):
url = get_referer_view(request, default='/')
# get urls by current url
urls = URL.cached.all()
good_urls = []
for u in urls:
if u.regex:
url_re = re.compile(u.url)
if url_re.findall(url):
good_urls.append(u)
elif url == u.url:
good_urls.append(u)
# fill parameters dict
params = {'theme': request.GET.getlist('theme', []),
'tag': request.GET.get('tag'),
'country': request.GET.get('country'),
'city': request.GET.get('city'),
'ip': get_client_ip(request)}
group_banners = BannerGroup.cached.group_banners()
result = []
cookie = None
# get banners for all groups
places = request.GET.getlist('places', [])
for group, banners in group_banners.iteritems():
if group not in places:
# on this page there is no such group
continue
banner = get_banner_by_params(banners, good_urls, params, request)
if banner:
if banner.html:
text = banner.text
img = ''
alt = ''
is_img = False
else:
text = ''
try:
img = banner.img.url
except ValueError:
continue
alt = banner.alt
is_img = True
result.append({'id': group,
'url': banner.get_click_link(),
'is_html': banner.html,
'is_flash': banner.flash,
'is_img': is_img,
'is_popup': banner.popup,
'img': img,
'alt': alt,
'text': text
})
if banner.popup:
cookie = banner.cookie
# add view log
banner.log(request, 1)
response = HttpResponse(json.dumps(result, indent=4), content_type='application/json')
if cookie:
response = set_cookie(response, cookie, '1')
return response
def get_top(request):
params = {'theme': request.GET.getlist('theme', []),
'tag': request.GET.get('tag'),
'country': request.GET.get('country'),
'city': request.GET.get('city'),
'catalog': request.GET.get('catalog')}
tops = Top.cached.all()
events = get_top_events(tops, params, request)
context = {'objects': events}
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='Дата окончания')
services = BitField(flags=flags)
# 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,
related_name='exposition_country')
city = models.ForeignKey('city.City', verbose_name='Город', on_delete=models.PROTECT,
@ -164,9 +166,6 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
enable = ClientManager()
imports = ExpoImportManager()
def __unicode__(self):
return self.lazy_translation_getter('name', unicode(self.pk))

@ -90,6 +90,7 @@ def paginate_results(qs, page=None):
return result
from hvad.models import TranslatableModel
class AdminListView(FormView):
def get_form(self, form_class):
@ -126,7 +127,10 @@ class AdminListView(FormView):
def get_context_data(self, **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'))
context['object_list'] = result
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 -*-
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.core.context_processors import csrf
from django.http import HttpResponseRedirect
from django.conf import settings
from django.forms.formsets import BaseFormSet, formset_factory
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
# models and forms
from models import MetaSetting
from forms import MetaForm, MetaFilterForm
from functions.admin_views import AdminListView, AdminView
@ -45,7 +39,7 @@ class MetaView(AdminView):
data['keywords_%s' % code] = trans_obj.keywords
data['h1_%s' % code] = trans_obj.h1
form =form_class(initial=data)
form = form_class(initial=data)
return form
else:
return form_class()

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

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

@ -3,9 +3,15 @@ from django.db import models
from django.utils import translation
from django.db.models.signals import post_save
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 pymorphy.django_conf import default_morph as morph
from functions.signal_handlers import post_save_handler
import copy
# additional funcs
MONTHES = {'jan': _(u'январе'), 'feb': _(u'феврале'), 'mar': _(u'марте'), 'apr': _(u'апреле'),
@ -118,62 +124,70 @@ post_save.connect(post_save_handler, sender=MetaSetting)
# 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):
cache_time = 120
def cache_get(self, *args, **kwargs):
url = kwargs.get('url')
lang = kwargs.get('lang')[:2] or translation.get_language()[:2]
key = 'seo_text_cache'
result = cache.get(key)
if result:
return result.get(lang+'_' + url)
return result.get("%s_%s" % (lang, url))
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)
return value_dict.get(lang+'_'+url)
return value_dict.get("%s_%s" % (lang, url))
class SeoText(TranslatableModel):
url = models.CharField(max_length=50, unique=True)
url = models.CharField(max_length=50, unique=True, verbose_name=u"URL: www.expomap.ru")
translations = TranslatedFields(
title=models.CharField(max_length=255),
body=models.TextField()
title=models.CharField(max_length=255, verbose_name=u"Заголовок"),
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()
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):
return reverse_lazy('seo_all')
return self.url
def save(self, *args, **kwargs):
super(SeoText,self).save(*args, **kwargs)
all_field_names = list(self._translated_field_names)
clear_f_n = []
for field_name in all_field_names:
if field_name not in ['master', 'master_id', u'id', 'language_code']:
clear_f_n.append(field_name)
field_items = {field_name:getattr(self, field_name) for field_name in clear_f_n}
langs = [lan[0] for lan in settings.LANGUAGES]
for lang in langs:
if lang not in self.get_available_languages():
self.translate(lang)
for field in clear_f_n:
setattr(self, field, field_items.get(field, ''))
super(SeoText,self).save(*args, **kwargs)
return SeoText
super(SeoText, self).save(*args, **kwargs)
self.initial_language = '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(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):
return self.url

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

@ -34,6 +34,7 @@ urlpatterns = required(
url(r'^settings/', include('settings.admin_urls')),
url(r'^meta/', include('meta.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'^currency/add/', 'directories.admin.currency_add'),

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

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

@ -29,6 +29,8 @@ sitemaps = {
handler404 = 'proj.views.error404'
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'^__debug__/', include(debug_toolbar.urls)),
url(r'^sitemap-(?P<section>.+)\.xml$', views.sitemap, {'sitemaps': sitemaps}),
@ -53,6 +55,7 @@ urlpatterns = patterns('',
url(r'^', include('company.urls')),
url(r'^', include('photoreport.urls')),
url(r'^', include('article.urls')),
url(r'^specialist/', include("specialist_catalog.urls")),
url(r'^country/', include('country.urls')),
url(r'^city/', include('city.urls')),
url(r'^organiser/', include('organiser.urls')),

@ -26,6 +26,7 @@ def clear_slashes(str_):
str_ = str_[:-1]
return str_
def add_seo(request):
url = request.path
lang = get_language()
@ -38,6 +39,7 @@ def add_seo(request):
seo_text = None
return seo_text
def expo_context(request):
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,

@ -4,7 +4,7 @@ from views import ServiceView, CallBackListView, VisitListView, TranslationListV
ParticipationListView, RemoteListView,TicketsListView, Thanks
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/$', 'service.views.advertise'),
url(r'service/(?P<url>.*)/$', ServiceView.as_view()),

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

@ -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 %}
@ -8,7 +8,14 @@
</div>
<div class="box-content">
{% 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">
<thead>
<tr>
@ -36,5 +43,13 @@
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
<script>
var cbox = $("#public");
var form = $("#form");
if(location.search != "")
cbox.attr('checked', true);
cbox.click(function(){
form.submit()
});
</script>
{% endblock %}

@ -1,4 +1,4 @@
{% extends 'base.html' %}
{% extends 'admin/base.html' %}
{% load static %}
{% block scripts %}
<script src="{% static 'js/jquery.dataTables.min.js' %}"></script>
@ -27,6 +27,14 @@
</tr>
</thead>
<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 %}
{% for stat in stats %}
<tr>

@ -8,8 +8,13 @@
</div>
<div class="box-content">
{% block list_table %}
<a class="btn btn-success" href="{% url 'expobanner-create_paid' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a>
<table class="table table-hover">
<a class="btn btn-success" href="{% url 'expobanner-create_paid' %}"><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">
<thead>
<tr>
<th>Выставка</th>
@ -34,5 +39,13 @@
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
<script>
var cbox = $("#public");
var form = $("#form");
if(location.search != "")
cbox.attr('checked', true);
cbox.click(function(){
form.submit()
});
</script>
{% endblock %}

@ -27,6 +27,13 @@
</tr>
</thead>
<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 %}
{% for stat in stats %}
<tr>

@ -9,6 +9,11 @@
<div class="box-content">
{% block list_table %}
<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">
<thead>
<tr>
@ -32,5 +37,13 @@
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
<script>
var cbox = $("#public");
var form = $("#form");
if(location.search != "")
cbox.attr('checked', true);
cbox.click(function(){
form.submit()
});
</script>
{% endblock %}

@ -1,63 +1,79 @@
{% extends 'base.html' %}
{% load static %}
{# Displays article form #}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
{% endblock %}
{% block body %}
{{ request.LANGUAGE_CODE }}
<form method="post" class="form-horizontal" > {% csrf_token %}
<fieldset>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# url/slug #}
<div class="control-group {% if form.url.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.url.label }}:</b></label>
<div class="controls">
{{ form.langs }}
{{ form.url }}
<span class="help-inline">{{ form.url.errors }}</span>
</div>
</div>
{# title #}
<div class="control-group {% if form.title.errors %}error{% endif %}">
<label class="control-label">{{ form.title.label }}:</label>
<div class="controls">
{{ form.title }}
<span class="help-inline">{{ form.title.errors }}</span>
</div>
</div>
{# body #}
<div class="control-group {% if form.body.errors %}error{% endif %}">
<label class="control-label">{{ form.body.label }}:</label>
<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 %}
{% extends 'base.html' %}
{% load static %}
{# Displays article form #}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
{% endblock %}
{% block body %}
{{ request.LANGUAGE_CODE }}
<form method="post" class="form-horizontal" > {% csrf_token %}
<fieldset>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# url/slug #}
<div class="control-group {% if form.url.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.url.label }}:</b></label>
<div class="controls">
{{ form.langs }}
{{ form.url }}<span class="help-inline"></span>
<span class="help-inline">{{ form.url.errors }}</span>
</div>
</div>
{# title #}
<div class="control-group {% if form.title.errors %}error{% endif %}">
<label class="control-label">{{ form.title.label }}:</label>
<div class="controls">
{{ form.title }}
<span class="help-inline">{{ form.title.errors }}</span>
</div>
</div>
{# page title #}
<div class="control-group {% if form.page_title.errors %}error{% endif %}">
<label class="control-label">{{ form.page_title.label }}:</label>
<div class="controls">
{{ form.page_title }}
<span class="help-inline">{{ form.page_title.errors }}</span>
</div>
</div>
{# description #}
<div class="control-group {% if form.description.errors %}error{% endif %}">
<label class="control-label">{{ form.description.label }}:</label>
<div class="controls">
{{ form.description }}
<span class="help-inline">{{ form.description.errors }}</span>
</div>
</div>
{# body #}
<div class="control-group {% if form.body.errors %}error{% endif %}">
<label class="control-label">{{ form.body.label }}:</label>
<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' %}
{% block sidebar %}{% endblock %}
{% block body %}
<form action="" method="post">{% csrf_token %}
<div class="controls">
<p>Вы точно хотите удалить seo-текст "{{ object.title }}" для страницы <a href = "{{ object.url }}"></a> ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'seo_all' %}>Нет</a>
</div>
</form>
{% extends 'base.html' %}
{% block sidebar %}{% endblock %}
{% block body %}
<form action="" method="post">{% csrf_token %}
<div class="controls">
<p>Вы точно хотите удалить seo-текст "{{ object.title }}" для страницы <a href = "{{ object.url }}"></a> ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'seo_all' %}>Нет</a>
</div>
</form>
{% endblock %}

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

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

@ -21,7 +21,7 @@ This template include basic anf main styles and js files,
<html class="no-js"> <!--<![endif]-->
<!--if IE 8><script src="js/selectivizr-min.js"></script><![endif]-->
<head>
{% include 'includes/meta.html' %}
{% include 'client/includes/meta.html' %}
<meta name="cmsmagazine" content="ca270688603566278c9006a1511705b1" />
<meta name="ktoprodvinul" content="7bf9e596b7b6707a" />
<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/jquery-1.10.1.min.js' %}"></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' %}
<script src="{% static 'client/js/_modules/block.common.js' %}"></script>
{% else %}

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

@ -2,7 +2,10 @@
{% load i18n %}
<meta charset="utf-8">
<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.keywords %}{% meta_list 'keywords' meta.keywords %}{% endif %}
{% if meta.title %}<title>{{ meta.title }}</title>{% endif %}

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

@ -1,19 +1,19 @@
{% extends 'client/base_catalog.html' %}
{% load static %}
{% load i18n %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<strong>{{ object.main_title }}</strong>
</div>
{% endblock %}
{% block page_title %}
<h1>{{ object.h1 }}</h1>
{% endblock %}
{% block page_body %}
{{ object.body|safe|striptags}}
{% extends 'client/base_catalog.html' %}
{% load static %}
{% load i18n %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<strong>{{ object.main_title }}</strong>
</div>
{% endblock %}
{% block page_title %}
<h1>{{ object.h1 }}</h1>
{% endblock %}
{% block page_body %}
{{ object.body|safe|striptags}}
{% 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,
self = this,
handler = function (data) {
if (data.success){
if (data.success) {
console.log('ok');
$(self.DOMbutton).addClass('active');
}else{
} else {
console.log('data not send');
}

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

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

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

@ -1,65 +1,75 @@
# -*- coding: utf-8 -*-
from django import forms
from theme.models import Theme, Tag
from place_exposition.models import PlaceExposition
from city.models import City
from country.models import Country
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 года'), (
0.33, u'Раз в 3 года'), (0.25, u'Раз в 4 года'))
class ExpoForm1(forms.Form):
"""
main information about exposition
"""
theme = forms.ModelChoiceField(queryset=Theme.objects.filter(id=50))
tag = forms.ModelChoiceField(queryset=Tag.objects.filter(id=50))
name = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Введите название выставки"}))
main_title = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Краткое описание выставки (необязательно)"}))
description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Полное описание выставки", 'cols':30, 'rows':10}))
date_start = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateFrom', 'placeholder':'дд.мм.гг'}))
date_end = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateTo','placeholder':'дд.мм.гг'}))
country = forms.ModelChoiceField(queryset=Country.objects.filter(id=50))
city = forms.ModelChoiceField(queryset=City.objects.language('ru').filter(id=900052419))
place = forms.ModelChoiceField(queryset=PlaceExposition.objects.filter(id=50))
audience1 = forms.BooleanField(required=False)
audience2 = forms.BooleanField(required=False)
audience3 = forms.BooleanField(required=False)
periodic = forms.ChoiceField(choices=choices)
membership1= forms.BooleanField(required=False)
membership2= forms.BooleanField(required=False)
membership3= forms.BooleanField(required=False)
web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"}))
products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10}))
time_start = forms.TimeField()
time_end = forms.TimeField()
logo = forms.ImageField(widget=forms.FileInput(attrs={'class':"button big icon-clip"}), required=False)
class ExpoForm2(forms.Form):
"""
statistics
"""
found_year = forms.IntegerField()
statistic_year = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'введите год'}))
visitors = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'количество посетителей'}))
partisipants = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'количество учасников'}))
square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'площадь'}))
countries = forms.ModelChoiceField(queryset=Country.objects.filter(id=50))
# ticket price
pre_one_day = 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':'на один день'}))
all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'}))
# rent price
equiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'оборудованная площадь'}))
unequiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'необорудованная площадь'}))
open_square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'открытая площадь'}))
min_square = forms.FloatField()
registration_depos = forms.FloatField()
deadline_date = forms.DateField(widget=forms.TextInput(attrs={'placeholder':'дд.мм.гг'}))
# -*- coding: utf-8 -*-
from django import forms
from theme.models import Theme
from place_exposition.models import PlaceExposition
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 года'), (
0.33, u'Раз в 3 года'), (0.25, u'Раз в 4 года'))
places = [(item.id, item.name) for item in PlaceExposition.objects.language().all()]
places.insert(0,('', 'Не выбрано'))
class ExpoForm1(forms.Form):
"""
main information about exposition
"""
name = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Введите название выставки"}))
main_title = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Краткое описание выставки (необязательно)"}))
description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Полное описание выставки", 'cols':30, 'rows':10}))
date_start = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateFrom', 'placeholder':'дд.мм.гг'}))
date_end = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateTo','placeholder':'дд.мм.гг'}))
country = forms.ChoiceField(label=u'Страна', choices=[(c.id, c.name) for c in Country.objects.all()], widget=forms.Select(attrs={'id':'id_country'}))
theme = forms.MultipleChoiceField(label='Тематики', choices=[(item.id, item.name) for item in Theme.objects.language().all()], widget=forms.SelectMultiple(attrs={'id':'id_theme'}))
place = forms.ChoiceField(label=u'Место проведения', required=False, choices=places, widget=forms.Select(attrs={'id':'id_place'}))
city = forms.CharField(label=u'Город', widget=forms.HiddenInput(attrs={'id':'id_city'}))
tag = forms.CharField(label=u'Теги', widget=forms.HiddenInput(attrs={'id':'id_tag'}), required=False)
audience1 = forms.BooleanField(required=False)
audience2 = forms.BooleanField(required=False)
audience3 = forms.BooleanField(required=False)
periodic = forms.ChoiceField(choices=choices, required=False)
membership1 = forms.BooleanField(required=False)
membership2 = forms.BooleanField(required=False)
membership3 = forms.BooleanField(required=False)
web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"}))
products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10}))
time_start = forms.TimeField()
time_end = forms.TimeField()
logo = forms.ImageField(widget=forms.FileInput(attrs={'class':"button big icon-clip"}), required=False)
class ExpoForm2(forms.Form):
"""
statistics
"""
found_year = forms.IntegerField()
# ticket price
pre_one_day = 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':'на один день'}))
all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'}))
# rent price
equiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'оборудованная площадь'}))
unequiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'необорудованная площадь'}))
open_square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'открытая площадь'}))
min_square = forms.FloatField()
registration_depos = forms.FloatField()
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 wizard.forms import ExpoForm1, ExpoForm2
from wizard.views import ExpoWizard
urlpatterns = patterns('',
(r'^$', ExpoWizard.as_view([ExpoForm1, ExpoForm2]))
)
from django.conf.urls import patterns, url
from .views import ExpoWizard
from .forms import ExpoForm1, ExpoForm2,ExpoForm3
formlist = [ExpoForm1,ExpoForm2, ExpoForm3]
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.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
from proj import settings
from wizard import forms
from exposition.models import Exposition, Statistic
from photologue.models import Photo
from exposition.models import Exposition
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
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):
location=os.path.join(settings.MEDIA_ROOT, 'temp', 'files')
# storing temporary files during upload
location = os.path.join(settings.MEDIA_ROOT, 'temp')
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):
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()
expo = Exposition.objects.language('ru').create(
name = data.get('name'),
data_begin = data.get('date_start'),
data_end = data.get('date_end'),
main_title = data.get('main_title'),
description = data.get('description'),
products = data.get('products'),
country = data.get('country', 1),
city = data.get('city', 1),
place = data.get('place', 1),
periodic = data.get('periodic'),
web_page = data.get('web_site'),
logo = data.get('logo'),
foundation_year = data.get('found_year'),
area = data.get('square'),
price_day = '%i %s'%(data.get('one_day'), self.request.POST['oneDayCurrency1']),
price_all = '%i %s'%(data.get('all_days'), self.request.POST['allDaysCurrency1']),
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']),
min_area = data.get('min_square'),
registration_payment = data.get('registration_depos'),
application_deadline = data.get('deadline_date'),
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
# creating new exposition
lang = self.request.LANGUAGE_CODE
expo = Exposition.objects.language(lang).create(
name=data.get('name'),
data_begin=data.get('date_start'),
data_end=data.get('date_end'),
main_title=data.get('main_title'),
description=data.get('description'),
products=data.get('products'),
country=Country.objects.language(lang).get(id=data.get('country')),
city=City.objects.language(lang).get(id=data.get('city')),
place=PlaceExposition.objects.language(lang).get(id=data.get('place')),
periodic=data.get('periodic'),
web_page=data.get('web_site'),
logo=data.get('logo'),
foundation_year=data.get('found_year'),
area=data.get('square'),
price_day=data.get('one_day'),
price_all=data.get('all_days'),
price_day_bar=data.get('pre_one_day'),
price_all_bar=data.get('pre_all_days'),
min_area=data.get('min_square'),
registration_payment=data.get('registration_depos'),
application_deadline=data.get('deadline_date'),
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')]
expo.theme = [data.get('theme')]
# adding photo to gallery
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']:
expo.quality_label = (expo.quality_label| Exposition.quality_label.exporating)
expo.quality_label = (expo.quality_label | Exposition.quality_label.exporating)
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']:
expo.quality_label = (expo.quality_label| Exposition.quality_label.ufi)
expo.quality_label = (expo.quality_label | Exposition.quality_label.ufi)
if data['audience1']:
expo.audience = (expo.audience | Exposition.audience.experts)
@ -67,23 +128,4 @@ class ExpoWizard(SessionWizardView):
if data['audience3']:
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