added form wizard and seo_texts support

remotes/origin/1203
Ivan 11 years ago
parent 8f0adcdcb5
commit 146afd4513
  1. 43
      accounts/admin.py
  2. 5
      accounts/admin_urls.py
  3. 186
      accounts/forms.py
  4. 13
      accounts/models.py
  5. 2
      accounts/urls.py
  6. 10
      core/admin_urls.py
  7. 38
      core/forms.py
  8. 51
      core/models.py
  9. 76
      core/utils.py
  10. 83
      core/views.py
  11. 4
      exposition/search_indexes.py
  12. 5
      functions/admin_views.py
  13. 100
      functions/pipeline.py
  14. 1
      functions/search_forms.py
  15. 10
      import_xls/admin.py
  16. 2
      import_xls/excel_settings.py
  17. 155
      import_xls/import_forms.py
  18. 9
      import_xls/utils.py
  19. 0
      logs/django_request.log
  20. 16
      logs/mylog.log
  21. 7056
      logs/mylog.log.1
  22. 5
      meta/admin_urls.py
  23. 14
      meta/forms.py
  24. 66
      meta/models.py
  25. 47
      meta/views.py
  26. 1
      proj/admin_urls.py
  27. 16
      proj/decorators.py
  28. 100
      proj/settings.py
  29. 3
      proj/urls.py
  30. 45
      proj/views.py
  31. 42
      registration/backends/default/views.py
  32. 6
      settings/old_urls.py
  33. 27
      settings/redirect_views.py
  34. 9
      settings/views.py
  35. 74
      templates/admin/accounts/user_change.html
  36. 8
      templates/admin/accounts/user_list.html
  37. 21
      templates/admin/import templates/import.html
  38. 63
      templates/admin/meta/create_seo_text.html
  39. 54
      templates/admin/meta/seo_admin_list.html
  40. 11
      templates/admin/meta/seo_confirm_delete.html
  41. 90
      templates/admin/page/new_page.html
  42. 58
      templates/admin/page/page_admin_list.html
  43. 11
      templates/admin/page/page_confirm_delete.html
  44. 5
      templates/admin/translator/translator_list.html
  45. 31
      templates/client/404_test.html
  46. 7
      templates/client/accounts/email_required.html
  47. 10
      templates/client/base_catalog.html
  48. 113
      templates/client/base_page.html
  49. 6
      templates/client/blank.html
  50. 3
      templates/client/includes/seo_text.html
  51. 19
      templates/client/page/page_view.html
  52. 24
      templates/client/popups/acquire_email.html
  53. 101
      templates/client/popups/user_information.html
  54. 274
      templates/client/static_client/css/jquery.fancybox.css
  55. 46
      templates/client/static_client/js/jquery.fancybox.pack.js
  56. 218
      templates/client/wizard/first_step.html
  57. 310
      templates/client/wizard/second_step.html
  58. 23
      templates/client/wizard/wizard.html
  59. 1
      templates/done.html
  60. 27
      templates/registration/acquire_email.html
  61. 8
      templates/registration/social_registration_complete.html
  62. 0
      wizard/__init__.py
  63. 65
      wizard/forms.py
  64. 3
      wizard/models.py
  65. 16
      wizard/tests.py
  66. 8
      wizard/urls.py
  67. 89
      wizard/views.py

@ -4,7 +4,6 @@ import random
import json
from hashlib import md5
from django.shortcuts import render_to_response
from django.conf import settings
from django.http import HttpResponseRedirect, HttpResponse
from django.core.context_processors import csrf
from django.contrib.auth.decorators import login_required
@ -14,6 +13,7 @@ from models import User
from forms import UserForm, UserCreationForm, ChangePasswordForm, EmailAnnouncementForm, UserFilterForm
#custom views
from functions.admin_views import AdminView, AdminListView
from django.views.generic import UpdateView
class UserListView(AdminListView):
template_name = 'admin/accounts/user_list.html'
@ -21,24 +21,35 @@ class UserListView(AdminListView):
model = User
class EditUser(UpdateView):
model = User
form_class = UserForm
success_url = '/admin/accounts/all'
template_name = 'user_change.html'
def user_change(request, url):
"""
Return form of user and post it on the server.
If form is posted redirect on the page of all users.
"""
user = User.objects.safe_get(id=url)
# try get user by url if doesnt work by id
if user is None:
user = User.objects.safe_get(url=url)
#redirect to list of all users if cannot find user
if user is None:
try:
user = User.objects.get(url=url)
except User.DoesNotExist:
try:
user = User.objects.get(id=url)
except User.DoesNotExist, User.MultipleObjectsReturned:
return HttpResponseRedirect('/admin/accounts/all')
except User.MultipleObjectsReturned:
return HttpResponseRedirect('/admin/accounts/all')
if request.POST:
# bug with saving staff users(set is_staff to False)
staff = user.is_staff
form = UserForm(request.POST, instance=user)
form = UserForm(request.POST, request.FILES, instance=user)
if form.is_valid():
user = form.save()
@ -48,27 +59,29 @@ def user_change(request, url):
user.save()
return HttpResponseRedirect('/admin/accounts/all')
else:
form.fields['city'].widget.attrs['data-init-text'] = user.profile.city.name
if user.profile.city:
form.fields['city'].widget.attrs['data-init-text'] = user.profile.city.name
else:
profile = user.profile
data = {'country':profile.country_id, 'city': profile.city_id,
'title': profile.title, 'descriptions': profile.descriptions,
'keywords': profile.keywords, 'phone': profile.phone, 'web_page': profile.web_page,
'about': profile.about}
'about': profile.about, 'skype':profile.skype,'facebook':profile.facebook, 'linkedin':profile.linkedin,
'twitter':profile.twitter, 'vk':profile.vk}
form = UserForm(instance=user,initial=data)
if user.profile.city:
form.fields['city'].widget.attrs['data-init-text'] = user.profile.city.name
args = {}
args.update(csrf(request))
context = {}
context.update(csrf(request))
args['form'] = form
args['object'] = user
context['form'] = form
context['object'] = user
return render_to_response('user_change.html', args)
return render_to_response('user_change.html', context)
def create_admin(request):
if request.POST:

@ -1,12 +1,13 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
from admin import UserListView
from admin import UserListView, EditUser
urlpatterns = patterns('',
#url(r'^registration/$', 'accounts.admin.registration'),
#url(r'^create_admin/$', 'accounts.admin.create_admin'),
#url(r'^create_md5user/$', 'accounts.admin.create_md5'),
url(r'^change/(.*)/$', 'accounts.admin.user_change'),
# url(r'^change/(?P<pk>.*)/$', EditUser.as_view()),
url(r'^change/(?P<url>.*)/$', 'accounts.admin.user_change'),
url(r'^all/$', UserListView.as_view()),
url(r'^reset_password_email/$', 'accounts.admin.reset_password_email'),
)

@ -5,6 +5,7 @@ from django import forms
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.forms.util import ErrorList
from django.utils.translation import ugettext as _
from django.conf import settings
from models import User, Profile
from theme.models import Theme, Tag
from country.models import Area
@ -13,7 +14,7 @@ from country.models import Country
from city.models import City
from company.models import Company
from organiser.models import Organiser
#functions
# functions
from functions.form_check import translit_with_separator, is_latin
@ -27,7 +28,6 @@ def clean_relation_field(inst, field_name, model):
return None
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput(render_value=False))
password2 = forms.CharField(label='Повторите пароль', widget=forms.PasswordInput(render_value=False))
@ -36,7 +36,6 @@ class UserCreationForm(forms.ModelForm):
model = User
fields = ('email', 'first_name', 'last_name')
def clean_email(self):
"""
checking if user already exist
@ -56,7 +55,6 @@ class UserCreationForm(forms.ModelForm):
raise forms.ValidationError('Пароли не совпадают')
return password2
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data['password2'])
@ -66,6 +64,7 @@ class UserCreationForm(forms.ModelForm):
return user
class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField()
@ -76,24 +75,39 @@ class UserChangeForm(forms.ModelForm):
return self.initial['password']
class UserForm(forms.ModelForm):
#email = forms.EmailField(widget=forms.TextInput(attrs={'disabled' : True}), required=False)
country = forms.ChoiceField(label='Страна', choices=[(item.id, item.name) for item in Country.objects.all()], required=False)
city = forms.CharField(label='Город', widget=forms.HiddenInput())
company = forms.ChoiceField(label='Компания', choices=[(item.id, item.name) for item in Company.objects.language().all()], required=False)
organiser = forms.ChoiceField(label='Организатор', choices=[(item.id, item.name) for item in Organiser.objects.language().all()], required=False)
title = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)
descriptions = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)
keywords = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)
phone = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)
# email = forms.EmailField(widget=forms.TextInput(attrs={'disabled' : True}), required=False)
country = forms.ChoiceField(label='Страна', choices=[(item.id, item.name) for item in Country.objects.all()],
required=False)
city = forms.CharField(label='Город', widget=forms.HiddenInput(), required=False)
company = forms.ChoiceField(label='Компания',
choices=[(item.id, item.name) for item in Company.objects.language().all()],
required=False)
organiser = forms.ChoiceField(label='Организатор',
choices=[(item.id, item.name) for item in Organiser.objects.language().all()],
required=False, initial=None)
title = forms.CharField(widget=forms.TextInput(attrs={'style': 'width: 550px'}), required=False)
descriptions = forms.CharField(widget=forms.TextInput(attrs={'style': 'width: 550px'}), required=False)
keywords = forms.CharField(widget=forms.TextInput(attrs={'style': 'width: 550px'}), required=False)
phone = forms.CharField(widget=forms.TextInput(attrs={'style': 'width: 550px'}), required=False)
web_page = forms.URLField(required=False)
about = forms.CharField(widget=forms.Textarea())
about = forms.CharField(widget=forms.Textarea(), required=False)
avatar = forms.ImageField(required=False)
# ---
skype = forms.CharField(required=False)
facebook = forms.URLField(required=False)
twitter = forms.URLField(required=False)
linkedin = forms.URLField(required=False)
vk = forms.URLField(required=False)
new_password = forms.CharField(required=False, min_length=6, max_length=60,
widget=forms.TextInput(attrs={'class': 'new_password'}))
class Meta:
model = User
exclude = ('username', 'email','last_login', 'password', 'is_active', 'is_admin', 'is_superuser', 'is_staff'
'date_joined', 'date_registered', 'date_modified')
exclude = ('username', 'email', 'last_login', 'password', 'is_admin', 'rating', 'is_superuser', 'is_staff'
'date_joined',
'date_registered', 'date_modified')
def save(self, force_insert=False, force_update=False, commit=True):
@ -108,28 +122,34 @@ class UserForm(forms.ModelForm):
profile.phone = data.get('phone')
profile.web_page = data.get('web_page')
profile.about = data.get('about')
profile.skype = data.get('skype', '')
profile.facebook = data.get('facebook', '')
profile.twitter = data.get('twitter', '')
profile.linkedin = data.get('linkedin', '')
profile.vk = data.get('vk', '')
profile.avatar = data.get('avatar')
if data['new_password']:
new_pass = data['new_password']
user.set_password(new_pass)
user.email_user('Reset password', 'Your new password: "%s" ' % new_pass, settings.DEFAULT_FROM_EMAIL, )
if commit:
user.save()
profile.save()
return user
"""
def clean_url(self):
url = self.cleaned_data.get('url')
try:
user = User.objects.get(url=translit_with_separator(url))
if (user.url == translit_with_separator(url)):
if url:
if User.objects.get(url=translit_with_separator(url)):
raise forms.ValidationError('Такой урл уже занят')
else:
return url
except:
return url
raise forms.ValidationError('Такой урл уже занят')
"""
def clean_organiser(self):
return clean_relation_field(self, 'organiser', Organiser)
def clean_company(self):
return clean_relation_field(self, 'company', Company)
@ -139,23 +159,23 @@ class UserForm(forms.ModelForm):
def clean_city(self):
return clean_relation_field(self, 'city', City)
def clean_phone(self):
"""
phone code checking
"""
cleaned_data = super(UserForm, self).clean()
phone = cleaned_data.get('phone')
if not phone:
if not phone:
return
deduct = ('-','(',')','.',' ')
deduct = ('-', '(', ')', '.', ' ')
for elem in deduct:
phone = phone.replace(elem, '')
if phone.isdigit():
return phone
else:
raise forms.ValidationError('Введите правильный код страны')
"""
def clean_web_page(self):
cleaned_data = super(UserForm, self).clean()
@ -171,6 +191,7 @@ class UserForm(forms.ModelForm):
return forms.ValidationError('Введите правильный адрес страници')
"""
class ChangePasswordForm(forms.Form):
"""
Form to change password
@ -183,7 +204,8 @@ class ChangePasswordForm(forms.Form):
attrs={'placeholder': _(u'Придумайте новый пароль')}))
new_password_confirm = forms.CharField(label=_(u'Confirm password'), required=True,
widget=forms.PasswordInput(render_value=False,
attrs={'placeholder': _(u'Повторите новый пароль')}))
attrs={
'placeholder': _(u'Повторите новый пароль')}))
def clean(self):
data = super(ChangePasswordForm, self).clean()
@ -191,7 +213,7 @@ class ChangePasswordForm(forms.Form):
password2 = data.get('new_password_confirm')
if not password1 or not password2:
return data
# self._errors['new_password'] = ErrorList([_(u'Different passwords!')])
# self._errors['new_password'] = ErrorList([_(u'Different passwords!')])
# return data
if password1 and password2 and password1 != password2:
# check if passwords exists and equal
@ -200,7 +222,7 @@ class ChangePasswordForm(forms.Form):
del data['new_password_confirm']
del data['new_password']
return data
if not password1.isdigit() and any(char.isdigit() for char in password1) and len(password1)>5:
if not password1.isdigit() and any(char.isdigit() for char in password1) and len(password1) > 5:
# password must contain digits and letters and length > 5
return data
else:
@ -210,33 +232,35 @@ class ChangePasswordForm(forms.Form):
del data['new_password_confirm']
return data
class EmailAnnouncementForm(forms.Form):
data = [(1, _(u'Получать приглашения, сообщения и другую корреспонденцию от пользователей Expomap')),
(2, _(u'Получать обзор событий')),
(3, _(u'Получать новости'))]
(2, _(u'Получать обзор событий')),
(3, _(u'Получать новости'))]
announcement = forms.MultipleChoiceField(choices=data, widget=forms.CheckboxSelectMultiple())
class RegistrationCompleteForm(forms.ModelForm):
country = forms.ModelChoiceField(label='Страна', queryset= Country.objects.all(),
country = forms.ModelChoiceField(label='Страна', queryset=Country.objects.all(),
widget=forms.Select(attrs={'class': 'select2'}))
city = forms.CharField(label='Город', widget=forms.HiddenInput())
url = forms.CharField(widget=forms.TextInput(attrs={'placeholder': _(u'url(обязательно)')}))
code_country = forms.ChoiceField(label=_(u'код страны'), initial='70',
choices=[(str(c.phone_code), '+'+str(c.phone_code)) for c in Country.objects.all() if c.phone_code is not None],
choices=[(str(c.phone_code), '+' + str(c.phone_code)) for c in
Country.objects.all() if c.phone_code is not None],
widget=forms.Select(attrs={'class': 'select2'}))
code_city = forms.CharField(label=_(u'код города'))
phone = forms.CharField(label=_(u'ваш номер'))
class Meta:
model = User
fields = ('url',)
def save(self, force_insert=False, force_update=False, commit=True):
user = super(RegistrationCompleteForm, self).save(commit=False)
data = self.cleaned_data
phone = data['code_country']+data['code_city']+data['phone']
phone = data['code_country'] + data['code_city'] + data['phone']
user.profile.phone = int(phone)
user.profile.country = data['country']
@ -253,7 +277,6 @@ class RegistrationCompleteForm(forms.ModelForm):
except City.DoesNotExist:
return None
def clean_url(self):
url = self.cleaned_data['url']
if not is_latin(url):
@ -267,6 +290,36 @@ class RegistrationCompleteForm(forms.ModelForm):
class SocialRegistrationCompleteForm(RegistrationCompleteForm):
email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': _(u'Email')}), required=True)
class Meta:
model = User
fields = ['email', 'url']
def save(self, force_insert=False, force_update=False, commit=True):
email = self.cleaned_data['email']
if User.objects.filter(email=email).exists():
# pass to the view user, that had account before
user = User.objects.get(email=email)
# social = UserSocialAuth.objects.get(user=self.instance)
# social.user = user # that cause AuthAlreadyAssociated error!
else:
# create new user, with data from social auth
user = super(RegistrationCompleteForm, self).save(commit=False) # creating new user
user.username = email
data = self.cleaned_data
phone = data['code_country'] + data['code_city'] + data['phone']
user.profile.phone = int(phone)
user.profile.country = data['country']
user.profile.city = data['city']
user.profile.save()
# if commit:
user.save()
return user
class RecoveryForm(forms.Form):
email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': _(u'Email')}))
@ -283,10 +336,13 @@ class RecoveryForm(forms.Form):
raise forms.ValidationError(_(u'Пользователь с таким емейлом не зарегестрирован'))
from django.db.models import Q
class UserFilterForm(forms.Form):
model = User
email = forms.CharField(label=_(u'Email'), required=False)
search_req = forms.CharField(label=_(u'Введите e-mail, имя или фамилию для запроса'), required=False)
def filter(self):
"""
@ -295,27 +351,31 @@ class UserFilterForm(forms.Form):
"""
data = self.cleaned_data
email = data['email']
search_req = data['search_req']
words = search_req.split()
model = self.model
qs = model.objects.all()
if email:
qs = qs.filter(email__contains=email)
if len(words) > 1:
qs = qs.filter(Q(first_name__contains=words[0]) & Q(last_name__contains=words[1]))
elif words:
qs = qs.filter(
Q(email__contains=search_req) | Q(first_name__contains=search_req) | Q(last_name__contains=search_req))
return qs
class FeedFilterForm(forms.Form):
data_with_parents = None
filter = None
th = forms.MultipleChoiceField(label=_(u'Тематика'), choices=[(item.id, item.name) for item in Theme.active.all()],
required=False, widget=forms.CheckboxSelectMultiple())
required=False, widget=forms.CheckboxSelectMultiple())
tg = forms.CharField(label=_(u'Теги'), required=False, widget=forms.CheckboxSelectMultiple())
area = forms.MultipleChoiceField(label=_(u'Регион'), choices=[(item.id, item.name) for item in Area.objects.language().all()],
area = forms.MultipleChoiceField(label=_(u'Регион'),
choices=[(item.id, item.name) for item in Area.objects.language().all()],
required=False, widget=forms.CheckboxSelectMultiple())
co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in Country.objects.expo_countries()]
)
)
ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in City.used.expo_cities()]
@ -336,21 +396,19 @@ class FeedFilterForm(forms.Form):
self.filter = filter
self.data_with_parents = self.get_form_data(filter)
def get_form_data(self, filter):
if filter.area.exists():
areas = [{'name':'area', 'id':item.id, 'parent':None, 'text':item.name} for item in filter.area.all()]
areas = [{'name': 'area', 'id': item.id, 'parent': None, 'text': item.name} for item in filter.area.all()]
else:
areas = []
if filter.country.exists():
cos = []
for country in filter.country.all():
cos.append({'name':'area', 'id':country.area_id, 'text': country.area.name, 'children':{
'id': country.id, 'name':'co', 'text': country.name
}
cos.append({'name': 'area', 'id': country.area_id, 'text': country.area.name, 'children': {
'id': country.id, 'name': 'co', 'text': country.name
}
})
else:
cos = []
@ -358,29 +416,27 @@ class FeedFilterForm(forms.Form):
if filter.city.exists():
cis = []
for city in filter.city.all():
cis.append({'name':'area', 'id': city.country.area_id, 'text': city.country.area.name, 'children':{
'id': city.country_id, 'name':'co', 'text': city.country.name, 'children':{
'name':'ci', 'id':city.id, 'text':city.name
}
}
cis.append({'name': 'area', 'id': city.country.area_id, 'text': city.country.area.name, 'children': {
'id': city.country_id, 'name': 'co', 'text': city.country.name, 'children': {
'name': 'ci', 'id': city.id, 'text': city.name
}
}
})
else:
cis = []
if filter.theme.exists():
ths = [{'name':'th', 'id':item.id, 'parent':None, 'text':item.name} for item in filter.theme.all()]
ths = [{'name': 'th', 'id': item.id, 'parent': None, 'text': item.name} for item in filter.theme.all()]
else:
ths = []
if filter.tag.exists():
tgs = []
for tag in filter.tag.all():
tgs.append({'name':'th', 'id':tag.theme_id, 'text': tag.theme.name, 'children':{
'id': tag.id, 'name':'tg', 'text': tag.name
}
tgs.append({'name': 'th', 'id': tag.theme_id, 'text': tag.theme.name, 'children': {
'id': tag.id, 'name': 'tg', 'text': tag.name
}
})
else:
tgs = []
@ -418,4 +474,4 @@ class FeedFilterForm(forms.Form):
if tg:
res = ast.literal_eval(tg)
return res
return tg
return tg

@ -32,7 +32,8 @@ class UserManager(BaseUserManager):
raise ValueError('Вы должни ввести электронную почту')
user= self.model(
email = UserManager.normalize_email(email),first_name = first_name,last_name = last_name,
email = UserManager.normalize_email(email),
first_name = first_name,last_name = last_name,
username = UserManager.normalize_email(email),
is_staff=False, is_active=False, is_superuser=False,
last_login=now, date_joined=now, **extra_fields
@ -42,7 +43,7 @@ class UserManager(BaseUserManager):
user.save(using=self._db)
return user
def create_social_user(self,username, first_name, last_name, password=None, **extra_fields):
def create_social_user(self, username, first_name, last_name, password=None, **extra_fields):
now = timezone.now()
# generate random password
digits = random.sample(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'), 4)
@ -116,7 +117,7 @@ class User(AbstractBaseUser, PermissionsMixin):
first_name = models.CharField(verbose_name='First name', max_length=255)
last_name = models.CharField(verbose_name='Last name', max_length=255)
rating = models.IntegerField(default=100)# добавить индекс в базе
url = models.SlugField(blank=True)
url = models.SlugField(blank=True)#, unique=True, null=True)
#
is_active = models.BooleanField(default=0) # СДЕЛАТЬ проверку на емейле
is_staff = models.BooleanField(default=0)
@ -377,8 +378,10 @@ def calculate_rating(user):
user_rating_fields = {'position': 5, 'company': 5, 'url': 10}
profile_rating_fields = {'country': 5, 'city': 5, 'phone': 10, 'facebook': 5, 'twitter': 5, 'linkedin': 5, 'vk': 5,
'web_page': 10, 'avatar': 20, 'about': 15}
# доделать "Отметки на выставках, за каждую", "Подписка на рассылку", "Добавление фото, за каждую", "Добавление компании, за каждую опубликованную"
'''
TODO: доделать "Отметки на выставках, за каждую", "Подписка на рассылку", "Добавление фото, за каждую",
"Добавление компании, за каждую опубликованную"
'''
# base rating
rating = 100
for key, value in user_rating_fields.iteritems():

@ -16,6 +16,7 @@ urlpatterns = patterns('',
url(r'^profile/company/$', login_required(ProfileCompanyView.as_view())),
url(r'^profile/settings/$', login_required(SettingsView.as_view())),
url(r'^profile/calendar/remove/$', 'accounts.views.remove_from_calendar'),
url(r'^profile/calendar/export/$', 'core.views.download_workbook'),
url(r'^profile/calendar/$', login_required(CalendarView.as_view())),
url(r'^profile/feed/page/(?P<page>\d+)/$', Feed.as_view()),
url(r'^profile/feed/$', login_required(Feed.as_view())),
@ -28,6 +29,7 @@ urlpatterns = patterns('',
url(r'^user/(?P<url>.*)/events/(?P<page>\d+)/$', UserView.as_view()),
url(r'^user/(?P<url>.*)/events/$', UserView.as_view()),
url(r'^user/(?P<url>.*)/$', UserView.as_view()),
url(r'^inactive-user/$', 'registration.backends.default.views.inactive_user_message'),
#url(r'^profile/messages/(?P<user>.*)/$', login_required(MessagesView.as_view())),
#url(r'^profile/messages/$', login_required(MessagesView.as_view())),

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

@ -6,7 +6,8 @@ from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference
from django.utils.translation import ugettext_lazy as _
from haystack.query import SearchQuerySet, EmptySearchQuerySet
from hvad.forms import TranslatableModelForm
from models import Page
class PlaceSearchForm(forms.Form):
q = forms.CharField(label=_(u'Поиск'), required=False)
@ -45,3 +46,38 @@ class CallbackForm(forms.Form):
def send(self):
phone = self.cleaned_data['callback_phone']
send_mail(phone, phone, None, [settings.CALLBACK_EMAIL])
# ------------------ Page Form -----------------------
from django.conf import settings
from django.forms import Textarea
from ckeditor.widgets import CKEditorWidget
class PageForm(TranslatableModelForm):
# language = 'ru'
class Meta:
model = Page
fields = ['url','title','h1','descriptions','keywords', 'body' ]
widgets = {
'body':CKEditorWidget,
'keywords':Textarea,
'descriptions':Textarea,
}
def clean_url(self):
url = self.cleaned_data.get('url', None)
if url[0] == '/':
url = url[1:]
if url[-1] == '/':
url = url[:-1]
if ' ' in url:
url.replace(' ', '_')
return url

@ -1,12 +1,18 @@
# -*- coding: utf-8 -*-
from django.contrib.syndication.views import Feed
from django.shortcuts import get_object_or_404
from django.db import models
from exposition.models import Exposition
from settings.models import create_transl_fields
from theme.models import Theme
from country.models import Country
from city.models import City
from hvad.models import TranslatableModel, TranslatedFields
# ----------------------- RSS -------------------------- #
EXPO_ON_PAGE = 10
# nearest expositions at all
@ -85,4 +91,47 @@ class ThemeFeeds(Feed):
return obj.main_title
def items(self, obj):
return Exposition.enable.upcoming().filter(theme = obj)[:NUM_ITEMS_ON_PAGE]
return Exposition.enable.upcoming().filter(theme = obj)[:NUM_ITEMS_ON_PAGE]
# ------------------------ Page model --------------------------- #
from django.conf import settings
from django.core.urlresolvers import reverse
class Page(TranslatableModel):
url = models.SlugField(unique=True)
translations = TranslatedFields(
h1 = models.CharField(max_length=255),
body = models.TextField(),
# meta
title = models.CharField(max_length=255, blank=True),
descriptions = models.CharField(max_length=255, blank=True),
keywords = models.CharField(max_length=255, blank=True),
)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
return reverse('page_view', args=[self.url])
def save(self, *args, **kwargs):
super(Page,self).save(*args, **kwargs)
all_field_names = list(self._translated_field_names)
clear_f_n = []
for field_name in all_field_names:
if field_name not in ['master', 'master_id',u'id', 'language_code']:
clear_f_n.append(field_name)
field_items = {field_name:getattr(self, field_name) for field_name in clear_f_n}
langs = [lan[0] for lan in settings.LANGUAGES]
for lang in langs:
if lang not in self.get_available_languages():
self.translate(lang)
for field in clear_f_n:
setattr(self, field, field_items.get(field, ''))
super(Page,self).save(*args, **kwargs)
return self
def __unicode__(self):
return self.url

@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
import xlwt
import datetime
from exposition.models import Exposition
from conference.models import Conference
from django.core.exceptions import ObjectDoesNotExist
HEADER_STYLE = xlwt.easyxf('font: bold on')
DEFAULT_STYLE = xlwt.easyxf()
CELL_STYLE_MAP = (
(datetime.date, xlwt.easyxf(num_format_str='DD/MM/YYYY')),
(datetime.time, xlwt.easyxf(num_format_str='HH:MM')),
(bool, xlwt.easyxf(num_format_str='BOOLEAN')),
)
def multi_getattr(obj, attr, default=None):
attributes = attr.split(".")
for i in attributes:
try:
obj = getattr(obj, i)
except AttributeError:
if default:
return default
else:
return '-'
return obj
def get_column_cell(obj, name):
try:
attr = multi_getattr(obj, name)
except ObjectDoesNotExist:
return ''
if hasattr(attr, '_meta'):
# A Django Model (related object)
return unicode(attr).strip()
elif hasattr(attr, 'all'):
# A Django queryset (ManyRelatedManager)
return ', '.join(unicode(x).strip() for x in attr.all())
return attr
def queryset_to_workbook(queryset, columns, header_style=None, default_style=None, cell_style_map=None):
workbook = xlwt.Workbook()
report_date = datetime.date.today()
sheet_name = 'Export {0}'.format(report_date.strftime('%Y-%m-%d'))
sheet = workbook.add_sheet(sheet_name)
if not header_style:
header_style = HEADER_STYLE
if not default_style:
default_style = DEFAULT_STYLE
if not cell_style_map:
cell_style_map = CELL_STYLE_MAP
obj = queryset[0]
for y, column in enumerate(columns):
header_list=[u'Название события',u'Страна',u'Город',u'Место проведения', u'Дата начала', u'Дата окончания']
sheet.write(0, y, header_list[y], header_style)
for x, obj in enumerate(queryset, start=1):
for y, column in enumerate(columns):
value = get_column_cell(obj, column)
style = default_style
for value_type, cell_style in cell_style_map:
if isinstance(value, value_type):
style = cell_style
sheet.write(x, y, value, style)
return workbook

@ -4,7 +4,8 @@ from country.models import Country
from city.models import City
from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference
from django.views.generic import ListView, FormView
from django.views.generic import ListView, CreateView, DeleteView, UpdateView, DetailView
from django.core.urlresolvers import reverse_lazy
from functions.views_help import split_params
from django.utils.translation import ugettext as _
@ -199,3 +200,83 @@ class PlacePhotoView(PlaceListView):
context = super(PlacePhotoView, self).get_context_data(**kwargs)
context['object'] = self.obj
return context
# --------------------- Page views ------------------------
from forms import PageForm
from models import Page
class NewPage(CreateView):
form_class= PageForm
template_name = 'new_page.html'
success_url = '/admin/page/all/'
class PageList(ListView):
paginate_by = 10
template_name = 'page_admin_list.html'
model = Page
order = 'created'
from django import forms
from django.http import HttpResponseRedirect
class EditPage(UpdateView):
model = Page
template_name = 'new_page.html'
form_class = PageForm
slug_url_kwarg = 'url'
slug_field = 'url'
def get_context_data(self, **kwargs):
context = super(EditPage,self).get_context_data(**kwargs)
context['request'] = self.request
return context
def get_success_url(self):
return HttpResponseRedirect('/admin/page/all/')
class DeletePage(DeleteView):
template_name = 'admin/page/page_confirm_delete.html'
model = Page
success_url = reverse_lazy('page_list')
slug_field = 'url'
slug_url_kwarg = 'url'
class PageDetailed(DetailView):
model = Page
template_name = 'client/base_page.html'
slug_field = 'url'
slug_url_kwarg = 'url'
# ------------ XLS Export ----------------
from django.http import HttpResponse
from .utils import queryset_to_workbook
from exposition.models import Exposition
from conference.models import Conference
def download_workbook(request):
data = [(36539, 'expo'),(36602, 'expo'), (3033, 'conf'), (3053, 'conf')]
qs = []
for obj in data:
if obj[1] == 'expo':
qs.append(Exposition.objects.get(id=obj[0]))
if obj[1] == 'conf':
qs.append(Conference.objects.get(id=obj[0]))
columns = (
'name',
'country.name',
'city.name',
'place.name',
'data_begin',
'data_end')
workbook = queryset_to_workbook(qs, columns)
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename="export.xls"'
workbook.save(response)
return response

@ -19,9 +19,9 @@ class ExpositionIndex(indexes.SearchIndex, indexes.Indexable, ExpoSearchMixin):
content_auto = indexes.EdgeNgramField()
form_name = indexes.CharField()
# translated fields
name_en = indexes.CharField()
name_en = indexes.CharField()
name_ru = indexes.CharField()
catalog_name_en = indexes.CharField()
catalog_name_en = indexes.CharField()
catalog_name_ru = indexes.CharField()
def prepare_form_name(self, obj):

@ -126,7 +126,10 @@ class AdminListView(FormView):
def get_context_data(self, **kwargs):
context = super(AdminListView, self).get_context_data(**kwargs)
qs = self.model.objects.language().all().order_by('name')
if hasattr(self.model,'user'):
qs = self.model.objects.language().order_by('user__first_name')
else:
qs = self.model.objects.order_by('first_name')
result = paginate_results(qs, page=self.request.GET.get('page'))
context['object_list'] = result
return context

@ -1,41 +1,97 @@
from accounts.models import User
import random
import string
def random_pass():
digits = random.sample(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'), 4)
chars = random.sample(string.lowercase[:], 4)
password = chars + digits
random.shuffle(password)
return ''.join(password)
def load_user(details, response, uid, *args, **kwargs):
if details.get('email'):
username = details.get('email')
else:
username = str(uid)
user = User.objects.safe_get(username=username)
def load_user(strategy, details, response, uid, *args, **kwargs):
user = None
if details.get('email'):
email = details.get('email')
user = User.objects.safe_get(email=email)
return {'user': user, 'is_new': False}
from django.contrib.sites.models import Site, RequestSite
from registration.models import RegistrationProfile
def create_user(strategy, details, response, uid, user=None, *args, **kwargs):
if user:
return {'user': user, 'is_new': False}
else:
request = strategy.request
if Site._meta.installed:
site = Site.objects.get_current()
else:
site = RequestSite(request)
new_user = RegistrationProfile.objects.create_inactive_user(details['first_name'], details['last_name'], details['email'],
random_pass(), site or 1)
signals.user_registered.send(sender=User, user=new_user, request=request)
#user = User.objects.create_social_user(username, details['first_name'], details['last_name'])
return {'user': new_user, 'is_new': True}
if details.get('email'):
username = details.get('email')
from django.shortcuts import redirect
from social.pipeline.partial import partial
from registration import signals
@partial
def require_email(strategy, details, user=None, is_new=False, *args, **kwargs):
if user and user.email:
return
elif is_new and not details.get('email'):
email = strategy.request_data().get('email')
if email:
details['email'] = email
else:
username = str(uid)
strategy.request.session['new_email'] = True
return redirect('acquire_email')
user = User.objects.create_social_user(username, details['first_name'], details['last_name'])
return {'user': user, 'is_new': True}
from django.core import signing
from django.core.mail import EmailMultiAlternatives
from django.conf import settings
from django.core.urlresolvers import reverse
def SendVerificationEmail(strategy, backend, code):
"""
if details.get('email'):
user = User.objects.safe_get(email=details['email'])
if user:
return {'user': user, 'is_new': False}
else:
user = User.objects.create_user(email=details['email'], first_name=details['first_name'],
last_name=details['last_name'], password='1q2w3e4r', is_active=True)
Send an email with an embedded verification code and the necessary details to restore the required session
elements to complete the verification and sign-in, regardless of what browser the user completes the
verification from.
"""
signature = signing.dumps({"session_key": strategy.session.session_key, "email": code.email},
key=settings.EMAIL_SECRET_KEY)
verifyURL = "{0}?verification_code={1}&signature={2}".format(
reverse('social:complete', args=(backend.name,)),
code.code, signature)
verifyURL = strategy.request.build_absolute_uri(verifyURL)
return {'user': user, 'is_new': True}
else:
return None
"""
emailHTML = ''# Include your function that returns an html string here
emailText = """Welcome to Expomap.ru!
In order to login with your new user account, you need to verify your email address with us.
Please click on <a href='{verifyURL}'>this link</a> to continue registration.
""".format(verifyURL=verifyURL)
kwargs = {
"subject": "Verify Your Account",
"body": emailText,
"from_email": settings.CALLBACK_EMAIL,
"to": [code.email],
}
email = EmailMultiAlternatives(**kwargs)
email.attach_alternative(emailHTML, "text/html")
email.send()

@ -237,7 +237,6 @@ class ExpositionSearchForm(AbstactSearchForm):
required=False, widget=forms.CheckboxSelectMultiple())
tg = forms.CharField(label=_(u'Теги'), required=False, widget=forms.CheckboxSelectMultiple())
#co = forms.CharField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple())
#tg = forms.CharField(label=_(u'Теги'), required=False, widget=forms.CheckboxSelectMultiple())
area = forms.MultipleChoiceField(label=_(u'Регион'),
choices=[(item.id, item.name) for item in Area.objects.language().all()],

@ -27,17 +27,13 @@ class ImportView(FormView):
"""
abstract class
"""
template_name = 'admin/import templates/import.html'
template_name = 'import.html'
def form_valid(self, form):
errors = form.save_file()
form.save_file()
messages.success(self.request, 'Success')
context = self.get_context_data()
context['import_errors'] = errors
context['form'] = form
return render_to_response(self.template_name, context)
return super(ImportView, self).form_valid(form)
class ExportView(FormView):

@ -280,7 +280,7 @@ place_exp_sett = {
u'Тип':{u'field': u'type', u'func': to_type},
u'Краткое описание':{u'field': u'main_title', u'func': unicode},
u'Страна':{u'field': u'country', u'func': to_country},
u'Город':{u'field': u'city_id', u'func': to_city, 'extra_values': 'country'},
u'Город':{u'field': u'city', u'func': to_city, 'extra_values': 'country'},
u'Описание':{u'field': u'description', u'func': unicode},
u'Адрес':{u'field': u'adress', u'func': unicode},
u'Тел.':{u'field': u'phone', u'func': to_phone},

@ -106,7 +106,6 @@ def google_address(address):
response = {'address' : results[0].get('formatted_address'),
'lat' : results[0]['geometry']['location']['lat'],
'lng' : results[0]['geometry']['location']['lng']}
#return response
return json.dumps(response)
else:
return ''
@ -114,11 +113,11 @@ def google_address(address):
from djutils.decorators import async
from djutils.queue.decorators import queue_command
# place
class ImportPlaceExpositionForm(ImportForm):
model = PlaceExposition
settings = place_exp_sett
#@async
def save_file(self):
data = self.cleaned_data
lang = data['language']
@ -126,113 +125,86 @@ class ImportPlaceExpositionForm(ImportForm):
book = xlrd.open_workbook(file_contents=f.read())
sheet = book.sheet_by_index(0)
row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)]
model = self.model
labels = [label for label in row_list[0]]
errors = []
for row_number, row in enumerate(row_list):
if row_number == 0:
continue
if row[0] != '':
# in first column id
try:
obj = self.model.objects.language(lang).get(id=int(row[0]))
except ValueError:
obj = self.model()
obj.translate(lang)
except self.model.DoesNotExist:
obj = self.model(id= int(row[0]))
obj.translate(lang)
else:
# if id blank - its a new event
obj = model()
obj.translate(lang)
# ----------------
# go through all rows in file
if row_number > 0:
# first field is label
if row[0] != '':
# in first column ids
methods = []
for col_number, cell in enumerate(row):
# go through row cells
# field name current cell
label = labels[col_number]
setting = place_exp_sett.get(label)
if setting is None:
continue
if setting.get('method'):
if cell != "":
methods.append({'func': setting['func'], 'value': cell, 'purpose': setting.get('purpose')})
continue
field_name = setting['field']
func = setting.get('func')
if func is None:
continue
extra_value = setting.get('extra_values')
if extra_value is not None:
# if setting has extra value then
# it is some field like city, theme, tag
# that has relation and can be created
# in function we add language(need for relation fields)
# and extra value from object (like for city need country)
try:
extra = getattr(obj, extra_value)
except Exception:
continue
value = func(cell, 'ru', extra)
object = self.model.objects.language(lang).get(id=int(row[0]))
except ValueError:
object = self.model()
object.translate(lang)
except self.model.DoesNotExist:
object = self.model(id= int(row[0]))
object.translate(lang)
else:
value = func(cell)
try:
setattr(obj, field_name, value)
except ValueError, e:
continue
# if id blank - its a new event
object = self.model()
object.translate(lang)
methods = []
for col_number, cell in enumerate(row):
# go through row cells
# field name current cell
label = labels[col_number]
setting = place_exp_sett.get(label)
if field_name !='adress':
try:
setattr(obj, field_name, value)
except ValueError:
if setting is None:
continue
else:
#gaddress = google_address(value)
setattr(obj, 'address', google_address(value))
if setting.get('method'):
if cell != "":
methods.append({'func': setting['func'], 'value': cell, 'purpose': setting.get('purpose')})
continue
if not obj.url:
obj.url = translit_with_separator(obj.name)
try:
obj.save()
field_name = setting['field']
except IntegrityError, e:
error = str(e)
if typical_errors.get(error):
error = typical_errors[error]
if error.startswith('(1062, "Duplicate entry') and error.endswith('for key \'url\'")'):
error = u'Место с таким названием или урлом уже существует'
func = setting.get('func')
if func is not None:
extra_value = setting.get('extra_values')
if extra_value is not None:
# if setting has extra value then
# it is some field like city, theme, tag
# that has relation and can be created
errors.append([obj.name, error])
continue
# in function we add language(need for relation fields)
# and extra value from object (like for city need country)
value = func(cell, lang, getattr(object, extra_value))
else:
value = func(cell)
if field_name =='adress':
setattr(object, 'address', google_address(value))
setattr(object, field_name, value)
for method in methods:
func = method['func']
if method.get('purpose'):
try:
func(obj, method['value'], method['purpose'])
except Exception, e:
continue
else:
func(obj, method['value'])
return errors
try:
object.save()
except IntegrityError:
continue
#url = object.url + translit_with_separator(object.city.name)
#object.url = url
#object.save()
for method in methods:
func = method['func']
if method.get('purpose'):
try:
func(object, method['value'], method['purpose'])
except:
continue
else:
try:
func(object, method['value'])
except:
continue
class ImportPlaceConferenceForm(ImportForm):
@ -245,7 +217,6 @@ typical_errors = {'(1048, "Column \'city_id\' cannot be null")':u'Неправи
'(1048, "Column \'data_end\' cannot be null")':u'НЕправильный формат или не заполнена дата окончания',
'(1048, "Column \'data_end\' cannot be null")':u'НЕправильный формат или не заполнена дата начала'}
# event
class ImportEventForm(ImportForm):
"""
extended form for importing one type of event

@ -62,12 +62,12 @@ def to_country(value):
return None
def to_city(value, lang, country):
try:
# get city by name
#objects = get_translation_aware_manager(City)
# except IndexError if no found
city = City.objects.filter(translations__name=value, country=country)[0]
# print(city)
return city.id
except IndexError:
print('---------city error------------')
@ -154,19 +154,14 @@ def get_audience(value):
return ', '.join(new_list)
return ''
import types
def save_logo(obj, path):
if not path:
return None
file_name = path.split('/')[-1]
logo_path = obj.logo.field.upload_to
if isinstance(logo_path, types.FunctionType):
logo_path = logo_path(obj, obj.url)
logo_path = '/'.join(logo_path.split('/')[:-1])
full_path = settings.MEDIA_ROOT + logo_path
try:
alt_name = get_alternative_filename(full_path, file_name)
except UnicodeEncodeError:

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

@ -45,4 +45,16 @@ class MetaForm(forms.Form):
meta.save()
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 Meta:
model = SeoText
fields = ['url', 'title', 'body']
widgets = {'body':CKEditorWidget}

@ -113,4 +113,68 @@ class MetaSetting(TranslatableModel):
return []
post_save.connect(post_save_handler, sender=MetaSetting)
post_save.connect(post_save_handler, sender=MetaSetting)
# SEO - tests #
from django.db import models
from hvad.models import TranslatableModel, TranslatedFields
from django.conf import settings
from django.core.urlresolvers import reverse_lazy
from django.core.cache import cache
class SeoTextManager(TranslationManager):
cache_time = 120
def cache_get(self, *args, **kwargs):
url = kwargs.get('url',None)
lang = kwargs.get('lang')[:2] or translation.get_language()[:2]
key = 'seo_text_cache'
result = cache.get(key)
if result:
return result.get(lang+'_' + url)
qs = SeoText.objects.language('all')
value_dict = {obj.language_code+'_'+obj.url:obj for obj in qs}
cache.set(key, value_dict, self.cache_time)
return value_dict.get(lang+'_'+url)
class SeoText(TranslatableModel):
url = models.CharField(max_length=50, unique=True)
translations = TranslatedFields(
title=models.CharField(max_length=255),
body=models.TextField()
)
objects = SeoTextManager()
def get_absolute_url(self):
return reverse_lazy('seo_all')
def save(self, *args, **kwargs):
super(SeoText,self).save(*args, **kwargs)
all_field_names = list(self._translated_field_names)
clear_f_n = []
for field_name in all_field_names:
if field_name not in ['master', 'master_id', u'id', 'language_code']:
clear_f_n.append(field_name)
field_items = {field_name:getattr(self, field_name) for field_name in clear_f_n}
langs = [lan[0] for lan in settings.LANGUAGES]
for lang in langs:
if lang not in self.get_available_languages():
self.translate(lang)
for field in clear_f_n:
setattr(self, field, field_items.get(field, ''))
super(SeoText,self).save(*args, **kwargs)
return SeoText
def __unicode__(self):
return self.url

@ -187,4 +187,49 @@ class MetadataMixin(object):
site_name=self.get_meta_site_name(context=context),
)
return context
return context
from django.views.generic import CreateView, UpdateView, DeleteView, ListView
from .models import SeoText
from .forms import SeoTextForm
class CreateSeoText(CreateView):
form_class = SeoTextForm
model = SeoText
template_name = "admin/meta/create_seo_text.html"
success_url = '/admin/meta/seo/all/'
class SeoTextList(ListView):
model = SeoText
template_name = "admin/meta/seo_admin_list.html"
class EditSeoText(UpdateView):
form_class = SeoTextForm
model = SeoText
template_name = "admin/meta/create_seo_text.html"
class DeleteSeoText(DeleteView):
model = SeoText
template_name = "admin/meta/seo_confirm_delete.html"
success_url = '/admin/meta/seo/all/'

@ -12,6 +12,7 @@ urlpatterns = required(
url(r'^$', AdminIndex.as_view()),
url(r'^', include('import_xls.admin_urls')),
url(r'^accounts/', include('accounts.admin_urls')),
url(r'page/', include('core.admin_urls')),
url(r'^article/', include('article.admin_urls')),
url(r'^photogallery/', include('photologue.admin_urls')),
url(r'^city/', include('city.admin_urls')),

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

@ -22,7 +22,7 @@ DATABASES = {
'NAME': 'test2',
'USER': 'kotzilla',
'PASSWORD': 'qazedc',
'HOST': '195.66.79.152',
'HOST': '195.66.79.148',
'PORT': '',
}
}
@ -42,7 +42,7 @@ CACHES = {
# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
ALLOWED_HOSTS = ['hit.expomap.ru', '195.66.79.152', '195.66.79.145', 'expomap.ru']
ALLOWED_HOSTS = ['hit.expomap.ru', '195.66.79.152', '195.66.79.145', 'expomap.ru', '195.66.79.148']
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
@ -108,7 +108,7 @@ STATIC_URL = '/static/'
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
#'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
# Make this unique, and don't share it with anybody.
@ -173,6 +173,7 @@ TEMPLATE_DIRS = (
os.path.join(SITE_ROOT, 'templates/admin/organiser'),
os.path.join(SITE_ROOT, 'templates/admin/place_conference'),
os.path.join(SITE_ROOT, 'templates/admin/place_exposition'),
os.path.join(SITE_ROOT, 'templates/admin/page'),
os.path.join(SITE_ROOT, 'templates/admin/photoreport'),
os.path.join(SITE_ROOT, 'templates/admin/settings'),
os.path.join(SITE_ROOT, 'templates/admin/seminar'),
@ -198,12 +199,13 @@ EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False
EMAIL_USE_TLS = True
EMAIL_PORT = 25
DEFAULT_FROM_EMAIL = "expomap.ru"
AUTHENTICATION_BACKENDS = (
'social.backends.open_id.OpenIdAuth',
'social.backends.vk.VKOAuth2',
'social.backends.facebook.FacebookOAuth2',
'social.backends.twitter.TwitterOAuth',
@ -216,14 +218,31 @@ AUTHENTICATION_BACKENDS = (
SOCIAL_AUTH_LOGIN_URL = '/'
SOCIAL_AUTH_USER_MODEL = 'accounts.User'
#SOCIAL_AUTH_UID_LENGTH = <int>
#SOCIAL_AUTH_NONCE_SERVER_URL_LENGTH = <int>
#SOCIAL_AUTH_ASSOCIATION_SERVER_URL_LENGTH = <int>
#SOCIAL_AUTH_FORCE_EMAIL_VALIDATION = True
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/logged-in/'
# The user will be redirected to this URL when a social account is disconnected
SOCIAL_AUTH_INACTIVE_USER_URL = '/inactive-user/'
# #Used to redirect the user once the auth process ended successfully. The value of ?next=/foo is used if it was present
# SOCIAL_AUTH_LOGIN_ERROR_URL = '/login-error/'
# #URL where the user will be redirected in case of an error
# SOCIAL_AUTH_LOGIN_URL = '/login-url/'
# #Is used as a fallback for LOGIN_ERROR_URL
# SOCIAL_AUTH_NEW_USER_REDIRECT_URL = '/new-users-redirect-url/'
# # Used to redirect new registered users, will be used in place of SOCIAL_AUTH_LOGIN_REDIRECT_URL if defined.
# Note that ?next=/foo is appended if present, if you want new users to go to next, you’ll need to do it yourself.
# SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = '/new-association-redirect-url/'
# # Like SOCIAL_AUTH_NEW_USER_REDIRECT_URL but for new associated accounts (user is already logged in).
# Used in place of SOCIAL_AUTH_LOGIN_REDIRECT_URL
# SOCIAL_AUTH_DISCONNECT_REDIRECT_URL = '/account-disconnected-redirect-url/'
# Inactive users can be redirected to this URL when trying to authenticate.
# SOCIAL_AUTH_UID_LENGTH = <int>
# SOCIAL_AUTH_NONCE_SERVER_URL_LENGTH = <int>
# SOCIAL_AUTH_ASSOCIATION_SERVER_URL_LENGTH = <int>
# SOCIAL_AUTH_FORCE_EMAIL_VALIDATION = True
SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True
#SOCIAL_AUTH_STORAGE = 'social.apps.django_app.me.models.DjangoStorage'
from social.pipeline.social_auth import social_details
SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.social_details',
'social.pipeline.social_auth.social_uid',
@ -231,35 +250,53 @@ SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.auth_allowed',
'social.pipeline.social_auth.social_user',
'social.pipeline.user.get_username',
'functions.pipeline.require_email',
#'social.pipeline.mail.mail_validation',
'functions.pipeline.create_user',
#'social.pipeline.user.create_user',
'social.pipeline.social_auth.associate_by_email',
'social.pipeline.social_auth.associate_user',
'social.pipeline.social_auth.load_extra_data',
'social.pipeline.user.user_details'
)
REQUIRES_EMAIL_VALIDATION = True
SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = 'functions.pipeline.SendVerificationEmail'
SOCIAL_AUTH_EMAIL_VALIDATION_URL = '/email_verify_sent/'
SOCIAL_AUTH_VK_OAUTH2_KEY = '3393841'
SOCIAL_AUTH_VK_OAUTH2_SECRET = '2P19EBUEpLZifaabbREv'
SOCIAL_AUTH_VK_OAUTH2_SCOPE =['email']
SOCIAL_AUTH_VK_OAUTH2_PROFILE_EXTRA_PARAMS = {
'fields': 'email'
}
SOCIAL_AUTH_FACEBOOK_KEY = '133775720059470'
SOCIAL_AUTH_FACEBOOK_SECRET = '434edf89c24a290497646a739df656c6'
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', 'publish_actions']
SOCIAL_AUTH_TWITTER_KEY = 'S6NX33FazTcWuqnXQhlOdg'
SOCIAL_AUTH_TWITTER_SECRET = 'MxUGfySQmLI5kvqSoAtWsGje2eAHQL7Jo8mXuIZ4D0'
SOCIAL_AUTH_TWITTER_SCOPE = ['email']
SOCIAL_AUTH_GOOGLE_OAUTH_KEY = '1044044901114.apps.googleusercontent.com'
SOCIAL_AUTH_GOOGLE_OAUTH_SECRET = 'j_McErlPPof88eNrmOXI-ZXI'
SOCIAL_AUTH_GOOGLE_OAUTH_SCOPE = ['email']
SOCIAL_AUTH_MAILRU_OAUTH2_KEY = '697945'
SOCIAL_AUTH_MAILRU_OAUTH2_SECRET = '343581b9e31961b334532cc1880066e8'
SOCIAL_AUTH_MAILRU_OAUTH2_SCOPE = ['email']
SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_KEY = 'CBAQDCKIABABABABA'
SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_SECRET = '814CDDCD3E2D2F278EF1591B'
SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_PUBLIC_NAME = '128007936'
SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_PUBLIC_SCOPE = ['email']
SOCIAL_AUTH_LINKEDIN_KEY = 'jt9xwquj1fkd'
SOCIAL_AUTH_LINKEDIN_SECRET = 'GvM2xQCNADaBfiMy'
SOCIAL_AUTH_LINKEDIN_SCOPE = ['email']
@ -315,6 +352,7 @@ INSTALLED_APPS = (
'password_reset', # reset password
'django_crontab', # crons
'social.apps.django_app.default', # social auth
'core',
)
@ -361,6 +399,50 @@ LOGGING = {
},
}
}
"""
LOGGING ={
'version':1,
'disable_existing_loggers': True,
'formatters': {
'standart': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename':'/home/www/proj/logs/mylog.log',
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'standart',
},
'request_handler':{
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/home/www/proj/logs/django_request.log',
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'standart',
},
},
'loggers': {
'':{
'handlers':['default'],
'level': 'DEBUG',
'propagate': True
},
'django_request':{
'handlers': ['request_handler'],
'level': 'DEBUG',
'propagate': False
},
}
}
"""
CRONJOBS = [

@ -26,6 +26,8 @@ sitemaps = {
handler404 = 'proj.views.error404'
urlpatterns = patterns('',
url(r'^wizard/', include('wizard.urls')),
url(r'^acquire_email/$', 'registration.backends.default.views.acquire_email', name = 'acquire_email'),
url(r'^rss/', include('core.urls')),
#url(r'^__debug__/', include(debug_toolbar.urls)),
url(r'^sitemap-(?P<section>.+)\.xml$', views.sitemap, {'sitemaps': sitemaps}),
@ -38,7 +40,6 @@ urlpatterns = patterns('',
url(r'^page/', include('core.simple_urls')),
url(r'^theme/', include('theme.urls')),
url(r'^places/', include('place_exposition.urls')),
url(r'^translators/', include('translator.urls')),
url(r'^', include('accounts.urls')),
url(r'^', include('exposition.urls')),
url(r'^', include('settings.conference_old_urls')), # conference redirects from old version

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
from django.core.context_processors import csrf
from django.shortcuts import render_to_response
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.views.generic import TemplateView
from django.conf import settings
@ -14,24 +14,53 @@ from functions.forms import ThemeSearch, PlaceSearch
from functions.search_forms import EventSearchForm, ExpositionSearchForm
from functions.custom_views import ExpoListView
from accounts.forms import RegistrationCompleteForm
from accounts.forms import RegistrationCompleteForm, SocialRegistrationCompleteForm
from meta.models import SeoText
from django.utils.translation import get_language
def clear_slashes(str_):
if str_[0] == r'/':
str_ = str_[1:]
if str_[-1] == r'/':
str_ = str_[:-1]
return str_
def add_seo(request):
url = request.path
lang = get_language()
try:
seo_text = SeoText.objects.cache_get(url=url, lang=lang)
except SeoText.DoesNotExist:
try:
seo_text = SeoText.objects.cache_get(url=url[:-1], lang=lang)
except SeoText.DoesNotExist:
seo_text = None
return seo_text
def expo_context(request):
banners_themes = [24, 34, 4]
banner_tags = [141, 142, 143, 156, 206, 231, 232, 390, 391, 400, 457, 500, 536, 537, 539, 457, 500, 686, 715, 765, 766, 857, 927, 964, 971, 972, 987, 1009, 1010, 1021, 2508, 2509, 2516, 2518, 2536, 2568, 2583, 2585, 3811, 3940, 4130, 4192, 4236, 4512, 4841, 5353, 5532, 5854, 106, 107, 195, 380, 930, 931, 932, 3845, 3846, 3863, 3873, 4141, 4142, 4343, 4344, 4347, 211, 212, 277, 631]
banner_tags = [141, 142, 143, 156, 206, 231, 232, 390, 391, 400, 457, 500, 536, 537, 539, 457, 500, 686, 715, 765,
766, 857, 927, 964, 971, 972, 987, 1009, 1010, 1021, 2508, 2509, 2516, 2518, 2536, 2568, 2583, 2585,
3811, 3940, 4130, 4192, 4236, 4512, 4841, 5353, 5532, 5854, 106, 107, 195, 380, 930, 931, 932, 3845,
3846, 3863, 3873, 4141, 4142, 4343, 4344, 4347, 211, 212, 277, 631]
cont = {'theme_search_form': ThemeSearch(), 'expo_catalog': Exposition.catalog,
'book_aid': settings.BOOKING_AID, 'blogs': Article.objects.main_page_blogs(),
'news_list': Article.objects.main_page_news(), 'sng_countries': settings.SNG_COUNTRIES,
'banner_themes' : banners_themes, 'banner_tags' : banner_tags
'banner_themes': banners_themes, 'banner_tags': banner_tags, 'seo_text': add_seo(request)
}
user = request.user
if not user.is_anonymous() and not user.url:
cont.update({'reg_complete': RegistrationCompleteForm(instance=user)})
if not user.email:
cont.update({'reg_complete': SocialRegistrationCompleteForm(instance=user)})
else:
cont.update({'reg_complete': RegistrationCompleteForm(instance=user)})
if not request.GET:
cont.update({'search_form': ExpositionSearchForm()})
return cont
def error404(request):
context = {}
expo_themes = Theme.active.expo_themes_with_count()
@ -39,7 +68,8 @@ def error404(request):
context.update({'expo_themes': expo_themes, 'conf_themes': conf_themes})
return render_to_response('client/404.html', context, context_instance=RequestContext(request))
class MainPageView(JitterCacheMixin,TemplateView):
class MainPageView(JitterCacheMixin, TemplateView):
cache_range = settings.CACHE_RANGE
template_name = 'index.html'
@ -61,5 +91,6 @@ class MainPageView(JitterCacheMixin,TemplateView):
class AdvertisingView(TemplateView):
template_name = 'simple_pages/advertising.html'
class AboutView(TemplateView):
template_name = 'simple_pages/about.html'
template_name = 'simple_pages/about.html'

@ -8,7 +8,7 @@ from registration import signals
from registration.models import RegistrationProfile
from registration.views import ActivationView as BaseActivationView
from registration.views import RegistrationView as BaseRegistrationView
from django.views.generic import View
import json
@ -150,7 +150,7 @@ from django.http import HttpResponse, HttpResponseRedirect
from accounts.models import User
from registration.forms import RegistrationFormUniqueEmail
from django.contrib.auth import login, logout
from django.contrib.auth import login, logout, authenticate
from django.views.decorators.debug import sensitive_post_parameters
from django.views.decorators.cache import never_cache
@ -248,15 +248,29 @@ def LoginView(request):
else:
HttpResponseRedirect('/')
from accounts.forms import RegistrationCompleteForm, RecoveryForm
from accounts.forms import RegistrationCompleteForm, RecoveryForm, SocialRegistrationCompleteForm
from social.apps.django_app.default.models import UserSocialAuth
def complete_registration(request):
if request.is_ajax():
response = {'success': False}
form = RegistrationCompleteForm(request.POST, instance=request.user)
if request.POST.get('email'):
form = SocialRegistrationCompleteForm(request.POST, instance=request.user)
else:
form = RegistrationCompleteForm(request.POST, instance=request.user)
if form.is_valid():
user = form.save()
response['success']=True
response['redirect'] = user.get_permanent_url()
if user != request.user:
try:
social = UserSocialAuth.objects.get(user=request.user)
uid, provider = social.uid, social.provider
User.objects.get(id = request.user.id).delete()
user.social_auth.create(uid=uid, provider=provider)
except UserSocialAuth.DoesNotExist:
pass
response['success']= True
response['redirect'] = '/'
else:
response['errors'] = form.errors
return HttpResponse(json.dumps(response), content_type='application/json')
@ -264,6 +278,22 @@ def complete_registration(request):
else:
return HttpResponse('not ajax')
from django.shortcuts import render
def acquire_email(request, template_name="registration/acquire_email.html"):
"""
Request email for the create user flow for logins that don't specify their email address.
"""
backend = request.session['partial_pipeline']['backend']
return render(request, template_name, {"backend": backend})
def inactive_user_message(request):
return render(request, 'registration/social_registration_complete.html')
def pswd_recovery(request):
#if request.is_ajax():
response = {'success': False}

@ -13,9 +13,9 @@ urlpatterns = patterns('',
url(r'^serv-zaoch-info.php$', old_redirect, {'redirect_url': '/service/remote/'}),
url(r'^serv-visit-info.php$', old_redirect, {'redirect_url': '/service/visit/'}),
url(r'^serv-bilet-info.php$', old_redirect, {'redirect_url': '/service/tickets/'}),
url(r'^serv-translator-info.php$', old_redirect, {'redirect_url': '/translators/'}),
url(r'^content.php/coID/(?P<some>.*)/perevodchiki-(?P<country_or_city>.*)/$', old_redirect, {'redirect_url': '/translators/{country_or_city}/'}),
url(r'^content.php/coID/(?P<some>.*)/perevodchik-(?P<country_or_city>.*)/$', old_redirect, {'redirect_url': '/translators/{country_or_city}/'}),
url(r'^serv-translator-info.php$', old_redirect, {'redirect_url': '/service/translator/'}),
url(r'^content.php/coID/(?P<some>.*)/perevodchiki-(?P<some1>.*)/$', old_redirect, {'redirect_url': '/service/translator/'}),
url(r'^content.php/coID/(?P<some>.*)/perevodchiki-(?P<some1>.*)$', old_redirect, {'redirect_url': '/service/translator/'}),
url(r'^(?P<some>.*)/(?P<event>.*)/buildstand.html$', old_redirect, {'redirect_url': '{event_catalog}{event_url}/service/participation/'}),
url(r'^(?P<some>.*)/(?P<event>.*)/bilet.html$', old_redirect, {'redirect_url': '{event_catalog}{event_url}/service/tickets/'}),

@ -106,36 +106,11 @@ class News_p(object):
obj = get_object_or_404(Article, old_id=value)
return {key: obj.slug}
class Country_or_City(object):
def get_object_url(self,key, value):
try:
obj = Country.objects.get(old_url=value)
except Country.DoesNotExist:
try:
obj = Country.objects.filter(url=value)[0]
except IndexError:
obj = None
if not obj:
try:
obj = City.objects.get(old_url=value)
except City.DoesNotExist:
obj = get_object_or_404(City, url=value)
except City.MultipleObjectsReturned:
obj = City.objects.filter(old_url=value)[0]
if not obj:
raise Http404
if isinstance(obj, Country):
result = 'country/%s'%obj.url
elif isinstance(obj, City):
result = 'city/%s'%obj.url
return {key: result}
old_params = {'city': CityRedirect, 'country': CountryRedirect, 'theme': ThemeRedirect, 'tag': TagRedirect,
'event': EventRedirect, 'company': Company, 'article': ArticleRedirect, 'user': UserRedirect,
'page': PageRedirect, 'news_p': News_p, 'country_or_city': Country_or_City}
'page': PageRedirect, 'news_p': News_p}
def old_redirect(request, *args, **kwargs):

@ -10,6 +10,7 @@ from theme.models import Tag, Theme
from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference
from company.models import Company
import datetime
# every this model must have method get_subcategories
categories = {'area':{'sub':True, 'model':Area, 'sub_categorie_name':'co'},
@ -55,7 +56,7 @@ def search_autocomplete(request):
objects = [{'text': get_by_lang(item, 'name', lang), 'id':item.pk, 'name': item.form_name, 'cat': get_by_lang(item, 'parent', lang)} for item in SearchQuerySet().models(Theme, Tag).autocomplete(content_auto=term)]
return HttpResponse(json.dumps(objects), content_type='application/json')
else:
return HttpResponse("Don't implemented yet")
return HttpResponse("Doesn't implemented yet")
else:
@ -86,7 +87,10 @@ def get_by_lang(item, field, lang='en'):
:return:
"""
return getattr(item, field+'_'+lang)
import datetime
def expo_autosearch(request):
if request.GET:
lang = translation.get_language()
@ -105,6 +109,7 @@ def expo_autosearch(request):
else:
raise Http404
def place_autosearch(request):
if request.GET:
lang = translation.get_language()

@ -1,4 +1,4 @@
{% extends 'base.html' %}
{% extends 'base.html' %}
{% load static %}
{% block scripts %}
@ -23,8 +23,20 @@
}
});
return false;
});
$('#gen_pass').click(function(){
$('#id_new_password').val(generatePassword());
})
})
});
function generatePassword() {
var length = 8,
charset = "abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
retVal = "";
for (var i = 0, n = charset.length; i < length; ++i) {
retVal += charset.charAt(Math.floor(Math.random() * n));
}
return retVal;
}
</script>
<style>
.alert{
@ -120,6 +132,15 @@
<span class="help-inline">{{ form.position.errors }}</span>
</div>
</div>
{# position #}
<div class="control-group {% if form.new_password.errors %}error{% endif %}">
<label class="control-label">{{ form.new_password.label }}:</label>
<div class="controls">
{{ form.new_password }}
<a id="gen_pass" class="btn" href="javascript:void(0)">Generage password</a>
<span class="help-inline">{{ form.new_password.errors }}</span>
</div>
</div>
</div>
</div>
@ -161,11 +182,39 @@
</div>
</div>
{# social #}
<div class="control-group {% if form.social.errors %}error{% endif %}">
<label class="control-label">{{ form.social.label }}:</label>
<div class="control-group {% if form.skype.errors %}error{% endif %}">
<label class="control-label">{{ form.skype.label }}:</label>
<div class="controls">
{{ form.skype }}
<span class="help-inline">{{ form.skype.errors }}</span>
</div>
</div>
<div class="control-group {% if form.facebook.errors %}error{% endif %}">
<label class="control-label">{{ form.facebook.label }}:</label>
<div class="controls">
{{ form.facebook }}
<span class="help-inline">{{ form.facebook.errors }}</span>
</div>
</div>
<div class="control-group {% if form.linkedin.errors %}error{% endif %}">
<label class="control-label">{{ form.linkedin.label }}:</label>
<div class="controls">
{{ form.social }}
<span class="help-inline">{{ form.social.errors }}</span>
{{ form.linkedin }}
<span class="help-inline">{{ form.linkedin.errors }}</span>
</div>
</div>
<div class="control-group {% if form.twitter.errors %}error{% endif %}">
<label class="control-label">{{ form.twitter.label }}:</label>
<div class="controls">
{{ form.twitter }}
<span class="help-inline">{{ form.twitter.errors }}</span>
</div>
</div>
<div class="control-group {% if form.vk.errors %}error{% endif %}">
<label class="control-label">{{ form.vk.label }}:</label>
<div class="controls">
{{ form.vk }}
<span class="help-inline">{{ form.vk.errors }}</span>
</div>
</div>
{# company #}
@ -184,14 +233,7 @@
<span class="help-inline">{{ form.organiser.errors }}</span>
</div>
</div>
{# is_translator #}
<div class="control-group {% if form.is_translator.errors %}error{% endif %}">
<label class="control-label">{{ form.is_translator.label }}:</label>
<div class="controls">
{{ form.is_translator }}
<span class="help-inline">{{ form.is_translator.errors }}</span>
</div>
</div>
</div>
</div>
<div class="box span8">
@ -216,7 +258,7 @@
</div>
</div>
{# keywords #}
<d iv class="control-group {% if form.keywords.errors %}error{% endif %}">
<div class="control-group {% if form.keywords.errors %}error{% endif %}">
<label class="control-label">{{ form.keywords.label }}:</label>
<div class="controls">
{{ form.keywords }}
@ -227,7 +269,7 @@
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Добавить">
<input class="btn btn-large btn-primary" type="submit" value="Изменить">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</div>

@ -27,7 +27,6 @@
<th>Email</th>
<th>Полное имя</th>
<th>Админ</th>
<th>Переводчик</th>
<th>&nbsp;</th>
</tr>
</thead>
@ -43,12 +42,7 @@
{% else %}
<td>&nbsp;</td>
{% endif %}
{% if item.is_translator %}
<td>Да</td>
{% else %}
<td>&nbsp;</td>
{% endif %}
<td>&nbsp;</td>
<td class="center sorting_1">
<a class="btn btn-info" href="/admin/accounts/change/{% if item.url %}{{ item.url }}{% else %}{{ item.id }}{% endif %}">
<i class="icon-edit icon-white"></i> Изменить

@ -62,26 +62,6 @@
{% endfor %}
{% endif %}
{% if import_errors %}
<div id="import_errors">
<table class="table table-hover">
<thead>
<tr>
<th>Событие</th>
<th>Ошибка</th>
</tr>
</thead>
<tbody>
{% for error in import_errors %}
<tr>
<td>{{ error.0 }}</td>
<td>{{ error.1 }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
<script>
$(document).ready(function(){
setTimeout(function(){
@ -90,5 +70,4 @@
});
</script>
{% endblock %}

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

@ -0,0 +1,54 @@
{% extends 'base.html' %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список seo-текстов</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>Аддрес страници</th>
<th>Заголовок</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td><a href = "{{ item.url }}/">{{ item.url }}</a></td>
<td>{{ item.title }}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href='{% url "seo_edit" item.id %}'>
Изменить
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href='{% url "seo_delete" item.id %}'>
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href='{% url "seo_new" %}'>
<i class="icon-plus-sign icon-white"></i> Добавить seo-текст </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>Вы точно хотите удалить seo-текст "{{ object.title }}" для страницы <a href = "{{ object.url }}"></a> ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'seo_all' %}>Нет</a>
</div>
</form>
{% endblock %}

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

@ -0,0 +1,58 @@
{% extends 'base.html' %}
{% 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>{{ item.title }}</td>
<td>{{ item.h1 }}</td>
<td><a href = "/admin/page/{{ item.url }}/">{{ item.url }}</a></td>
<td> {{ item.created|date:"Y-m-d H:i" }}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href="/admin/page/edit/{{ item.url }}">
Изменить
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href="/admin/page/delete/{{ item.url }}/">
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="/admin/page/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 }}"?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'page_list' %}>Нет</a>
</div>
</form>
{% endblock %}

@ -28,7 +28,6 @@
<th>id</th>
<th>Пользователь</th>
<th>Страна</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
@ -37,8 +36,8 @@
<tr>
<td>{{ item.id }}</td>
{% for u in item.user.all %}
<td>{{ u }}</td>
<td>{{ u.country }}</td>
<td>{{ u.get_full_name }}</td>
<td>{{ u.profile.country.name }}</td>
{% endfor %}
<td class="center sorting_1">

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

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

@ -98,12 +98,10 @@
{% endblock %}
</div>
{% block content_text %}
{% comment %}
{% with filter=filter %}
{% include 'includes/event_list_description.html' %}
{% endwith %}
{% endcomment %}
{% block seo_text_ %}
{% if seo_text %}
{% include 'client/includes/seo_text.html' with object=seo_text %}
{% endif %}
{% endblock %}
{% endblock %}

@ -0,0 +1,113 @@
{% extends 'blank.html' %}
{% load static %}
{% load i18n %}
{% load template_filters %}
{% block main_part %}
<section class="layout main-part">
<div class="layout-wrap">
<aside>
<div class="sbg"></div>
{% include 'menu.html' %}
<hr/>
{% include 'client/includes/feedback.html' %}
<hr />
{% include 'client/includes/online_consult.html' %}
{% block aside_banner1 %}
{% if theme_for_filter.id == 27 or theme_for_filter.id == 9 or theme_for_filter.id == 48 %}
<div class="sbnr">
<div class="sbnr-wrap">
<a href="/redirect/redirect/11/" target="_blank">
<img src="{% static 'client/img/partners/ipsa_.gif' %}" alt="" />
</a>
</div>
</div>
{% endif %}
{% endblock %}
{% include 'client/includes/services.html' %}
<hr />
{% include 'client/includes/announces.html' %}
{% block asside_banner2 %}
<!-- task EXPO-145-->
{% comment %}
<div class="sbnr">
<div class="sbnr-wrap">
<a href="/redirect/redirect/11/">
<img src="{% static 'client/img/partners/imgo.jpg' %}" alt="" />
</a>
</div>
</div>
{% endcomment %}
{% endblock %}
{% include 'client/includes/side_confs.html' %}
<hr />
<div class="s-news-list">
{% include 'client/includes/news.html' with news=news_list %}
</div>
{% block aside_vk %}
<div class="vk-widget">
{% include 'client/includes/social_widjet.html' %}
</div>
{% endblock %}
</aside>
<div class="mcl">
{% with search_form=search_form %}
{% include 'client/includes/catalog_search.html' %}
{% endwith %}
{% block under_search_baner %}
{% include 'client/includes/banners/under_search.html' %}
{% endblock %}
{% block bread_scrumbs %}
{% endblock %}
<div class="page-title">
{% block page_title %}
{% endblock %}
</div>
{% block page_filter %}
{% endblock %}
{% block page_body %}
<div class="page-body clearfix">
{% block content_list %}
{% endblock %}
{% block paginator %}
{% endblock %}
{% block content_footer_banner %}
{% endblock %}
</div>
{% block content_text %}
{% comment %}
{% with filter=filter %}
{% include 'includes/event_list_description.html' %}
{% endwith %}
{% endcomment %}
{% endblock %}
{% endblock %}
</div>
</div>
</section>
{% endblock %}

@ -158,14 +158,16 @@ This template include basic anf main styles and js files,
{% include 'client/popups/callback.html' %}
{# if user doesnt have url- show form #}
{% if 'partial_pipeline' not in request.session %}
{% include 'client/popups/acquire_email.html' %}
{% endif %}
{% if not request.user.is_anonymous %}
{% if not request.user.url %}
{% include 'client/popups/user_information.html' with form=reg_complete %}
{% if request.GET.debug == '1' %}
<script src="{% static 'client/js/_modules/block.registration.completion.js' %}"></script>
{% else %}
<script src="{% static 'client/js_min/_modules/block.registration.completion.min.js' %}"></script>
<script type="text/javascript" src="{% static 'client/js_min/_modules/block.registration.completion.min.js' %}"></script>
{% endif %}
{% endif %}
{% endif %}

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

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

@ -0,0 +1,24 @@
{% load static %}
{% load i18n %}
<div id="acq_email" class="popup-window pw-login">
<header class="clearfix">
<div class="pw-title">{% trans 'Введите email' %}</div>
</header>
<div class="pw-body clearfix">
{# <form method="post" id="log_form" class="pw-form validate" enctype="application/x-www-form-urlencoded" action="{% url "social:complete" backend=backend %}">{% csrf_token %}#}
{# <div class="pwf-line">#}
{# <div class="pwf-field">#}
{# <input id="id_email" name="email" placeholder="{% trans 'Ваш адрес электронной почты' %}" type="text">#}
{# </div>#}
{# <div class="pwf-msg err-message-box"></div>#}
{# </div>#}
{# <div class="pwf-buttons-line">#}
{# <div class="pwf-field">#}
{# <button type="submit" class="icon-check">{% trans 'Подтвердить' %}</button>#}
{# </div>#}
{##}
{# </div>#}
{# </form>#}
</div>
</div>

@ -10,79 +10,90 @@
<div class="pw-body clearfix after-register-modal">
<form id="end-reg-form" class="pw-form validate" action="/register-complete/" method="post">{% csrf_token %}
<ul class="end_reg_list">
<li class="input_top">
<div class="pwf-line">
<div class="pwf-field">
<li class="input_top">
<div class="pwf-line">
<div class="pwf-field">
{{ form.email }}
</div>
<div class="pwf-msg err-message-box"></div>
</div>
</li>
<li class="input_top">
<div class="pwf-line">
<div class="pwf-field">
<select class="select2" id="id_country" name="country">
{% with countries=form.country.field.queryset %}
{% for country in countries %}
<option value="{{ country.id }}" data-phone-code="{% if country.phone_code %}{{ country.phone_code }}{% endif %}" >{{ country.name }}</option>
<option value="{{ country.id }}" data-phone-code="
{% if country.phone_code %}{{ country.phone_code }}{% endif %}">{{ country.name }}</option>
{% endfor %}
{% endwith %}
</select>
</div>
<div class="pwf-msg err-message-box"></div>
</div>
</div>
<div class="pwf-msg err-message-box"></div>
</div>
</li>
<li class="input_top">
<div class="pwf-line">
<div class="pwf-field">
{{ form.city }}
</div>
<div class="pwf-msg err-message-box"></div>
</div>
<div class="pwf-line">
<div class="pwf-field">
{{ form.city }}
</div>
<div class="pwf-msg err-message-box"></div>
</div>
</li>
<li>
<table>
<tr>
<th>{% trans 'Номер телефона' %}</th>
<table>
<tr>
<th>{% trans 'Номер телефона' %}</th>
<td class="width1">
<div class="pwf-line phone">
<div class="pwf-field">
{{ form.code_country }}
<p class="label">{{ form.code_country.label }}</p>
<div class="pwf-msg err-message-box"></div>
</div>
</div>
<div class="pwf-line phone">
<div class="pwf-field">
{{ form.code_country }}
<p class="label">{{ form.code_country.label }}</p>
<div class="pwf-msg err-message-box"></div>
</div>
</div>
</td>
<td class="width2">
<div class="pwf-line phone">
<div class="pwf-field">
{{ form.code_city }}
<p class="label">{{ form.code_city.label }}</p>
<div class="pwf-msg err-message-box"></div>
</div>
<div class="pwf-line phone">
<div class="pwf-field">
{{ form.code_city }}
<p class="label">{{ form.code_city.label }}</p>
<div class="pwf-msg err-message-box"></div>
</div>
</div>
</div>
</td>
<td class="width3">
<div class="pwf-line phone">
<div class="pwf-field">
{{ form.phone }}
<p class="label">{{ form.phone.label }}</p>
<div class="pwf-msg err-message-box"></div>
</div>
</div>
<div class="pwf-line phone">
<div class="pwf-field">
{{ form.phone }}
<p class="label">{{ form.phone.label }}</p>
<div class="pwf-msg err-message-box"></div>
</div>
</div>
</td>
</tr>
<tr>
<th>www.expomap.ru/</th>
<th>www.expomap.ru/</th>
<td class="input_bottom" colspan="3">
<div class="pwf-line">
<div class="pwf-field url-field">
{{ form.url }}
</div>
<div class="hint-box">ivanova</div>
<div class="pwf-msg err-message-box"></div>
</div>
<div class="pwf-line">
<div class="pwf-field url-field">
{{ form.url }}
</div>
<div class="hint-box">ivanova</div>
<div class="pwf-msg err-message-box"></div>
</div>
</td>
</tr>

@ -0,0 +1,274 @@
/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
.fancybox-wrap,
.fancybox-skin,
.fancybox-outer,
.fancybox-inner,
.fancybox-image,
.fancybox-wrap iframe,
.fancybox-wrap object,
.fancybox-nav,
.fancybox-nav span,
.fancybox-tmp
{
padding: 0;
margin: 0;
border: 0;
outline: none;
vertical-align: top;
}
.fancybox-wrap {
position: absolute;
top: 0;
left: 0;
z-index: 8020;
}
.fancybox-skin {
position: relative;
background: #f9f9f9;
color: #444;
text-shadow: none;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.fancybox-opened {
z-index: 8030;
}
.fancybox-opened .fancybox-skin {
-webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
}
.fancybox-outer, .fancybox-inner {
position: relative;
}
.fancybox-inner {
overflow: hidden;
}
.fancybox-type-iframe .fancybox-inner {
-webkit-overflow-scrolling: touch;
}
.fancybox-error {
color: #444;
font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
margin: 0;
padding: 15px;
white-space: nowrap;
}
.fancybox-image, .fancybox-iframe {
display: block;
width: 100%;
height: 100%;
}
.fancybox-image {
max-width: 100%;
max-height: 100%;
}
#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
background-image: url('../img/fancybox/fancybox_sprite.png');
}
#fancybox-loading {
position: fixed;
top: 50%;
left: 50%;
margin-top: -22px;
margin-left: -22px;
background-position: 0 -108px;
opacity: 0.8;
cursor: pointer;
z-index: 8060;
}
#fancybox-loading div {
width: 44px;
height: 44px;
background: url('../img/fancybox/fancybox_loading.gif') center center no-repeat;
}
.fancybox-close {
position: absolute;
top: -18px;
right: -18px;
width: 36px;
height: 36px;
cursor: pointer;
z-index: 8040;
}
.fancybox-nav {
position: absolute;
top: 0;
width: 40%;
height: 100%;
cursor: pointer;
text-decoration: none;
background: transparent url('../img/fancybox/blank.gif'); /* helps IE */
-webkit-tap-highlight-color: rgba(0,0,0,0);
z-index: 8040;
}
.fancybox-prev {
left: 0;
}
.fancybox-next {
right: 0;
}
.fancybox-nav span {
position: absolute;
top: 50%;
width: 36px;
height: 34px;
margin-top: -18px;
cursor: pointer;
z-index: 8040;
visibility: hidden;
}
.fancybox-prev span {
left: 10px;
background-position: 0 -36px;
}
.fancybox-next span {
right: 10px;
background-position: 0 -72px;
}
.fancybox-nav:hover span {
visibility: visible;
}
.fancybox-tmp {
position: absolute;
top: -99999px;
left: -99999px;
visibility: hidden;
max-width: 99999px;
max-height: 99999px;
overflow: visible !important;
}
/* Overlay helper */
.fancybox-lock {
overflow: hidden !important;
width: auto;
}
.fancybox-lock body {
overflow: hidden !important;
}
.fancybox-lock-test {
overflow-y: hidden !important;
}
.fancybox-overlay {
position: absolute;
top: 0;
left: 0;
overflow: hidden;
display: none;
z-index: 8010;
background: url('../img/fancybox/fancybox_overlay.png');
}
.fancybox-overlay-fixed {
position: fixed;
bottom: 0;
right: 0;
}
.fancybox-lock .fancybox-overlay {
overflow: auto;
overflow-y: scroll;
}
/* Title helper */
.fancybox-title {
visibility: hidden;
font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
position: relative;
text-shadow: none;
z-index: 8050;
}
.fancybox-opened .fancybox-title {
visibility: visible;
}
.fancybox-title-float-wrap {
position: absolute;
bottom: 0;
right: 50%;
margin-bottom: -35px;
z-index: 8050;
text-align: center;
}
.fancybox-title-float-wrap .child {
display: inline-block;
margin-right: -100%;
padding: 2px 20px;
background: transparent; /* Fallback for web browsers that doesn't support RGBa */
background: rgba(0, 0, 0, 0.8);
-webkit-border-radius: 15px;
-moz-border-radius: 15px;
border-radius: 15px;
text-shadow: 0 1px 2px #222;
color: #FFF;
font-weight: bold;
line-height: 24px;
white-space: nowrap;
}
.fancybox-title-outside-wrap {
position: relative;
margin-top: 10px;
color: #fff;
}
.fancybox-title-inside-wrap {
padding-top: 10px;
}
.fancybox-title-over-wrap {
position: absolute;
bottom: 0;
left: 0;
color: #fff;
padding: 10px;
background: #000;
background: rgba(0, 0, 0, .8);
}
/*Retina graphics!*/
@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
only screen and (min--moz-device-pixel-ratio: 1.5),
only screen and (min-device-pixel-ratio: 1.5){
#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
background-image: url('../img/fancybox/fancybox_sprite@2x.png');
background-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/
}
#fancybox-loading div {
background-image: url('../img/fancybox/fancybox_loading@2x.gif');
background-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/
}
}

@ -0,0 +1,46 @@
/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
(function(r,G,f,v){var J=f("html"),n=f(r),p=f(G),b=f.fancybox=function(){b.open.apply(this,arguments)},I=navigator.userAgent.match(/msie/i),B=null,s=G.createTouch!==v,t=function(a){return a&&a.hasOwnProperty&&a instanceof f},q=function(a){return a&&"string"===f.type(a)},E=function(a){return q(a)&&0<a.indexOf("%")},l=function(a,d){var e=parseInt(a,10)||0;d&&E(a)&&(e*=b.getViewport()[d]/100);return Math.ceil(e)},w=function(a,b){return l(a,b)+"px"};f.extend(b,{version:"2.1.5",defaults:{padding:15,margin:20,
width:800,height:600,minWidth:100,minHeight:100,maxWidth:9999,maxHeight:9999,pixelRatio:1,autoSize:!0,autoHeight:!1,autoWidth:!1,autoResize:!0,autoCenter:!s,fitToView:!0,aspectRatio:!1,topRatio:0.5,leftRatio:0.5,scrolling:"auto",wrapCSS:"",arrows:!0,closeBtn:!0,closeClick:!1,nextClick:!1,mouseWheel:!0,autoPlay:!1,playSpeed:3E3,preload:3,modal:!1,loop:!0,ajax:{dataType:"html",headers:{"X-fancyBox":!0}},iframe:{scrolling:"auto",preload:!0},swf:{wmode:"transparent",allowfullscreen:"true",allowscriptaccess:"always"},
keys:{next:{13:"left",34:"up",39:"left",40:"up"},prev:{8:"right",33:"down",37:"right",38:"down"},close:[27],play:[32],toggle:[70]},direction:{next:"left",prev:"right"},scrollOutside:!0,index:0,type:null,href:null,content:null,title:null,tpl:{wrap:'<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',image:'<img class="fancybox-image" src="{href}" alt="" />',iframe:'<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen'+
(I?' allowtransparency="true"':"")+"></iframe>",error:'<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',closeBtn:'<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>',next:'<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>',prev:'<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>'},openEffect:"fade",openSpeed:250,openEasing:"swing",openOpacity:!0,
openMethod:"zoomIn",closeEffect:"fade",closeSpeed:250,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:250,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic",prevSpeed:250,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:!0,title:!0},onCancel:f.noop,beforeLoad:f.noop,afterLoad:f.noop,beforeShow:f.noop,afterShow:f.noop,beforeChange:f.noop,beforeClose:f.noop,afterClose:f.noop},group:{},opts:{},previous:null,coming:null,current:null,isActive:!1,
isOpen:!1,isOpened:!1,wrap:null,skin:null,outer:null,inner:null,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(a,d){if(a&&(f.isPlainObject(d)||(d={}),!1!==b.close(!0)))return f.isArray(a)||(a=t(a)?f(a).get():[a]),f.each(a,function(e,c){var k={},g,h,j,m,l;"object"===f.type(c)&&(c.nodeType&&(c=f(c)),t(c)?(k={href:c.data("fancybox-href")||c.attr("href"),title:c.data("fancybox-title")||c.attr("title"),isDom:!0,element:c},f.metadata&&f.extend(!0,k,
c.metadata())):k=c);g=d.href||k.href||(q(c)?c:null);h=d.title!==v?d.title:k.title||"";m=(j=d.content||k.content)?"html":d.type||k.type;!m&&k.isDom&&(m=c.data("fancybox-type"),m||(m=(m=c.prop("class").match(/fancybox\.(\w+)/))?m[1]:null));q(g)&&(m||(b.isImage(g)?m="image":b.isSWF(g)?m="swf":"#"===g.charAt(0)?m="inline":q(c)&&(m="html",j=c)),"ajax"===m&&(l=g.split(/\s+/,2),g=l.shift(),l=l.shift()));j||("inline"===m?g?j=f(q(g)?g.replace(/.*(?=#[^\s]+$)/,""):g):k.isDom&&(j=c):"html"===m?j=g:!m&&(!g&&
k.isDom)&&(m="inline",j=c));f.extend(k,{href:g,type:m,content:j,title:h,selector:l});a[e]=k}),b.opts=f.extend(!0,{},b.defaults,d),d.keys!==v&&(b.opts.keys=d.keys?f.extend({},b.defaults.keys,d.keys):!1),b.group=a,b._start(b.opts.index)},cancel:function(){var a=b.coming;a&&!1!==b.trigger("onCancel")&&(b.hideLoading(),b.ajaxLoad&&b.ajaxLoad.abort(),b.ajaxLoad=null,b.imgPreload&&(b.imgPreload.onload=b.imgPreload.onerror=null),a.wrap&&a.wrap.stop(!0,!0).trigger("onReset").remove(),b.coming=null,b.current||
b._afterZoomOut(a))},close:function(a){b.cancel();!1!==b.trigger("beforeClose")&&(b.unbindEvents(),b.isActive&&(!b.isOpen||!0===a?(f(".fancybox-wrap").stop(!0).trigger("onReset").remove(),b._afterZoomOut()):(b.isOpen=b.isOpened=!1,b.isClosing=!0,f(".fancybox-item, .fancybox-nav").remove(),b.wrap.stop(!0,!0).removeClass("fancybox-opened"),b.transitions[b.current.closeMethod]())))},play:function(a){var d=function(){clearTimeout(b.player.timer)},e=function(){d();b.current&&b.player.isActive&&(b.player.timer=
setTimeout(b.next,b.current.playSpeed))},c=function(){d();p.unbind(".player");b.player.isActive=!1;b.trigger("onPlayEnd")};if(!0===a||!b.player.isActive&&!1!==a){if(b.current&&(b.current.loop||b.current.index<b.group.length-1))b.player.isActive=!0,p.bind({"onCancel.player beforeClose.player":c,"onUpdate.player":e,"beforeLoad.player":d}),e(),b.trigger("onPlayStart")}else c()},next:function(a){var d=b.current;d&&(q(a)||(a=d.direction.next),b.jumpto(d.index+1,a,"next"))},prev:function(a){var d=b.current;
d&&(q(a)||(a=d.direction.prev),b.jumpto(d.index-1,a,"prev"))},jumpto:function(a,d,e){var c=b.current;c&&(a=l(a),b.direction=d||c.direction[a>=c.index?"next":"prev"],b.router=e||"jumpto",c.loop&&(0>a&&(a=c.group.length+a%c.group.length),a%=c.group.length),c.group[a]!==v&&(b.cancel(),b._start(a)))},reposition:function(a,d){var e=b.current,c=e?e.wrap:null,k;c&&(k=b._getPosition(d),a&&"scroll"===a.type?(delete k.position,c.stop(!0,!0).animate(k,200)):(c.css(k),e.pos=f.extend({},e.dim,k)))},update:function(a){var d=
a&&a.type,e=!d||"orientationchange"===d;e&&(clearTimeout(B),B=null);b.isOpen&&!B&&(B=setTimeout(function(){var c=b.current;c&&!b.isClosing&&(b.wrap.removeClass("fancybox-tmp"),(e||"load"===d||"resize"===d&&c.autoResize)&&b._setDimension(),"scroll"===d&&c.canShrink||b.reposition(a),b.trigger("onUpdate"),B=null)},e&&!s?0:300))},toggle:function(a){b.isOpen&&(b.current.fitToView="boolean"===f.type(a)?a:!b.current.fitToView,s&&(b.wrap.removeAttr("style").addClass("fancybox-tmp"),b.trigger("onUpdate")),
b.update())},hideLoading:function(){p.unbind(".loading");f("#fancybox-loading").remove()},showLoading:function(){var a,d;b.hideLoading();a=f('<div id="fancybox-loading"><div></div></div>').click(b.cancel).appendTo("body");p.bind("keydown.loading",function(a){if(27===(a.which||a.keyCode))a.preventDefault(),b.cancel()});b.defaults.fixed||(d=b.getViewport(),a.css({position:"absolute",top:0.5*d.h+d.y,left:0.5*d.w+d.x}))},getViewport:function(){var a=b.current&&b.current.locked||!1,d={x:n.scrollLeft(),
y:n.scrollTop()};a?(d.w=a[0].clientWidth,d.h=a[0].clientHeight):(d.w=s&&r.innerWidth?r.innerWidth:n.width(),d.h=s&&r.innerHeight?r.innerHeight:n.height());return d},unbindEvents:function(){b.wrap&&t(b.wrap)&&b.wrap.unbind(".fb");p.unbind(".fb");n.unbind(".fb")},bindEvents:function(){var a=b.current,d;a&&(n.bind("orientationchange.fb"+(s?"":" resize.fb")+(a.autoCenter&&!a.locked?" scroll.fb":""),b.update),(d=a.keys)&&p.bind("keydown.fb",function(e){var c=e.which||e.keyCode,k=e.target||e.srcElement;
if(27===c&&b.coming)return!1;!e.ctrlKey&&(!e.altKey&&!e.shiftKey&&!e.metaKey&&(!k||!k.type&&!f(k).is("[contenteditable]")))&&f.each(d,function(d,k){if(1<a.group.length&&k[c]!==v)return b[d](k[c]),e.preventDefault(),!1;if(-1<f.inArray(c,k))return b[d](),e.preventDefault(),!1})}),f.fn.mousewheel&&a.mouseWheel&&b.wrap.bind("mousewheel.fb",function(d,c,k,g){for(var h=f(d.target||null),j=!1;h.length&&!j&&!h.is(".fancybox-skin")&&!h.is(".fancybox-wrap");)j=h[0]&&!(h[0].style.overflow&&"hidden"===h[0].style.overflow)&&
(h[0].clientWidth&&h[0].scrollWidth>h[0].clientWidth||h[0].clientHeight&&h[0].scrollHeight>h[0].clientHeight),h=f(h).parent();if(0!==c&&!j&&1<b.group.length&&!a.canShrink){if(0<g||0<k)b.prev(0<g?"down":"left");else if(0>g||0>k)b.next(0>g?"up":"right");d.preventDefault()}}))},trigger:function(a,d){var e,c=d||b.coming||b.current;if(c){f.isFunction(c[a])&&(e=c[a].apply(c,Array.prototype.slice.call(arguments,1)));if(!1===e)return!1;c.helpers&&f.each(c.helpers,function(d,e){if(e&&b.helpers[d]&&f.isFunction(b.helpers[d][a]))b.helpers[d][a](f.extend(!0,
{},b.helpers[d].defaults,e),c)});p.trigger(a)}},isImage:function(a){return q(a)&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)},isSWF:function(a){return q(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(a){var d={},e,c;a=l(a);e=b.group[a]||null;if(!e)return!1;d=f.extend(!0,{},b.opts,e);e=d.margin;c=d.padding;"number"===f.type(e)&&(d.margin=[e,e,e,e]);"number"===f.type(c)&&(d.padding=[c,c,c,c]);d.modal&&f.extend(!0,d,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,
mouseWheel:!1,keys:null,helpers:{overlay:{closeClick:!1}}});d.autoSize&&(d.autoWidth=d.autoHeight=!0);"auto"===d.width&&(d.autoWidth=!0);"auto"===d.height&&(d.autoHeight=!0);d.group=b.group;d.index=a;b.coming=d;if(!1===b.trigger("beforeLoad"))b.coming=null;else{c=d.type;e=d.href;if(!c)return b.coming=null,b.current&&b.router&&"jumpto"!==b.router?(b.current.index=a,b[b.router](b.direction)):!1;b.isActive=!0;if("image"===c||"swf"===c)d.autoHeight=d.autoWidth=!1,d.scrolling="visible";"image"===c&&(d.aspectRatio=
!0);"iframe"===c&&s&&(d.scrolling="scroll");d.wrap=f(d.tpl.wrap).addClass("fancybox-"+(s?"mobile":"desktop")+" fancybox-type-"+c+" fancybox-tmp "+d.wrapCSS).appendTo(d.parent||"body");f.extend(d,{skin:f(".fancybox-skin",d.wrap),outer:f(".fancybox-outer",d.wrap),inner:f(".fancybox-inner",d.wrap)});f.each(["Top","Right","Bottom","Left"],function(a,b){d.skin.css("padding"+b,w(d.padding[a]))});b.trigger("onReady");if("inline"===c||"html"===c){if(!d.content||!d.content.length)return b._error("content")}else if(!e)return b._error("href");
"image"===c?b._loadImage():"ajax"===c?b._loadAjax():"iframe"===c?b._loadIframe():b._afterLoad()}},_error:function(a){f.extend(b.coming,{type:"html",autoWidth:!0,autoHeight:!0,minWidth:0,minHeight:0,scrolling:"no",hasError:a,content:b.coming.tpl.error});b._afterLoad()},_loadImage:function(){var a=b.imgPreload=new Image;a.onload=function(){this.onload=this.onerror=null;b.coming.width=this.width/b.opts.pixelRatio;b.coming.height=this.height/b.opts.pixelRatio;b._afterLoad()};a.onerror=function(){this.onload=
this.onerror=null;b._error("image")};a.src=b.coming.href;!0!==a.complete&&b.showLoading()},_loadAjax:function(){var a=b.coming;b.showLoading();b.ajaxLoad=f.ajax(f.extend({},a.ajax,{url:a.href,error:function(a,e){b.coming&&"abort"!==e?b._error("ajax",a):b.hideLoading()},success:function(d,e){"success"===e&&(a.content=d,b._afterLoad())}}))},_loadIframe:function(){var a=b.coming,d=f(a.tpl.iframe.replace(/\{rnd\}/g,(new Date).getTime())).attr("scrolling",s?"auto":a.iframe.scrolling).attr("src",a.href);
f(a.wrap).bind("onReset",function(){try{f(this).find("iframe").hide().attr("src","//about:blank").end().empty()}catch(a){}});a.iframe.preload&&(b.showLoading(),d.one("load",function(){f(this).data("ready",1);s||f(this).bind("load.fb",b.update);f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();b._afterLoad()}));a.content=d.appendTo(a.inner);a.iframe.preload||b._afterLoad()},_preloadImages:function(){var a=b.group,d=b.current,e=a.length,c=d.preload?Math.min(d.preload,
e-1):0,f,g;for(g=1;g<=c;g+=1)f=a[(d.index+g)%e],"image"===f.type&&f.href&&((new Image).src=f.href)},_afterLoad:function(){var a=b.coming,d=b.current,e,c,k,g,h;b.hideLoading();if(a&&!1!==b.isActive)if(!1===b.trigger("afterLoad",a,d))a.wrap.stop(!0).trigger("onReset").remove(),b.coming=null;else{d&&(b.trigger("beforeChange",d),d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove());b.unbindEvents();e=a.content;c=a.type;k=a.scrolling;f.extend(b,{wrap:a.wrap,skin:a.skin,
outer:a.outer,inner:a.inner,current:a,previous:d});g=a.href;switch(c){case "inline":case "ajax":case "html":a.selector?e=f("<div>").html(e).find(a.selector):t(e)&&(e.data("fancybox-placeholder")||e.data("fancybox-placeholder",f('<div class="fancybox-placeholder"></div>').insertAfter(e).hide()),e=e.show().detach(),a.wrap.bind("onReset",function(){f(this).find(e).length&&e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder",!1)}));break;case "image":e=a.tpl.image.replace("{href}",
g);break;case "swf":e='<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="'+g+'"></param>',h="",f.each(a.swf,function(a,b){e+='<param name="'+a+'" value="'+b+'"></param>';h+=" "+a+'="'+b+'"'}),e+='<embed src="'+g+'" type="application/x-shockwave-flash" width="100%" height="100%"'+h+"></embed></object>"}(!t(e)||!e.parent().is(a.inner))&&a.inner.append(e);b.trigger("beforeShow");a.inner.css("overflow","yes"===k?"scroll":
"no"===k?"hidden":k);b._setDimension();b.reposition();b.isOpen=!1;b.coming=null;b.bindEvents();if(b.isOpened){if(d.prevMethod)b.transitions[d.prevMethod]()}else f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();b.transitions[b.isOpened?a.nextMethod:a.openMethod]();b._preloadImages()}},_setDimension:function(){var a=b.getViewport(),d=0,e=!1,c=!1,e=b.wrap,k=b.skin,g=b.inner,h=b.current,c=h.width,j=h.height,m=h.minWidth,u=h.minHeight,n=h.maxWidth,p=h.maxHeight,s=h.scrolling,q=h.scrollOutside?
h.scrollbarWidth:0,x=h.margin,y=l(x[1]+x[3]),r=l(x[0]+x[2]),v,z,t,C,A,F,B,D,H;e.add(k).add(g).width("auto").height("auto").removeClass("fancybox-tmp");x=l(k.outerWidth(!0)-k.width());v=l(k.outerHeight(!0)-k.height());z=y+x;t=r+v;C=E(c)?(a.w-z)*l(c)/100:c;A=E(j)?(a.h-t)*l(j)/100:j;if("iframe"===h.type){if(H=h.content,h.autoHeight&&1===H.data("ready"))try{H[0].contentWindow.document.location&&(g.width(C).height(9999),F=H.contents().find("body"),q&&F.css("overflow-x","hidden"),A=F.outerHeight(!0))}catch(G){}}else if(h.autoWidth||
h.autoHeight)g.addClass("fancybox-tmp"),h.autoWidth||g.width(C),h.autoHeight||g.height(A),h.autoWidth&&(C=g.width()),h.autoHeight&&(A=g.height()),g.removeClass("fancybox-tmp");c=l(C);j=l(A);D=C/A;m=l(E(m)?l(m,"w")-z:m);n=l(E(n)?l(n,"w")-z:n);u=l(E(u)?l(u,"h")-t:u);p=l(E(p)?l(p,"h")-t:p);F=n;B=p;h.fitToView&&(n=Math.min(a.w-z,n),p=Math.min(a.h-t,p));z=a.w-y;r=a.h-r;h.aspectRatio?(c>n&&(c=n,j=l(c/D)),j>p&&(j=p,c=l(j*D)),c<m&&(c=m,j=l(c/D)),j<u&&(j=u,c=l(j*D))):(c=Math.max(m,Math.min(c,n)),h.autoHeight&&
"iframe"!==h.type&&(g.width(c),j=g.height()),j=Math.max(u,Math.min(j,p)));if(h.fitToView)if(g.width(c).height(j),e.width(c+x),a=e.width(),y=e.height(),h.aspectRatio)for(;(a>z||y>r)&&(c>m&&j>u)&&!(19<d++);)j=Math.max(u,Math.min(p,j-10)),c=l(j*D),c<m&&(c=m,j=l(c/D)),c>n&&(c=n,j=l(c/D)),g.width(c).height(j),e.width(c+x),a=e.width(),y=e.height();else c=Math.max(m,Math.min(c,c-(a-z))),j=Math.max(u,Math.min(j,j-(y-r)));q&&("auto"===s&&j<A&&c+x+q<z)&&(c+=q);g.width(c).height(j);e.width(c+x);a=e.width();
y=e.height();e=(a>z||y>r)&&c>m&&j>u;c=h.aspectRatio?c<F&&j<B&&c<C&&j<A:(c<F||j<B)&&(c<C||j<A);f.extend(h,{dim:{width:w(a),height:w(y)},origWidth:C,origHeight:A,canShrink:e,canExpand:c,wPadding:x,hPadding:v,wrapSpace:y-k.outerHeight(!0),skinSpace:k.height()-j});!H&&(h.autoHeight&&j>u&&j<p&&!c)&&g.height("auto")},_getPosition:function(a){var d=b.current,e=b.getViewport(),c=d.margin,f=b.wrap.width()+c[1]+c[3],g=b.wrap.height()+c[0]+c[2],c={position:"absolute",top:c[0],left:c[3]};d.autoCenter&&d.fixed&&
!a&&g<=e.h&&f<=e.w?c.position="fixed":d.locked||(c.top+=e.y,c.left+=e.x);c.top=w(Math.max(c.top,c.top+(e.h-g)*d.topRatio));c.left=w(Math.max(c.left,c.left+(e.w-f)*d.leftRatio));return c},_afterZoomIn:function(){var a=b.current;a&&(b.isOpen=b.isOpened=!0,b.wrap.css("overflow","visible").addClass("fancybox-opened"),b.update(),(a.closeClick||a.nextClick&&1<b.group.length)&&b.inner.css("cursor","pointer").bind("click.fb",function(d){!f(d.target).is("a")&&!f(d.target).parent().is("a")&&(d.preventDefault(),
b[a.closeClick?"close":"next"]())}),a.closeBtn&&f(a.tpl.closeBtn).appendTo(b.skin).bind("click.fb",function(a){a.preventDefault();b.close()}),a.arrows&&1<b.group.length&&((a.loop||0<a.index)&&f(a.tpl.prev).appendTo(b.outer).bind("click.fb",b.prev),(a.loop||a.index<b.group.length-1)&&f(a.tpl.next).appendTo(b.outer).bind("click.fb",b.next)),b.trigger("afterShow"),!a.loop&&a.index===a.group.length-1?b.play(!1):b.opts.autoPlay&&!b.player.isActive&&(b.opts.autoPlay=!1,b.play()))},_afterZoomOut:function(a){a=
a||b.current;f(".fancybox-wrap").trigger("onReset").remove();f.extend(b,{group:{},opts:{},router:!1,current:null,isActive:!1,isOpened:!1,isOpen:!1,isClosing:!1,wrap:null,skin:null,outer:null,inner:null});b.trigger("afterClose",a)}});b.transitions={getOrigPosition:function(){var a=b.current,d=a.element,e=a.orig,c={},f=50,g=50,h=a.hPadding,j=a.wPadding,m=b.getViewport();!e&&(a.isDom&&d.is(":visible"))&&(e=d.find("img:first"),e.length||(e=d));t(e)?(c=e.offset(),e.is("img")&&(f=e.outerWidth(),g=e.outerHeight())):
(c.top=m.y+(m.h-g)*a.topRatio,c.left=m.x+(m.w-f)*a.leftRatio);if("fixed"===b.wrap.css("position")||a.locked)c.top-=m.y,c.left-=m.x;return c={top:w(c.top-h*a.topRatio),left:w(c.left-j*a.leftRatio),width:w(f+j),height:w(g+h)}},step:function(a,d){var e,c,f=d.prop;c=b.current;var g=c.wrapSpace,h=c.skinSpace;if("width"===f||"height"===f)e=d.end===d.start?1:(a-d.start)/(d.end-d.start),b.isClosing&&(e=1-e),c="width"===f?c.wPadding:c.hPadding,c=a-c,b.skin[f](l("width"===f?c:c-g*e)),b.inner[f](l("width"===
f?c:c-g*e-h*e))},zoomIn:function(){var a=b.current,d=a.pos,e=a.openEffect,c="elastic"===e,k=f.extend({opacity:1},d);delete k.position;c?(d=this.getOrigPosition(),a.openOpacity&&(d.opacity=0.1)):"fade"===e&&(d.opacity=0.1);b.wrap.css(d).animate(k,{duration:"none"===e?0:a.openSpeed,easing:a.openEasing,step:c?this.step:null,complete:b._afterZoomIn})},zoomOut:function(){var a=b.current,d=a.closeEffect,e="elastic"===d,c={opacity:0.1};e&&(c=this.getOrigPosition(),a.closeOpacity&&(c.opacity=0.1));b.wrap.animate(c,
{duration:"none"===d?0:a.closeSpeed,easing:a.closeEasing,step:e?this.step:null,complete:b._afterZoomOut})},changeIn:function(){var a=b.current,d=a.nextEffect,e=a.pos,c={opacity:1},f=b.direction,g;e.opacity=0.1;"elastic"===d&&(g="down"===f||"up"===f?"top":"left","down"===f||"right"===f?(e[g]=w(l(e[g])-200),c[g]="+=200px"):(e[g]=w(l(e[g])+200),c[g]="-=200px"));"none"===d?b._afterZoomIn():b.wrap.css(e).animate(c,{duration:a.nextSpeed,easing:a.nextEasing,complete:b._afterZoomIn})},changeOut:function(){var a=
b.previous,d=a.prevEffect,e={opacity:0.1},c=b.direction;"elastic"===d&&(e["down"===c||"up"===c?"top":"left"]=("up"===c||"left"===c?"-":"+")+"=200px");a.wrap.animate(e,{duration:"none"===d?0:a.prevSpeed,easing:a.prevEasing,complete:function(){f(this).trigger("onReset").remove()}})}};b.helpers.overlay={defaults:{closeClick:!0,speedOut:200,showEarly:!0,css:{},locked:!s,fixed:!0},overlay:null,fixed:!1,el:f("html"),create:function(a){a=f.extend({},this.defaults,a);this.overlay&&this.close();this.overlay=
f('<div class="fancybox-overlay"></div>').appendTo(b.coming?b.coming.parent:a.parent);this.fixed=!1;a.fixed&&b.defaults.fixed&&(this.overlay.addClass("fancybox-overlay-fixed"),this.fixed=!0)},open:function(a){var d=this;a=f.extend({},this.defaults,a);this.overlay?this.overlay.unbind(".overlay").width("auto").height("auto"):this.create(a);this.fixed||(n.bind("resize.overlay",f.proxy(this.update,this)),this.update());a.closeClick&&this.overlay.bind("click.overlay",function(a){if(f(a.target).hasClass("fancybox-overlay"))return b.isActive?
b.close():d.close(),!1});this.overlay.css(a.css).show()},close:function(){var a,b;n.unbind("resize.overlay");this.el.hasClass("fancybox-lock")&&(f(".fancybox-margin").removeClass("fancybox-margin"),a=n.scrollTop(),b=n.scrollLeft(),this.el.removeClass("fancybox-lock"),n.scrollTop(a).scrollLeft(b));f(".fancybox-overlay").remove().hide();f.extend(this,{overlay:null,fixed:!1})},update:function(){var a="100%",b;this.overlay.width(a).height("100%");I?(b=Math.max(G.documentElement.offsetWidth,G.body.offsetWidth),
p.width()>b&&(a=p.width())):p.width()>n.width()&&(a=p.width());this.overlay.width(a).height(p.height())},onReady:function(a,b){var e=this.overlay;f(".fancybox-overlay").stop(!0,!0);e||this.create(a);a.locked&&(this.fixed&&b.fixed)&&(e||(this.margin=p.height()>n.height()?f("html").css("margin-right").replace("px",""):!1),b.locked=this.overlay.append(b.wrap),b.fixed=!1);!0===a.showEarly&&this.beforeShow.apply(this,arguments)},beforeShow:function(a,b){var e,c;b.locked&&(!1!==this.margin&&(f("*").filter(function(){return"fixed"===
f(this).css("position")&&!f(this).hasClass("fancybox-overlay")&&!f(this).hasClass("fancybox-wrap")}).addClass("fancybox-margin"),this.el.addClass("fancybox-margin")),e=n.scrollTop(),c=n.scrollLeft(),this.el.addClass("fancybox-lock"),n.scrollTop(e).scrollLeft(c));this.open(a)},onUpdate:function(){this.fixed||this.update()},afterClose:function(a){this.overlay&&!b.coming&&this.overlay.fadeOut(a.speedOut,f.proxy(this.close,this))}};b.helpers.title={defaults:{type:"float",position:"bottom"},beforeShow:function(a){var d=
b.current,e=d.title,c=a.type;f.isFunction(e)&&(e=e.call(d.element,d));if(q(e)&&""!==f.trim(e)){d=f('<div class="fancybox-title fancybox-title-'+c+'-wrap">'+e+"</div>");switch(c){case "inside":c=b.skin;break;case "outside":c=b.wrap;break;case "over":c=b.inner;break;default:c=b.skin,d.appendTo("body"),I&&d.width(d.width()),d.wrapInner('<span class="child"></span>'),b.current.margin[2]+=Math.abs(l(d.css("margin-bottom")))}d["top"===a.position?"prependTo":"appendTo"](c)}}};f.fn.fancybox=function(a){var d,
e=f(this),c=this.selector||"",k=function(g){var h=f(this).blur(),j=d,k,l;!g.ctrlKey&&(!g.altKey&&!g.shiftKey&&!g.metaKey)&&!h.is(".fancybox-wrap")&&(k=a.groupAttr||"data-fancybox-group",l=h.attr(k),l||(k="rel",l=h.get(0)[k]),l&&(""!==l&&"nofollow"!==l)&&(h=c.length?f(c):e,h=h.filter("["+k+'="'+l+'"]'),j=h.index(this)),a.index=j,!1!==b.open(h,a)&&g.preventDefault())};a=a||{};d=a.index||0;!c||!1===a.live?e.unbind("click.fb-start").bind("click.fb-start",k):p.undelegate(c,"click.fb-start").delegate(c+
":not('.fancybox-item, .fancybox-nav')","click.fb-start",k);this.filter("[data-fancybox-start=1]").trigger("click");return this};p.ready(function(){var a,d;f.scrollbarWidth===v&&(f.scrollbarWidth=function(){var a=f('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo("body"),b=a.children(),b=b.innerWidth()-b.height(99).innerWidth();a.remove();return b});if(f.support.fixedPosition===v){a=f.support;d=f('<div style="position:fixed;top:20px;"></div>').appendTo("body");var e=20===
d[0].offsetTop||15===d[0].offsetTop;d.remove();a.fixedPosition=e}f.extend(b.defaults,{scrollbarWidth:f.scrollbarWidth(),fixed:f.support.fixedPosition,parent:f("body")});a=f(r).width();J.addClass("fancybox-lock-test");d=f(r).width();J.removeClass("fancybox-lock-test");f("<style type='text/css'>.fancybox-margin{margin-right:"+(d-a)+"px;}</style>").appendTo("head")})})(window,document,jQuery);

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

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

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

@ -0,0 +1 @@
{{form_data}}

@ -0,0 +1,27 @@
{% extends "client/base_page.html" %}
{% block title %}Email confirmation{% endblock %}
{% block page_body %}
<h1>Enter your email</h1>
{% if form.errors %}
<p class="error">Please correct the errors below:</p>
{% endif %}
<form class="form-inline" action="{% url "social:complete" backend=backend %}" method="post" role="form">{% csrf_token %}
<div class="form-group">
<div class="input-group">
<label class="control-label" for="id_email">Email address:</label>
<input class="form-control" id="id_email" type="email" name="email" placeholder="E-mail"/>
{# <input type="hidden" name="valid" value="no">#}
</div>
</div>
<button class="btn btn-default" type="submit">Submit</button>
</form>
{% endblock %}
{% block content-related %}
<p>Please enter your valid email, to activate account we will send you an email on this e-mail address</p>
{% endblock %}

@ -0,0 +1,8 @@
{% extends "client/base_page.html" %}
{% block title %}Registration complete{% endblock %}
{% block page_body %}
<h1>Check your email</h1>
<p>An activation link has been sent to the email address you supplied, along with instructions for activating your account.</p>
{% endblock %}

@ -0,0 +1,65 @@
# -*- coding: utf-8 -*-
from django import forms
from theme.models import Theme, Tag
from place_exposition.models import PlaceExposition
from city.models import City
from country.models import Country
choices = ((0, ''), (1.0, u'Ежегодно'), (2.0, u'2 раза в год'), (3.0, u'3 раза в год'), (4.0, u'4 раза в год'),
(5.0, u'5 раз в год'), (0.5, u'Раз в 2 года'), (
0.33, u'Раз в 3 года'), (0.25, u'Раз в 4 года'))
class ExpoForm1(forms.Form):
"""
main information about exposition
"""
theme = forms.ModelChoiceField(queryset=Theme.objects.filter(id=50))
tag = forms.ModelChoiceField(queryset=Tag.objects.filter(id=50))
name = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Введите название выставки"}))
main_title = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Краткое описание выставки (необязательно)"}))
description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Полное описание выставки", 'cols':30, 'rows':10}))
date_start = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateFrom', 'placeholder':'дд.мм.гг'}))
date_end = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateTo','placeholder':'дд.мм.гг'}))
country = forms.ModelChoiceField(queryset=Country.objects.filter(id=50))
city = forms.ModelChoiceField(queryset=City.objects.language('ru').filter(id=900052419))
place = forms.ModelChoiceField(queryset=PlaceExposition.objects.filter(id=50))
audience1 = forms.BooleanField(required=False)
audience2 = forms.BooleanField(required=False)
audience3 = forms.BooleanField(required=False)
periodic = forms.ChoiceField(choices=choices)
membership1= forms.BooleanField(required=False)
membership2= forms.BooleanField(required=False)
membership3= forms.BooleanField(required=False)
web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"}))
products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10}))
time_start = forms.TimeField()
time_end = forms.TimeField()
logo = forms.ImageField(widget=forms.FileInput(attrs={'class':"button big icon-clip"}), required=False)
class ExpoForm2(forms.Form):
"""
statistics
"""
found_year = forms.IntegerField()
statistic_year = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'введите год'}))
visitors = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'количество посетителей'}))
partisipants = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'количество учасников'}))
square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'площадь'}))
countries = forms.ModelChoiceField(queryset=Country.objects.filter(id=50))
# ticket price
pre_one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'}))
pre_all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'}))
one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'}))
all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'}))
# rent price
equiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'оборудованная площадь'}))
unequiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'необорудованная площадь'}))
open_square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'открытая площадь'}))
min_square = forms.FloatField()
registration_depos = forms.FloatField()
deadline_date = forms.DateField(widget=forms.TextInput(attrs={'placeholder':'дд.мм.гг'}))

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

@ -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 @@
from django.conf.urls import patterns
from wizard.forms import ExpoForm1, ExpoForm2
from wizard.views import ExpoWizard
urlpatterns = patterns('',
(r'^$', ExpoWizard.as_view([ExpoForm1, ExpoForm2]))
)

@ -0,0 +1,89 @@
from django.shortcuts import render_to_response
from django.contrib.formtools.wizard.views import SessionWizardView
from django.core.files.storage import default_storage, FileSystemStorage
import os
from proj import settings
from wizard import forms
from exposition.models import Exposition, Statistic
from functions.form_check import translit_with_separator
# defining different template for every form
TEMPLATES = {'0':'client/wizard/first_step.html', '1':'client/wizard/second_step.html'}
class ExpoWizard(SessionWizardView):
location=os.path.join(settings.MEDIA_ROOT, 'temp', 'files')
file_storage = FileSystemStorage(location, settings.MEDIA_URL)
def done(self, form_list, **kwargs):
upload_file = form_list[0].cleaned_data['logo']
data = self.get_all_cleaned_data()
expo = Exposition.objects.language('ru').create(
name = data.get('name'),
data_begin = data.get('date_start'),
data_end = data.get('date_end'),
main_title = data.get('main_title'),
description = data.get('description'),
products = data.get('products'),
country = data.get('country', 1),
city = data.get('city', 1),
place = data.get('place', 1),
periodic = data.get('periodic'),
web_page = data.get('web_site'),
logo = data.get('logo'),
foundation_year = data.get('found_year'),
area = data.get('square'),
price_day = '%i %s'%(data.get('one_day'), self.request.POST['oneDayCurrency1']),
price_all = '%i %s'%(data.get('all_days'), self.request.POST['allDaysCurrency1']),
price_day_bar = '%i %s'%(data.get('pre_one_day'),self.request.POST['oneDayCurrency1']),
price_all_bar = '%i %s'%(data.get('pre_all_days'),self.request.POST['allDaysCurrency1']),
min_area = data.get('min_square'),
registration_payment = data.get('registration_depos'),
application_deadline = data.get('deadline_date'),
min_closed_area = data.get('unequiped'),
min_open_area = data.get('open_square'),
min_closed_equipped_area = data.get('equiped'),
url = translit_with_separator(data.get('name')),
quality_label= 0,
audience = 0
)
expo.tag = [data.get('tag')]
expo.theme = [data.get('theme')]
if data['membership1']:
expo.quality_label = (expo.quality_label| Exposition.quality_label.exporating)
if data['membership2']:
expo.quality_label = (expo.quality_label| Exposition.quality_label.rsva)
if data['membership3']:
expo.quality_label = (expo.quality_label| Exposition.quality_label.ufi)
if data['audience1']:
expo.audience = (expo.audience | Exposition.audience.experts)
if data['audience2']:
expo.audience = expo.audience | getattr(Exposition.audience, 'experts and consumers')
if data['audience3']:
expo.audience = expo.audience | (getattr(Exposition.audience, 'general public'))
expo.save()
Statistic.objects.language().create(
exposition = expo,
year = data.get('statistic_year'),
visitors = data.get('visitors'),
members = data.get('partisipants'),
countries = data.get('countries'),
area = data.get('square')
)
if upload_file:
self.file_storage.delete(upload_file.name)
return render_to_response('done.html', {
'form_data': [form.cleaned_data for form in form_list],
})
def get_template_names(self):
return [TEMPLATES[self.steps.current]]
Loading…
Cancel
Save