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

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

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

@ -144,6 +144,9 @@ class User(AbstractBaseUser, PermissionsMixin):
class Meta: class Meta:
ordering=['-rating'] ordering=['-rating']
def is_organiser(self):
return bool(self.organiser)
def get_full_name(self): def get_full_name(self):
""" """
Returns the first_name plus the last_name, with a space in between. Returns the first_name plus the last_name, with a space in between.

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

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

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

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

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

@ -113,7 +113,6 @@ class Banner(models.Model, StatMixin):
def get_admin_url(self): def get_admin_url(self):
return '/admin/expobanners/banners/banner/%d/edit/'%self.id return '/admin/expobanners/banners/banner/%d/edit/'%self.id
def key(slef): def key(slef):
if hasattr(settings, 'SECRET_KEY'): if hasattr(settings, 'SECRET_KEY'):
key = str(datetime.now()) + settings.SECRET_KEY key = str(datetime.now()) + settings.SECRET_KEY
@ -206,6 +205,9 @@ class LogStat(models.Model):
def __unicode__(self): def __unicode__(self):
return '%s - (%s)' % (self.banner, self.date) return '%s - (%s)' % (self.banner, self.date)
class Meta:
ordering = ['-date']
# ------------------ # ------------------
class Paid(models.Model, StatMixin): class Paid(models.Model, StatMixin):
@ -241,6 +243,9 @@ class PaidStat(models.Model):
participation_clicks = models.PositiveIntegerField(default=0) participation_clicks = models.PositiveIntegerField(default=0)
official_clicks = models.PositiveIntegerField(default=0) official_clicks = models.PositiveIntegerField(default=0)
class Meta:
ordering = ['-date']
class Top(models.Model, StatMixin): class Top(models.Model, StatMixin):
link = models.ForeignKey(Banner) link = models.ForeignKey(Banner)
@ -266,6 +271,7 @@ class Top(models.Model, StatMixin):
except IndexError: except IndexError:
return None return None
class TopStat(models.Model): class TopStat(models.Model):
date = models.DateField() date = models.DateField()
theme = models.ForeignKey('theme.Theme', blank=True, null=True) theme = models.ForeignKey('theme.Theme', blank=True, null=True)
@ -317,7 +323,6 @@ def generate_stat_pass(sender, **kwargs):
obj.save() obj.save()
post_save.connect(generate_stat_pass, sender=Banner) post_save.connect(generate_stat_pass, sender=Banner)
post_save.connect(generate_stat_pass, sender=Paid) post_save.connect(generate_stat_pass, sender=Paid)
post_save.connect(generate_stat_pass, sender=Top) post_save.connect(generate_stat_pass, sender=Top)

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

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

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

File diff suppressed because one or more lines are too long

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -29,7 +29,7 @@
<label class="control-label"><b>{{ form.url.label }}:</b></label> <label class="control-label"><b>{{ form.url.label }}:</b></label>
<div class="controls"> <div class="controls">
{{ form.langs }} {{ form.langs }}
{{ form.url }} {{ form.url }}<span class="help-inline"></span>
<span class="help-inline">{{ form.url.errors }}</span> <span class="help-inline">{{ form.url.errors }}</span>
</div> </div>
</div> </div>
@ -41,6 +41,22 @@
<span class="help-inline">{{ form.title.errors }}</span> <span class="help-inline">{{ form.title.errors }}</span>
</div> </div>
</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 #} {# body #}
<div class="control-group {% if form.body.errors %}error{% endif %}"> <div class="control-group {% if form.body.errors %}error{% endif %}">
<label class="control-label">{{ form.body.label }}:</label> <label class="control-label">{{ form.body.label }}:</label>

@ -18,7 +18,7 @@
{% block body %} {% block body %}
{# Uses multilang.html template for translated fields #} {# Uses multilang.html template for translated fields #}
<form method="post" class="form-horizontal" > {% csrf_token %} <form method="post" action="" class="form-horizontal" > {% csrf_token %}
<fieldset> <fieldset>
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
@ -26,16 +26,16 @@
</div> </div>
<div class="box-content"> <div class="box-content">
{# url/slug #} {# url/slug #}
{% if request.path == '/admin/page/new/' %} {# {% if request.path == '/admin/page/new/' %}#}
<div class="control-group {% if form.url.errors %}error{% endif %}"> <div class="control-group {% if form.url.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.url.label }}:</b></label> <label class="control-label"><b>{{ form.url.label }}:</b></label>
<div class="controls"> <div class="controls">
{{ form.langs }}
{{ form.url }} {{ form.url }}
<span class="help-inline">{{ form.url.errors }}</span> <span class="help-inline">{{ form.url.errors }}</span>
</div> </div>
</div> </div>
{% endif %} {# {% endif %}#}
{# h1 #} {# h1 #}
<div class="control-group {% if form.h1.errors %}error{% endif %} "> <div class="control-group {% if form.h1.errors %}error{% endif %} ">
<label class="control-label"><b>{{ form.h1.label }}:</b></label> <label class="control-label"><b>{{ form.h1.label }}:</b></label>

@ -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 %}

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

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

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

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

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

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

@ -1,4 +1,10 @@
{% extends 'client/base_catalog.html' %} {% 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 %} {% block content_list %}
{{ form.errors }} {{ form.errors }}
@ -8,14 +14,8 @@
{{ wizard.form.media }} {{ wizard.form.media }}
<h3>Шаг {{ wizard.steps.step1 }}. Основная информация</h3> <h3>Шаг {{ wizard.steps.step1 }}. Основная информация</h3>
</div> </div>
<form action="" enctype="multipart/form-data" method="post">{% csrf_token %} <form action="" enctype="multipart/form-data" method="post">{% csrf_token %}
{{ wizard.management_form }} {{ 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 %} {% with wizard.form as form %}
<div class="adm-form-body"> <div class="adm-form-body">
<div class="mf-line "> <div class="mf-line ">
@ -77,14 +77,14 @@
<div class="mf-line"> <div class="mf-line">
<div class="mf-field"> <div class="mf-field">
<h3>Место проведения:</h3> <h3>Место проведения:</h3>
{{ form.place }} {{ form.place }}
</div> </div>
</div> </div>
<div class="mf-line"> <div class="mf-line">
<div class="mf-field"> <div class="mf-field">
<h3>Страна:</h3> <h3>Страна:</h3>
{{ form.country }} {{ form.country }}
</div> </div>
@ -107,13 +107,14 @@
<div class="clearfix"> <div class="clearfix">
<div class="mff-col"> <div class="mff-col">
<label class="check">{{ form.audience1 }}специалисты</label> <label class="checkbox">{{ form.audience1 }}специалисты</label>
<label class="check">{{ form.audience2 }}специалисты и <label class="checkbox">{{ form.audience2 }}специалисты и
потребители</label> потребители</label>
<label class="check">{{ form.audience3 }}широкая публика</label> <label class="checkbox">{{ form.audience3 }}широкая публика</label>
</div> </div>
<div class="mff-col"> <div class="mff-col">
Периодичность:
{{ form.periodic }} {{ form.periodic }}
</div> </div>
</div> </div>
@ -127,9 +128,9 @@
<label>Членства и знаки качества:</label> <label>Членства и знаки качества:</label>
<div class="mf-field"> <div class="mf-field">
<label class="check">{{ form.membership1 }}Exporating</label> <label class="checkbox">{{ form.membership1 }}Exporating</label>
<label class="check">{{ form.membership2 }}RSVA</label> <label class="checkbox">{{ form.membership2 }}RSVA</label>
<label class="check">{{ form.membership3 }}UFI</label> <label class="checkbox">{{ form.membership3 }}UFI</label>
<hr/> <hr/>
</div> </div>
</div> </div>
@ -150,12 +151,6 @@
<div id="work-time" class="mf-field"> <div id="work-time" class="mf-field">
<div class="w-time"> <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"> <div class="w-time-wrap">
<label>c</label> <label>c</label>
{{ form.time_start }} {{ form.time_start }}
@ -165,10 +160,7 @@
<label>до</label> <label>до</label>
{{ form.time_end }} {{ form.time_end }}
</div> </div>
{# <label class="check"><input type="checkbox" class="w-time-switcher" name="c05" checked />Один график на все дни</label>#}
</div> </div>
</div> </div>
</div> </div>
@ -195,24 +187,23 @@
</div> </div>
</form> </form>
{% endwith %} {% endwith %}
</div> </div>
<div class="set-sect p-form adm-form not-active"> <div class="set-sect p-form adm-form not-active">
<div class="set-sect-title clearfix"> <div class="set-sect-title clearfix">
<h3>Шаг 2. Статистика и условия участия</h3> <h3>Шаг 2. Статистика и условия участия</h3>
</div> </div>
</div> </div>
<div class="set-sect p-form adm-form not-active"> <div class="set-sect p-form adm-form not-active">
<div class="set-sect-title clearfix"> <div class="set-sect-title clearfix">
<h3>Шаг 3. Добавление фото</h3> <h3>Шаг 3. Добавление фото</h3>
</div> </div>
</div> </div>
</div> </div>
<hr/> <hr/>
{# {% endif %}#}
{% endblock %} {% endblock %}

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

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

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

@ -1,36 +1,42 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
from theme.models import Theme, Tag from theme.models import Theme
from place_exposition.models import PlaceExposition from place_exposition.models import PlaceExposition
from city.models import City
from country.models import Country from country.models import Country
from multiupload.fields import MultiFileField, MultiFileInput
choices = ((0, ''), (1.0, u'Ежегодно'), (2.0, u'2 раза в год'), (3.0, u'3 раза в год'), (4.0, u'4 раза в год'), 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 года'), ( (5.0, u'5 раз в год'), (0.5, u'Раз в 2 года'), (
0.33, u'Раз в 3 года'), (0.25, u'Раз в 4 года')) 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): class ExpoForm1(forms.Form):
""" """
main information about exposition 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': "Введите название выставки"})) name = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Введите название выставки"}))
main_title = 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})) 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_start = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateFrom', 'placeholder':'дд.мм.гг'}))
date_end = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateTo','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)) country = forms.ChoiceField(label=u'Страна', choices=[(c.id, c.name) for c in Country.objects.all()], widget=forms.Select(attrs={'id':'id_country'}))
place = forms.ModelChoiceField(queryset=PlaceExposition.objects.filter(id=50)) 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) audience1 = forms.BooleanField(required=False)
audience2 = forms.BooleanField(required=False) audience2 = forms.BooleanField(required=False)
audience3 = forms.BooleanField(required=False) audience3 = forms.BooleanField(required=False)
periodic = forms.ChoiceField(choices=choices) periodic = forms.ChoiceField(choices=choices, required=False)
membership1= forms.BooleanField(required=False) membership1 = forms.BooleanField(required=False)
membership2= forms.BooleanField(required=False) membership2 = forms.BooleanField(required=False)
membership3= forms.BooleanField(required=False) membership3 = forms.BooleanField(required=False)
web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"})) web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"}))
products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10})) products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10}))
time_start = forms.TimeField() time_start = forms.TimeField()
@ -43,12 +49,6 @@ class ExpoForm2(forms.Form):
statistics statistics
""" """
found_year = forms.IntegerField() 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 # ticket price
pre_one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'})) pre_one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'}))
pre_all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'})) pre_all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'}))
@ -63,3 +63,13 @@ class ExpoForm2(forms.Form):
registration_depos = forms.FloatField() registration_depos = forms.FloatField()
deadline_date = forms.DateField(widget=forms.TextInput(attrs={'placeholder':'дд.мм.гг'})) deadline_date = forms.DateField(widget=forms.TextInput(attrs={'placeholder':'дд.мм.гг'}))
class ExpoForm3(forms.Form):
"""
photos from last expositions
"""
attachments = MultiFileField(min_num=0, max_num=6, max_file_size=1024*1024*5, widget=MultiFileInput(
attrs={'class':'button big icon-camera', 'value': u'выберите фотографии', 'id': 'files'}
))

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

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

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

Loading…
Cancel
Save