commit
4bf1894e80
84 changed files with 10853 additions and 1719 deletions
@ -1,10 +1,10 @@ |
|||||||
from django.conf.urls import url, patterns |
from django.conf.urls import url, patterns |
||||||
from views import NewPage, PageList, EditPage, DeletePage, PageDetailed |
from views import NewPage, PageList, EditPage, DeletePage, PageDetailed |
||||||
|
|
||||||
urlpatterns = patterns('', |
urlpatterns = patterns('', |
||||||
url(r'^new/$', NewPage.as_view(), name='new_page' ), |
url(r'^new/$', NewPage.as_view(), name='new_page' ), |
||||||
url(r'^all/$', PageList.as_view(), name = 'page_list'), |
url(r'^all/$', PageList.as_view(), name = 'page_list'), |
||||||
url(r'^edit/(?P<url>.*)/$', EditPage.as_view(), name='edit_page'), |
url(r'^edit/(?P<url>.*)/$', EditPage.as_view(), name='edit_page'), |
||||||
url(r'^delete/(?P<url>.*)/$', DeletePage.as_view(), name='delete_page'), |
url(r'^delete/(?P<url>.*)/$', DeletePage.as_view(), name='delete_page'), |
||||||
url(r'^(?P<url>.*)/$', PageDetailed.as_view(), name='page_view'), |
url(r'^(?P<url>.*)/$', PageDetailed.as_view(), name='page_view'), |
||||||
) |
) |
||||||
|
|||||||
@ -1,79 +1,79 @@ |
|||||||
# -*- coding: utf-8 -* |
# -*- coding: utf-8 -* |
||||||
from datetime import date |
from datetime import date |
||||||
from random import choice, shuffle |
from random import choice, shuffle |
||||||
from django.db import models |
from django.db import models |
||||||
from django.db.models import Q |
from django.db.models import Q |
||||||
from django.core.cache import cache |
from django.core.cache import cache |
||||||
|
|
||||||
|
|
||||||
class BiasedManager(models.Manager): |
class BiasedManager(models.Manager): |
||||||
def by_time(self, **kwargs): |
def by_time(self, **kwargs): |
||||||
all = super(BiasedManager, self).get_query_set().filter(**kwargs) |
all = super(BiasedManager, self).get_query_set().filter(**kwargs) |
||||||
result = [] |
result = [] |
||||||
for i in all: |
for i in all: |
||||||
for j in range(i.often): |
for j in range(i.often): |
||||||
result.append(i) |
result.append(i) |
||||||
return result |
return result |
||||||
|
|
||||||
def one(self, **kwargs): |
def one(self, **kwargs): |
||||||
return choice(self.by_time(**kwargs)) |
return choice(self.by_time(**kwargs)) |
||||||
|
|
||||||
def by_often(self, **kwargs): |
def by_often(self, **kwargs): |
||||||
result = self.by_time(**kwargs) |
result = self.by_time(**kwargs) |
||||||
shuffle(result) |
shuffle(result) |
||||||
return result |
return result |
||||||
|
|
||||||
def create_for_paid(self, expo, url, role): |
def create_for_paid(self, expo, url, role): |
||||||
try: |
try: |
||||||
name = str(expo.name) |
name = str(expo.name) |
||||||
except UnicodeEncodeError, UnicodeDecodeError: |
except UnicodeEncodeError, UnicodeDecodeError: |
||||||
name = expo.url |
name = expo.url |
||||||
|
|
||||||
alt = u'%s_%s'%(name, role) |
alt = u'%s_%s'%(name, role) |
||||||
return self.create(alt=alt, url=url, paid=True) |
return self.create(alt=alt, url=url, paid=True) |
||||||
|
|
||||||
class BannerGroupCached(models.Manager): |
class BannerGroupCached(models.Manager): |
||||||
def all(self): |
def all(self): |
||||||
key = 'banner_group_all' |
key = 'banner_group_all' |
||||||
result = cache.get(key) |
result = cache.get(key) |
||||||
if not result: |
if not result: |
||||||
result = list(self.filter(public=True)) |
result = list(self.filter(public=True)) |
||||||
cache.set(key, result, 90) |
cache.set(key, result, 90) |
||||||
return result |
return result |
||||||
|
|
||||||
def group_banners(self): |
def group_banners(self): |
||||||
key = 'banner_group_banners' |
key = 'banner_group_banners' |
||||||
result = cache.get(key) |
result = cache.get(key) |
||||||
if not result: |
if not result: |
||||||
groups = self.all() |
groups = self.all() |
||||||
today = date.today() |
today = date.today() |
||||||
result = {} |
result = {} |
||||||
for group in groups: |
for group in groups: |
||||||
result[group.slug] = list(group.banners.prefetch_related('urls', 'theme', 'country')\ |
result[group.slug] = list(group.banners.prefetch_related('urls', 'theme', 'country')\ |
||||||
.filter(public=True, fr__lte=today)\ |
.filter(public=True, fr__lte=today)\ |
||||||
.filter(Q(to__gte=today) | Q(to__isnull=True))) |
.filter(Q(to__gte=today) | Q(to__isnull=True))) |
||||||
cache.set(key, result, 70) |
cache.set(key, result, 70) |
||||||
|
|
||||||
return result |
return result |
||||||
|
|
||||||
|
|
||||||
class URLCached(models.Manager): |
class URLCached(models.Manager): |
||||||
def all(self): |
def all(self): |
||||||
key = 'banner_url_all' |
key = 'banner_url_all' |
||||||
result = cache.get(key) |
result = cache.get(key) |
||||||
if not result: |
if not result: |
||||||
result = list(self.filter(public=True)) |
result = list(self.filter(public=True)) |
||||||
cache.set(key, result, 150) |
cache.set(key, result, 150) |
||||||
return result |
return result |
||||||
|
|
||||||
class TopCached(models.Manager): |
class TopCached(models.Manager): |
||||||
def all(self): |
def all(self): |
||||||
key = 'expo_b_top_all' |
key = 'expo_b_top_all' |
||||||
result = cache.get(key) |
result = cache.get(key) |
||||||
if not result: |
if not result: |
||||||
today = date.today() |
today = date.today() |
||||||
result = list(self.prefetch_related('theme', 'country', 'excluded_tags', 'excluded_cities'). |
result = list(self.prefetch_related('theme', 'country', 'excluded_tags', 'excluded_cities'). |
||||||
filter(fr__lte=today).filter(Q(to__gte=today) | Q(to__isnull=True))) |
filter(fr__lte=today).filter(Q(to__gte=today) | Q(to__isnull=True))) |
||||||
cache.set(key, result, 80) |
cache.set(key, result, 80) |
||||||
|
|
||||||
return result |
return result |
||||||
@ -1,323 +1,328 @@ |
|||||||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||||||
import random |
import random |
||||||
import hashlib |
import hashlib |
||||||
from datetime import datetime, date |
from datetime import datetime, date |
||||||
from django.db import models |
from django.db import models |
||||||
from django.utils.translation import ugettext_lazy as _ |
from django.utils.translation import ugettext_lazy as _ |
||||||
from django.conf import settings |
from django.conf import settings |
||||||
from django.contrib.sites.models import Site |
from django.contrib.sites.models import Site |
||||||
from django.db.models.signals import post_save |
from django.db.models.signals import post_save |
||||||
from .managers import BiasedManager, BannerGroupCached, URLCached, TopCached |
from .managers import BiasedManager, BannerGroupCached, URLCached, TopCached |
||||||
from .mixins import StatMixin |
from .mixins import StatMixin |
||||||
from theme.models import Theme |
from theme.models import Theme |
||||||
from country.models import Country |
from country.models import Country |
||||||
|
|
||||||
|
|
||||||
class URL(models.Model): |
class URL(models.Model): |
||||||
title = models.CharField(verbose_name=u'Заголовок', max_length=256) |
title = models.CharField(verbose_name=u'Заголовок', max_length=256) |
||||||
url = models.CharField(verbose_name=u'URL or URL RegEx', max_length=2048) |
url = models.CharField(verbose_name=u'URL or URL RegEx', max_length=2048) |
||||||
regex = models.BooleanField(verbose_name=u'RegEx', default=False) |
regex = models.BooleanField(verbose_name=u'RegEx', default=False) |
||||||
sites = models.ManyToManyField(Site, related_name='site_urls', verbose_name=_('Sites'), null=True, blank=True) |
sites = models.ManyToManyField(Site, related_name='site_urls', verbose_name=_('Sites'), null=True, blank=True) |
||||||
|
|
||||||
public = models.BooleanField(verbose_name=u'Активный', default=True) |
public = models.BooleanField(verbose_name=u'Активный', default=True) |
||||||
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
||||||
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
||||||
|
|
||||||
objects = models.Manager() |
objects = models.Manager() |
||||||
cached = URLCached() |
cached = URLCached() |
||||||
|
|
||||||
def __unicode__(self): |
def __unicode__(self): |
||||||
return self.title |
return self.title |
||||||
|
|
||||||
class Meta: |
class Meta: |
||||||
ordering = ['-created_at'] |
ordering = ['-created_at'] |
||||||
verbose_name = _('URL') |
verbose_name = _('URL') |
||||||
verbose_name_plural = _('URLs') |
verbose_name_plural = _('URLs') |
||||||
|
|
||||||
def get_admin_url(self): |
def get_admin_url(self): |
||||||
return '/admin/expobanners/banners/url/%d/edit/'%self.id |
return '/admin/expobanners/banners/url/%d/edit/'%self.id |
||||||
|
|
||||||
|
|
||||||
class BannerGroup (models.Model): |
class BannerGroup (models.Model): |
||||||
name = models.CharField(verbose_name=u'Имя', max_length=255) |
name = models.CharField(verbose_name=u'Имя', max_length=255) |
||||||
slug = models.SlugField(verbose_name=u'URL', unique=True) |
slug = models.SlugField(verbose_name=u'URL', unique=True) |
||||||
width = models.PositiveSmallIntegerField(verbose_name=u'Ширина', default=0) |
width = models.PositiveSmallIntegerField(verbose_name=u'Ширина', default=0) |
||||||
height = models.PositiveSmallIntegerField(verbose_name=u'Высота', default=0) |
height = models.PositiveSmallIntegerField(verbose_name=u'Высота', default=0) |
||||||
speed = models.PositiveSmallIntegerField(verbose_name=u'Скорость отображения', default=2000) |
speed = models.PositiveSmallIntegerField(verbose_name=u'Скорость отображения', default=2000) |
||||||
|
|
||||||
public = models.BooleanField(verbose_name=u'Активная', default=True) |
public = models.BooleanField(verbose_name=u'Активная', default=True) |
||||||
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
||||||
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
||||||
|
|
||||||
objects = models.Manager() |
objects = models.Manager() |
||||||
cached = BannerGroupCached() |
cached = BannerGroupCached() |
||||||
|
|
||||||
def size(self): |
def size(self): |
||||||
return '%sx%s' % (self.width, self.height) |
return '%sx%s' % (self.width, self.height) |
||||||
|
|
||||||
def __unicode__(self): |
def __unicode__(self): |
||||||
return '%s - [%s x %s]' % (self.name, self.width, self.height) |
return '%s - [%s x %s]' % (self.name, self.width, self.height) |
||||||
|
|
||||||
class Meta: |
class Meta: |
||||||
ordering = ['name'] |
ordering = ['name'] |
||||||
verbose_name = _('Banner Group') |
verbose_name = _('Banner Group') |
||||||
verbose_name_plural = _('Banner Groups') |
verbose_name_plural = _('Banner Groups') |
||||||
|
|
||||||
def get_admin_url(self): |
def get_admin_url(self): |
||||||
return '/admin/expobanners/banners/group/%d/edit/'%self.id |
return '/admin/expobanners/banners/group/%d/edit/'%self.id |
||||||
|
|
||||||
|
|
||||||
class Banner(models.Model, StatMixin): |
class Banner(models.Model, StatMixin): |
||||||
objects = BiasedManager() |
objects = BiasedManager() |
||||||
|
|
||||||
title = models.CharField(verbose_name=u'Заголовок', max_length=255, blank=True) |
title = models.CharField(verbose_name=u'Заголовок', max_length=255, blank=True) |
||||||
alt = models.CharField(verbose_name=_('Alt'), max_length=255) |
alt = models.CharField(verbose_name=_('Alt'), max_length=255) |
||||||
|
|
||||||
text = models.TextField(verbose_name=u'Текст', blank=True, null=True) |
text = models.TextField(verbose_name=u'Текст', blank=True, null=True) |
||||||
img = models.FileField(verbose_name=u'Картинка', upload_to='expo_upload', blank=True, null=True) |
img = models.FileField(verbose_name=u'Картинка', upload_to='expo_upload', blank=True, null=True) |
||||||
url = models.CharField(verbose_name=u'URL', max_length=1024) |
url = models.CharField(verbose_name=u'URL', max_length=1024) |
||||||
fr = models.DateField(default=date.today()) |
fr = models.DateField(default=date.today()) |
||||||
to = models.DateField(blank=True, null=True) |
to = models.DateField(blank=True, null=True) |
||||||
|
|
||||||
theme = models.ManyToManyField(Theme, blank=True, null=True, verbose_name=u'Тематика') |
theme = models.ManyToManyField(Theme, blank=True, null=True, verbose_name=u'Тематика') |
||||||
country = models.ManyToManyField(Country, blank=True, null=True, verbose_name=u'Страна') |
country = models.ManyToManyField(Country, blank=True, null=True, verbose_name=u'Страна') |
||||||
|
|
||||||
sort = models.PositiveSmallIntegerField(verbose_name=u'Сорт', default=500) |
sort = models.PositiveSmallIntegerField(verbose_name=u'Сорт', default=500) |
||||||
|
|
||||||
group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=u'Место', null=True, blank=True) |
group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=u'Место', null=True, blank=True) |
||||||
often = models.PositiveSmallIntegerField( |
often = models.PositiveSmallIntegerField( |
||||||
verbose_name=_('Often'), |
verbose_name=_('Often'), |
||||||
help_text=_('A ten will display 10 times more often that a one.'), |
help_text=_('A ten will display 10 times more often that a one.'), |
||||||
choices=[[i, i] for i in range(11)], |
choices=[[i, i] for i in range(11)], |
||||||
default=1 |
default=1 |
||||||
) |
) |
||||||
urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True) |
urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True) |
||||||
|
|
||||||
html = models.BooleanField(verbose_name=_('HTML?'), default=False) |
html = models.BooleanField(verbose_name=_('HTML?'), default=False) |
||||||
flash = models.BooleanField(verbose_name=_('Flash?'), default=False) |
flash = models.BooleanField(verbose_name=_('Flash?'), default=False) |
||||||
popup = models.BooleanField(verbose_name=_('Popup?'), default=False) |
popup = models.BooleanField(verbose_name=_('Popup?'), default=False) |
||||||
paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False) |
paid = models.BooleanField(verbose_name=_('Is Paid event link?'), default=False) |
||||||
link = models.BooleanField(verbose_name=_('Is simple link?'), default=False) |
link = models.BooleanField(verbose_name=_('Is simple link?'), default=False) |
||||||
# for detecting popups |
# for detecting popups |
||||||
cookie = models.CharField(max_length=30, blank=True, null=True, default=settings.DEFAULT_POPUP_COOKIE) |
cookie = models.CharField(max_length=30, blank=True, null=True, default=settings.DEFAULT_POPUP_COOKIE) |
||||||
|
|
||||||
public = models.BooleanField(verbose_name=u'Активный', default=True) |
public = models.BooleanField(verbose_name=u'Активный', default=True) |
||||||
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) |
||||||
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) |
||||||
|
|
||||||
stat_pswd = models.CharField(max_length=16) |
stat_pswd = models.CharField(max_length=16) |
||||||
|
|
||||||
class Meta: |
class Meta: |
||||||
ordering = ['-public'] |
ordering = ['-public'] |
||||||
|
|
||||||
def get_admin_url(self): |
def get_admin_url(self): |
||||||
return '/admin/expobanners/banners/banner/%d/edit/'%self.id |
return '/admin/expobanners/banners/banner/%d/edit/'%self.id |
||||||
|
|
||||||
|
def key(slef): |
||||||
def key(slef): |
if hasattr(settings, 'SECRET_KEY'): |
||||||
if hasattr(settings, 'SECRET_KEY'): |
key = str(datetime.now()) + settings.SECRET_KEY |
||||||
key = str(datetime.now()) + settings.SECRET_KEY |
else: |
||||||
else: |
key = str(datetime.now()) |
||||||
key = str(datetime.now()) |
return hashlib.md5(key).hexdigest() |
||||||
return hashlib.md5(key).hexdigest() |
|
||||||
|
def log(self, request, type): |
||||||
def log(self, request, type): |
log = { |
||||||
log = { |
'type': type, |
||||||
'type': type, |
'banner': self, |
||||||
'banner': self, |
'group': self.group, |
||||||
'group': self.group, |
'ip': request.META.get('REMOTE_ADDR'), |
||||||
'ip': request.META.get('REMOTE_ADDR'), |
'user_agent': request.META.get('HTTP_USER_AGENT'), |
||||||
'user_agent': request.META.get('HTTP_USER_AGENT'), |
'page': request.META.get('HTTP_REFERER'), |
||||||
'page': request.META.get('HTTP_REFERER'), |
} |
||||||
} |
|
||||||
|
if request.user.is_authenticated(): |
||||||
if request.user.is_authenticated(): |
log['user'] = request.user |
||||||
log['user'] = request.user |
return Log.objects.create(**log) |
||||||
return Log.objects.create(**log) |
|
||||||
|
@models.permalink |
||||||
@models.permalink |
def image(self): |
||||||
def image(self): |
return ('banner_view', (), {'banner_id': self.pk, 'key': self.key()}) |
||||||
return ('banner_view', (), {'banner_id': self.pk, 'key': self.key()}) |
|
||||||
|
def impressions(self): |
||||||
def impressions(self): |
return Log.objects.filter(banner=self.pk, type=0).count() |
||||||
return Log.objects.filter(banner=self.pk, type=0).count() |
|
||||||
|
def views(self): |
||||||
def views(self): |
return Log.objects.filter(banner=self.pk, type=1).count() |
||||||
return Log.objects.filter(banner=self.pk, type=1).count() |
|
||||||
|
def clicks(self): |
||||||
def clicks(self): |
return Log.objects.filter(banner=self.pk, type=2).count() |
||||||
return Log.objects.filter(banner=self.pk, type=2).count() |
|
||||||
|
def __unicode__(self): |
||||||
def __unicode__(self): |
return self.title or self.alt |
||||||
return self.title or self.alt |
|
||||||
|
def get_absolute_url(self): |
||||||
def get_absolute_url(self): |
if self.url == '#': |
||||||
if self.url == '#': |
return self.url |
||||||
return self.url |
else: |
||||||
else: |
@models.permalink |
||||||
@models.permalink |
def get_absolute_url(self): |
||||||
def get_absolute_url(self): |
return ('banner_click', (), {'banner_id': self.pk, 'key': self.key()}) |
||||||
return ('banner_click', (), {'banner_id': self.pk, 'key': self.key()}) |
return get_absolute_url(self) |
||||||
return get_absolute_url(self) |
|
||||||
|
def get_click_link(self): |
||||||
def get_click_link(self): |
return '/expo-b/click/%d/'%self.id |
||||||
return '/expo-b/click/%d/'%self.id |
|
||||||
|
class Meta: |
||||||
class Meta: |
ordering = ['sort'] |
||||||
ordering = ['sort'] |
verbose_name = _('Banner') |
||||||
verbose_name = _('Banner') |
verbose_name_plural = _('Banners') |
||||||
verbose_name_plural = _('Banners') |
|
||||||
|
|
||||||
|
class Log(models.Model): |
||||||
class Log(models.Model): |
banner = models.ForeignKey(Banner, related_name='banner_logs') |
||||||
banner = models.ForeignKey(Banner, related_name='banner_logs') |
group = models.ForeignKey(BannerGroup, related_name='group_logs', verbose_name=_('Group'), blank=True, null=True) |
||||||
group = models.ForeignKey(BannerGroup, related_name='group_logs', verbose_name=_('Group'), blank=True, null=True) |
urls = models.ManyToManyField(URL, related_name='url_logs', verbose_name=_('URLs'), blank=True) |
||||||
urls = models.ManyToManyField(URL, related_name='url_logs', verbose_name=_('URLs'), blank=True) |
|
||||||
|
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name='users', verbose_name=_('User')) |
||||||
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name='users', verbose_name=_('User')) |
datetime = models.DateTimeField(verbose_name=_('Clicked At'), auto_now_add=True) |
||||||
datetime = models.DateTimeField(verbose_name=_('Clicked At'), auto_now_add=True) |
ip = models.IPAddressField(verbose_name=_('IP'), null=True, blank=True) |
||||||
ip = models.IPAddressField(verbose_name=_('IP'), null=True, blank=True) |
user_agent = models.CharField(verbose_name=_('User Agent'), max_length=1024, null=True, blank=True) |
||||||
user_agent = models.CharField(verbose_name=_('User Agent'), max_length=1024, null=True, blank=True) |
page = models.URLField(verbose_name=_('Page'), null=True, blank=True) |
||||||
page = models.URLField(verbose_name=_('Page'), null=True, blank=True) |
key = models.CharField(verbose_name=_('User Agent'), max_length=32, null=True, blank=True) |
||||||
key = models.CharField(verbose_name=_('User Agent'), max_length=32, null=True, blank=True) |
TYPE_CHOICES = ( |
||||||
TYPE_CHOICES = ( |
(0, 'impressions'), |
||||||
(0, 'impressions'), |
(1, 'view'), |
||||||
(1, 'view'), |
(2, 'click') |
||||||
(2, 'click') |
) |
||||||
) |
|
||||||
|
type = models.PositiveSmallIntegerField(verbose_name=_('Type'), max_length=1, default=0, choices=TYPE_CHOICES) |
||||||
type = models.PositiveSmallIntegerField(verbose_name=_('Type'), max_length=1, default=0, choices=TYPE_CHOICES) |
|
||||||
|
def __unicode__(self): |
||||||
def __unicode__(self): |
return '%s - (%s)' % (self.banner, self.datetime) |
||||||
return '%s - (%s)' % (self.banner, self.datetime) |
|
||||||
|
|
||||||
|
class LogStat(models.Model): |
||||||
class LogStat(models.Model): |
banner = models.ForeignKey(Banner, related_name='banner_stat', verbose_name=_('Banner'), blank=True) |
||||||
banner = models.ForeignKey(Banner, related_name='banner_stat', verbose_name=_('Banner'), blank=True) |
group = models.ForeignKey(BannerGroup, related_name='group_stat', verbose_name=_('Group'), blank=True, null=True) |
||||||
group = models.ForeignKey(BannerGroup, related_name='group_stat', verbose_name=_('Group'), blank=True, null=True) |
urls = models.ManyToManyField(URL, related_name='url_bloks', verbose_name=_('URLs'), null=True, blank=True) |
||||||
urls = models.ManyToManyField(URL, related_name='url_bloks', verbose_name=_('URLs'), null=True, blank=True) |
|
||||||
|
date = models.DateField(verbose_name=_('Data')) |
||||||
date = models.DateField(verbose_name=_('Data')) |
view = models.PositiveIntegerField(verbose_name=_('Views')) |
||||||
view = models.PositiveIntegerField(verbose_name=_('Views')) |
click = models.PositiveIntegerField(verbose_name=_('Clicks')) |
||||||
click = models.PositiveIntegerField(verbose_name=_('Clicks')) |
unique_click = models.PositiveIntegerField(verbose_name=_('Unique Views'), blank=True, null=True) |
||||||
unique_click = models.PositiveIntegerField(verbose_name=_('Unique Views'), blank=True, null=True) |
unique_view = models.PositiveIntegerField(verbose_name=_('Unique Clicks')) |
||||||
unique_view = models.PositiveIntegerField(verbose_name=_('Unique Clicks')) |
|
||||||
|
def __unicode__(self): |
||||||
def __unicode__(self): |
return '%s - (%s)' % (self.banner, self.date) |
||||||
return '%s - (%s)' % (self.banner, self.date) |
|
||||||
|
class Meta: |
||||||
|
ordering = ['-date'] |
||||||
# ------------------ |
|
||||||
class Paid(models.Model, StatMixin): |
|
||||||
tickets = models.ForeignKey(Banner, related_name='paid_tickets') |
# ------------------ |
||||||
participation = models.ForeignKey(Banner, related_name='paid_participation') |
class Paid(models.Model, StatMixin): |
||||||
official = models.ForeignKey(Banner, related_name='paid_official') |
tickets = models.ForeignKey(Banner, related_name='paid_tickets') |
||||||
catalog = models.ForeignKey(Banner, related_name='paid_catalog') |
participation = models.ForeignKey(Banner, related_name='paid_participation') |
||||||
logo = models.ImageField(upload_to='expo-b/paid', blank=True) |
official = models.ForeignKey(Banner, related_name='paid_official') |
||||||
organiser = models.CharField(max_length=100, blank=True) |
catalog = models.ForeignKey(Banner, related_name='paid_catalog') |
||||||
public = models.BooleanField(default=True, verbose_name=u'Активная') |
logo = models.ImageField(upload_to='expo-b/paid', blank=True) |
||||||
stat_pswd = models.CharField(max_length=16) |
organiser = models.CharField(max_length=100, blank=True) |
||||||
created = models.DateTimeField(auto_now_add=True) |
public = models.BooleanField(default=True, verbose_name=u'Активная') |
||||||
modified = models.DateTimeField(auto_now=True) |
stat_pswd = models.CharField(max_length=16) |
||||||
|
created = models.DateTimeField(auto_now_add=True) |
||||||
class Meta: |
modified = models.DateTimeField(auto_now=True) |
||||||
ordering = ['-public'] |
|
||||||
|
class Meta: |
||||||
def get_event(self): |
ordering = ['-public'] |
||||||
try: |
|
||||||
return self.exposition_set.all()[0] |
def get_event(self): |
||||||
except IndexError: |
try: |
||||||
return None |
return self.exposition_set.all()[0] |
||||||
|
except IndexError: |
||||||
|
return None |
||||||
class PaidStat(models.Model): |
|
||||||
paid = models.ForeignKey(Paid) |
|
||||||
date = models.DateField(verbose_name=_('Date')) |
class PaidStat(models.Model): |
||||||
page_views = models.PositiveIntegerField(default=0) |
paid = models.ForeignKey(Paid) |
||||||
price_views = models.PositiveIntegerField(default=0) |
date = models.DateField(verbose_name=_('Date')) |
||||||
catalog_views = models.PositiveIntegerField(default=0) |
page_views = models.PositiveIntegerField(default=0) |
||||||
catalog_clicks = models.PositiveIntegerField(default=0) |
price_views = models.PositiveIntegerField(default=0) |
||||||
tickets_clicks = models.PositiveIntegerField(default=0) |
catalog_views = models.PositiveIntegerField(default=0) |
||||||
participation_clicks = models.PositiveIntegerField(default=0) |
catalog_clicks = models.PositiveIntegerField(default=0) |
||||||
official_clicks = models.PositiveIntegerField(default=0) |
tickets_clicks = models.PositiveIntegerField(default=0) |
||||||
|
participation_clicks = models.PositiveIntegerField(default=0) |
||||||
|
official_clicks = models.PositiveIntegerField(default=0) |
||||||
class Top(models.Model, StatMixin): |
|
||||||
link = models.ForeignKey(Banner) |
class Meta: |
||||||
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа') |
ordering = ['-date'] |
||||||
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') |
|
||||||
theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=u'Тематики') |
|
||||||
excluded_tags = models.ManyToManyField('theme.Tag', blank=True, null=True, verbose_name=u'Исключить теги') |
class Top(models.Model, StatMixin): |
||||||
country = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=u'Страны') |
link = models.ForeignKey(Banner) |
||||||
excluded_cities = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=u'Исключить города') |
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа') |
||||||
fr = models.DateField(default=date.today(), verbose_name=u'Начало') |
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') |
||||||
to = models.DateField(blank=True, null=True, verbose_name=u'Конец') |
theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=u'Тематики') |
||||||
stat_pswd = models.CharField(max_length=16) |
excluded_tags = models.ManyToManyField('theme.Tag', blank=True, null=True, verbose_name=u'Исключить теги') |
||||||
|
country = models.ManyToManyField('country.Country', blank=True, null=True, verbose_name=u'Страны') |
||||||
objects = models.Manager() |
excluded_cities = models.ManyToManyField('city.City', blank=True, null=True, verbose_name=u'Исключить города') |
||||||
cached = TopCached() |
fr = models.DateField(default=date.today(), verbose_name=u'Начало') |
||||||
|
to = models.DateField(blank=True, null=True, verbose_name=u'Конец') |
||||||
class Meta: |
stat_pswd = models.CharField(max_length=16) |
||||||
ordering = ['position'] |
|
||||||
|
objects = models.Manager() |
||||||
def get_event(self): |
cached = TopCached() |
||||||
try: |
|
||||||
return self.exposition_set.all()[0] |
class Meta: |
||||||
except IndexError: |
ordering = ['position'] |
||||||
return None |
|
||||||
|
def get_event(self): |
||||||
class TopStat(models.Model): |
try: |
||||||
date = models.DateField() |
return self.exposition_set.all()[0] |
||||||
theme = models.ForeignKey('theme.Theme', blank=True, null=True) |
except IndexError: |
||||||
tag = models.ForeignKey('theme.Tag', blank=True, null=True) |
return None |
||||||
country = models.ForeignKey('country.Country', blank=True, null=True) |
|
||||||
city = models.ForeignKey('city.City', blank=True, null=True) |
|
||||||
views = models.PositiveIntegerField(default=0) |
class TopStat(models.Model): |
||||||
clicks = models.PositiveIntegerField(default=0) |
date = models.DateField() |
||||||
|
theme = models.ForeignKey('theme.Theme', blank=True, null=True) |
||||||
|
tag = models.ForeignKey('theme.Tag', blank=True, null=True) |
||||||
class MainPage(models.Model, StatMixin): |
country = models.ForeignKey('country.Country', blank=True, null=True) |
||||||
link = models.ForeignKey(Banner) |
city = models.ForeignKey('city.City', blank=True, null=True) |
||||||
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') |
views = models.PositiveIntegerField(default=0) |
||||||
public = models.BooleanField(default=True, verbose_name=u'Активная') |
clicks = models.PositiveIntegerField(default=0) |
||||||
stat_pswd = models.CharField(max_length=16) |
|
||||||
created = models.DateTimeField(auto_now_add=True) |
|
||||||
modified = models.DateTimeField(auto_now=True) |
class MainPage(models.Model, StatMixin): |
||||||
|
link = models.ForeignKey(Banner) |
||||||
class Meta: |
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') |
||||||
ordering = ['-public'] |
public = models.BooleanField(default=True, verbose_name=u'Активная') |
||||||
|
stat_pswd = models.CharField(max_length=16) |
||||||
def get_event(self): |
created = models.DateTimeField(auto_now_add=True) |
||||||
try: |
modified = models.DateTimeField(auto_now=True) |
||||||
return self.exposition_set.all()[0] |
|
||||||
except IndexError: |
class Meta: |
||||||
return None |
ordering = ['-public'] |
||||||
|
|
||||||
|
def get_event(self): |
||||||
def generatePassword(length=5): |
try: |
||||||
""" |
return self.exposition_set.all()[0] |
||||||
generate random password |
except IndexError: |
||||||
""" |
return None |
||||||
SYMBOLS = [',', '.', '?', '!', '-', '+', '1', '2', '3', '4', '5', '6', '7', '8', |
|
||||||
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', |
|
||||||
'm', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', |
def generatePassword(length=5): |
||||||
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', |
""" |
||||||
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#'] |
generate random password |
||||||
PASSWORD_LENGTH = length |
""" |
||||||
newPassword = [] |
SYMBOLS = [',', '.', '?', '!', '-', '+', '1', '2', '3', '4', '5', '6', '7', '8', |
||||||
for i in range(PASSWORD_LENGTH): |
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', |
||||||
newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))]) |
'm', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', |
||||||
return ''.join(newPassword) |
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', |
||||||
|
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '#'] |
||||||
|
PASSWORD_LENGTH = length |
||||||
def generate_stat_pass(sender, **kwargs): |
newPassword = [] |
||||||
obj = kwargs['instance'] |
for i in range(PASSWORD_LENGTH): |
||||||
if not obj.stat_pswd: |
newPassword.append(SYMBOLS[random.randrange(0, len(SYMBOLS))]) |
||||||
obj.stat_pswd = generatePassword() |
return ''.join(newPassword) |
||||||
obj.save() |
|
||||||
|
|
||||||
|
def generate_stat_pass(sender, **kwargs): |
||||||
|
obj = kwargs['instance'] |
||||||
post_save.connect(generate_stat_pass, sender=Banner) |
if not obj.stat_pswd: |
||||||
post_save.connect(generate_stat_pass, sender=Paid) |
obj.stat_pswd = generatePassword() |
||||||
post_save.connect(generate_stat_pass, sender=Top) |
obj.save() |
||||||
|
|
||||||
|
|
||||||
|
post_save.connect(generate_stat_pass, sender=Banner) |
||||||
|
post_save.connect(generate_stat_pass, sender=Paid) |
||||||
|
post_save.connect(generate_stat_pass, sender=Top) |
||||||
|
|||||||
@ -1,74 +1,74 @@ |
|||||||
{% load thumbnail %} |
{% load thumbnail %} |
||||||
|
|
||||||
{% if banners %} |
{% if banners %} |
||||||
|
|
||||||
<div class="b-slider m-{{ group.slug }}" id="slider-{{ group.slug }}"> |
<div class="b-slider m-{{ group.slug }}" id="slider-{{ group.slug }}"> |
||||||
<ul class='b-slider-list'> |
<ul class='b-slider-list'> |
||||||
{% for banner in banners %} |
{% for banner in banners %} |
||||||
<li data-url='{{ banner.get_absolute_url }}' |
<li data-url='{{ banner.get_absolute_url }}' |
||||||
class=' |
class=' |
||||||
b-slider-item |
b-slider-item |
||||||
m-slider-item-{{ forloop.counter }} |
m-slider-item-{{ forloop.counter }} |
||||||
{% if forloop.counter == 1 %} |
{% if forloop.counter == 1 %} |
||||||
m-slider-current |
m-slider-current |
||||||
{% endif %} |
{% endif %} |
||||||
' |
' |
||||||
data-slide='{{ forloop.counter }}' |
data-slide='{{ forloop.counter }}' |
||||||
> |
> |
||||||
|
|
||||||
<a href='{{ banner.get_absolute_url }}' class='b-slider-item__link'> |
<a href='{{ banner.get_absolute_url }}' class='b-slider-item__link'> |
||||||
{% thumbnail banner.img group.size crop="top" as im %} |
{% thumbnail banner.img group.size crop="top" as im %} |
||||||
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" alt="{{ banner.alt }}" title="{{ banner.title }}" class='b-slider-item__img' data-view='{{ banner.image }}'> |
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" alt="{{ banner.alt }}" title="{{ banner.title }}" class='b-slider-item__img' data-view='{{ banner.image }}'> |
||||||
{% endthumbnail %} |
{% endthumbnail %} |
||||||
|
|
||||||
<div class="b-slider-item__info_cover"> |
<div class="b-slider-item__info_cover"> |
||||||
<span class='b-slider-item__title'>{{ banner.title|safe }}</span> |
<span class='b-slider-item__title'>{{ banner.title|safe }}</span> |
||||||
<span class='b-slider-item__text'>{{ banner.text|safe }}</span> |
<span class='b-slider-item__text'>{{ banner.text|safe }}</span> |
||||||
</div> |
</div> |
||||||
</a> |
</a> |
||||||
</li> |
</li> |
||||||
{% endfor %} |
{% endfor %} |
||||||
</ul> |
</ul> |
||||||
|
|
||||||
<ul class="b-slider-nav"> |
<ul class="b-slider-nav"> |
||||||
{% for banner in banners %} |
{% for banner in banners %} |
||||||
<li class="b-slider-nav-button |
<li class="b-slider-nav-button |
||||||
{% if forloop.counter == 1 %} |
{% if forloop.counter == 1 %} |
||||||
m-slider-nav-current_button |
m-slider-nav-current_button |
||||||
{% endif %} |
{% endif %} |
||||||
" data-slide='{{ forloop.counter }}'> |
" data-slide='{{ forloop.counter }}'> |
||||||
{{ forloop.counter }} |
{{ forloop.counter }} |
||||||
</li> |
</li> |
||||||
{% endfor %} |
{% endfor %} |
||||||
</ul> |
</ul> |
||||||
|
|
||||||
<span data-direction="prev" class='b-slider-nav-prev'>〈 </span> |
<span data-direction="prev" class='b-slider-nav-prev'>〈 </span> |
||||||
<span data-direction="next" class='b-slider-nav-next'> 〉</span> |
<span data-direction="next" class='b-slider-nav-next'> 〉</span> |
||||||
|
|
||||||
</div> |
</div> |
||||||
|
|
||||||
<script> |
<script> |
||||||
(function() { |
(function() { |
||||||
$('.m-{{ group.slug }}').bannersSlider({'auto_play': {{ group.speed }}, 'speed': {{ group.speed }}}); |
$('.m-{{ group.slug }}').bannersSlider({'auto_play': {{ group.speed }}, 'speed': {{ group.speed }}}); |
||||||
})(); |
})(); |
||||||
</script> |
</script> |
||||||
|
|
||||||
<style> |
<style> |
||||||
.m-{{ group.slug }} { |
.m-{{ group.slug }} { |
||||||
width: {{ group.width }}px; |
width: {{ group.width }}px; |
||||||
height: {{ group.height }}px; |
height: {{ group.height }}px; |
||||||
} |
} |
||||||
|
|
||||||
.m-{{ group.slug }} .b-slider-nav-prev, |
.m-{{ group.slug }} .b-slider-nav-prev, |
||||||
.m-{{ group.slug }} .b-slider-nav-next { |
.m-{{ group.slug }} .b-slider-nav-next { |
||||||
line-height: {{ group.height }}px; |
line-height: {{ group.height }}px; |
||||||
} |
} |
||||||
|
|
||||||
.m-{{ group.slug }} .b-slider-item, |
.m-{{ group.slug }} .b-slider-item, |
||||||
.m-{{ group.slug }} .b-slider-list { |
.m-{{ group.slug }} .b-slider-list { |
||||||
width: {{ group.width }}px; |
width: {{ group.width }}px; |
||||||
height: {{ group.height }}px; |
height: {{ group.height }}px; |
||||||
} |
} |
||||||
</style> |
</style> |
||||||
|
|
||||||
{% endif %} |
{% endif %} |
||||||
@ -1,74 +1,74 @@ |
|||||||
from ..models import Banner |
from ..models import Banner |
||||||
from ..models import BannerGroup |
from ..models import BannerGroup |
||||||
from ..models import URL |
from ..models import URL |
||||||
|
|
||||||
from django import template |
from django import template |
||||||
|
|
||||||
# For render tag |
# For render tag |
||||||
from django.template import Context |
from django.template import Context |
||||||
from django.template import Template |
from django.template import Template |
||||||
|
|
||||||
import re |
import re |
||||||
|
|
||||||
register = template.Library() |
register = template.Library() |
||||||
|
|
||||||
|
|
||||||
@register.simple_tag(takes_context=True) |
@register.simple_tag(takes_context=True) |
||||||
def banner_group(context, group, tpl='group.html'): |
def banner_group(context, group, tpl='group.html'): |
||||||
try: |
try: |
||||||
page_url = context['request'].path_info |
page_url = context['request'].path_info |
||||||
site = context['request'].site |
site = context['request'].site |
||||||
group = BannerGroup.objects.get(slug=group) |
group = BannerGroup.objects.get(slug=group) |
||||||
good_urls = [] |
good_urls = [] |
||||||
for url in URL.objects.filter(public=True, sites__in=[site]): |
for url in URL.objects.filter(public=True, sites__in=[site]): |
||||||
if url.regex: |
if url.regex: |
||||||
url_re = re.compile(url.url) |
url_re = re.compile(url.url) |
||||||
if url_re.findall(page_url): |
if url_re.findall(page_url): |
||||||
good_urls.append(url) |
good_urls.append(url) |
||||||
elif page_url == url.url: |
elif page_url == url.url: |
||||||
good_urls.append(url) |
good_urls.append(url) |
||||||
banners = Banner.objects.filter(public=True, group=group, urls__in=good_urls) |
banners = Banner.objects.filter(public=True, group=group, urls__in=good_urls) |
||||||
except: |
except: |
||||||
banners = False |
banners = False |
||||||
group = False |
group = False |
||||||
if(banners and group): |
if(banners and group): |
||||||
context['banners'] = banners |
context['banners'] = banners |
||||||
context['group'] = group |
context['group'] = group |
||||||
|
|
||||||
t = template.loader.get_template(tpl) |
t = template.loader.get_template(tpl) |
||||||
return t.render(template.Context(context)) |
return t.render(template.Context(context)) |
||||||
|
|
||||||
|
|
||||||
@register.simple_tag(takes_context=True) |
@register.simple_tag(takes_context=True) |
||||||
def banner_one(context, banner_id, tpl='banner.html'): |
def banner_one(context, banner_id, tpl='banner.html'): |
||||||
try: |
try: |
||||||
page_url = context['request'].path_info |
page_url = context['request'].path_info |
||||||
site = context['request'].site |
site = context['request'].site |
||||||
good_urls = [] |
good_urls = [] |
||||||
for url in URL.objects.filter(public=True, sites__in=[site]): |
for url in URL.objects.filter(public=True, sites__in=[site]): |
||||||
if url.regex: |
if url.regex: |
||||||
url_re = re.compile(url.url) |
url_re = re.compile(url.url) |
||||||
if url_re.findall(page_url): |
if url_re.findall(page_url): |
||||||
good_urls.append(url) |
good_urls.append(url) |
||||||
elif page_url == url.url: |
elif page_url == url.url: |
||||||
good_urls.append(url) |
good_urls.append(url) |
||||||
|
|
||||||
banner = Banner.objects.get(id=banner_id, public=True, urls__in=good_urls) |
banner = Banner.objects.get(id=banner_id, public=True, urls__in=good_urls) |
||||||
except: |
except: |
||||||
banner = False |
banner = False |
||||||
|
|
||||||
context['banner'] = banner |
context['banner'] = banner |
||||||
|
|
||||||
t = template.loader.get_template(tpl) |
t = template.loader.get_template(tpl) |
||||||
return t.render(template.Context(context)) |
return t.render(template.Context(context)) |
||||||
|
|
||||||
|
|
||||||
# block render |
# block render |
||||||
@register.simple_tag(takes_context=True) |
@register.simple_tag(takes_context=True) |
||||||
def render(context, content): |
def render(context, content): |
||||||
try: |
try: |
||||||
tpl = Template(content) |
tpl = Template(content) |
||||||
content = Context(context) |
content = Context(context) |
||||||
return tpl.render(content) |
return tpl.render(content) |
||||||
except: |
except: |
||||||
return 'Render Error' |
return 'Render Error' |
||||||
|
|||||||
@ -1,13 +1,13 @@ |
|||||||
from django.conf.urls import url |
from django.conf.urls import url |
||||||
from expobanner.stat_views import * |
from expobanner.stat_views import * |
||||||
from . import views |
from . import views |
||||||
|
|
||||||
urlpatterns = [ |
urlpatterns = [ |
||||||
url(r'^click/(?P<banner_id>\d{1,4})/$', views.click, name='banner_click'), |
url(r'^click/(?P<banner_id>\d{1,4})/$', views.click, name='banner_click'), |
||||||
#url(r'^view/(?P<banner_id>\d+)/$', views.view, name='banner_view'), |
#url(r'^view/(?P<banner_id>\d+)/$', views.view, name='banner_view'), |
||||||
# |
# |
||||||
url(r'^get-banners/$', views.get_banners), |
url(r'^get-banners/$', views.get_banners), |
||||||
url(r'^get-tops/$', views.get_top), |
url(r'^get-tops/$', views.get_top), |
||||||
url(r'^banner/(?P<pk>\d+)/stat/$', BannerStat.as_view(), name='banner_stat_client'), |
url(r'^banner/(?P<pk>\d+)/stat/$', BannerStat.as_view(), name='banner_stat_client'), |
||||||
url(r'^paid/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='paid_stat_client'), |
url(r'^paid/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='paid_stat_client'), |
||||||
] |
] |
||||||
|
|||||||
@ -1,97 +1,97 @@ |
|||||||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||||||
import json |
import json |
||||||
import re |
import re |
||||||
from django.http import HttpResponse |
from django.http import HttpResponse |
||||||
from django.shortcuts import redirect, get_object_or_404 |
from django.shortcuts import redirect, get_object_or_404 |
||||||
from django.shortcuts import render_to_response |
from django.shortcuts import render_to_response |
||||||
from django.template import RequestContext |
from django.template import RequestContext |
||||||
from .models import Banner, BannerGroup, URL, Top |
from .models import Banner, BannerGroup, URL, Top |
||||||
from expobanner.utils import get_banner_by_params, get_client_ip, get_top_events, get_referer_view, set_cookie |
from expobanner.utils import get_banner_by_params, get_client_ip, get_top_events, get_referer_view, set_cookie |
||||||
|
|
||||||
|
|
||||||
def click(request, banner_id): |
def click(request, banner_id): |
||||||
banner = get_object_or_404(Banner, pk=banner_id) |
banner = get_object_or_404(Banner, pk=banner_id) |
||||||
banner.log(request, 2) |
banner.log(request, 2) |
||||||
return redirect(banner.url) |
return redirect(banner.url) |
||||||
|
|
||||||
|
|
||||||
def view(request, banner_id): |
def view(request, banner_id): |
||||||
banner = get_object_or_404(Banner, pk=banner_id) |
banner = get_object_or_404(Banner, pk=banner_id) |
||||||
banner.log(request, 1) |
banner.log(request, 1) |
||||||
return redirect(banner.img.url) |
return redirect(banner.img.url) |
||||||
|
|
||||||
def get_banners(request): |
def get_banners(request): |
||||||
url = get_referer_view(request, default='/') |
url = get_referer_view(request, default='/') |
||||||
# get urls by current url |
# get urls by current url |
||||||
urls = URL.cached.all() |
urls = URL.cached.all() |
||||||
good_urls = [] |
good_urls = [] |
||||||
for u in urls: |
for u in urls: |
||||||
if u.regex: |
if u.regex: |
||||||
url_re = re.compile(u.url) |
url_re = re.compile(u.url) |
||||||
if url_re.findall(url): |
if url_re.findall(url): |
||||||
good_urls.append(u) |
good_urls.append(u) |
||||||
elif url == u.url: |
elif url == u.url: |
||||||
good_urls.append(u) |
good_urls.append(u) |
||||||
# fill parameters dict |
# fill parameters dict |
||||||
params = {'theme': request.GET.getlist('theme', []), |
params = {'theme': request.GET.getlist('theme', []), |
||||||
'tag': request.GET.get('tag'), |
'tag': request.GET.get('tag'), |
||||||
'country': request.GET.get('country'), |
'country': request.GET.get('country'), |
||||||
'city': request.GET.get('city'), |
'city': request.GET.get('city'), |
||||||
'ip': get_client_ip(request)} |
'ip': get_client_ip(request)} |
||||||
|
|
||||||
group_banners = BannerGroup.cached.group_banners() |
group_banners = BannerGroup.cached.group_banners() |
||||||
result = [] |
result = [] |
||||||
cookie = None |
cookie = None |
||||||
# get banners for all groups |
# get banners for all groups |
||||||
places = request.GET.getlist('places', []) |
places = request.GET.getlist('places', []) |
||||||
|
|
||||||
for group, banners in group_banners.iteritems(): |
for group, banners in group_banners.iteritems(): |
||||||
if group not in places: |
if group not in places: |
||||||
# on this page there is no such group |
# on this page there is no such group |
||||||
continue |
continue |
||||||
banner = get_banner_by_params(banners, good_urls, params, request) |
banner = get_banner_by_params(banners, good_urls, params, request) |
||||||
if banner: |
if banner: |
||||||
if banner.html: |
if banner.html: |
||||||
text = banner.text |
text = banner.text |
||||||
img = '' |
img = '' |
||||||
alt = '' |
alt = '' |
||||||
is_img = False |
is_img = False |
||||||
else: |
else: |
||||||
text = '' |
text = '' |
||||||
try: |
try: |
||||||
img = banner.img.url |
img = banner.img.url |
||||||
except ValueError: |
except ValueError: |
||||||
continue |
continue |
||||||
alt = banner.alt |
alt = banner.alt |
||||||
is_img = True |
is_img = True |
||||||
result.append({'id': group, |
result.append({'id': group, |
||||||
'url': banner.get_click_link(), |
'url': banner.get_click_link(), |
||||||
'is_html': banner.html, |
'is_html': banner.html, |
||||||
'is_flash': banner.flash, |
'is_flash': banner.flash, |
||||||
'is_img': is_img, |
'is_img': is_img, |
||||||
'is_popup': banner.popup, |
'is_popup': banner.popup, |
||||||
'img': img, |
'img': img, |
||||||
'alt': alt, |
'alt': alt, |
||||||
'text': text |
'text': text |
||||||
}) |
}) |
||||||
if banner.popup: |
if banner.popup: |
||||||
cookie = banner.cookie |
cookie = banner.cookie |
||||||
# add view log |
# add view log |
||||||
banner.log(request, 1) |
banner.log(request, 1) |
||||||
response = HttpResponse(json.dumps(result, indent=4), content_type='application/json') |
response = HttpResponse(json.dumps(result, indent=4), content_type='application/json') |
||||||
if cookie: |
if cookie: |
||||||
response = set_cookie(response, cookie, '1') |
response = set_cookie(response, cookie, '1') |
||||||
|
|
||||||
return response |
return response |
||||||
|
|
||||||
def get_top(request): |
def get_top(request): |
||||||
params = {'theme': request.GET.getlist('theme', []), |
params = {'theme': request.GET.getlist('theme', []), |
||||||
'tag': request.GET.get('tag'), |
'tag': request.GET.get('tag'), |
||||||
'country': request.GET.get('country'), |
'country': request.GET.get('country'), |
||||||
'city': request.GET.get('city'), |
'city': request.GET.get('city'), |
||||||
'catalog': request.GET.get('catalog')} |
'catalog': request.GET.get('catalog')} |
||||||
|
|
||||||
tops = Top.cached.all() |
tops = Top.cached.all() |
||||||
events = get_top_events(tops, params, request) |
events = get_top_events(tops, params, request) |
||||||
context = {'objects': events} |
context = {'objects': events} |
||||||
return render_to_response('client/includes/exposition/expo_top.html', context, context_instance=RequestContext(request)) |
return render_to_response('client/includes/exposition/expo_top.html', context, context_instance=RequestContext(request)) |
||||||
@ -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,16 +1,15 @@ |
|||||||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||||||
from django.conf.urls import patterns, include, url |
from django.conf.urls import patterns, url |
||||||
from admin import MetaListView, MetaView |
from views import CreateSeoText, SeoTextList, EditSeoText, DeleteSeoText |
||||||
from .views import CreateSeoText, SeoTextList, EditSeoText, DeleteSeoText |
from .admin import MetaListView, MetaView |
||||||
|
|
||||||
urlpatterns = patterns('conference.admin', |
|
||||||
|
|
||||||
|
urlpatterns = patterns('', |
||||||
url(r'^seo/new/$', CreateSeoText.as_view(), name='seo_new'), |
url(r'^seo/new/$', CreateSeoText.as_view(), name='seo_new'), |
||||||
url(r'^seo/all/$', SeoTextList.as_view(), name='seo_all'), |
url(r'^seo/all/$', SeoTextList.as_view(), name='seo_all'), |
||||||
url(r'^seo/edit/(?P<pk>\d{1,5})/$', EditSeoText.as_view(), name='seo_edit'), |
url(r'^seo/edit/(?P<pk>\d{1,5})/$', EditSeoText.as_view(), name='seo_edit'), |
||||||
url(r'^seo/delete/(?P<pk>\d{1,5})/$', DeleteSeoText.as_view(), name='seo_delete'), |
url(r'^seo/delete/(?P<pk>\d{1,5})/$', DeleteSeoText.as_view(), name='seo_delete'), |
||||||
url(r'^all/$', MetaListView.as_view()), |
url(r'^all/$', MetaListView.as_view()), |
||||||
#url(r'^change/(?P<url>.*)/$', 'conference_change'), |
url(r'^(?P<id>\d{1,6})/$', MetaView.as_view()), |
||||||
url(r'^(?P<id>.*)/$', MetaView.as_view()), |
|
||||||
url(r'^$', MetaView.as_view()), |
url(r'^$', MetaView.as_view()), |
||||||
) |
) |
||||||
@ -1,16 +1,16 @@ |
|||||||
from functools import wraps |
from functools import wraps |
||||||
|
|
||||||
from django.template import RequestContext |
from django.template import RequestContext |
||||||
from django.shortcuts import render_to_response |
from django.shortcuts import render_to_response |
||||||
|
|
||||||
|
|
||||||
def render_to(tpl): |
def render_to(tpl): |
||||||
def decorator(func): |
def decorator(func): |
||||||
@wraps(func) |
@wraps(func) |
||||||
def wrapper(request, *args, **kwargs): |
def wrapper(request, *args, **kwargs): |
||||||
out = func(request, *args, **kwargs) |
out = func(request, *args, **kwargs) |
||||||
if isinstance(out, dict): |
if isinstance(out, dict): |
||||||
out = render_to_response(tpl, out, RequestContext(request)) |
out = render_to_response(tpl, out, RequestContext(request)) |
||||||
return out |
return out |
||||||
return wrapper |
return wrapper |
||||||
return decorator |
return decorator |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from django.conf.urls import url, patterns |
||||||
|
from .views import * |
||||||
|
|
||||||
|
urlpatterns = patterns('', |
||||||
|
url(r'^specialist/new/$', SpecialistCreateView.as_view(), name='specialist_new'), |
||||||
|
url(r'^specialist/all/$', SpecialistListView.as_view(), name='specialist_all'), |
||||||
|
url(r'^specialist/edit/(?P<pk>\d{1,4})/$', SpecialistUpdateView.as_view(), name='specialist_edit'), |
||||||
|
url(r'^specialist/delete/(?P<pk>\d{1,4})/$', SpecialistDeleteView.as_view(), name='specialist_delete'), |
||||||
|
url(r'^catalog/new/$', CatalogCreateView.as_view(), name='catalog_new'), |
||||||
|
url(r'^catalog/all/$', CatalogListView.as_view(), name='catalog_all'), |
||||||
|
url(r'^catalog/city/$', CatalogCityView.as_view(), name='catalog_city'), |
||||||
|
url(r'^catalog/country/$', CatalogCountryView.as_view(), name='catalog_country'), |
||||||
|
url(r'^catalog/edit/(?P<pk>\d{1,4})/$', CatalogUpdateView.as_view(), name='catalog_edit'), |
||||||
|
url(r'^catalog/delete/(?P<pk>\d{1,4})/$', CatalogDeleteView.as_view(), name='catalog_delete'), |
||||||
|
url(r'^catalog/(?P<catalog_pk>\d{1,4})/add_feedback/$', FeedbackCreateView.as_view(), name='feedback_new'), |
||||||
|
#url(r'^catalog/(?P<pk>\d{1,4})/feedbacks/$', FeedbackListView.as_view(), name='feedback_all'), |
||||||
|
url(r'^catalog/(?P<catalog_pk>\d{1,4})/feedback/(?P<id>\d{1,4})/$', FeedbackUpdateView.as_view(), name='feedback_edit'), |
||||||
|
url(r'^feedback/delete/(?P<pk>\d{1,4})/$', FeedbackDeleteView.as_view(), name='feedback_delete'), |
||||||
|
) |
||||||
@ -0,0 +1,64 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from django import forms |
||||||
|
from hvad.forms import TranslatableModelForm |
||||||
|
from .models import Specialist, SpecialistCatalog, Feedback, City, Country |
||||||
|
from ckeditor.widgets import CKEditorWidget |
||||||
|
from django.utils.translation import get_language |
||||||
|
|
||||||
|
country_choices = [(c.id, c.name) for c in Country.objects.all()] |
||||||
|
lang_code = get_language()[:2] |
||||||
|
|
||||||
|
default_text = u"Планируете посетить выставку в %s?" \ |
||||||
|
u" Мы предлагаем Вам подобрать переводчика именно под Ваши цели и потребности. " \ |
||||||
|
u"Специализируясь уже более 7 лет на предоставлении переводчиков на выставки и конференции " \ |
||||||
|
u"%s, мы можем предоставить профессионалов со знанием разных " \ |
||||||
|
u"языков на гибких для Вас условиях. Каждый заказ индивидуален для нас, " \ |
||||||
|
u"и итоговая цена зависит от вида перевода, тематики, срочности подбора " \ |
||||||
|
u"специалиста, города и объема работы." |
||||||
|
default_title = u"Переводчики в %s" |
||||||
|
|
||||||
|
|
||||||
|
class SpecialistCatalogForm(TranslatableModelForm): |
||||||
|
|
||||||
|
class Meta: |
||||||
|
model = SpecialistCatalog |
||||||
|
fields = ['price', 'currency', 'logo_preview', 'main_descr', 'place_photo', |
||||||
|
'specialists', 'city', 'country', 'type', 'title', 'benefits', 'big_cities'] |
||||||
|
widgets = { |
||||||
|
'type': forms.Select(choices=(('1', 'Country'), ('2', 'City'))), |
||||||
|
'city': forms.HiddenInput(attrs={'id': 'id_city'}), |
||||||
|
'country': forms.Select(choices=country_choices, attrs={'id': 'id_country'}), |
||||||
|
'main_descr': CKEditorWidget, |
||||||
|
'benefits': CKEditorWidget, |
||||||
|
'big_cities': CKEditorWidget, |
||||||
|
} |
||||||
|
|
||||||
|
def save(self, commit=True): |
||||||
|
place = self.cleaned_data.get('city') or self.cleaned_data.get('country') |
||||||
|
place_inflect = place.inflect or place.name |
||||||
|
if not self.cleaned_data['title']: |
||||||
|
self.cleaned_data['title'] = default_title % place_inflect |
||||||
|
if not self.cleaned_data['main_descr']: |
||||||
|
self.cleaned_data['main_descr'] = default_text % (place_inflect, place_inflect) |
||||||
|
return super(SpecialistCatalogForm, self).save(commit=True) |
||||||
|
|
||||||
|
|
||||||
|
class SpecialistForm(forms.ModelForm): |
||||||
|
|
||||||
|
class Meta: |
||||||
|
model = Specialist |
||||||
|
fields = ['name','country', 'city', 'photo', 'languages'] |
||||||
|
widgets = { |
||||||
|
'city': forms.HiddenInput(attrs={'id': 'id_city'}), |
||||||
|
'country': forms.Select(choices=country_choices, attrs={'id': 'id_country'}) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
class FeedbackForm(forms.ModelForm): |
||||||
|
|
||||||
|
class Meta: |
||||||
|
model = Feedback |
||||||
|
fields = ['company', 'name', 'text', 'logo', 'catalog'] |
||||||
|
widgets = { |
||||||
|
'text':CKEditorWidget |
||||||
|
} |
||||||
@ -0,0 +1 @@ |
|||||||
|
__author__ = 'dart_vaider' |
||||||
@ -0,0 +1 @@ |
|||||||
|
__author__ = 'dart_vaider' |
||||||
@ -0,0 +1,34 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
from django.core.management.base import BaseCommand |
||||||
|
from city.models import City |
||||||
|
from specialist_catalog.models import SpecialistCatalog |
||||||
|
|
||||||
|
default_text = u"Планируете посетить выставку в %s?" \ |
||||||
|
u" Мы предлагаем Вам подобрать переводчика именно под Ваши цели и потребности. " \ |
||||||
|
u"Специализируясь уже более 7 лет на предоставлении переводчиков на выставки и конференции " \ |
||||||
|
u"%s, мы можем предоставить профессионалов со знанием разных " \ |
||||||
|
u"языков на гибких для Вас условиях. Каждый заказ индивидуален для нас, " \ |
||||||
|
u"и итоговая цена зависит от вида перевода, тематики, срочности подбора " \ |
||||||
|
u"специалиста, города и объема работы." |
||||||
|
default_title = u"Переводчики в %s" |
||||||
|
default_logo = "specialist_catalog/logo_preview/default_logo.jpg" |
||||||
|
default_cities = u"<ul><li>Лондон</li><li>Киев</li><li>Барселона</li></ul>" |
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand): |
||||||
|
def handle(self, *args, **options): |
||||||
|
cities = list(City.objects.language('ru').order_by('id')) |
||||||
|
for cty in cities: |
||||||
|
name = cty.inflect or cty.name |
||||||
|
sc = SpecialistCatalog( |
||||||
|
type=2, |
||||||
|
country=cty.country, |
||||||
|
city=cty, |
||||||
|
title=default_title % name, |
||||||
|
main_descr=default_text % (name, name), |
||||||
|
logo_preview=default_logo, |
||||||
|
big_cities=default_cities, |
||||||
|
) |
||||||
|
sc.save() |
||||||
|
print cty.url, " -> ", cty.country.url |
||||||
@ -0,0 +1,33 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from django.core.management.base import BaseCommand |
||||||
|
from country.models import Country |
||||||
|
from specialist_catalog.models import SpecialistCatalog |
||||||
|
|
||||||
|
default_text = u"Планируете посетить выставку в %s?" \ |
||||||
|
u" Мы предлагаем Вам подобрать переводчика именно под Ваши цели и потребности. " \ |
||||||
|
u"Специализируясь уже более 7 лет на предоставлении переводчиков на выставки и конференции " \ |
||||||
|
u"%s, мы можем предоставить профессионалов со знанием разных " \ |
||||||
|
u"языков на гибких для Вас условиях. Каждый заказ индивидуален для нас, " \ |
||||||
|
u"и итоговая цена зависит от вида перевода, тематики, срочности подбора " \ |
||||||
|
u"специалиста, города и объема работы." |
||||||
|
default_title = u"Переводчики в %s" |
||||||
|
default_logo = "specialist_catalog/logo_preview/ukraine.gif" |
||||||
|
default_cities = u"<ul><li>Лондон</li><li>Киев</li><li>Барселона</li></ul>" |
||||||
|
lang = 'ru' |
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand): |
||||||
|
def handle(self, *args, **options): |
||||||
|
countries = Country.objects.language('ru').order_by('name') |
||||||
|
for cntry in countries: |
||||||
|
name = cntry.inflect or cntry.name |
||||||
|
sc = SpecialistCatalog( |
||||||
|
type='1', |
||||||
|
country=cntry, |
||||||
|
title=default_title % name, |
||||||
|
main_descr=default_text % (name, name), |
||||||
|
logo_preview=default_logo, |
||||||
|
big_cities=default_cities, |
||||||
|
) |
||||||
|
sc.save() |
||||||
|
print "created for: %s" % cntry.url |
||||||
@ -0,0 +1,97 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from django.db import models |
||||||
|
from django.conf import settings |
||||||
|
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager |
||||||
|
from city.models import City |
||||||
|
from country.models import Country |
||||||
|
from django.core.urlresolvers import reverse_lazy |
||||||
|
from django.utils.translation import get_language |
||||||
|
import copy |
||||||
|
|
||||||
|
# types of catalog |
||||||
|
_country = 1 |
||||||
|
_city = 2 |
||||||
|
|
||||||
|
|
||||||
|
class Specialist(models.Model): |
||||||
|
name = models.CharField(max_length=255, verbose_name=u"Полное имя", blank=False) |
||||||
|
languages = models.CharField(max_length=255, verbose_name=u"Языки") |
||||||
|
city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name=u"Город", blank=True) |
||||||
|
country = models.ForeignKey(Country, on_delete=models.PROTECT, verbose_name=u"Страна") |
||||||
|
photo = models.ImageField(verbose_name=u"Фото", upload_to="specialist_catalog/specialist_photo/", blank=True) |
||||||
|
|
||||||
|
def __unicode__(self): |
||||||
|
return u"%s" % self.name |
||||||
|
|
||||||
|
|
||||||
|
class SpecialistCatalog(TranslatableModel): |
||||||
|
price = models.IntegerField(verbose_name=u"Цена", default=200) |
||||||
|
currency = models.CharField(max_length=255, verbose_name=u"Валюта", default=u"EUR") |
||||||
|
logo_preview = models.ImageField(verbose_name=u"Логотип", blank=True, upload_to='specialist_catalog/logo_preview/') |
||||||
|
place_photo = models.ImageField(verbose_name=u"Фото для города", blank=True, upload_to='specialist_catalog/place_photo/') |
||||||
|
specialists = models.ManyToManyField(Specialist, verbose_name=u"Специалисты", blank=True) |
||||||
|
city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name=u"Город", unique=True, blank=True) |
||||||
|
country = models.ForeignKey(Country, on_delete=models.PROTECT, verbose_name=u"Страна", blank=False) |
||||||
|
type = models.PositiveSmallIntegerField(verbose_name=u"Тип(Страна/Город)", default=2) |
||||||
|
|
||||||
|
translations = TranslatedFields( |
||||||
|
title=models.CharField(max_length=255, verbose_name=u"Заголовок"), |
||||||
|
main_descr=models.CharField(max_length=1000, verbose_name=u"Краткое описание"), |
||||||
|
benefits=models.CharField(max_length=2000, verbose_name=u"Преимущества"), |
||||||
|
big_cities=models.TextField(verbose_name=u"Крупные города") |
||||||
|
) |
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs): |
||||||
|
super(SpecialistCatalog, self).__init__(*args, **kwargs) |
||||||
|
self.cache_fields = ['title', 'main_descr', 'benefits'] |
||||||
|
self.is_new = True |
||||||
|
|
||||||
|
def get_absolute_url(self): |
||||||
|
global _country, _city |
||||||
|
if self.type == _country: |
||||||
|
return reverse_lazy('spec_catalog_country', kwargs={'slug': self.country.url}) |
||||||
|
return reverse_lazy('spec_catalog_city', kwargs={'slug': self.city.url}) |
||||||
|
|
||||||
|
def save(self, *args, **kwargs): |
||||||
|
super(SpecialistCatalog, self).save(*args, **kwargs) |
||||||
|
self.initial_language = get_language()[:2] or 'ru' |
||||||
|
|
||||||
|
new_values = {field: getattr(self, field) for field in self.cache_fields} |
||||||
|
langs = [code for code, _ in settings.LANGUAGES] |
||||||
|
if self.is_new: |
||||||
|
for lang in langs: |
||||||
|
if lang not in self.get_available_languages(): |
||||||
|
self.translate(lang) |
||||||
|
for key, value in new_values.items(): |
||||||
|
setattr(self, key, value) |
||||||
|
self.save_translations(self) |
||||||
|
else: |
||||||
|
translations = {obj.language_code: obj for obj in list(self.translations.all())} |
||||||
|
for lang in langs: |
||||||
|
if lang is not self.initial_language: |
||||||
|
tr = translations[lang] |
||||||
|
for key, value in new_values.items(): |
||||||
|
#if u'%s' % getattr(tr, key) is u'%s' % self.var_cache[key]: |
||||||
|
setattr(tr, key, value) |
||||||
|
tr.save() |
||||||
|
|
||||||
|
self.lazy_translation_getter(self.initial_language) |
||||||
|
self.var_cache = {var: copy.copy(getattr(self, var)) for var in self.cache_fields} |
||||||
|
self.is_new = False |
||||||
|
return self |
||||||
|
|
||||||
|
def __unicode__(self): |
||||||
|
return self.title |
||||||
|
|
||||||
|
|
||||||
|
class Feedback(models.Model): |
||||||
|
company = models.CharField(max_length=255, verbose_name=u"Название компании") |
||||||
|
name = models.CharField(max_length=100, verbose_name=u"Имя") |
||||||
|
text = models.CharField(max_length=5000, verbose_name=u"Текст отзыва") |
||||||
|
logo = models.ImageField(verbose_name=u"Логотип компании", upload_to='specialist_catalog/feedback_logo/', blank=True) |
||||||
|
catalog = models.ForeignKey(SpecialistCatalog, verbose_name=u"Страница", blank=False) |
||||||
|
|
||||||
|
def __unicode__(self): |
||||||
|
return "Feedback from %s" % self.company |
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,16 @@ |
|||||||
|
""" |
||||||
|
This file demonstrates writing tests using the unittest module. These will pass |
||||||
|
when you run "manage.py test". |
||||||
|
|
||||||
|
Replace this with more appropriate tests for your application. |
||||||
|
""" |
||||||
|
|
||||||
|
from django.test import TestCase |
||||||
|
|
||||||
|
|
||||||
|
class SimpleTest(TestCase): |
||||||
|
def test_basic_addition(self): |
||||||
|
""" |
||||||
|
Tests that 1 + 1 always equals 2. |
||||||
|
""" |
||||||
|
self.assertEqual(1 + 1, 2) |
||||||
@ -0,0 +1,8 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from django.conf.urls import url, patterns |
||||||
|
from .views import CatalogDetailedView |
||||||
|
|
||||||
|
urlpatterns = patterns('', |
||||||
|
url(r'^city/(?P<slug>.*)/$', CatalogDetailedView.as_view(), {'type': 'city'}, name="spec_catalog_city"), |
||||||
|
url(r'^country/(?P<slug>.*)/$', CatalogDetailedView.as_view(), {'type': 'country'}, name="spec_catalog_country"), |
||||||
|
) |
||||||
@ -0,0 +1,171 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from django.views.generic import CreateView, UpdateView, DeleteView, ListView, FormView, DetailView |
||||||
|
from django.views.generic.detail import SingleObjectMixin |
||||||
|
from .forms import * |
||||||
|
from django.core.urlresolvers import reverse_lazy |
||||||
|
from django.conf import settings |
||||||
|
from django.shortcuts import get_object_or_404 |
||||||
|
from service.order_forms import TranslationForm |
||||||
|
from django.http import HttpResponseRedirect |
||||||
|
from django.utils.translation import get_language |
||||||
|
|
||||||
|
# =========== ADMIN VIEWS =========== |
||||||
|
|
||||||
|
# Specialist views |
||||||
|
|
||||||
|
|
||||||
|
class SpecialistCreateView(CreateView): |
||||||
|
form_class = SpecialistForm |
||||||
|
model = Specialist |
||||||
|
template_name = 'admin/specialist/specialist_new.html' |
||||||
|
success_url = reverse_lazy("specialist_all") |
||||||
|
|
||||||
|
|
||||||
|
class SpecialistListView(ListView): |
||||||
|
model = Specialist |
||||||
|
template_name = 'admin/specialist/specialist_all.html' |
||||||
|
paginate_by = settings.ADMIN_PAGINATION |
||||||
|
|
||||||
|
|
||||||
|
class SpecialistUpdateView(UpdateView): |
||||||
|
form_class = SpecialistForm |
||||||
|
model = Specialist |
||||||
|
template_name = 'admin/specialist/specialist_new.html' |
||||||
|
success_url = reverse_lazy("specialist_all") |
||||||
|
|
||||||
|
def get_form(self, form_class): |
||||||
|
form = super(SpecialistUpdateView, self).get_form(form_class) |
||||||
|
form.fields['city'].widget.attrs['data-init-text'] = self.object.city.name |
||||||
|
return form |
||||||
|
|
||||||
|
|
||||||
|
class SpecialistDeleteView(DeleteView): |
||||||
|
model = Specialist |
||||||
|
template_name = 'admin/specialist/specialist_confirm_delete.html' |
||||||
|
success_url = reverse_lazy("specialist_all") |
||||||
|
|
||||||
|
|
||||||
|
# Catalog views |
||||||
|
|
||||||
|
|
||||||
|
class CatalogCreateView(CreateView): |
||||||
|
form_class = SpecialistCatalogForm |
||||||
|
model = SpecialistCatalog |
||||||
|
template_name = 'admin/specialist/catalog_new.html' |
||||||
|
success_url = reverse_lazy("catalog_all") |
||||||
|
|
||||||
|
|
||||||
|
class CatalogListView(ListView): |
||||||
|
model = SpecialistCatalog |
||||||
|
template_name = 'admin/specialist/catalog_all.html' |
||||||
|
paginate_by = settings.ADMIN_PAGINATION |
||||||
|
|
||||||
|
|
||||||
|
class CatalogCityView(ListView): |
||||||
|
model = SpecialistCatalog |
||||||
|
template_name = 'admin/specialist/catalog_all.html' |
||||||
|
paginate_by = settings.ADMIN_PAGINATION |
||||||
|
|
||||||
|
def get_queryset(self): |
||||||
|
qs = super(CatalogCityView, self).get_queryset() |
||||||
|
return qs.filter(type=2) |
||||||
|
|
||||||
|
|
||||||
|
class CatalogCountryView(ListView): |
||||||
|
model = SpecialistCatalog |
||||||
|
template_name = 'admin/specialist/catalog_all.html' |
||||||
|
paginate_by = settings.ADMIN_PAGINATION |
||||||
|
|
||||||
|
def get_queryset(self): |
||||||
|
qs = super(CatalogCountryView, self).get_queryset() |
||||||
|
return qs.filter(type=1) |
||||||
|
|
||||||
|
|
||||||
|
class CatalogUpdateView(UpdateView): |
||||||
|
form_class = SpecialistCatalogForm |
||||||
|
model = SpecialistCatalog |
||||||
|
template_name = 'admin/specialist/catalog_new.html' |
||||||
|
success_url = reverse_lazy("catalog_all") |
||||||
|
|
||||||
|
def get_form(self, form_class): |
||||||
|
form = super(CatalogUpdateView, self).get_form(form_class) |
||||||
|
if self.object.type is 2: # city |
||||||
|
form.fields['city'].widget.attrs['data-init-text'] = self.object.city.name |
||||||
|
return form |
||||||
|
|
||||||
|
|
||||||
|
class CatalogDeleteView(DeleteView): |
||||||
|
model = SpecialistCatalog |
||||||
|
template_name = 'admin/specialist/catalog_confirm_delete.html' |
||||||
|
success_url = reverse_lazy("catalog_all") |
||||||
|
|
||||||
|
|
||||||
|
# Feedback views |
||||||
|
|
||||||
|
|
||||||
|
class FeedbackCreateView(CreateView): |
||||||
|
form_class = FeedbackForm |
||||||
|
model = Feedback |
||||||
|
template_name = 'admin/specialist/feedback_new.html' |
||||||
|
success_url = reverse_lazy("catalog_all") |
||||||
|
|
||||||
|
def get_initial(self): |
||||||
|
catalog = get_object_or_404(SpecialistCatalog, pk=self.kwargs.get('catalog_pk')) |
||||||
|
return {'catalog': catalog} |
||||||
|
|
||||||
|
|
||||||
|
class FeedbackUpdateView(UpdateView): |
||||||
|
form_class = FeedbackForm |
||||||
|
model = Feedback |
||||||
|
template_name = 'admin/specialist/feedback_new.html' |
||||||
|
success_url = reverse_lazy("catalog_all") |
||||||
|
|
||||||
|
def get_initial(self): |
||||||
|
catalog = get_object_or_404(SpecialistCatalog, pk=self.kwargs.get('catalog_pk')) |
||||||
|
return {'catalog': catalog} |
||||||
|
|
||||||
|
|
||||||
|
class FeedbackDeleteView(DeleteView): |
||||||
|
model = Feedback |
||||||
|
template_name = 'admin/specialist/feedback_confirm_delete.html' |
||||||
|
success_url = reverse_lazy("catalog_all") |
||||||
|
|
||||||
|
|
||||||
|
# ========= CLIENT VIEWS ============ |
||||||
|
|
||||||
|
lang = get_language()[:2] |
||||||
|
|
||||||
|
|
||||||
|
class CatalogDetailedView(SingleObjectMixin, FormView): |
||||||
|
model = SpecialistCatalog |
||||||
|
form_class = TranslationForm |
||||||
|
template_name = "client/specialist_catalog/catalog_detailed.html" |
||||||
|
success_url = reverse_lazy("service_thanks") |
||||||
|
|
||||||
|
def get_object(self, queryset=None): |
||||||
|
if self.kwargs.get('type') is "country": |
||||||
|
obj = self.model.objects.language(lang).get(country__url=self.kwargs.get('slug')) |
||||||
|
else: |
||||||
|
obj = self.model.objects.language(lang).get(city__url=self.kwargs.get('slug')) |
||||||
|
self.object = obj |
||||||
|
return obj |
||||||
|
|
||||||
|
def get_context_data(self, **kwargs): |
||||||
|
self.get_object() |
||||||
|
context = super(CatalogDetailedView, self).get_context_data(**kwargs) |
||||||
|
context['object'] = self.object |
||||||
|
return context |
||||||
|
|
||||||
|
def form_valid(self, form): |
||||||
|
order = form.save(commit=False) |
||||||
|
order.save() |
||||||
|
return HttpResponseRedirect(self.success_url) |
||||||
|
|
||||||
|
def get_initial(self): |
||||||
|
obj = self.get_object() |
||||||
|
init = {} |
||||||
|
init['country'] = obj.country.name |
||||||
|
if self.kwargs.get('type') is "city": |
||||||
|
init['city'] = obj.city.name |
||||||
|
return init |
||||||
|
|
||||||
@ -0,0 +1,93 @@ |
|||||||
|
/** |
||||||
|
* Created by dev on 07.09.2015. |
||||||
|
*/ |
||||||
|
$(document).ready(function () { |
||||||
|
$('select').select2({ |
||||||
|
width: 'element', |
||||||
|
allowClear: true |
||||||
|
}); |
||||||
|
|
||||||
|
$('#id_country').change(function () { |
||||||
|
$.get( |
||||||
|
"/admin/ajax_city/", {'id': $(this).val()}, function (j) { |
||||||
|
|
||||||
|
$('#id_city').html(j); |
||||||
|
$('#id_city').attr('disabled', false); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
$('#id_city').select2({ |
||||||
|
placeholder: "Город", |
||||||
|
width: 300, |
||||||
|
ajax: { |
||||||
|
|
||||||
|
url: "/admin/city/search/", |
||||||
|
dataType: "json", |
||||||
|
quietMillis: 200, |
||||||
|
|
||||||
|
data: function (term, page, country) { |
||||||
|
var country = $('#id_country').val(); |
||||||
|
return { |
||||||
|
term: term, |
||||||
|
page: page, |
||||||
|
country: country |
||||||
|
}; |
||||||
|
}, |
||||||
|
|
||||||
|
results: function (data) { |
||||||
|
var results = []; |
||||||
|
$.each(data, function (index, item) { |
||||||
|
results.push({ |
||||||
|
id: item.id, |
||||||
|
text: item.label |
||||||
|
}); |
||||||
|
}); |
||||||
|
return {results: results}; |
||||||
|
} |
||||||
|
}, |
||||||
|
initSelection: function (element, callback) { |
||||||
|
var id = $(element).val(); |
||||||
|
var text = $(element).attr('data-init-text'); |
||||||
|
callback({id: id, text: text}); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
// displaying uploaded photo
|
||||||
|
|
||||||
|
function handleFileSelect(evt) { |
||||||
|
var files = evt.target.files; // FileList object
|
||||||
|
|
||||||
|
// Loop through the FileList and render image files as thumbnails.
|
||||||
|
for (var i = 0, f; f = files[i]; i++) { |
||||||
|
|
||||||
|
// Only process image files.
|
||||||
|
if (!f.type.match('image.*')) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
var reader = new FileReader(); |
||||||
|
|
||||||
|
// Closure to capture the file information.
|
||||||
|
|
||||||
|
reader.onload = (function (theFile) { |
||||||
|
return function (e) { |
||||||
|
document.getElementById('list').innerHTML = ['<img class="thumb" src="', |
||||||
|
e.target.result, '" title="', escape(theFile.name), '"/>'].join(''); |
||||||
|
}; |
||||||
|
})(f); |
||||||
|
|
||||||
|
|
||||||
|
// Read in the image file as a data URL.
|
||||||
|
reader.readAsDataURL(f); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
document.getElementById('id_photo').addEventListener('change', handleFileSelect, false); |
||||||
|
document.getElementById('id_logo').addEventListener('change', handleFileSelect, false); |
||||||
|
console.log("hello from new specialist view.js"); |
||||||
|
}); |
||||||
@ -0,0 +1,120 @@ |
|||||||
|
/** |
||||||
|
* Created by dev on 07.09.2015. |
||||||
|
*/ |
||||||
|
$(document).ready(function () { |
||||||
|
$('select').select2({ |
||||||
|
width: 'element', |
||||||
|
allowClear: true |
||||||
|
}); |
||||||
|
|
||||||
|
$('#id_country').change(function () { |
||||||
|
$.get( |
||||||
|
"/admin/ajax_city/", {'id': $(this).val()}, function (j) { |
||||||
|
|
||||||
|
$('#id_city').html(j); |
||||||
|
$('#id_city').attr('disabled', false); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
$('#id_city').select2({ |
||||||
|
placeholder: "Город", |
||||||
|
width: 300, |
||||||
|
ajax: { |
||||||
|
|
||||||
|
url: "/admin/city/search/", |
||||||
|
dataType: "json", |
||||||
|
quietMillis: 200, |
||||||
|
|
||||||
|
data: function (term, page, country) { |
||||||
|
var country = $('#id_country').val(); |
||||||
|
return { |
||||||
|
term: term, |
||||||
|
page: page, |
||||||
|
country: country |
||||||
|
}; |
||||||
|
}, |
||||||
|
|
||||||
|
results: function (data) { |
||||||
|
var results = []; |
||||||
|
$.each(data, function (index, item) { |
||||||
|
results.push({ |
||||||
|
id: item.id, |
||||||
|
text: item.label |
||||||
|
}); |
||||||
|
}); |
||||||
|
return {results: results}; |
||||||
|
} |
||||||
|
}, |
||||||
|
initSelection: function (element, callback) { |
||||||
|
var id = $(element).val(); |
||||||
|
var text = $(element).attr('data-init-text'); |
||||||
|
callback({id: id, text: text}); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
// displaying uploaded photo
|
||||||
|
|
||||||
|
function handleFileSelect1(evt) { |
||||||
|
var files = evt.target.files; // FileList object
|
||||||
|
|
||||||
|
// Loop through the FileList and render image files as thumbnails.
|
||||||
|
for (var i = 0, f; f = files[i]; i++) { |
||||||
|
|
||||||
|
// Only process image files.
|
||||||
|
if (!f.type.match('image.*')) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
var reader = new FileReader(); |
||||||
|
|
||||||
|
// Closure to capture the file information.
|
||||||
|
|
||||||
|
reader.onload = (function (theFile) { |
||||||
|
return function (e) { |
||||||
|
document.getElementById('list_picture').innerHTML = ['<img class="thumb" src="', |
||||||
|
e.target.result, '" title="', escape(theFile.name), '"/>'].join(''); |
||||||
|
}; |
||||||
|
})(f); |
||||||
|
|
||||||
|
|
||||||
|
// Read in the image file as a data URL.
|
||||||
|
reader.readAsDataURL(f); |
||||||
|
} |
||||||
|
} |
||||||
|
function handleFileSelect2(evt) { |
||||||
|
var files = evt.target.files; // FileList object
|
||||||
|
|
||||||
|
// Loop through the FileList and render image files as thumbnails.
|
||||||
|
for (var i = 0, f; f = files[i]; i++) { |
||||||
|
|
||||||
|
// Only process image files.
|
||||||
|
if (!f.type.match('image.*')) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
var reader = new FileReader(); |
||||||
|
|
||||||
|
// Closure to capture the file information.
|
||||||
|
|
||||||
|
reader.onload = (function (theFile) { |
||||||
|
return function (e) { |
||||||
|
document.getElementById('list_logo').innerHTML = ['<img class="thumb" src="', |
||||||
|
e.target.result, '" title="', escape(theFile.name), '"/>'].join(''); |
||||||
|
}; |
||||||
|
})(f); |
||||||
|
|
||||||
|
|
||||||
|
// Read in the image file as a data URL.
|
||||||
|
reader.readAsDataURL(f); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
document.getElementById('id_place_photo').addEventListener('change', handleFileSelect1, false); |
||||||
|
document.getElementById('id_logo_preview').addEventListener('change', handleFileSelect2, false); |
||||||
|
console.log("hello from new catalog view.js"); |
||||||
|
}); |
||||||
@ -0,0 +1,167 @@ |
|||||||
|
/** |
||||||
|
* Created by dev on 07.09.2015. |
||||||
|
*/ |
||||||
|
$(document).ready(function () { |
||||||
|
$('select').select2({ |
||||||
|
width: 'element', |
||||||
|
allowClear: true |
||||||
|
}); |
||||||
|
|
||||||
|
$('#id_country').change(function () { |
||||||
|
$.get( |
||||||
|
"/admin/ajax_city/", {'id': $(this).val()}, function (j) { |
||||||
|
|
||||||
|
$('#id_city').html(j); |
||||||
|
$('#id_city').attr('disabled', false); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
$('#id_place').select2({ |
||||||
|
placeholder:"Место проведения", |
||||||
|
widht: 400 |
||||||
|
}); |
||||||
|
|
||||||
|
$('#id_city').select2({ |
||||||
|
placeholder: "Город", |
||||||
|
width: 300, |
||||||
|
ajax: { |
||||||
|
|
||||||
|
url: "/admin/city/search/", |
||||||
|
dataType: "json", |
||||||
|
quietMillis: 200, |
||||||
|
|
||||||
|
data: function (term, page, country) { |
||||||
|
var country = $('#id_country').val() |
||||||
|
return { |
||||||
|
term: term, |
||||||
|
page: page, |
||||||
|
country: country |
||||||
|
}; |
||||||
|
}, |
||||||
|
|
||||||
|
results: function (data) { |
||||||
|
var results = []; |
||||||
|
$.each(data, function (index, item) { |
||||||
|
results.push({ |
||||||
|
id: item.id, |
||||||
|
text: item.label |
||||||
|
}); |
||||||
|
}); |
||||||
|
return {results: results}; |
||||||
|
} |
||||||
|
}, |
||||||
|
initSelection: function (element, callback) { |
||||||
|
var id = $(element).val(); |
||||||
|
var text = $(element).attr('data-init-text'); |
||||||
|
callback({id: id, text: text}); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
$('#id_0-periodic').select2({ |
||||||
|
placeholder: "Периодичность", |
||||||
|
width: '350px' |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
$('#id_tag').select2({ |
||||||
|
placeholder: "Теги", |
||||||
|
width: '350px', |
||||||
|
multiple: true, |
||||||
|
ajax: { |
||||||
|
|
||||||
|
url: "/admin/theme/tag/search/", |
||||||
|
dataType: "json", |
||||||
|
quietMillis: 200, |
||||||
|
multiple: true, |
||||||
|
|
||||||
|
data: function (term, page, theme) { |
||||||
|
var theme = $('#id_theme').serialize().replace(/0-theme/g, 'theme'); |
||||||
|
return { |
||||||
|
term: term, |
||||||
|
page: page, |
||||||
|
theme: theme |
||||||
|
}; |
||||||
|
}, |
||||||
|
|
||||||
|
results: function (data) { |
||||||
|
var results = []; |
||||||
|
$.each(data, function (index, item) { |
||||||
|
results.push({ |
||||||
|
id: item.id, |
||||||
|
text: item.label |
||||||
|
}); |
||||||
|
}); |
||||||
|
return {results: results}; |
||||||
|
} |
||||||
|
}, |
||||||
|
initSelection: function (element, callback) { |
||||||
|
var data = []; |
||||||
|
$(element.val().split(",")).each(function (i) { |
||||||
|
var item = this.split(':'); |
||||||
|
data.push({ |
||||||
|
id: item[0], |
||||||
|
text: item[1] |
||||||
|
}); |
||||||
|
}); |
||||||
|
callback(data); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
// end selects
|
||||||
|
/* |
||||||
|
*/ |
||||||
|
// theme change
|
||||||
|
|
||||||
|
$('#id_theme').change(function () { |
||||||
|
$.get( |
||||||
|
"/admin/ajax_tag/", {'id': $(this).serialize().replace(/0-theme/g, 'theme')}, function (data) { |
||||||
|
var optionValues = []; |
||||||
|
var getValues = []; |
||||||
|
var selectedValues = []; |
||||||
|
//push values sended from server in array
|
||||||
|
$.each(data, function (i, elem) { |
||||||
|
getValues.push(elem[0].toString()) |
||||||
|
}); |
||||||
|
//delete options if they aren't in getvalues
|
||||||
|
//otherwise push it in array
|
||||||
|
//also push in array already selected values
|
||||||
|
$('#id_tag option').each(function () { |
||||||
|
var check = $.inArray($(this), getValues); |
||||||
|
if ($(this).is(':selected')) { |
||||||
|
selectedValues.push($(this).val()) |
||||||
|
} |
||||||
|
if (check == -1) { |
||||||
|
$(this).remove() |
||||||
|
} |
||||||
|
else { |
||||||
|
optionValues.push($(this).val()); |
||||||
|
} |
||||||
|
}); |
||||||
|
//generate new options
|
||||||
|
//old options unchanged
|
||||||
|
var html = ''; |
||||||
|
$.each(data, function (i, elem) { |
||||||
|
var check = $.inArray(elem[0].toString(), optionValues); |
||||||
|
|
||||||
|
if (check == -1) { |
||||||
|
html += '<option value="'; |
||||||
|
html += elem[0]; |
||||||
|
html += '">'; |
||||||
|
html += elem[1]; |
||||||
|
html += '</option>'; |
||||||
|
} |
||||||
|
}); |
||||||
|
$('#id_tag').append(html); |
||||||
|
//select previous selected values
|
||||||
|
$('#id_tag option').each(function () { |
||||||
|
var check = $.inArray($(this).val(), selectedValues) |
||||||
|
if (check != -1) { |
||||||
|
$(this).attr('selected', 'selected'); |
||||||
|
} |
||||||
|
}); |
||||||
|
});//end get
|
||||||
|
});//end change
|
||||||
|
console.log("hello from wizard.js"); |
||||||
|
}); |
||||||
@ -1,63 +1,79 @@ |
|||||||
{% extends 'base.html' %} |
{% extends 'base.html' %} |
||||||
{% load static %} |
{% load static %} |
||||||
{# Displays article form #} |
{# Displays article form #} |
||||||
|
|
||||||
{% block scripts %} |
{% block scripts %} |
||||||
|
|
||||||
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script> |
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script> |
||||||
{# selects #} |
{# selects #} |
||||||
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
||||||
<script src="{% static 'js/select/select2.js' %}"></script> |
<script src="{% static 'js/select/select2.js' %}"></script> |
||||||
<script src="{% static 'custom_js/make_select.js' %}"></script> |
<script src="{% static 'custom_js/make_select.js' %}"></script> |
||||||
{# ajax #} |
{# ajax #} |
||||||
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script> |
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script> |
||||||
<script src="{% static 'custom_js/select_tag.js' %}"></script> |
<script src="{% static 'custom_js/select_tag.js' %}"></script> |
||||||
|
|
||||||
{% endblock %} |
{% endblock %} |
||||||
|
|
||||||
{% block body %} |
{% block body %} |
||||||
{{ request.LANGUAGE_CODE }} |
{{ request.LANGUAGE_CODE }} |
||||||
<form method="post" class="form-horizontal" > {% csrf_token %} |
<form method="post" class="form-horizontal" > {% csrf_token %} |
||||||
<fieldset> |
<fieldset> |
||||||
<div class="box span8"> |
<div class="box span8"> |
||||||
<div class="box-header well"> |
<div class="box-header well"> |
||||||
<h2><i class="icon-pencil"></i> Основная информация</h2> |
<h2><i class="icon-pencil"></i> Основная информация</h2> |
||||||
</div> |
</div> |
||||||
<div class="box-content"> |
<div class="box-content"> |
||||||
{# url/slug #} |
{# url/slug #} |
||||||
<div class="control-group {% if form.url.errors %}error{% endif %}"> |
<div class="control-group {% if form.url.errors %}error{% endif %}"> |
||||||
<label class="control-label"><b>{{ form.url.label }}:</b></label> |
<label class="control-label"><b>{{ form.url.label }}:</b></label> |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
{{ form.langs }} |
{{ form.langs }} |
||||||
{{ form.url }} |
{{ form.url }}<span class="help-inline"></span> |
||||||
<span class="help-inline">{{ form.url.errors }}</span> |
<span class="help-inline">{{ form.url.errors }}</span> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
{# title #} |
{# title #} |
||||||
<div class="control-group {% if form.title.errors %}error{% endif %}"> |
<div class="control-group {% if form.title.errors %}error{% endif %}"> |
||||||
<label class="control-label">{{ form.title.label }}:</label> |
<label class="control-label">{{ form.title.label }}:</label> |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
{{ form.title }} |
{{ form.title }} |
||||||
<span class="help-inline">{{ form.title.errors }}</span> |
<span class="help-inline">{{ form.title.errors }}</span> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
{# body #} |
{# page title #} |
||||||
<div class="control-group {% if form.body.errors %}error{% endif %}"> |
<div class="control-group {% if form.page_title.errors %}error{% endif %}"> |
||||||
<label class="control-label">{{ form.body.label }}:</label> |
<label class="control-label">{{ form.page_title.label }}:</label> |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
{{ form.body }} |
{{ form.page_title }} |
||||||
<span class="help-inline">{{ form.body.errors }}</span> |
<span class="help-inline">{{ form.page_title.errors }}</span> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
</div> |
{# description #} |
||||||
</div> |
<div class="control-group {% if form.description.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.description.label }}:</label> |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
|
{{ form.description }} |
||||||
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/meta/seo/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/> |
<span class="help-inline">{{ form.description.errors }}</span> |
||||||
<input class="btn btn-large" type="reset" value="Отмена"> |
</div> |
||||||
</div> |
</div> |
||||||
</fieldset> |
{# body #} |
||||||
</form> |
<div class="control-group {% if form.body.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.body.label }}:</label> |
||||||
{% endblock %} |
<div class="controls"> |
||||||
|
{{ form.body }} |
||||||
|
<span class="help-inline">{{ form.body.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="controls"> |
||||||
|
|
||||||
|
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/meta/seo/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/> |
||||||
|
<input class="btn btn-large" type="reset" value="Отмена"> |
||||||
|
</div> |
||||||
|
</fieldset> |
||||||
|
</form> |
||||||
|
|
||||||
|
{% endblock %} |
||||||
|
|||||||
@ -1,11 +1,11 @@ |
|||||||
{% extends 'base.html' %} |
{% extends 'base.html' %} |
||||||
{% block sidebar %}{% endblock %} |
{% block sidebar %}{% endblock %} |
||||||
{% block body %} |
{% block body %} |
||||||
<form action="" method="post">{% csrf_token %} |
<form action="" method="post">{% csrf_token %} |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
<p>Вы точно хотите удалить seo-текст "{{ object.title }}" для страницы <a href = "{{ object.url }}"></a> ?</p> |
<p>Вы точно хотите удалить seo-текст "{{ object.title }}" для страницы <a href = "{{ object.url }}"></a> ?</p> |
||||||
<input class="btn btn-large btn-danger delete" type="submit" value="Да" /> |
<input class="btn btn-large btn-danger delete" type="submit" value="Да" /> |
||||||
<a class="btn btn-large btn-primary" href = {% url 'seo_all' %}>Нет</a> |
<a class="btn btn-large btn-primary" href = {% url 'seo_all' %}>Нет</a> |
||||||
</div> |
</div> |
||||||
</form> |
</form> |
||||||
{% endblock %} |
{% endblock %} |
||||||
@ -1,90 +1,90 @@ |
|||||||
{% extends 'base.html' %} |
{% extends 'base.html' %} |
||||||
{% load static %} |
{% load static %} |
||||||
{# Displays article form #} |
{# Displays article form #} |
||||||
|
|
||||||
{% block scripts %} |
{% block scripts %} |
||||||
|
|
||||||
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script> |
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script> |
||||||
{# selects #} |
{# selects #} |
||||||
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
||||||
<script src="{% static 'js/select/select2.js' %}"></script> |
<script src="{% static 'js/select/select2.js' %}"></script> |
||||||
<script src="{% static 'custom_js/make_select.js' %}"></script> |
<script src="{% static 'custom_js/make_select.js' %}"></script> |
||||||
{# ajax #} |
{# ajax #} |
||||||
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script> |
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script> |
||||||
<script src="{% static 'custom_js/select_tag.js' %}"></script> |
<script src="{% static 'custom_js/select_tag.js' %}"></script> |
||||||
|
|
||||||
{% endblock %} |
{% endblock %} |
||||||
|
|
||||||
{% block body %} |
{% block body %} |
||||||
|
|
||||||
{# Uses multilang.html template for translated fields #} |
{# Uses multilang.html template for translated fields #} |
||||||
<form method="post" class="form-horizontal" > {% csrf_token %} |
<form method="post" action="" class="form-horizontal" > {% csrf_token %} |
||||||
<fieldset> |
<fieldset> |
||||||
<div class="box span8"> |
<div class="box span8"> |
||||||
<div class="box-header well"> |
<div class="box-header well"> |
||||||
<h2><i class="icon-pencil"></i> Основная информация</h2> |
<h2><i class="icon-pencil"></i> Основная информация</h2> |
||||||
</div> |
</div> |
||||||
<div class="box-content"> |
<div class="box-content"> |
||||||
{# url/slug #} |
{# url/slug #} |
||||||
{% if request.path == '/admin/page/new/' %} |
{# {% if request.path == '/admin/page/new/' %}#} |
||||||
<div class="control-group {% if form.url.errors %}error{% endif %}"> |
<div class="control-group {% if form.url.errors %}error{% endif %}"> |
||||||
<label class="control-label"><b>{{ form.url.label }}:</b></label> |
<label class="control-label"><b>{{ form.url.label }}:</b></label> |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
{{ form.langs }} |
{{ form.url }} |
||||||
{{ form.url }} |
<span class="help-inline">{{ form.url.errors }}</span> |
||||||
<span class="help-inline">{{ form.url.errors }}</span> |
</div> |
||||||
</div> |
</div> |
||||||
</div> |
{# {% endif %}#} |
||||||
{% endif %} |
|
||||||
{# h1 #} |
{# h1 #} |
||||||
<div class="control-group {% if form.h1.errors %}error{% endif %} "> |
<div class="control-group {% if form.h1.errors %}error{% endif %} "> |
||||||
<label class="control-label"><b>{{ form.h1.label }}:</b></label> |
<label class="control-label"><b>{{ form.h1.label }}:</b></label> |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
{{ form.h1 }} |
{{ form.h1 }} |
||||||
<span class="help-inline">{{ form.h1.errors }}</span> |
<span class="help-inline">{{ form.h1.errors }}</span> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
{# title #} |
{# title #} |
||||||
<div class="control-group {% if form.title.errors %}error{% endif %}"> |
<div class="control-group {% if form.title.errors %}error{% endif %}"> |
||||||
<label class="control-label">{{ form.title.label }}:</label> |
<label class="control-label">{{ form.title.label }}:</label> |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
{{ form.title }} |
{{ form.title }} |
||||||
<span class="help-inline">{{ form.title.errors }}</span> |
<span class="help-inline">{{ form.title.errors }}</span> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
{# description #} |
{# description #} |
||||||
<div class="control-group {% if form.descriptions.errors %}error{% endif %}"> |
<div class="control-group {% if form.descriptions.errors %}error{% endif %}"> |
||||||
<label class="control-label">{{ form.descriptions.label }}:</label> |
<label class="control-label">{{ form.descriptions.label }}:</label> |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
{{ form.descriptions }} |
{{ form.descriptions }} |
||||||
<span class="help-inline">{{ form.descriptions.errors }}</span> |
<span class="help-inline">{{ form.descriptions.errors }}</span> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
{# keywords #} |
{# keywords #} |
||||||
<div class="control-group {% if form.keywords.errors %}error{% endif %}"> |
<div class="control-group {% if form.keywords.errors %}error{% endif %}"> |
||||||
<label class="control-label">{{ form.keywords.label }}:</label> |
<label class="control-label">{{ form.keywords.label }}:</label> |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
{{ form.keywords }} |
{{ form.keywords }} |
||||||
<span class="help-inline">{{ form.keywords.errors }}</span> |
<span class="help-inline">{{ form.keywords.errors }}</span> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
{# body #} |
{# body #} |
||||||
<div class="control-group {% if form.body.errors %}error{% endif %}"> |
<div class="control-group {% if form.body.errors %}error{% endif %}"> |
||||||
<label class="control-label">{{ form.body.label }}:</label> |
<label class="control-label">{{ form.body.label }}:</label> |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
{{ form.body }} |
{{ form.body }} |
||||||
<span class="help-inline">{{ form.body.errors }}</span> |
<span class="help-inline">{{ form.body.errors }}</span> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
|
|
||||||
<div class="controls"> |
<div class="controls"> |
||||||
|
|
||||||
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/page/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/> |
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/page/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/> |
||||||
<input class="btn btn-large" type="reset" value="Отмена"> |
<input class="btn btn-large" type="reset" value="Отмена"> |
||||||
</div> |
</div> |
||||||
</fieldset> |
</fieldset> |
||||||
</form> |
</form> |
||||||
|
|
||||||
{% endblock %} |
{% endblock %} |
||||||
|
|||||||
@ -1,11 +1,11 @@ |
|||||||
{% extends 'base.html' %} |
{% extends 'base.html' %} |
||||||
{% block sidebar %}{% endblock %} |
{% block sidebar %}{% endblock %} |
||||||
{% block body %} |
{% block body %} |
||||||
<form action="" method="post">{% csrf_token %} |
<form action="" method="post">{% csrf_token %} |
||||||
<div class="controls"> |
<div class="controls"> |
||||||
<p>Вы точно хотите удалить страницу "{{ object }}"?</p> |
<p>Вы точно хотите удалить страницу "{{ object }}"?</p> |
||||||
<input class="btn btn-large btn-danger delete" type="submit" value="Да" /> |
<input class="btn btn-large btn-danger delete" type="submit" value="Да" /> |
||||||
<a class="btn btn-large btn-primary" href = {% url 'page_list' %}>Нет</a> |
<a class="btn btn-large btn-primary" href = {% url 'page_list' %}>Нет</a> |
||||||
</div> |
</div> |
||||||
</form> |
</form> |
||||||
{% endblock %} |
{% endblock %} |
||||||
@ -0,0 +1,14 @@ |
|||||||
|
{% extends 'client/base_catalog.html' %} |
||||||
|
{% load static %} |
||||||
|
{% load i18n %} |
||||||
|
{% load template_filters %} |
||||||
|
|
||||||
|
{% block title %}{{ object.title }} {% endblock %} |
||||||
|
|
||||||
|
{% block content_list %} |
||||||
|
<div id="title"> |
||||||
|
{{ object.h1 }} |
||||||
|
</div> |
||||||
|
<div id="body">{{ object.body }}</div> |
||||||
|
|
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,64 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% load thumbnail %} |
||||||
|
{% block body %} |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-arrow-down"></i>Все каталоги специалистов</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
<table class="table table-hover"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
|
||||||
|
<th> </th> |
||||||
|
<th>Заголовок</th> |
||||||
|
<th>{% if request.path == "/admin/specialist_catalog/catalog/city/" %}Город{% elif request.path == "/admin/specialist_catalog/catalog/country/" %}Страна{% else %}Страна/Город{% endif %}</th> |
||||||
|
<th>Количество специалистов</th> |
||||||
|
<th>Link</th> |
||||||
|
<th> </th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
{% for item in object_list %} |
||||||
|
<tr> |
||||||
|
|
||||||
|
<td> |
||||||
|
{% thumbnail item.logo_preview "100x100" crop="center" as im %} |
||||||
|
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"> |
||||||
|
{% endthumbnail %}</td> |
||||||
|
<td>{{ item.title }}</td> |
||||||
|
<td>{% if item.type == 1%}{{ item.country.name }}{% else %}{{ item.city.name }}{% endif %}</td> |
||||||
|
<td>{{ item.specialists.count }}</td> |
||||||
|
<td><a href="{{ item.get_absolute_url }}">Заценить</a></td> |
||||||
|
<td class="center sorting_1"> |
||||||
|
<a class="btn-small btn-info" href='{% url "catalog_edit" item.id %}'> |
||||||
|
Изменить |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
|
||||||
|
<td> |
||||||
|
<a class="btn-small btn-danger delete" href='{% url "catalog_delete" item.id %}'> |
||||||
|
Удалить |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
{% endfor %} |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
<a class="btn btn-success" href='{% url "catalog_new" %}'> |
||||||
|
<i class="icon-plus-sign icon-white"></i> Хочу еще один </a> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="pagination pagination-centered"> |
||||||
|
<ul> |
||||||
|
{% if page_obj.has_previous %} |
||||||
|
<li> <a href="?page={{ page_obj.previous_page_number }}">←</a></li> |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
{% if page_obj.has_next %} |
||||||
|
<li><a href="?page={{ page_obj.next_page_number }}">→</a></li> |
||||||
|
{% endif %} |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% block sidebar %}{% endblock %} |
||||||
|
{% block body %} |
||||||
|
<form action="" method="post">{% csrf_token %} |
||||||
|
<div class="controls"> |
||||||
|
<p>Вы точно хотите удалить "{{ object.title }}" ?</p> |
||||||
|
<input class="btn btn-large btn-danger delete" type="submit" value="Да" /> |
||||||
|
<a class="btn btn-large btn-primary" href = {% url 'catalog_all' %}>Нет</a> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,203 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% load thumbnail %} |
||||||
|
{% load static %} |
||||||
|
{# Displays article form #} |
||||||
|
|
||||||
|
{% block scripts %} |
||||||
|
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script> |
||||||
|
{# selects for city and country #} |
||||||
|
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
||||||
|
<style> |
||||||
|
.thumb { |
||||||
|
height: 75px; |
||||||
|
border: 1px solid #000; |
||||||
|
margin: 10px 5px 0 0; |
||||||
|
} |
||||||
|
</style> |
||||||
|
<script src="{% static 'js/select/select2.js' %}"></script> |
||||||
|
<script src="{% static 'custom_js/specialist_catalog.js' %}"></script> |
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %} |
||||||
|
<fieldset> |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-pencil"></i> Добавление каталога специалистов(переводчиков)</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
{# title #} |
||||||
|
<div class="control-group {% if form.title.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ form.title.label }}:</b></label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.title }}<span class="help-inline"></span> |
||||||
|
<span class="help-inline">{{ form.title.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# main_descr #} |
||||||
|
<div class="control-group {% if form.main_descr.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.main_descr.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.main_descr }} |
||||||
|
<span class="help-inline">{{ form.main_descr.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{# benefits #} |
||||||
|
<div class="control-group {% if form.benefits.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.benefits.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.benefits }} |
||||||
|
<span class="help-inline">{{ form.benefits.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# big_cities #} |
||||||
|
<div class="control-group {% if form.big_cities.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.big_cities.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.big_cities }} |
||||||
|
<span class="help-inline">{{ form.big_cities.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{# price #} |
||||||
|
<div class="control-group {% if form.price.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.price.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.price }}{{ form.currency.label }}{{ form.currency }} |
||||||
|
<span class="help-inline">{{ form.price.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{# type #} |
||||||
|
<div class="control-group {% if form.type.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.type.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.type }} |
||||||
|
<span class="help-inline">{{ form.type.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{# country #} |
||||||
|
<div class="control-group {% if form.country.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.country.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.country }} |
||||||
|
<span class="help-inline">{{ form.country.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# city #} |
||||||
|
<div class="control-group {% if form.city.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.city.label }}(не обязательно):</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.city }} |
||||||
|
<span class="help-inline">{{ form.city.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{# specialists #} |
||||||
|
<div class="control-group {% if form.specialists.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.specialists.label }}(не обязательно):</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.specialists }}<a class="btn " href="{% url 'specialist_new' %}">Довавить</a> |
||||||
|
<span class="help-inline">{{ form.specialists.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# logo_preview #} |
||||||
|
<div class="control-group {% if form.logo_preview.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.logo_preview.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.logo_preview }} <output id="list_logo"></output> |
||||||
|
<span class="help-inline">{{ form.logo_preview.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# place_photo #} |
||||||
|
<div class="control-group {% if form.place_photo.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.place_photo.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.place_photo }} <output id="list_picture"></output> |
||||||
|
<span class="help-inline">{{ form.place_photo.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="controls"> |
||||||
|
|
||||||
|
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/specialist_catalog/catalog/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/> |
||||||
|
<input class="btn btn-large" type="reset" value="Отмена"> |
||||||
|
<a class="btn btn-large" href="{% url 'catalog_all' %}">Чет передумал(а)</a> |
||||||
|
</div> |
||||||
|
</fieldset> |
||||||
|
</form> |
||||||
|
|
||||||
|
<!--Feedbacks block --> |
||||||
|
{% if object.feedback_set.all %} |
||||||
|
{% with object.feedback_set.all as feedbacks %} |
||||||
|
|
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-arrow-down"></i>Отзывы для текущего каталога </h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
<table class="table table-hover"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
|
||||||
|
<th>Логотип</th> |
||||||
|
<th>Имя</th> |
||||||
|
<th>Компания</th> |
||||||
|
<th>Текст</th> |
||||||
|
<th> </th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
{% for item in feedbacks %} |
||||||
|
<tr> |
||||||
|
|
||||||
|
<td> |
||||||
|
{% thumbnail item.logo "100x100" crop="center" as im %} |
||||||
|
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"> |
||||||
|
{% endthumbnail %}</td> |
||||||
|
<td>{{ item.name }}</td> |
||||||
|
<td>{{ item.company }}</td> |
||||||
|
<td>{{ item.text }}</td> |
||||||
|
<td class="center sorting_1"> |
||||||
|
<a class="btn-small btn-info" href='{% url "feedback_edit" catalog_pk=object.id id=item.id %}'> |
||||||
|
Изменить |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
|
||||||
|
<td> |
||||||
|
<a class="btn-small btn-danger delete" href='{% url "feedback_delete" item.id %}'> |
||||||
|
Удалить |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
{% endfor %} |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
<a class="btn btn-success" href='{% url "feedback_new" object.id %}'> |
||||||
|
<i class="icon-plus-sign icon-white"></i> Хочу еще один </a> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="pagination pagination-centered"> |
||||||
|
<ul> |
||||||
|
{% if page_obj.has_previous %} |
||||||
|
<li><a href="?page={{ page_obj.previous_page_number }}">←</a></li> |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
{% if page_obj.has_next %} |
||||||
|
<li><a href="?page={{ page_obj.next_page_number }}">→</a></li> |
||||||
|
{% endif %} |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endwith %} |
||||||
|
{% elif object.id %} |
||||||
|
Отзывов еще нет, |
||||||
|
<a class="btn btn-success" href='{% url "feedback_new" catalog_pk=object.id%}'> |
||||||
|
<i class="icon-plus-sign icon-white"></i> Добавить </a> |
||||||
|
{% endif %} |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,62 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% load thumbnail %} |
||||||
|
{% block body %} |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-arrow-down"></i>Отзывы для %(calatolog)</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
<table class="table table-hover"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
|
||||||
|
<th>Логотип </th> |
||||||
|
<th>Имя</th> |
||||||
|
<th>Компания</th> |
||||||
|
<th>Текст</th> |
||||||
|
<th> </th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
{% for item in object_list %} |
||||||
|
<tr> |
||||||
|
|
||||||
|
<td> |
||||||
|
{% thumbnail item.logo "100x100" crop="center" as im %} |
||||||
|
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"> |
||||||
|
{% endthumbnail %}</td> |
||||||
|
<td>{{ item.name }}</td> |
||||||
|
<td>{{ item.company }}</td> |
||||||
|
<td>{{ item.text }}</td> |
||||||
|
<td class="center sorting_1"> |
||||||
|
<a class="btn-small btn-info" href='{% url "feedback_edit" item.id %}'> |
||||||
|
Изменить |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
|
||||||
|
<td> |
||||||
|
<a class="btn-small btn-danger delete" href='{% url "feedback_delete" item.id %}'> |
||||||
|
Удалить |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
{% endfor %} |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
<a class="btn btn-success" href='{% url "feedback_new" %}'> |
||||||
|
<i class="icon-plus-sign icon-white"></i> Хочу еще один </a> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="pagination pagination-centered"> |
||||||
|
<ul> |
||||||
|
{% if page_obj.has_previous %} |
||||||
|
<li> <a href="?page={{ page_obj.previous_page_number }}">←</a></li> |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
{% if page_obj.has_next %} |
||||||
|
<li><a href="?page={{ page_obj.next_page_number }}">→</a></li> |
||||||
|
{% endif %} |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% block sidebar %}{% endblock %} |
||||||
|
{% block body %} |
||||||
|
<form action="" method="post">{% csrf_token %} |
||||||
|
<div class="controls"> |
||||||
|
<p>Вы точно хотите удалить "{{ object.name }}" ?</p> |
||||||
|
<input class="btn btn-large btn-danger delete" type="submit" value="Да" /> |
||||||
|
<a class="btn btn-large btn-primary" href = {% url 'catalog_all' %}>Нет</a> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,79 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% load static %} |
||||||
|
{# Displays article form #} |
||||||
|
|
||||||
|
{% block scripts %} |
||||||
|
{# selects for city and country #} |
||||||
|
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
||||||
|
<style> |
||||||
|
.thumb { |
||||||
|
height: 75px; |
||||||
|
border: 1px solid #000; |
||||||
|
margin: 10px 5px 0 0; |
||||||
|
} |
||||||
|
</style> |
||||||
|
<script src="{% static 'js/select/select2.js' %}"></script> |
||||||
|
<script src="{% static 'custom_js/specialist.js' %}?ad=ddd"></script> |
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %} |
||||||
|
<fieldset> |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-pencil"></i> Добавление отз ва</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
{# name #} |
||||||
|
<div class="control-group {% if form.name.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ form.name.label }}:</b></label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.name }}<span class="help-inline"></span> |
||||||
|
<span class="help-inline">{{ form.name.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# company #} |
||||||
|
<div class="control-group {% if form.company.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.company.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.company }} |
||||||
|
<span class="help-inline">{{ form.company.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# text #} |
||||||
|
<div class="control-group {% if form.text.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.text.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.text }} |
||||||
|
<span class="help-inline">{{ form.text.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# catalog #} |
||||||
|
<div class="control-group {% if form.catalog.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.catalog.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.catalog }} |
||||||
|
<span class="help-inline">{{ form.catalog.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# logo #} |
||||||
|
<div class="control-group {% if form.logo.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.logo.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.logo }} <output id="list"></output> |
||||||
|
<span class="help-inline">{{ form.logo.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="controls"> |
||||||
|
|
||||||
|
<input class="btn btn-large btn-primary" type="submit" value="Добавить/Изменить" /> |
||||||
|
<input class="btn btn-large" type="reset" value="Отмена"> |
||||||
|
</div> |
||||||
|
</fieldset> |
||||||
|
</form> |
||||||
|
|
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,62 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% load thumbnail %} |
||||||
|
{% block body %} |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-arrow-down"></i>Список специалистов(переводчиков)</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
<table class="table table-hover"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
|
||||||
|
<th>Фото </th> |
||||||
|
<th>Имя</th> |
||||||
|
<th>Город</th> |
||||||
|
<th>Языки</th> |
||||||
|
<th> </th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
{% for item in object_list %} |
||||||
|
<tr> |
||||||
|
|
||||||
|
<td> |
||||||
|
{% thumbnail item.photo "100x100" crop="center" as im %} |
||||||
|
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"> |
||||||
|
{% endthumbnail %}</td> |
||||||
|
<td>{{ item.name }}</td> |
||||||
|
<td>{{ item.city.name }}</td> |
||||||
|
<td>{{ item.languages }}</td> |
||||||
|
<td class="center sorting_1"> |
||||||
|
<a class="btn-small btn-info" href='{% url "specialist_edit" item.id %}'> |
||||||
|
Изменить |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
|
||||||
|
<td> |
||||||
|
<a class="btn-small btn-danger delete" href='{% url "specialist_delete" item.id %}'> |
||||||
|
Удалить |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
{% endfor %} |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
<a class="btn btn-success" href='{% url "specialist_new" %}'> |
||||||
|
<i class="icon-plus-sign icon-white"></i> Хочу еще </a> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="pagination pagination-centered"> |
||||||
|
<ul> |
||||||
|
{% if page_obj.has_previous %} |
||||||
|
<li> <a href="?page={{ page_obj.previous_page_number }}">←</a></li> |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
{% if page_obj.has_next %} |
||||||
|
<li><a href="?page={{ page_obj.next_page_number }}">→</a></li> |
||||||
|
{% endif %} |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% block sidebar %}{% endblock %} |
||||||
|
{% block body %} |
||||||
|
<form action="" method="post">{% csrf_token %} |
||||||
|
<div class="controls"> |
||||||
|
<p>Вы точно хотите удалить "{{ object.name }}" ?</p> |
||||||
|
<input class="btn btn-large btn-danger delete" type="submit" value="Да" /> |
||||||
|
<a class="btn btn-large btn-primary" href = {% url 'specialist_all' %}>Нет</a> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,79 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% load static %} |
||||||
|
{# Displays article form #} |
||||||
|
|
||||||
|
{% block scripts %} |
||||||
|
{# selects for city and country #} |
||||||
|
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
||||||
|
<style> |
||||||
|
.thumb { |
||||||
|
height: 75px; |
||||||
|
border: 1px solid #000; |
||||||
|
margin: 10px 5px 0 0; |
||||||
|
} |
||||||
|
</style> |
||||||
|
<script src="{% static 'js/select/select2.js' %}"></script> |
||||||
|
<script src="{% static 'custom_js/specialist.js' %}?ad=ddd"></script> |
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %} |
||||||
|
<fieldset> |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-pencil"></i> Добавление специалиста(переводчика)</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
{# name #} |
||||||
|
<div class="control-group {% if form.name.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ form.name.label }}:</b></label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.name }}<span class="help-inline"></span> |
||||||
|
<span class="help-inline">{{ form.name.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# languages #} |
||||||
|
<div class="control-group {% if form.languages.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.languages.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.languages }} |
||||||
|
<span class="help-inline">{{ form.languages.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# country #} |
||||||
|
<div class="control-group {% if form.country.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.country.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.country }} |
||||||
|
<span class="help-inline">{{ form.country.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# city #} |
||||||
|
<div class="control-group {% if form.city.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.city.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.city }} |
||||||
|
<span class="help-inline">{{ form.city.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{# photo #} |
||||||
|
<div class="control-group {% if form.photo.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{{ form.photo.label }}:</label> |
||||||
|
<div class="controls"> |
||||||
|
{{ form.photo }} <output id="list"></output> |
||||||
|
<span class="help-inline">{{ form.photo.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="controls"> |
||||||
|
|
||||||
|
<input class="btn btn-large btn-primary" type="submit" {% if request.path == '/admin/specialist_catalog/specialist/new/' %} value="Добавить" {% else %} value='Изменить' {% endif %}/> |
||||||
|
<input class="btn btn-large" type="reset" value="Отмена"> |
||||||
|
</div> |
||||||
|
</fieldset> |
||||||
|
</form> |
||||||
|
|
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,31 @@ |
|||||||
|
{% extends 'base_catalog.html' %} |
||||||
|
|
||||||
|
{% block content_list %} |
||||||
|
|
||||||
|
<div class="page-title"> |
||||||
|
<h1>Запрашиваемая страница не найдена</h1> |
||||||
|
</div> |
||||||
|
<div class="m-article error-404"> |
||||||
|
<span class="figure">404:</span> |
||||||
|
<p class="title">Возможно у нее изменился адрес или же она была удалена.<br> Воспользуйтесь поиском по названию, расширенной формой поиска или каталогом событий.</p> |
||||||
|
<div class="clearfix"></div> |
||||||
|
<hr/> |
||||||
|
<section> |
||||||
|
<h2>Каталог выставок</h2> |
||||||
|
<ul class="items-list"> |
||||||
|
{% for item in expo_themes %} |
||||||
|
<li><i class="fa fa-circle"></i><a href="/expo/theme/{{ item.url }}/">{{ item.name }} ({{ 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 }} ({{ item.conference_count }})</a></li> |
||||||
|
{% endfor %} |
||||||
|
</ul> |
||||||
|
</section> |
||||||
|
</div> |
||||||
|
{% endblock %} |
||||||
@ -1,7 +1,7 @@ |
|||||||
{% extends 'client/blank.html' %} |
{% extends 'client/blank.html' %} |
||||||
{% block main_part %} |
{% block main_part %} |
||||||
<form method="post" action="{% url "require_email" %}">{% csrf_token %} |
<form method="post" action="{% url "require_email" %}">{% csrf_token %} |
||||||
{{ form }} |
{{ form }} |
||||||
<input type="submit" value="Send"> |
<input type="submit" value="Send"> |
||||||
</form> |
</form> |
||||||
{% endblock %} |
{% endblock %} |
||||||
@ -1,3 +1,3 @@ |
|||||||
<div class="so-text"> |
<div class="seo-text"> |
||||||
<h2>{{ object.title }}</h2>{{ object.body|safe }} |
<h2>{{ object.title }}</h2>{{ object.body|safe }} |
||||||
</div> |
</div> |
||||||
@ -1,19 +1,19 @@ |
|||||||
{% extends 'client/base_catalog.html' %} |
{% extends 'client/base_catalog.html' %} |
||||||
{% load static %} |
{% load static %} |
||||||
{% load i18n %} |
{% load i18n %} |
||||||
|
|
||||||
{% block bread_scrumbs %} |
{% block bread_scrumbs %} |
||||||
<div class="bread-crumbs"> |
<div class="bread-crumbs"> |
||||||
<a href="/">{% trans 'Главная страница' %}</a> |
<a href="/">{% trans 'Главная страница' %}</a> |
||||||
<strong>{{ object.main_title }}</strong> |
<strong>{{ object.main_title }}</strong> |
||||||
</div> |
</div> |
||||||
{% endblock %} |
{% endblock %} |
||||||
|
|
||||||
{% block page_title %} |
{% block page_title %} |
||||||
<h1>{{ object.h1 }}</h1> |
<h1>{{ object.h1 }}</h1> |
||||||
{% endblock %} |
{% endblock %} |
||||||
{% block page_body %} |
{% block page_body %} |
||||||
|
|
||||||
{{ object.body|safe|striptags}} |
{{ object.body|safe|striptags}} |
||||||
|
|
||||||
{% endblock %} |
{% endblock %} |
||||||
@ -0,0 +1,326 @@ |
|||||||
|
{% extends "client/base_catalog.html" %} |
||||||
|
{% load static %} |
||||||
|
{% load thumbnail %} |
||||||
|
{% load i18n %} |
||||||
|
|
||||||
|
{% block head_scripts %} |
||||||
|
|
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block page_body%} |
||||||
|
<div class="page-body clearfix request-form rq-translator"> |
||||||
|
|
||||||
|
<div class="m-article"> |
||||||
|
|
||||||
|
<div class="item-wrap place clearfix"> |
||||||
|
<aside> |
||||||
|
<div class="i-pict"> |
||||||
|
{% thumbnail object.logo_preview "100x100" crop="center" as im %} |
||||||
|
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"> |
||||||
|
{% endthumbnail %} |
||||||
|
</div> |
||||||
|
</aside> |
||||||
|
|
||||||
|
<div class="i-info"> |
||||||
|
<header> |
||||||
|
<div class="i-title">{{ object.title }}</div> |
||||||
|
</header> |
||||||
|
|
||||||
|
<div class="i-descr"> |
||||||
|
{{ object.main_descr }} |
||||||
|
</div> |
||||||
|
<hr/> |
||||||
|
|
||||||
|
<div class="i-address map-opened country_map"> |
||||||
|
|
||||||
|
{# #} |
||||||
|
<div class="i-map"> |
||||||
|
{% thumbnail object.place_photo "957x400" crop="center" as im %} |
||||||
|
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"> |
||||||
|
{% endthumbnail %} |
||||||
|
</div> |
||||||
|
|
||||||
|
{# <!-- позиция для карты задается в атрибуте data-coords -->#} |
||||||
|
{# <div class="map-canvas" id="map-canvas" data-coords="55.751898,37.545172" ></div>#} |
||||||
|
{# <div class="close-map"><a class="toggle-map" href="#">Скрыть карту</a></div>#} |
||||||
|
{# #} |
||||||
|
{# <header>#} |
||||||
|
{# <div class="show-map show-map_1"><a class="toggle-map" href="#">Раскрыть карту</a></div>#} |
||||||
|
{# </header>#} |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{{ object.big_cities }} |
||||||
|
<div class="country_towns"> |
||||||
|
<h4>Крупные города:</h4> |
||||||
|
{{ object.big_cities }} |
||||||
|
</div> |
||||||
|
|
||||||
|
<hr /> |
||||||
|
|
||||||
|
<div class="i-services country_content"> |
||||||
|
<div class="i-descr"> |
||||||
|
<h4>Коротко о наших преимуществах:</h4> |
||||||
|
<div style="margin-top:20px;"> |
||||||
|
{{ object.benefits|safe }} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{# ----------------------------------------- FORM ----------------------------------------------#} |
||||||
|
<div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}> |
||||||
|
<form method="post">{% csrf_token %} |
||||||
|
|
||||||
|
<hr /> |
||||||
|
|
||||||
|
<div class="rq-form-sect"> |
||||||
|
|
||||||
|
<div class="rqf-title">{% trans 'Информация о переводе' %}</div> |
||||||
|
|
||||||
|
<div class="mf-line cols-2 rq-trans"> |
||||||
|
|
||||||
|
<div class="mf-field"> |
||||||
|
{{ form.languages }} |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="mf-field"> |
||||||
|
{{ form.themes }} |
||||||
|
|
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="mf-line"> |
||||||
|
<label>Занятость:</label> |
||||||
|
<div class="mf-field rq-tickets-days rq-num"> |
||||||
|
{{ form.days }} {% trans 'дней' %} |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="mf-field rq-tickets-num rq-num"> |
||||||
|
{{ form.hours }} {% trans 'часов в день' %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="mf-line rq-p-days"> |
||||||
|
<label>{% trans 'Даты работы' %}:</label> |
||||||
|
<div class="mf-field"> |
||||||
|
<div class="period"> |
||||||
|
<div class="pwf-field validate-field{% if form.fr.errors %} error-field{% endif %}"> |
||||||
|
<label>{% trans 'с' %}</label> |
||||||
|
{{ form.fr }} |
||||||
|
<div class="error-blob"> |
||||||
|
{{ form.fr.errors }} |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="pwf-field validate-field{% if form.to.errors %} error-field{% endif %}"> |
||||||
|
<label>{% trans 'по' %}</label> |
||||||
|
{{ form.to }} |
||||||
|
<div class="error-blob"> |
||||||
|
{{ form.to.errors }} |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
<hr /> |
||||||
|
|
||||||
|
<div class="rq-form-sect"> |
||||||
|
|
||||||
|
<div class="rqf-title">{% trans 'Ваши контактные данные' %}</div> |
||||||
|
{% if not object %} |
||||||
|
<div class="mf-line rq-person "> |
||||||
|
<div class="mf-field validate-field{% if form.event.errors %} error-field{% endif %}"> |
||||||
|
{{ form.event }} |
||||||
|
<div class="error-blob"> |
||||||
|
{{ form.event.errors }} |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
<div class="mf-line rq-person"> |
||||||
|
<div class="mf-field validate-field{% if form.person_inf.errors %} error-field{% endif %}"> |
||||||
|
{{ form.person_inf }} |
||||||
|
<div class="error-blob"> |
||||||
|
{{ form.person_inf.errors }} |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="mf-line cols-2 rq-place"> |
||||||
|
<div class="mf-field validate-field rq-country{% if form.country.errors %} error-field{% endif %}"> |
||||||
|
{{ form.country }} |
||||||
|
<div class="error-blob"> |
||||||
|
{{ form.country.errors }} |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="mf-field validate-field rq-city{% if form.city.errors %} error-field{% endif %}"> |
||||||
|
{{ form.city }} |
||||||
|
<div class="error-blob"> |
||||||
|
{{ form.city.errors }} |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="mf-line cols-2 rq-contacts"> |
||||||
|
<div class="mf-field validate-field rq-tel{% if form.phone.errors %} error-field{% endif %}"> |
||||||
|
{{ form.phone }} |
||||||
|
<div class="error-blob"> |
||||||
|
{{ form.phone.errors }} |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="mf-field validate-field rq-mail{% if form.person.errors %} error-field{% endif %}"> |
||||||
|
{{ form.person }} |
||||||
|
<div class="error-blob"> |
||||||
|
{{ form.person.errors }} |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
<hr /> |
||||||
|
|
||||||
|
<div class="rq-btn-wrap"> |
||||||
|
|
||||||
|
<div class="rq-order-button"> |
||||||
|
<div class="rqob-wrap"> |
||||||
|
<div class="rqob-button"> |
||||||
|
<button type="submit">{% trans 'отправить запрос' %}</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
</form> |
||||||
|
</div> |
||||||
|
{# ----------------------------------------- END FORM -------------------------------------------#} |
||||||
|
|
||||||
|
<div class="rq-btn-wrap rq-btn-to-hide rq-to-hide"> |
||||||
|
<div class="rqb-cols"> |
||||||
|
<div class="rqb-button"> |
||||||
|
<div class="rq-order-button"> |
||||||
|
<div class="rqob-wrap"> |
||||||
|
<div class="rqob-price">от {{ object.price }} {{ object.currency }} / день</div> |
||||||
|
<div class="rqob-button"> |
||||||
|
<a class="ob-text" href="#">заказать услугу</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<hr> |
||||||
|
{% if request.GET.debug == '1' %} |
||||||
|
<script src="{% static 'client/js/_modules/page.translator.js' %}"></script> |
||||||
|
{% else %} |
||||||
|
<script src="{% static 'client/js_min/_modules/page.translator.min.js' %}"></script> |
||||||
|
{% endif %} |
||||||
|
<script> |
||||||
|
EXPO.translator.init({}); |
||||||
|
</script> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% with object.specialists.all as specialists %} |
||||||
|
{% if specialists %} |
||||||
|
<div class="i-staff"> |
||||||
|
<div class="sect-title">Наши специалисты</div> |
||||||
|
|
||||||
|
<div class="i-staff-list"> |
||||||
|
|
||||||
|
<ul> |
||||||
|
{% for spec in specialists %} |
||||||
|
<li> |
||||||
|
<a href="#"> |
||||||
|
<div class="sl-item clearfix"> |
||||||
|
<div class="sl-pict"> |
||||||
|
{% thumbnail spec.photo "100x100" crop="center" as im %} |
||||||
|
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"> |
||||||
|
{% endthumbnail %} |
||||||
|
</div> |
||||||
|
<div class="sl-info"> |
||||||
|
<div class="sl-info-wrap"> |
||||||
|
<div class="sl-name">{{ spec.name }}</div> |
||||||
|
<div class="sl-position">{{ spec.languages }}</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</a> |
||||||
|
</li> |
||||||
|
|
||||||
|
{% endfor %} |
||||||
|
|
||||||
|
</ul> |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
{% endwith %} |
||||||
|
|
||||||
|
</div> |
||||||
|
{% with object.feedback_set.all as feedbacks %} |
||||||
|
{% if feedbacks %} |
||||||
|
<div class="rq-to-hide"> |
||||||
|
|
||||||
|
<div class="s-comments"> |
||||||
|
<div class="sect-title">Отзывы клиентов:</div> |
||||||
|
<div class="cat-list sc-comments"> |
||||||
|
{% for feedback in feedbacks %} |
||||||
|
<div class="cl-item"> |
||||||
|
<div class="cl-item-wrap clearfix"> |
||||||
|
|
||||||
|
<div class="cli-pict"> |
||||||
|
{% thumbnail feedback.logo "100x100" crop="center" as im %} |
||||||
|
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}"> |
||||||
|
{% endthumbnail %} |
||||||
|
</div> |
||||||
|
<div class="cli-info"> |
||||||
|
<div class="cli-top clearfix"> |
||||||
|
<header> |
||||||
|
<div class="cli-title">{{ feedback.company }}</div> |
||||||
|
</header> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="sc-name">{{ feedback.name }}</div> |
||||||
|
|
||||||
|
<div class="sc-text"> |
||||||
|
{{ feedback.text }} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endfor %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
{% endwith %} |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
{% endblock %} |
||||||
@ -1,218 +1,209 @@ |
|||||||
{% extends 'client/base_catalog.html' %} |
{% extends 'client/base_catalog.html' %} |
||||||
|
{% load static %} |
||||||
{% block content_list %} |
|
||||||
{{ form.errors }} |
{% block head_scripts %} |
||||||
<div class="page-body clearfix"> |
<script src="{% static 'js/select/select2.js' %}"></script> |
||||||
<div class="set-sect p-form adm-form"> |
<script src="{% static 'custom_js/wizard.js' %}"></script> |
||||||
<div class="set-sect-title clearfix"> |
{% endblock %} |
||||||
{{ wizard.form.media }} |
|
||||||
<h3>Шаг {{ wizard.steps.step1 }}. Основная информация</h3> |
{% block content_list %} |
||||||
</div> |
{{ form.errors }} |
||||||
<form action="" enctype="multipart/form-data" method="post">{% csrf_token %} |
<div class="page-body clearfix"> |
||||||
{{ wizard.management_form }} |
<div class="set-sect p-form adm-form"> |
||||||
{# {% if wizard.form.forms %}#} |
<div class="set-sect-title clearfix"> |
||||||
{# {{ wizard.form.management_form }}#} |
{{ wizard.form.media }} |
||||||
{# {% for form in wizard.form.forms %}#} |
<h3>Шаг {{ wizard.steps.step1 }}. Основная информация</h3> |
||||||
{# {{ form }}#} |
</div> |
||||||
{# {% endfor %}#} |
<form action="" enctype="multipart/form-data" method="post">{% csrf_token %} |
||||||
{# {% else %}#} |
{{ wizard.management_form }} |
||||||
{% with wizard.form as form %} |
{% with wizard.form as form %} |
||||||
<div class="adm-form-body"> |
<div class="adm-form-body"> |
||||||
<div class="mf-line "> |
<div class="mf-line "> |
||||||
<div class="mf-field"> |
<div class="mf-field"> |
||||||
<label>Тематика:</label> |
<label>Тематика:</label> |
||||||
{{ form.theme }} |
{{ form.theme }} |
||||||
</div> |
</div> |
||||||
<div class="mf-field"> |
<div class="mf-field"> |
||||||
<label>Теги:</label> |
<label>Теги:</label> |
||||||
{{ form.tag }} |
{{ form.tag }} |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
<hr/> |
<hr/> |
||||||
|
|
||||||
<h2>Описание выставки</h2> |
<h2>Описание выставки</h2> |
||||||
|
|
||||||
<div class="mf-line"> |
<div class="mf-line"> |
||||||
<div class="mf-field"> |
<div class="mf-field"> |
||||||
{{ form.name }} |
{{ form.name }} |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
|
|
||||||
<div class="mf-line full-width"> |
<div class="mf-line full-width"> |
||||||
<div class="mf-field"> |
<div class="mf-field"> |
||||||
{{ form.main_title }} |
{{ form.main_title }} |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
|
|
||||||
<div class="mf-line full-width"> |
<div class="mf-line full-width"> |
||||||
<div class="mf-field"> |
<div class="mf-field"> |
||||||
{{ form.description }} |
{{ form.description }} |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
|
|
||||||
<hr/> |
<hr/> |
||||||
|
|
||||||
<div id="dates-range" class="mf-line"> |
<div id="dates-range" class="mf-line"> |
||||||
<label class="h2">Даты проведения:</label> |
<label class="h2">Даты проведения:</label> |
||||||
|
|
||||||
<div class="mf-field"> |
<div class="mf-field"> |
||||||
<div class="period"> |
<div class="period"> |
||||||
<div class="pwf-field"> |
<div class="pwf-field"> |
||||||
<label>с</label> |
<label>с</label> |
||||||
{{ form.date_start }} |
{{ form.date_start }} |
||||||
</div> |
</div> |
||||||
<div class="pwf-field"> |
<div class="pwf-field"> |
||||||
<label>по</label> |
<label>по</label> |
||||||
{{ form.date_end }} |
{{ form.date_end }} |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
|
|
||||||
<hr/> |
<hr/> |
||||||
|
|
||||||
<div class="mfs-location"> |
<div class="mfs-location"> |
||||||
|
|
||||||
<h2>Локация</h2> |
<h2>Локация</h2> |
||||||
|
|
||||||
<div class="mf-line"> |
<div class="mf-line"> |
||||||
<div class="mf-field"> |
<div class="mf-field"> |
||||||
<h3>Место проведения:</h3> |
<h3>Место проведения:</h3> |
||||||
{{ form.place }} |
{{ form.place }} |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
|
|
||||||
<div class="mf-line"> |
<div class="mf-line"> |
||||||
<div class="mf-field"> |
<div class="mf-field"> |
||||||
<h3>Страна:</h3> |
<h3>Страна:</h3> |
||||||
{{ form.country }} |
{{ form.country }} |
||||||
</div> |
</div> |
||||||
|
|
||||||
<div class="mf-field"> |
<div class="mf-field"> |
||||||
<h3>Город:</h3> |
<h3>Город:</h3> |
||||||
{{ form.city }} |
{{ form.city }} |
||||||
</div> |
</div> |
||||||
</div> |
</div> |
||||||
|
|
||||||
</div> |
</div> |
||||||
<hr/> |
<hr/> |
||||||
|
|
||||||
<div class="mfs-additional"> |
<div class="mfs-additional"> |
||||||
<h2>Дополнительная информация</h2> |
<h2>Дополнительная информация</h2> |
||||||
|
|
||||||
<div class="mf-line mf-targets"> |
<div class="mf-line mf-targets"> |
||||||
<label>Аудитория:</label> |
<label>Аудитория:</label> |
||||||
|
|
||||||
<div class="mf-field"> |
<div class="mf-field"> |
||||||
|
|
||||||
<div class="clearfix"> |
<div class="clearfix"> |
||||||
<div class="mff-col"> |
<div class="mff-col"> |
||||||
<label class="check">{{ form.audience1 }}специалисты</label> |
<label class="checkbox">{{ form.audience1 }}специалисты</label> |
||||||
<label class="check">{{ form.audience2 }}специалисты и |
<label class="checkbox">{{ form.audience2 }}специалисты и |
||||||
потребители</label> |
потребители</label> |
||||||
<label class="check">{{ form.audience3 }}широкая публика</label> |
<label class="checkbox">{{ form.audience3 }}широкая публика</label> |
||||||
</div> |
</div> |
||||||
|
|
||||||
<div class="mff-col"> |
<div class="mff-col"> |
||||||
{{ form.periodic }} |
Периодичность: |
||||||
</div> |
{{ form.periodic }} |
||||||
</div> |
</div> |
||||||
|
</div> |
||||||
<hr/> |
|
||||||
|
<hr/> |
||||||
</div> |
|
||||||
</div> |
</div> |
||||||
|
</div> |
||||||
<div class="mf-line mf-membership"> |
|
||||||
<label>Членства и знаки качества:</label> |
<div class="mf-line mf-membership"> |
||||||
|
<label>Членства и знаки качества:</label> |
||||||
<div class="mf-field"> |
|
||||||
<label class="check">{{ form.membership1 }}Exporating</label> |
<div class="mf-field"> |
||||||
<label class="check">{{ form.membership2 }}RSVA</label> |
<label class="checkbox">{{ form.membership1 }}Exporating</label> |
||||||
<label class="check">{{ form.membership3 }}UFI</label> |
<label class="checkbox">{{ form.membership2 }}RSVA</label> |
||||||
<hr/> |
<label class="checkbox">{{ form.membership3 }}UFI</label> |
||||||
</div> |
<hr/> |
||||||
</div> |
</div> |
||||||
|
</div> |
||||||
<div class="mf-line mf-prod"> |
|
||||||
<div class="mf-field"> |
<div class="mf-line mf-prod"> |
||||||
{{ form.web_site }} |
<div class="mf-field"> |
||||||
|
{{ form.web_site }} |
||||||
{{ form.products }} |
|
||||||
|
{{ form.products }} |
||||||
<hr/> |
|
||||||
|
<hr/> |
||||||
</div> |
|
||||||
</div> |
</div> |
||||||
|
</div> |
||||||
<div class="mf-line mf-time"> |
|
||||||
<label>Время работы:</label> |
<div class="mf-line mf-time"> |
||||||
|
<label>Время работы:</label> |
||||||
<div id="work-time" class="mf-field"> |
|
||||||
<div class="w-time"> |
<div id="work-time" class="mf-field"> |
||||||
{# <div class="w-time-day">#} |
<div class="w-time"> |
||||||
{# <select name="d01">#} |
<div class="w-time-wrap"> |
||||||
{# <option value="12.04.2014">12.04.2014</option>#} |
<label>c</label> |
||||||
{# </select>#} |
{{ form.time_start }} |
||||||
{# </div>#} |
</div> |
||||||
|
|
||||||
<div class="w-time-wrap"> |
<div class="w-time-wrap"> |
||||||
<label>c</label> |
<label>до</label> |
||||||
{{ form.time_start }} |
{{ form.time_end }} |
||||||
</div> |
</div> |
||||||
|
</div> |
||||||
<div class="w-time-wrap"> |
</div> |
||||||
<label>до</label> |
</div> |
||||||
{{ form.time_end }} |
|
||||||
</div> |
</div> |
||||||
|
<hr/> |
||||||
{# <label class="check"><input type="checkbox" class="w-time-switcher" name="c05" checked />Один график на все дни</label>#} |
|
||||||
</div> |
<div class="mf-line mf-logo"> |
||||||
|
<label class="h2">Логотип:</label> |
||||||
</div> |
|
||||||
</div> |
<div class="mf-field"> |
||||||
|
<div class="input-file clearfix"> |
||||||
</div> |
{{ form.logo }} |
||||||
<hr/> |
</div> |
||||||
|
</div> |
||||||
<div class="mf-line mf-logo"> |
</div> |
||||||
<label class="h2">Логотип:</label> |
|
||||||
|
<hr/> |
||||||
<div class="mf-field"> |
</div> |
||||||
<div class="input-file clearfix"> |
<div class="a-bot-buttons-line clearfix"> |
||||||
{{ form.logo }} |
|
||||||
</div> |
<div class="abb-right"> |
||||||
</div> |
<input class="button big orange a-more" type="submit" value="Дале >"/> |
||||||
</div> |
</div> |
||||||
|
|
||||||
<hr/> |
</div> |
||||||
</div> |
|
||||||
<div class="a-bot-buttons-line clearfix"> |
</form> |
||||||
|
|
||||||
<div class="abb-right"> |
{% endwith %} |
||||||
<input class="button big orange a-more" type="submit" value="Дале >"/> |
</div> |
||||||
</div> |
|
||||||
|
<div class="set-sect p-form adm-form not-active"> |
||||||
</div> |
<div class="set-sect-title clearfix"> |
||||||
|
<h3>Шаг 2. Статистика и условия участия</h3> |
||||||
</form> |
</div> |
||||||
|
</div> |
||||||
{% endwith %} |
|
||||||
</div> |
<div class="set-sect p-form adm-form not-active"> |
||||||
|
<div class="set-sect-title clearfix"> |
||||||
<div class="set-sect p-form adm-form not-active"> |
<h3>Шаг 3. Добавление фото</h3> |
||||||
<div class="set-sect-title clearfix"> |
</div> |
||||||
<h3>Шаг 2. Статистика и условия участия</h3> |
</div> |
||||||
</div> |
|
||||||
</div> |
</div> |
||||||
|
<hr/> |
||||||
<div class="set-sect p-form adm-form not-active"> |
{% endblock %} |
||||||
<div class="set-sect-title clearfix"> |
|
||||||
<h3>Шаг 3. Добавление фото</h3> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
</div> |
|
||||||
<hr/> |
|
||||||
{# {% endif %}#} |
|
||||||
{% endblock %} |
|
||||||
|
|||||||
@ -1,310 +1,261 @@ |
|||||||
{% extends 'client/base_catalog.html' %} |
{% extends 'client/base_catalog.html' %} |
||||||
|
{% load static %} |
||||||
{% block content_list %} |
|
||||||
{{ form.errors }} |
|
||||||
<div class="page-title"> |
{% block head_scripts %} |
||||||
<h1>Добавить событие</h1> |
<script src="{% static 'js/select/select2.js' %}"></script> |
||||||
</div> |
<script> |
||||||
<div class="page-body clearfix"> |
$(document).ready(function () { |
||||||
{{ wizard.form.media }} |
$('select').select2({ |
||||||
<div class="set-sect p-form adm-form passed"> |
width: 'element', |
||||||
<div class="set-sect-title clearfix"> |
allowClear: true |
||||||
<h3>Шаг 1. Основная информация</h3> |
}); |
||||||
|
}); |
||||||
<div class="afh-right"> |
</script> |
||||||
|
{% endblock %} |
||||||
<a class="button icon-edit" href="#">изменить</a> |
|
||||||
</div> |
|
||||||
</div> |
{% block content_list %} |
||||||
</div> |
{{ form.errors }} |
||||||
|
<div class="page-title"> |
||||||
|
<h1>Добавить событие</h1> |
||||||
|
</div> |
||||||
<div class="set-sect p-form adm-form"> |
<div class="page-body clearfix"> |
||||||
<div class="set-sect-title clearfix"> |
<form action="" method="post">{% csrf_token %} |
||||||
<h3>Шаг 2. Статистика и условия участия</h3> |
|
||||||
|
{{ wizard.form.media }} |
||||||
<div class="afh-right"> |
<div class="set-sect p-form adm-form passed"> |
||||||
<div class="sst-info"><b>+ 0,9 баллов</b> к рейтингу</div> |
<div class="set-sect-title clearfix"> |
||||||
</div> |
<h3>Шаг 1. Основная информация</h3> |
||||||
</div> |
|
||||||
|
<div class="afh-right"> |
||||||
<form action="" method="post">{% csrf_token %} |
<button name="wizard_goto_step" type="submit" class="button icon-edit" |
||||||
{{ wizard.management_form }} |
value="{{ wizard.steps.prev }}">изменить |
||||||
{% if wizard.form.forms %} |
</button> |
||||||
{{ wizard.form.management_form }} |
</div> |
||||||
{% for form in wizard.form.forms %} |
</div> |
||||||
{{ form }} |
</div> |
||||||
{% endfor %} |
|
||||||
{% else %} |
|
||||||
{% with wizard.form as form %} |
<div class="set-sect p-form adm-form"> |
||||||
<hr/> |
<div class="set-sect-title clearfix"> |
||||||
|
<h3>Шаг 2. Статистика и условия участия</h3> |
||||||
<div class="mfs-additional mf-stat"> |
|
||||||
|
<div class="afh-right"> |
||||||
<div class="mf-line mf-prod mf-short-input"> |
<div class="sst-info"><b>+ 0,9 баллов</b> к рейтингу</div> |
||||||
<label>Год основания:</label> |
</div> |
||||||
{{ form.found_year }} |
</div> |
||||||
<div class="mf-field"> |
|
||||||
|
{{ wizard.management_form }} |
||||||
</div> |
{% if wizard.form.forms %} |
||||||
</div> |
{{ wizard.form.management_form }} |
||||||
|
{% for form in wizard.form.forms %} |
||||||
<div class="mf-stat-item"> |
{{ form }} |
||||||
|
{% endfor %} |
||||||
<hr/> |
{% else %} |
||||||
|
{% with wizard.form as form %} |
||||||
<div class="mf-line mf-prod"> |
<hr/> |
||||||
<label class="h3">Статистика за</label> |
|
||||||
|
<div class="mfs-additional mf-stat"> |
||||||
<div class="mf-field"> |
|
||||||
|
<div class="mf-line mf-prod mf-short-input"> |
||||||
<div class="mf-year"> |
<label>Год основания:</label> |
||||||
{{ form.statistic_year }} |
{{ form.found_year }} |
||||||
</div> |
<div class="mf-field"> |
||||||
|
|
||||||
<div class="mf-stat-data"> |
</div> |
||||||
|
</div> |
||||||
<div class="sd-visitors"> |
|
||||||
{{ form.visitors }} |
<hr/> |
||||||
</div> |
|
||||||
|
<h2>Стоимость посещения и участия</h2> |
||||||
<div class="sd-participants"> |
|
||||||
{{ form.partisipants }} |
<div class="e-price-wrap"> |
||||||
</div> |
<div class="epr-layout"> |
||||||
|
|
||||||
<div class="sd-area"> |
<div class="eprl-col"> |
||||||
{{ form.square }} |
<div class="eprl-col-wrap"> |
||||||
м² |
|
||||||
</div> |
<div class="epr-subtitle">Стоимость билетов</div> |
||||||
</div> |
|
||||||
|
<div class="tp-wrap"> |
||||||
</div> |
|
||||||
</div> |
<ul class="pr-list"> |
||||||
|
|
||||||
<div class="mf-line mf-prod mf-stat-countries"> |
<li> |
||||||
<label>Страны:</label> |
{{ form.one_day }} |
||||||
|
<select name="oneDayCurrency1"> |
||||||
<div class="mf-field"> |
<option value="rur">руб</option> |
||||||
|
<option value="usd">usd</option> |
||||||
<div class="csb-selected-items"></div> |
<option value="eur">eur</option> |
||||||
<div class="csb-menu-wrap"> |
</select> |
||||||
<div class="scroll-container csb-menu"> |
</li> |
||||||
<div class="scroll-content clearfix"> |
|
||||||
{{ form.countries }} |
<li> |
||||||
</div> |
{{ form.all_days }} |
||||||
</div> |
<select name="allDaysCurrency1"> |
||||||
</div> |
<option value="rur">руб</option> |
||||||
</div> |
<option value="usd">usd</option> |
||||||
</div> |
<option value="eur">eur</option> |
||||||
|
</select> |
||||||
</div> |
</li> |
||||||
|
|
||||||
<div class="mf-stat-add-button"> |
</ul> |
||||||
<a class="button big icon-add" href="#">добавить данные за другой период</a> |
|
||||||
</div> |
<div class="tp-descr">Предварительная регистрация</div> |
||||||
|
|
||||||
</div> |
</div> |
||||||
|
|
||||||
<hr/> |
<hr/> |
||||||
|
|
||||||
<h2>Стоимость посещения и участия</h2> |
<div class="tp-wrap"> |
||||||
|
|
||||||
<div class="e-price-wrap"> |
<ul class="pr-list"> |
||||||
<div class="epr-layout"> |
|
||||||
|
<li> |
||||||
<div class="eprl-col"> |
{{ form.pre_one_day }} |
||||||
<div class="eprl-col-wrap"> |
<select name="oneDayCurrency2"> |
||||||
|
<option value="1">руб</option> |
||||||
<div class="epr-subtitle">Стоимость билетов</div> |
<option value="2">usd</option> |
||||||
|
<option value="3">eur</option> |
||||||
<div class="tp-wrap"> |
</select> |
||||||
|
</li> |
||||||
<ul class="pr-list"> |
|
||||||
|
<li> |
||||||
<li> |
{{ form.pre_all_days }} |
||||||
{{ form.one_day }} |
<select name="allDaysCurrency2"> |
||||||
<select name="oneDayCurrency1"> |
<option value="1">руб</option> |
||||||
<option value="rur">руб</option> |
<option value="2">usd</option> |
||||||
<option value="usd">usd</option> |
<option value="3">eur</option> |
||||||
<option value="eur">eur</option> |
</select> |
||||||
</select> |
</li> |
||||||
</li> |
|
||||||
|
</ul> |
||||||
<li> |
|
||||||
{{ form.all_days }} |
<div class="tp-descr grey">Регистрация на стойке</div> |
||||||
<select name="allDaysCurrency1"> |
|
||||||
<option value="rur">руб</option> |
</div> |
||||||
<option value="usd">usd</option> |
|
||||||
<option value="eur">eur</option> |
</div> |
||||||
</select> |
|
||||||
</li> |
</div> |
||||||
|
|
||||||
</ul> |
<div class="eprl-col"> |
||||||
|
<div class="eprl-col-wrap"> |
||||||
<div class="tp-descr">Предварительная регистрация</div> |
|
||||||
|
<div class="epr-subtitle">Стоимость аренды 1м²</div> |
||||||
</div> |
|
||||||
|
<ul class="pr-list"> |
||||||
<hr/> |
|
||||||
|
<li> |
||||||
<div class="tp-wrap"> |
{{ form.equiped }} |
||||||
|
<select name="areaCurrency1"> |
||||||
<ul class="pr-list"> |
<option value="1">руб</option> |
||||||
|
<option value="2">usd</option> |
||||||
<li> |
<option value="3">eur</option> |
||||||
{{ form.pre_one_day }} |
</select> |
||||||
<select name="oneDayCurrency2"> |
</li> |
||||||
<option value="1">руб</option> |
|
||||||
<option value="2">usd</option> |
<li> |
||||||
<option value="3">eur</option> |
{{ form.unequiped }} |
||||||
</select> |
<select name="areaCurrency2"> |
||||||
</li> |
<option value="1">руб</option> |
||||||
|
<option value="2">usd</option> |
||||||
<li> |
<option value="3">eur</option> |
||||||
{{ form.pre_all_days }} |
</select> |
||||||
<select name="allDaysCurrency2"> |
</li> |
||||||
<option value="1">руб</option> |
|
||||||
<option value="2">usd</option> |
<li> |
||||||
<option value="3">eur</option> |
{{ form.open_square }} |
||||||
</select> |
<select name="areaCurrency3"> |
||||||
</li> |
<option value="1">руб</option> |
||||||
|
<option value="2">usd</option> |
||||||
</ul> |
<option value="3">eur</option> |
||||||
|
</select> |
||||||
<div class="tp-descr grey">Регистрация на стойке</div> |
</li> |
||||||
|
|
||||||
</div> |
</ul> |
||||||
|
|
||||||
</div> |
<hr/> |
||||||
|
|
||||||
</div> |
<div class="mf-line mf-min-area"> |
||||||
|
<label>Минимальная площадь:</label> |
||||||
<div class="eprl-col"> |
|
||||||
<div class="eprl-col-wrap"> |
<div class="mf-field"> |
||||||
|
{{ form.min_square }} |
||||||
<div class="epr-subtitle">Стоимость аренды 1м²</div> |
м² |
||||||
|
</div> |
||||||
<ul class="pr-list"> |
</div> |
||||||
|
|
||||||
<li> |
<hr/> |
||||||
{{ form.equiped }} |
|
||||||
<select name="areaCurrency1"> |
<div class="mf-line mf-reg-payment"> |
||||||
<option value="1">руб</option> |
<label>Регистрационный взнос:</label> |
||||||
<option value="2">usd</option> |
|
||||||
<option value="3">eur</option> |
<div class="mf-field"> |
||||||
</select> |
{{ form.registration_depos }} |
||||||
</li> |
<select name="areaCurrency3"> |
||||||
|
<option value="1">руб</option> |
||||||
<li> |
<option value="2">usd</option> |
||||||
{{ form.unequiped }} |
<option value="3">eur</option> |
||||||
<select name="areaCurrency2"> |
</select> |
||||||
<option value="1">руб</option> |
</div> |
||||||
<option value="2">usd</option> |
</div> |
||||||
<option value="3">eur</option> |
|
||||||
</select> |
<hr/> |
||||||
</li> |
|
||||||
|
<div class="mf-line mf-deadline"> |
||||||
<li> |
<label>Крайний срок подачи заявки:</label> |
||||||
{{ form.open_square }} |
|
||||||
<select name="areaCurrency3"> |
<div class="mf-field"> |
||||||
<option value="1">руб</option> |
<div class="period"> |
||||||
<option value="2">usd</option> |
<div class="pwf-field"> |
||||||
<option value="3">eur</option> |
{{ form.deadline_date }} |
||||||
</select> |
</div> |
||||||
</li> |
</div> |
||||||
|
</div> |
||||||
</ul> |
</div> |
||||||
|
|
||||||
<hr/> |
</div> |
||||||
|
</div> |
||||||
<div class="mf-line mf-min-area"> |
|
||||||
<label>Минимальная площадь:</label> |
</div> |
||||||
|
</div> |
||||||
<div class="mf-field"> |
|
||||||
{{ form.min_square }} |
<hr/> |
||||||
м² |
|
||||||
</div> |
<div class="a-bot-buttons-line clearfix"> |
||||||
</div> |
|
||||||
|
<div class="abb-left"> |
||||||
<hr/> |
<div class="mfpl-button-line"> |
||||||
|
{# <div class="mfpl-button">#} |
||||||
<div class="mf-line mf-reg-payment"> |
{# <a class="button big grey a-more" href="#">пропустить этот шаг</a>#} |
||||||
<label>Регистрационный взнос:</label> |
{# </div>#} |
||||||
|
|
||||||
<div class="mf-field"> |
<div class="mfpl-text"> |
||||||
{{ form.registration_depos }} |
<p>более полная информация повышает рейтинг вашего мероприятия и позволяет |
||||||
<select name="areaCurrency3"> |
ранжировать |
||||||
<option value="1">руб</option> |
его выше других</p> |
||||||
<option value="2">usd</option> |
</div> |
||||||
<option value="3">eur</option> |
</div> |
||||||
</select> |
|
||||||
</div> |
</div> |
||||||
</div> |
<button class="button big orange a-more" type="submit">Дале</button> |
||||||
|
|
||||||
<hr/> |
</div> |
||||||
|
|
||||||
<div class="mf-line mf-deadline"> |
</div> |
||||||
<label>Крайний срок подачи заявки:</label> |
<div class="set-sect p-form adm-form passed"> |
||||||
|
<div class="set-sect-title clearfix"> |
||||||
<div class="mf-field"> |
<h3>Шаг 3. Добавление фото</h3> |
||||||
<div class="period"> |
|
||||||
<div class="pwf-field"> |
|
||||||
{{ form.deadline_date }} |
</div> |
||||||
</div> |
</div> |
||||||
</div> |
</form> |
||||||
</div> |
</div> |
||||||
</div> |
|
||||||
|
{% endwith %} |
||||||
</div> |
{% endif %} |
||||||
</div> |
|
||||||
|
|
||||||
</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
<hr/> |
|
||||||
|
|
||||||
<div class="a-bot-buttons-line clearfix"> |
|
||||||
|
|
||||||
<div class="abb-left"> |
|
||||||
<div class="mfpl-button-line"> |
|
||||||
<div class="mfpl-button"> |
|
||||||
<a class="button big grey a-more" href="#">пропустить этот шаг</a> |
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="mfpl-text"> |
|
||||||
<p>более полная информация повышает рейтинг вашего мероприятия и позволяет ранжировать |
|
||||||
его выше других</p> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
</div> |
|
||||||
|
|
||||||
{% if wizard.steps.prev %} |
|
||||||
<button class="button big orange a-more" name="wizard_goto_step" type="submit" |
|
||||||
value="{{ wizard.steps.first }}">"first step" |
|
||||||
</button> |
|
||||||
<button class="button big orange a-more" name="wizard_goto_step" type="submit" |
|
||||||
value="{{ wizard.steps.prev }}"> "prev step" |
|
||||||
</button> |
|
||||||
{% endif %} |
|
||||||
<button class="button big orange a-more" type="submit" >Дале</button> |
|
||||||
|
|
||||||
</div> |
|
||||||
</form> |
|
||||||
|
|
||||||
</div> |
|
||||||
<div class="set-sect p-form adm-form passed"> |
|
||||||
<div class="set-sect-title clearfix"> |
|
||||||
<h3>Шаг 3. Добавление фото</h3> |
|
||||||
|
|
||||||
<div class="afh-right"> |
|
||||||
<a class="button icon-edit" href="#">изменить</a> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
{% endwith %} |
|
||||||
{% endif %} |
|
||||||
|
|
||||||
{% endblock %} |
{% endblock %} |
||||||
@ -0,0 +1,148 @@ |
|||||||
|
{% extends "client/base_catalog.html" %} |
||||||
|
|
||||||
|
|
||||||
|
{% block styles %} |
||||||
|
<style> |
||||||
|
.thumb { |
||||||
|
height: 175px; |
||||||
|
border: 1px solid #000; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
</style> |
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block content_list %} |
||||||
|
{{ wizard.form.media }} |
||||||
|
|
||||||
|
<div class="page-title"> |
||||||
|
<h1>Добавить событие</h1> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="page-body clearfix"> |
||||||
|
<form action="" method="post" enctype="multipart/form-data">{% csrf_token %} |
||||||
|
|
||||||
|
|
||||||
|
<div class="set-sect p-form adm-form passed"> |
||||||
|
<div class="set-sect-title clearfix"> |
||||||
|
<h3>Шаг 1. Основная информация</h3> |
||||||
|
|
||||||
|
<div class="afh-right"> |
||||||
|
<button name="wizard_goto_step" type="submit" class="button icon-edit" |
||||||
|
value="{{ wizard.steps.first }}">изменить |
||||||
|
</button> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="set-sect p-form adm-form passed"> |
||||||
|
<div class="set-sect-title clearfix"> |
||||||
|
<h3>Шаг 2. Статистика и условия участия</h3> |
||||||
|
|
||||||
|
<div class="afh-right"> |
||||||
|
<button name="wizard_goto_step" type="submit" class="button icon-edit" |
||||||
|
value="{{ wizard.steps.prev }}">изменить |
||||||
|
</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="set-sect p-form adm-form"> |
||||||
|
<div class="set-sect-title clearfix"> |
||||||
|
<h3>Шаг 3. Добавление фото</h3> |
||||||
|
|
||||||
|
<div class="afh-right"> |
||||||
|
<div class="sst-info"><b>+ 1,2 балла</b> к рейтингу</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{{ form.errors }} |
||||||
|
{{ wizard.management_form }} |
||||||
|
{% if wizard.form.forms %} |
||||||
|
{{ wizard.form.management_form }} |
||||||
|
{% for form in wizard.form.forms %} |
||||||
|
{{ form }} |
||||||
|
{% endfor %} |
||||||
|
{% else %} |
||||||
|
{% with wizard.form as form %} |
||||||
|
<hr/> |
||||||
|
<div class="mf-photos-list"> |
||||||
|
<div class="mfpl-button-line"> |
||||||
|
<div class="mfpl-button"> |
||||||
|
{{ form.attachments }} |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="mfpl-text"> |
||||||
|
<p>более полная информация повышает рейтинг вашего мероприятия и позволяет |
||||||
|
ранжировать его выше других</p> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
<ul id="list"></ul> |
||||||
|
<div class="a-bot-buttons-line clearfix"> |
||||||
|
|
||||||
|
<div class="abb-left"> |
||||||
|
<button class="button big grey a-more" type="submit">пропустить этот шаг</button> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="abb-right"> |
||||||
|
<button id="next" class="button big orange a-more" type="submit">далее</button> |
||||||
|
</div> |
||||||
|
<div id="res"> </div> |
||||||
|
|
||||||
|
</div> |
||||||
|
{% endwith %} |
||||||
|
{% endif %} |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
|
||||||
|
</div> |
||||||
|
<!-- for response debugging --> |
||||||
|
{% comment %} <script> |
||||||
|
$("#next").click(function(e){ |
||||||
|
e.preventDefault(); |
||||||
|
$.ajax({url: '/wizard/ajax/', success: function(result){ |
||||||
|
$("#res").html(result); |
||||||
|
}}); |
||||||
|
}); |
||||||
|
</script>{% endcomment %} |
||||||
|
|
||||||
|
<script type="text/javascript"> |
||||||
|
var cnt = 0; |
||||||
|
function handleFileSelect(evt) { |
||||||
|
var files = evt.target.files; // FileList object |
||||||
|
|
||||||
|
// Loop through the FileList and render image files as thumbnails. |
||||||
|
for (var i = 0, f; f = files[i]; i++) { |
||||||
|
|
||||||
|
// Only process image files. |
||||||
|
if (!f.type.match('image.*')) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
var reader = new FileReader(); |
||||||
|
|
||||||
|
// Closure to capture the file information. |
||||||
|
reader.onload = (function (theFile) { |
||||||
|
return function (e) { |
||||||
|
// Render thumbnail. |
||||||
|
var div = document.createElement('div'); |
||||||
|
|
||||||
|
div.innerHTML = ['<li><div class="mfpli-pict"> <img class="thumb" src="', e.target.result, |
||||||
|
'" title="', theFile.name, |
||||||
|
'"/></div>', '<div class="mfpli-body"> <div class="mf-line full-width"> <div class="mf-field"> <textarea name="pdescr_', |
||||||
|
cnt.toString(), '" cols="30" rows="10" placeholder="Описание"></textarea></div></div>', |
||||||
|
'</li>'].join(''); |
||||||
|
cnt +=1 ; |
||||||
|
document.getElementById('list').insertBefore(div, null); |
||||||
|
}; |
||||||
|
})(f); |
||||||
|
|
||||||
|
// Read in the image file as a data URL. |
||||||
|
reader.readAsDataURL(f); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
document.getElementById('files').addEventListener('change', handleFileSelect, false); |
||||||
|
</script> |
||||||
|
{% endblock %} |
||||||
@ -1,23 +1,23 @@ |
|||||||
{% extends 'client/base_catalog.html' %} |
{% extends 'client/base_catalog.html' %} |
||||||
{% block content_list %} |
{% block content_list %} |
||||||
{{ wizard.form.media }} |
{{ wizard.form.media }} |
||||||
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p> |
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p> |
||||||
<form action="" method="post">{% csrf_token %} |
<form action="" method="post">{% csrf_token %} |
||||||
<table> |
<table> |
||||||
{{ wizard.management_form }} |
{{ wizard.management_form }} |
||||||
{% if wizard.form.forms %} |
{% if wizard.form.forms %} |
||||||
{{ wizard.form.management_form }} |
{{ wizard.form.management_form }} |
||||||
{% for form in wizard.form.forms %} |
{% for form in wizard.form.forms %} |
||||||
{{ form }} |
{{ form }} |
||||||
{% endfor %} |
{% endfor %} |
||||||
{% else %} |
{% else %} |
||||||
{{ wizard.form }} |
{{ wizard.form }} |
||||||
{% endif %} |
{% endif %} |
||||||
</table> |
</table> |
||||||
{% if wizard.steps.prev %} |
{% if wizard.steps.prev %} |
||||||
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}"> "first step" </button> |
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}"> "first step" </button> |
||||||
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}"> "prev step"</button> |
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}"> "prev step"</button> |
||||||
{% endif %} |
{% endif %} |
||||||
<input type="submit" value= "submit"/> |
<input type="submit" value= "submit"/> |
||||||
</form> |
</form> |
||||||
{% endblock %} |
{% endblock %} |
||||||
@ -1,65 +1,75 @@ |
|||||||
# -*- coding: utf-8 -*- |
# -*- coding: utf-8 -*- |
||||||
from django import forms |
from django import forms |
||||||
from theme.models import Theme, Tag |
from theme.models import Theme |
||||||
from place_exposition.models import PlaceExposition |
from place_exposition.models import PlaceExposition |
||||||
from city.models import City |
from country.models import Country |
||||||
from country.models import Country |
from multiupload.fields import MultiFileField, MultiFileInput |
||||||
|
|
||||||
choices = ((0, ''), (1.0, u'Ежегодно'), (2.0, u'2 раза в год'), (3.0, u'3 раза в год'), (4.0, u'4 раза в год'), |
|
||||||
(5.0, u'5 раз в год'), (0.5, u'Раз в 2 года'), ( |
choices = ((0, ''), (1.0, u'Ежегодно'), (2.0, u'2 раза в год'), (3.0, u'3 раза в год'), (4.0, u'4 раза в год'), |
||||||
0.33, u'Раз в 3 года'), (0.25, u'Раз в 4 года')) |
(5.0, u'5 раз в год'), (0.5, u'Раз в 2 года'), ( |
||||||
|
0.33, u'Раз в 3 года'), (0.25, u'Раз в 4 года')) |
||||||
|
|
||||||
class ExpoForm1(forms.Form): |
places = [(item.id, item.name) for item in PlaceExposition.objects.language().all()] |
||||||
""" |
places.insert(0,('', 'Не выбрано')) |
||||||
main information about exposition |
|
||||||
""" |
|
||||||
theme = forms.ModelChoiceField(queryset=Theme.objects.filter(id=50)) |
class ExpoForm1(forms.Form): |
||||||
tag = forms.ModelChoiceField(queryset=Tag.objects.filter(id=50)) |
""" |
||||||
name = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Введите название выставки"})) |
main information about exposition |
||||||
main_title = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Краткое описание выставки (необязательно)"})) |
""" |
||||||
description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Полное описание выставки", 'cols':30, 'rows':10})) |
name = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Введите название выставки"})) |
||||||
date_start = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateFrom', 'placeholder':'дд.мм.гг'})) |
main_title = forms.CharField(max_length=255, widget=forms.TextInput(attrs={'placeholder': "Краткое описание выставки (необязательно)"})) |
||||||
date_end = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateTo','placeholder':'дд.мм.гг'})) |
description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Полное описание выставки", 'cols':30, 'rows':10})) |
||||||
country = forms.ModelChoiceField(queryset=Country.objects.filter(id=50)) |
date_start = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateFrom', 'placeholder':'дд.мм.гг'})) |
||||||
city = forms.ModelChoiceField(queryset=City.objects.language('ru').filter(id=900052419)) |
date_end = forms.DateField(widget=forms.TextInput(attrs={'class':'data dateTo','placeholder':'дд.мм.гг'})) |
||||||
place = forms.ModelChoiceField(queryset=PlaceExposition.objects.filter(id=50)) |
|
||||||
audience1 = forms.BooleanField(required=False) |
country = forms.ChoiceField(label=u'Страна', choices=[(c.id, c.name) for c in Country.objects.all()], widget=forms.Select(attrs={'id':'id_country'})) |
||||||
audience2 = forms.BooleanField(required=False) |
theme = forms.MultipleChoiceField(label='Тематики', choices=[(item.id, item.name) for item in Theme.objects.language().all()], widget=forms.SelectMultiple(attrs={'id':'id_theme'})) |
||||||
audience3 = forms.BooleanField(required=False) |
place = forms.ChoiceField(label=u'Место проведения', required=False, choices=places, widget=forms.Select(attrs={'id':'id_place'})) |
||||||
periodic = forms.ChoiceField(choices=choices) |
city = forms.CharField(label=u'Город', widget=forms.HiddenInput(attrs={'id':'id_city'})) |
||||||
membership1= forms.BooleanField(required=False) |
tag = forms.CharField(label=u'Теги', widget=forms.HiddenInput(attrs={'id':'id_tag'}), required=False) |
||||||
membership2= forms.BooleanField(required=False) |
|
||||||
membership3= forms.BooleanField(required=False) |
audience1 = forms.BooleanField(required=False) |
||||||
web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"})) |
audience2 = forms.BooleanField(required=False) |
||||||
products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10})) |
audience3 = forms.BooleanField(required=False) |
||||||
time_start = forms.TimeField() |
periodic = forms.ChoiceField(choices=choices, required=False) |
||||||
time_end = forms.TimeField() |
membership1 = forms.BooleanField(required=False) |
||||||
logo = forms.ImageField(widget=forms.FileInput(attrs={'class':"button big icon-clip"}), required=False) |
membership2 = forms.BooleanField(required=False) |
||||||
|
membership3 = forms.BooleanField(required=False) |
||||||
|
web_site = forms.URLField(required=False, widget=forms.TextInput(attrs={'placeholder': "Веб-сайт (необязательно)"})) |
||||||
class ExpoForm2(forms.Form): |
products = forms.CharField(widget=forms.Textarea(attrs={'placeholder': "Экспонируемые продукты", 'cols':30, 'rows':10})) |
||||||
""" |
time_start = forms.TimeField() |
||||||
statistics |
time_end = forms.TimeField() |
||||||
""" |
logo = forms.ImageField(widget=forms.FileInput(attrs={'class':"button big icon-clip"}), required=False) |
||||||
found_year = forms.IntegerField() |
|
||||||
statistic_year = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'введите год'})) |
|
||||||
visitors = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'количество посетителей'})) |
class ExpoForm2(forms.Form): |
||||||
partisipants = forms.IntegerField(widget=forms.TextInput(attrs={'placeholder':'количество учасников'})) |
""" |
||||||
square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'площадь'})) |
statistics |
||||||
countries = forms.ModelChoiceField(queryset=Country.objects.filter(id=50)) |
""" |
||||||
|
found_year = forms.IntegerField() |
||||||
# ticket price |
# ticket price |
||||||
pre_one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'})) |
pre_one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'})) |
||||||
pre_all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'})) |
pre_all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'})) |
||||||
one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'})) |
one_day = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на один день'})) |
||||||
all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'})) |
all_days = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'на все дни'})) |
||||||
|
|
||||||
# rent price |
# rent price |
||||||
equiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'оборудованная площадь'})) |
equiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'оборудованная площадь'})) |
||||||
unequiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'необорудованная площадь'})) |
unequiped = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'необорудованная площадь'})) |
||||||
open_square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'открытая площадь'})) |
open_square = forms.FloatField(widget=forms.TextInput(attrs={'placeholder':'открытая площадь'})) |
||||||
min_square = forms.FloatField() |
min_square = forms.FloatField() |
||||||
registration_depos = forms.FloatField() |
registration_depos = forms.FloatField() |
||||||
deadline_date = forms.DateField(widget=forms.TextInput(attrs={'placeholder':'дд.мм.гг'})) |
deadline_date = forms.DateField(widget=forms.TextInput(attrs={'placeholder':'дд.мм.гг'})) |
||||||
|
|
||||||
|
|
||||||
|
class ExpoForm3(forms.Form): |
||||||
|
""" |
||||||
|
photos from last expositions |
||||||
|
""" |
||||||
|
attachments = MultiFileField(min_num=0, max_num=6, max_file_size=1024*1024*5, widget=MultiFileInput( |
||||||
|
attrs={'class':'button big icon-camera', 'value': u'выберите фотографии', 'id': 'files'} |
||||||
|
)) |
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +0,0 @@ |
|||||||
from django.db import models |
|
||||||
|
|
||||||
# Create your models here. |
|
||||||
@ -1,8 +1,7 @@ |
|||||||
from django.conf.urls import patterns |
from django.conf.urls import patterns, url |
||||||
|
from .views import ExpoWizard |
||||||
from wizard.forms import ExpoForm1, ExpoForm2 |
from .forms import ExpoForm1, ExpoForm2,ExpoForm3 |
||||||
from wizard.views import ExpoWizard |
|
||||||
|
formlist = [ExpoForm1,ExpoForm2, ExpoForm3] |
||||||
urlpatterns = patterns('', |
|
||||||
(r'^$', ExpoWizard.as_view([ExpoForm1, ExpoForm2])) |
urlpatterns = patterns('', url(r'^$', ExpoWizard.as_view(formlist), name = 'add_exposition')) |
||||||
) |
|
||||||
Loading…
Reference in new issue