pull request merging

remotes/origin/1203
Ivan Kovalkovskyi 11 years ago
commit 4ac9edd1cf
  1. 92
      expobanner/admin.py
  2. 12
      expobanner/admin_urls.py
  3. 111
      expobanner/forms.py
  4. 2
      expobanner/management/commands/banner_log_update.py
  5. 6
      expobanner/managers.py
  6. 26
      expobanner/models.py
  7. 63
      expobanner/utils.py
  8. 27
      expobanner/views.py
  9. 8
      exposition/forms.py
  10. 1
      exposition/manager.py
  11. 13
      exposition/models.py
  12. 4
      exposition/views.py
  13. 11
      functions/models_methods.py
  14. 1
      proj/urls.py
  15. 7
      proj/views.py
  16. 20
      settings/views.py
  17. 6
      templates/admin/expobanner/banners_control.html
  18. 1
      templates/admin/expobanner/default_form.html
  19. 38
      templates/admin/expobanner/link_list.html
  20. 40
      templates/admin/expobanner/main_list.html
  21. 48
      templates/admin/expobanner/main_stat.html
  22. 4
      templates/admin/expobanner/paid_stat.html
  23. 2
      templates/admin/expobanner/top_create.html
  24. 1
      templates/admin/includes/admin_nav.html
  25. 92
      templates/client/blank.html
  26. 28
      templates/client/expobanners/banner_stat.html
  27. 30
      templates/client/expobanners/paid_stat.html
  28. 69
      templates/client/exposition/exposition_detail.html
  29. 2
      templates/client/includes/banners/popup.html
  30. 6
      templates/client/includes/exposition/expo_top.html
  31. 4
      templates/client/includes/index/main_events.html
  32. 2
      templates/client/static_client/js/_modules/block.common.js
  33. 4
      templates/client/static_client/js/_modules/block.exposition.list.js
  34. 61
      templates/client/static_client/js/rejs/banners.js
  35. 13
      templates/client/static_client/js/rejs/tops.js
  36. 2
      templates/client/static_client/js_min/_modules/block.common.min.js

@ -3,9 +3,9 @@ from django.views.generic import TemplateView, CreateView, ListView, UpdateView,
from django.conf import settings from django.conf import settings
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from expobanner.models import URL, BannerGroup, Banner, Paid from expobanner.models import URL, BannerGroup, Banner, Paid, MainPage, Top
from expobanner.forms import UrlCreateForm, BannerCreateGroupForm, BannerCreateForm, BannerGroupUpdateForm,\ from expobanner.forms import UrlCreateForm, BannerCreateGroupForm, BannerCreateForm, BannerGroupUpdateForm,\
PaidCreateForm, PaidUpdateForm, TopCreateForm PaidCreateForm, PaidUpdateForm, TopCreateForm, BannerLinkCreateForm, MainCreateForm, MainUpdateForm, TopUpdateForm
from exposition.models import Exposition from exposition.models import Exposition
@ -32,6 +32,10 @@ class CreateBanner(AbstractCreate):
model = Banner model = Banner
form_class = BannerCreateForm form_class = BannerCreateForm
class CreateLink(AbstractCreate):
model = Banner
form_class = BannerLinkCreateForm
# LISTS VIEWS # LISTS VIEWS
class AbstractList(ListView): class AbstractList(ListView):
@ -63,6 +67,16 @@ class BannerList(AbstractList):
qs = qs.filter(group__isnull=False) qs = qs.filter(group__isnull=False)
return qs return qs
class LinkList(AbstractList):
model = Banner
verbose = u'Список ссылок'
template_name = 'admin/expobanner/link_list.html'
def get_queryset(self):
qs = super(LinkList, self).get_queryset()
qs = qs.filter(link=True)
return qs
# UPDATE VIEWS # UPDATE VIEWS
class AbstractUpdate(UpdateView): class AbstractUpdate(UpdateView):
template_name = 'admin/expobanner/default_form.html' template_name = 'admin/expobanner/default_form.html'
@ -84,10 +98,16 @@ class BannerUpdate(AbstractUpdate):
form_class = BannerCreateForm form_class = BannerCreateForm
class LinkUpdate(AbstractUpdate):
model = Banner
form_class = BannerLinkCreateForm
class BannerStat(DetailView): class BannerStat(DetailView):
model = Banner model = Banner
template_name = 'admin/expobanner/banner_stat.html' template_name = 'admin/expobanner/banner_stat.html'
class PaidList(ListView): class PaidList(ListView):
model = Exposition model = Exposition
template_name = 'admin/expobanner/paid_list.html' template_name = 'admin/expobanner/paid_list.html'
@ -96,11 +116,13 @@ class PaidList(ListView):
def get_queryset(self): def get_queryset(self):
return self.model.objects.language().filter(paid_new__isnull=False) return self.model.objects.language().filter(paid_new__isnull=False)
class PaidCreate(CreateView): class PaidCreate(CreateView):
form_class = PaidCreateForm form_class = PaidCreateForm
template_name = 'admin/expobanner/paid_create.html' template_name = 'admin/expobanner/paid_create.html'
success_url = '/admin/expobanners/paid/list/' success_url = '/admin/expobanners/paid/list/'
class PaidUpdate(UpdateView): class PaidUpdate(UpdateView):
model = Paid model = Paid
form_class = PaidUpdateForm form_class = PaidUpdateForm
@ -140,6 +162,58 @@ class PaidStat(DetailView):
model = Paid model = Paid
template_name = 'admin/expobanner/paid_stat.html' template_name = 'admin/expobanner/paid_stat.html'
# ----------------------------------
class MainList(ListView):
model = Exposition
template_name = 'admin/expobanner/main_list.html'
paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self):
return self.model.objects.language().filter(main__isnull=False)
class MainCreate(CreateView):
form_class = MainCreateForm
template_name = 'admin/expobanner/paid_create.html'
success_url = '/admin/expobanners/main/list/'
class MainUpdate(UpdateView):
model = MainPage
form_class = MainUpdateForm
template_name = 'admin/expobanner/default_form.html'
success_url = '/admin/expobanners/main/list/'
def get_context_data(self, **kwargs):
context = super(MainUpdate, self).get_context_data(**kwargs)
obj = self.object
context['exposition'] = obj.get_event()
return context
def main_turn(request, pk, status):
main = get_object_or_404(MainPage, pk=pk)
if status == 'on':
main.public = True
else:
main.public = False
main.save()
return HttpResponseRedirect('/admin/expobanners/main/list/')
class MainStat(DetailView):
model = MainPage
template_name = 'admin/expobanner/main_stat.html'
def get_context_data(self, **kwargs):
context = super(MainStat, self).get_context_data(**kwargs)
obj = self.object
context['stats'] = obj.link.banner_stat.all()
return context
# ------------------------------------
class TopList(ListView): class TopList(ListView):
model = Exposition model = Exposition
@ -154,3 +228,17 @@ class TopCreate(CreateView):
form_class = TopCreateForm form_class = TopCreateForm
template_name = 'admin/expobanner/top_create.html' template_name = 'admin/expobanner/top_create.html'
success_url = '/admin/expobanners/top/list/' success_url = '/admin/expobanners/top/list/'
class TopUpdate(UpdateView):
model = Top
form_class = TopUpdateForm
template_name = 'admin/expobanner/top_create.html'
success_url = '/admin/expobanners/top/list/'
def get_context_data(self, **kwargs):
context = super(TopUpdate, self).get_context_data(**kwargs)
obj = self.object
context['exposition'] = obj.get_event()
return context

@ -8,13 +8,17 @@ urlpatterns = patterns('expobanner.admin',
url(r'^banners/url/$', CreateUrl.as_view(), name='expobanner-create_url'), url(r'^banners/url/$', CreateUrl.as_view(), name='expobanner-create_url'),
url(r'^banners/group/$', CreateBannerGroup.as_view(), name='expobanner-create_group'), url(r'^banners/group/$', CreateBannerGroup.as_view(), name='expobanner-create_group'),
url(r'^banners/banner/$', CreateBanner.as_view(), name='expobanner-create_banner'), url(r'^banners/banner/$', CreateBanner.as_view(), name='expobanner-create_banner'),
url(r'^banners/link/$', CreateLink.as_view(), name='expobanner-create_link'),
url(r'^banners/url/list/$', UrlList.as_view(), name='expobanner-list_url'), url(r'^banners/url/list/$', UrlList.as_view(), name='expobanner-list_url'),
url(r'^banners/group/list/$', BannerGroupList.as_view(), name='expobanner-list_group'), url(r'^banners/group/list/$', BannerGroupList.as_view(), name='expobanner-list_group'),
url(r'^banners/banner/list/$', BannerList.as_view(), name='expobanner-list_banner'), url(r'^banners/banner/list/$', BannerList.as_view(), name='expobanner-list_banner'),
url(r'^banners/link/list/$', LinkList.as_view(), name='expobanner-list_link'),
url(r'^banners/url/(?P<pk>\d+)/edit/$', UrlUpdate.as_view(), name='expobanner-update_url'), url(r'^banners/url/(?P<pk>\d+)/edit/$', UrlUpdate.as_view(), name='expobanner-update_url'),
url(r'^banners/group/(?P<pk>\d+)/edit/$', BannerGroupUpdate.as_view(), name='expobanner-update_group'), url(r'^banners/group/(?P<pk>\d+)/edit/$', BannerGroupUpdate.as_view(), name='expobanner-update_group'),
url(r'^banners/banner/(?P<pk>\d+)/edit/$', BannerUpdate.as_view(), name='expobanner-update_banner'), url(r'^banners/banner/(?P<pk>\d+)/edit/$', BannerUpdate.as_view(), name='expobanner-update_banner'),
url(r'^banners/link/(?P<pk>\d+)/edit/$', LinkUpdate.as_view(), name='expobanner-update_link'),
url(r'^banners/banner/(?P<pk>\d+)/stat/$', BannerStat.as_view(), name='expobanner_stat_banner'), url(r'^banners/banner/(?P<pk>\d+)/stat/$', BannerStat.as_view(), name='expobanner_stat_banner'),
url(r'^banners/banner/(?P<pk>\d+)/stat/$', BannerStat.as_view(), name='expobanner_stat_link'),
# paid # paid
url(r'^paid/list/$', PaidList.as_view(), name='expobanner-list_paid'), url(r'^paid/list/$', PaidList.as_view(), name='expobanner-list_paid'),
url(r'^paid/(?P<pk>\d+)/edit/$', PaidUpdate.as_view(), name='expobanner-update_paid'), url(r'^paid/(?P<pk>\d+)/edit/$', PaidUpdate.as_view(), name='expobanner-update_paid'),
@ -23,7 +27,13 @@ urlpatterns = patterns('expobanner.admin',
url(r'^paid/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='expobanner_stat_paid'), url(r'^paid/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='expobanner_stat_paid'),
# top # top
url(r'^top/list/$', TopList.as_view(), name='expobanner-list_top'), url(r'^top/list/$', TopList.as_view(), name='expobanner-list_top'),
url(r'^top/(?P<pk>\d+)/edit/$', PaidUpdate.as_view(), name='expobanner-update_top'), url(r'^top/(?P<pk>\d+)/edit/$', TopUpdate.as_view(), name='expobanner-update_top'),
url(r'^top/$', TopCreate.as_view(), name='expobanner-create_top'), url(r'^top/$', TopCreate.as_view(), name='expobanner-create_top'),
url(r'^top/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='expobanner_stat_top'), url(r'^top/(?P<pk>\d+)/stat/$', PaidStat.as_view(), name='expobanner_stat_top'),
# main page
url(r'^main/list/$', MainList.as_view(), name='expobanner-list_main'),
url(r'^main/(?P<pk>\d+)/edit/$', MainUpdate.as_view(), name='expobanner-update_main'),
url(r'^main/$', MainCreate.as_view(), name='expobanner-create_main'),
url(r'^main/turn/(?P<pk>\d+)/(?P<status>.*)/$', main_turn, name='expobanner-main-turn'),
url(r'^main/(?P<pk>\d+)/stat/$', MainStat.as_view(), name='expobanner_stat_main'),
) )

@ -1,14 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
from expobanner.models import URL, BannerGroup, Banner, Paid, Top from expobanner.models import URL, BannerGroup, Banner, Paid, Top, MainPage
from exposition.models import Exposition from exposition.models import Exposition
from country.models import Country from country.models import Country
from city.models import City from ckeditor.widgets import CKEditorWidget
from theme.models import Theme, Tag from theme.models import Theme, Tag
class UrlCreateForm(forms.ModelForm): class UrlCreateForm(forms.ModelForm):
verbose = u'Создать урл' verbose = u'Создать урл'
class Meta: class Meta:
model = URL model = URL
exclude = ['created_at', 'updated_at', 'sites'] exclude = ['created_at', 'updated_at', 'sites']
@ -16,12 +17,14 @@ class UrlCreateForm(forms.ModelForm):
class BannerCreateGroupForm(forms.ModelForm): class BannerCreateGroupForm(forms.ModelForm):
verbose = u'Создать групу' verbose = u'Создать групу'
class Meta: class Meta:
model = BannerGroup model = BannerGroup
exclude = ['created_at', 'updated_at', 'speed'] exclude = ['created_at', 'updated_at', 'speed']
class BannerGroupUpdateForm(BannerCreateGroupForm): class BannerGroupUpdateForm(BannerCreateGroupForm):
verbose = u'Изменить групу' verbose = u'Изменить групу'
class Meta: class Meta:
model = BannerGroup model = BannerGroup
exclude = ['created_at', 'updated_at', 'slug', 'speed'] exclude = ['created_at', 'updated_at', 'slug', 'speed']
@ -29,15 +32,28 @@ class BannerGroupUpdateForm(BannerCreateGroupForm):
class BannerCreateForm(forms.ModelForm): class BannerCreateForm(forms.ModelForm):
verbose = u'Создать банер' verbose = u'Создать банер'
#country = forms.ChoiceField(label=u'Страна', choices=[('', ' ')] + [(c.id, c.name) for c in Country.objects.all()], required=False) text = forms.CharField(label=u'Текст', required=False, widget=CKEditorWidget)
#theme = forms.ChoiceField(label=u'Тематика', required=False, class Meta:
# choices=[('', ' ')] + [(item.id, item.name) for item in Theme.objects.language().all()]) model = Banner
#city = forms.CharField(label=u'Город', widget=forms.HiddenInput(), required=False) exclude = ['created_at', 'updated_at', 'often', 'paid', 'stat_pswd', 'cookie', 'link']
#tag = forms.CharField(label=u'Тег', widget=forms.HiddenInput(), required=False)
class BannerLinkCreateForm(forms.ModelForm):
verbose = u'Отслеживаемую ссылку'
class Meta: class Meta:
model = Banner model = Banner
exclude = ['created_at', 'updated_at', 'often', 'paid', 'stat_pswd'] fields = ['public', 'alt', 'url']
exclude = ['created_at', 'updated_at', 'often', 'paid', 'stat_pswd', 'cookie', 'link']
def save(self, commit=True):
banner = super(BannerLinkCreateForm, self).save(commit=False)
if commit:
banner.link =True
banner.save()
return banner
class ClientStatForm(forms.Form): class ClientStatForm(forms.Form):
@ -91,6 +107,36 @@ class PaidCreateForm(forms.ModelForm):
raise forms.ValidationError(u'Такой выставки не существует') raise forms.ValidationError(u'Такой выставки не существует')
return expo return expo
class MainCreateForm(forms.ModelForm):
verbose = u'Добавить выставку на главную'
exposition = forms.CharField(label=u'Выставка', widget=forms.HiddenInput())
class Meta:
model = MainPage
fields = ['position', 'public']
def save(self, commit=True):
main = super(MainCreateForm, self).save(commit=False)
if commit:
expo = self.cleaned_data['exposition']
link = expo.get_permanent_url()
link_b = Banner.objects.create_for_paid(expo, link, 'main_page_link')
main.link = link_b
main.save()
expo.main = main
expo.save()
return main
def clean_exposition(self):
expo_id = self.cleaned_data['exposition']
try:
expo = Exposition.objects.get(id=expo_id)
except Exposition.DoesNotExist:
raise forms.ValidationError(u'Такой выставки не существует')
return expo
class PaidUpdateForm(forms.ModelForm): class PaidUpdateForm(forms.ModelForm):
tickets = forms.URLField(label=u'Линк на билеты') tickets = forms.URLField(label=u'Линк на билеты')
participation = forms.URLField(label=u'Линк на участие') participation = forms.URLField(label=u'Линк на участие')
@ -126,17 +172,23 @@ class PaidUpdateForm(forms.ModelForm):
return paid return paid
class MainUpdateForm(forms.ModelForm):
class Meta:
model = MainPage
fields = ['position', 'public']
class TopCreateForm(forms.ModelForm): class TopCreateForm(forms.ModelForm):
verbose = u'Создать выставку в топе' verbose = u'Создать выставку в топе'
exposition = forms.CharField(label=u'Выставка', widget=forms.HiddenInput()) exposition = forms.CharField(label=u'Выставка', widget=forms.HiddenInput())
country = forms.MultipleChoiceField(label=u'Страна', choices=[('', ' ')] + [(c.id, c.name) for c in Country.objects.all()], required=False) country = forms.MultipleChoiceField(label=u'Страна', choices=[('', ' ')] + [(c.id, c.name) for c in Country.objects.all()], required=False)
theme = forms.MultipleChoiceField(label=u'Тематика', required=False, theme = forms.MultipleChoiceField(label=u'Тематика', required=False,
choices=[('', ' ')] + [(item.id, item.name) for item in Theme.objects.language().all()]) choices=[('', ' ')] + [(item.id, item.name) for item in Theme.objects.language().all()])
excluded_cities = forms.CharField(label=u'Город', widget=forms.HiddenInput(), required=False) #excluded_cities = forms.CharField(label=u'Город', widget=forms.HiddenInput(), required=False)
excluded_tags = forms.CharField(label=u'Тег', widget=forms.HiddenInput(), required=False) #excluded_tags = forms.CharField(label=u'Тег', widget=forms.HiddenInput(), required=False)
class Meta: class Meta:
model = Top model = Top
fields = ['catalog', 'position', 'theme', 'excluded_tags', 'country', 'excluded_cities', 'fr', 'to'] fields = ['catalog', 'position', 'theme', 'country', 'fr', 'to']
def save(self, commit=True): def save(self, commit=True):
top = super(TopCreateForm, self).save(commit=False) top = super(TopCreateForm, self).save(commit=False)
@ -149,15 +201,22 @@ class TopCreateForm(forms.ModelForm):
top.theme.clear() top.theme.clear()
for theme in self.cleaned_data['theme']: for theme in self.cleaned_data['theme']:
top.theme.add(theme) top.theme.add(theme)
top.country.clear()
for country in self.cleaned_data['country']:
top.country.add(country)
self.save_m2m = save_m2m self.save_m2m = save_m2m
if commit: if commit:
expo = self.cleaned_data['exposition'] expo = self.cleaned_data['exposition']
link = expo.get_permanent_url()
link_b = Banner.objects.create_for_paid(expo, link, 'top_link')
top.link = link_b
top.save() top.save()
self.save_m2m() self.save_m2m()
expo.top = top expo.top = top
expo.save() expo.save()
return top return top
def clean_theme(self): def clean_theme(self):
@ -179,3 +238,33 @@ class TopCreateForm(forms.ModelForm):
except Exposition.DoesNotExist: except Exposition.DoesNotExist:
raise forms.ValidationError(u'Такой выставки не существует') raise forms.ValidationError(u'Такой выставки не существует')
return expo return expo
class TopUpdateForm(forms.ModelForm):
verbose = u'Изменить выставку'
class Meta:
model = Top
fields = ['catalog', 'position', 'theme', 'country', 'fr', 'to']
def save(self, commit=True):
top = super(TopUpdateForm, self).save(commit=False)
# Prepare a 'save_m2m' method for the form,
old_save_m2m = self.save_m2m
def save_m2m():
old_save_m2m()
# This is where we actually link the pizza with toppings
top.theme.clear()
for theme in self.cleaned_data['theme']:
top.theme.add(theme)
top.country.clear()
for country in self.cleaned_data['country']:
top.country.add(country)
self.save_m2m = save_m2m
if commit:
top.save()
self.save_m2m()
return top

@ -9,7 +9,7 @@ class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
today = date.today() today = date.today()
# banners # banners
for banner in Banner.objects.select_related('group').filter(public=True, group__isnull=False): for banner in Banner.objects.select_related('group').filter(public=True):
try: try:
logstat = LogStat.objects.get(banner=banner, group=banner.group, date=today) logstat = LogStat.objects.get(banner=banner, group=banner.group, date=today)
except LogStat.DoesNotExist: except LogStat.DoesNotExist:

@ -51,7 +51,7 @@ class BannerGroupCached(models.Manager):
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)).extra({})) .filter(Q(to__gte=today) | Q(to__isnull=True)))
cache.set(key, result, 70) cache.set(key, result, 70)
return result return result
@ -71,7 +71,9 @@ class TopCached(models.Manager):
key = 'expo_b_top_all' key = 'expo_b_top_all'
result = cache.get(key) result = cache.get(key)
if not result: if not result:
result = list(self.prefetch_related('theme', 'country', 'excluded_tags', 'excluded_cities').all()) today = date.today()
result = list(self.prefetch_related('theme', 'country', 'excluded_tags', 'excluded_cities').
filter(fr__lte=today).filter(Q(to__gte=today) | Q(to__isnull=True)))
cache.set(key, result, 80) cache.set(key, result, 80)
return result return result

@ -97,6 +97,7 @@ class Banner(models.Model, StatMixin):
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)
# 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)
@ -223,9 +224,10 @@ class Paid(models.Model, StatMixin):
ordering = ['-public'] ordering = ['-public']
def get_event(self): def get_event(self):
if self.exposition_set.all().exists(): try:
return self.exposition_set.all()[0] return self.exposition_set.all()[0]
return None except IndexError:
return None
class PaidStat(models.Model): class PaidStat(models.Model):
@ -241,6 +243,7 @@ class PaidStat(models.Model):
class Top(models.Model, StatMixin): class Top(models.Model, StatMixin):
link = models.ForeignKey(Banner)
catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа') catalog = models.CharField(max_length=16, verbose_name=u'Каталог для топа')
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция') position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция')
theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=u'Тематики') theme = models.ManyToManyField('theme.Theme', blank=True, null=True, verbose_name=u'Тематики')
@ -272,6 +275,25 @@ class TopStat(models.Model):
views = models.PositiveIntegerField(default=0) views = models.PositiveIntegerField(default=0)
clicks = models.PositiveIntegerField(default=0) clicks = models.PositiveIntegerField(default=0)
class MainPage(models.Model, StatMixin):
link = models.ForeignKey(Banner)
position = models.PositiveIntegerField(blank=True, default=2, null=True, verbose_name=u'Позиция')
public = models.BooleanField(default=True, verbose_name=u'Активная')
stat_pswd = models.CharField(max_length=16)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-public']
def get_event(self):
try:
return self.exposition_set.all()[0]
except IndexError:
return None
def generatePassword(length=5): def generatePassword(length=5):
""" """
generate random password generate random password

@ -1,5 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import re
import random import random
import datetime
from django.db import connection from django.db import connection
def get_client_ip(request): def get_client_ip(request):
@ -10,6 +12,32 @@ def get_client_ip(request):
ip = request.META.get('REMOTE_ADDR') ip = request.META.get('REMOTE_ADDR')
return ip return ip
def get_referer_view(request, default=None):
'''
Return the referer view of the current request
Example:
def some_view(request):
...
referer_view = get_referer_view(request)
return HttpResponseRedirect(referer_view, '/accounts/login/')
'''
# if the user typed the url directly in the browser's address bar
referer = request.META.get('HTTP_REFERER')
if not referer:
return default
# remove the protocol and split the url at the slashes
referer = re.sub('^https?:\/\/', '', referer).split('/')
if referer[0] != request.META.get('SERVER_NAME'):
return default
# add the slash at the relative path's view and finished
referer = u'/' + u'/'.join(referer[1:])
return referer
def get_by_sort(banner_list): def get_by_sort(banner_list):
max_sort = 0 max_sort = 0
for banner in banner_list: for banner in banner_list:
@ -19,12 +47,26 @@ def get_by_sort(banner_list):
result = [banner for banner in banner_list if banner.sort == max_sort] result = [banner for banner in banner_list if banner.sort == max_sort]
return result return result
def set_cookie(response, key, value, days_expire = 7):
if days_expire is None:
max_age = 365 * 24 * 60 * 60 #one year
else:
max_age = days_expire * 24 * 60 * 60
expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), "%a, %d-%b-%Y %H:%M:%S GMT")
response.set_cookie(key, value, max_age=max_age, expires=expires)
return response
def get_banner_by_params(banners_list, urls, params): def get_banner_by_params(banners_list, urls, params, request):
thematic_banners = [] thematic_banners = []
url_banners = [] url_banners = []
for banner in banners_list: for banner in banners_list:
# check popups
if banner.popup:
cookie = request.COOKIES.get(banner.cookie)
if cookie:
continue
# check by theme # check by theme
banner_theme_ids = [str(theme.id) for theme in banner.theme.all()] banner_theme_ids = [str(theme.id) for theme in banner.theme.all()]
if banner_theme_ids: if banner_theme_ids:
@ -64,14 +106,18 @@ def get_banner_by_params(banners_list, urls, params):
continue continue
if thematic_banners: if thematic_banners:
return random.choice(thematic_banners) result = thematic_banners
if url_banners: elif url_banners:
return random.choice(url_banners) result = url_banners
return None else:
result = []
#print('END. NUMBER of queries = %d'%len(connection.queries)) if result:
sort_result = get_by_sort(result)
return random.choice(sort_result)
else:
return None
def get_top_events(tops, params): def get_top_events(tops, params, request):
catalog = params.get('catalog') catalog = params.get('catalog')
country = params.get('country', '') country = params.get('country', '')
theme = params.get('theme', []) theme = params.get('theme', [])
@ -108,5 +154,6 @@ def get_top_events(tops, params):
for top in sorted_top: for top in sorted_top:
event = top.get_event() event = top.get_event()
if event: if event:
top.link.log(request, 1)
events.append(event) events.append(event)
return events return events

@ -6,7 +6,7 @@ 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_by_sort, get_banner_by_params, get_client_ip, get_top_events 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):
@ -21,8 +21,7 @@ def view(request, banner_id):
return redirect(banner.img.url) return redirect(banner.img.url)
def get_banners(request): def get_banners(request):
#url = request.GET.get('url', '/') url = get_referer_view(request, default='/')
url = request.META.get('HTTP_REFERER', '/')
# get urls by current url # get urls by current url
urls = URL.cached.all() urls = URL.cached.all()
good_urls = [] good_urls = []
@ -42,9 +41,15 @@ def get_banners(request):
group_banners = BannerGroup.cached.group_banners() group_banners = BannerGroup.cached.group_banners()
result = [] result = []
cookie = None
# get banners for all groups # get banners for all groups
places = request.GET.getlist('places', [])
for group, banners in group_banners.iteritems(): for group, banners in group_banners.iteritems():
banner = get_banner_by_params(banners, good_urls, params) if group not in places:
# on this page there is no such group
continue
banner = get_banner_by_params(banners, good_urls, params, request)
if banner: if banner:
if banner.html: if banner.html:
text = banner.text text = banner.text
@ -53,7 +58,10 @@ def get_banners(request):
is_img = False is_img = False
else: else:
text = '' text = ''
img = banner.img.url try:
img = banner.img.url
except ValueError:
continue
alt = banner.alt alt = banner.alt
is_img = True is_img = True
result.append({'id': group, result.append({'id': group,
@ -66,10 +74,15 @@ def get_banners(request):
'alt': alt, 'alt': alt,
'text': text 'text': text
}) })
if banner.popup:
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')
if cookie:
response = set_cookie(response, cookie, '1')
return HttpResponse(json.dumps(result, indent=4), content_type='application/json') return response
def get_top(request): def get_top(request):
params = {'theme': request.GET.getlist('theme', []), params = {'theme': request.GET.getlist('theme', []),
@ -79,6 +92,6 @@ def get_top(request):
'catalog': request.GET.get('catalog')} 'catalog': request.GET.get('catalog')}
tops = Top.cached.all() tops = Top.cached.all()
events = get_top_events(tops, params) 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))

@ -2,8 +2,6 @@
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from tinymce.widgets import TinyMCE
from django.core.exceptions import ValidationError
from django.forms.util import ErrorList from django.forms.util import ErrorList
from django.core.validators import validate_email, URLValidator from django.core.validators import validate_email, URLValidator
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
@ -13,15 +11,11 @@ from theme.models import Tag
from country.models import Country from country.models import Country
from theme.models import Theme from theme.models import Theme
from organiser.models import Organiser from organiser.models import Organiser
from accounts.models import User
from company.models import Company
from city.models import City from city.models import City
from service.models import Service
from place_exposition.models import PlaceExposition from place_exposition.models import PlaceExposition
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all, fill_with_signal from functions.translate import fill_with_signal
from functions.form_check import is_positive_integer from functions.form_check import is_positive_integer
from functions.files import check_tmp_files
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
from settings.settings import date_formats from settings.settings import date_formats
from functions.admin_forms import AdminFilterForm from functions.admin_forms import AdminFilterForm

@ -10,6 +10,7 @@ class ClientManager(TranslationManager):
def upcoming(self): def upcoming(self):
return self.filter(data_begin__gte=datetime.datetime.now().date()) return self.filter(data_begin__gte=datetime.datetime.now().date())
""" """
from exposition.models import Exposition from exposition.models import Exposition

@ -160,6 +160,7 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
paid_new = models.ForeignKey('expobanner.Paid', blank=True, null=True, on_delete=models.SET_NULL) paid_new = models.ForeignKey('expobanner.Paid', blank=True, null=True, on_delete=models.SET_NULL)
top = models.ForeignKey('expobanner.Top', blank=True, null=True, on_delete=models.SET_NULL) top = models.ForeignKey('expobanner.Top', blank=True, null=True, on_delete=models.SET_NULL)
main = models.ForeignKey('expobanner.MainPage', blank=True, null=True, on_delete=models.SET_NULL)
#set manager of this model(fisrt manager is default) #set manager of this model(fisrt manager is default)
objects = ExpoManager() objects = ExpoManager()
enable = ClientManager() enable = ClientManager()
@ -308,6 +309,18 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
def theme_ids(self): def theme_ids(self):
return [item['id'] for item in self.theme.all().values('id')] return [item['id'] for item in self.theme.all().values('id')]
def get_main_link(self):
if self.main:
return self.main.link.get_click_link()
else:
return self.get_permanent_url()
def get_top_link(self):
if self.top:
return self.top.link.get_click_link()
else:
return self.get_permanent_url()
class Statistic(TranslatableModel): class Statistic(TranslatableModel):
exposition = models.ForeignKey(Exposition, related_name='statistic') exposition = models.ForeignKey(Exposition, related_name='statistic')

@ -433,7 +433,9 @@ class ExpoCityCatalog(ExpoCatalog):
return qs return qs
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(ExpoCityCatalog, self).get_context_data(**kwargs) context = super(ExpoCityCatalog, self).get_context_data(**kwargs)
context['city'] = str(self.kwargs['city'].id) city = self.kwargs['city']
context['country'] = str(city.country_id)
context['city'] = str(city.id)
return context return context

@ -25,6 +25,17 @@ class ExpoManager(TranslationManager):
except: except:
return None return None
def expo_main(self):
lang = translation.get_language()
key = 'expo_main_page_key_%s'%lang
result = cache.get(key)
if not result:
result = list(self.language(lang).select_related('country', 'city', 'place', 'main').prefetch_related('tag').filter(main__isnull=False))
cache.set(key, result, 45)
return result
class CityManager(TranslationManager): class CityManager(TranslationManager):
cache_time = 600 cache_time = 600

@ -80,7 +80,6 @@ urlpatterns = patterns('',
# ajax urls # ajax urls
urlpatterns += patterns('', urlpatterns += patterns('',
url(r'^ajax/get_popover/$', 'settings.views.get_popover_info'),
url(r'^registration/reply/$', 'registration.backends.default.views.RegisterReply'), url(r'^registration/reply/$', 'registration.backends.default.views.RegisterReply'),
url(r'^register/', 'registration.backends.default.views.RegisterAjaxView'), url(r'^register/', 'registration.backends.default.views.RegisterAjaxView'),
url(r'^register-complete/', 'registration.backends.default.views.complete_registration'), url(r'^register-complete/', 'registration.backends.default.views.complete_registration'),

@ -79,8 +79,11 @@ class MainPageView(JitterCacheMixin, TemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(MainPageView, self).get_context_data(**kwargs) context = super(MainPageView, self).get_context_data(**kwargs)
ev = Exposition.objects.expo_main()
events = Exposition.objects.language().select_related('country', 'city', 'place').filter(main_page__gte=1).order_by('-main_page') events = sorted(ev, key=lambda x: x.main.position)
# update main_page counter
for event in events:
event.main.link.log(self.request, 1)
exposition_themes = Theme.objects.language().order_by('-main_page').filter(types=Theme.types.exposition)[:6] exposition_themes = Theme.objects.language().order_by('-main_page').filter(types=Theme.types.exposition)[:6]
conference_themes = Theme.objects.language().order_by('-main_page').filter(types=Theme.types.conference)[:6] conference_themes = Theme.objects.language().order_by('-main_page').filter(types=Theme.types.conference)[:6]

@ -160,23 +160,3 @@ def get_popover(request):
response['html'] = html response['html'] = html
return HttpResponse(json.dumps(response), content_type='application/json') return HttpResponse(json.dumps(response), content_type='application/json')
from banners.models import Redirect
from django.db.models import F
import datetime
def set_cookie(response, key, value, days_expire = 7):
if days_expire is None:
max_age = 365 * 24 * 60 * 60 #one year
else:
max_age = days_expire * 24 * 60 * 60
expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), "%a, %d-%b-%Y %H:%M:%S GMT")
response.set_cookie(key, value, max_age=max_age, expires=expires)
def get_popover_info(request):
id = request.GET.get('rdr')
if id:
Redirect.objects.filter(id=id).update(views = F('views') + 1)
response = HttpResponse('success')
set_cookie(response, 'popover_test1', '1')
return response

@ -13,6 +13,9 @@
<div class="span4"><h6><a href="{% url 'expobanner-create_group' %}">Групы</a></h6></div> <div class="span4"><h6><a href="{% url 'expobanner-create_group' %}">Групы</a></h6></div>
<div class="span4"><h6><a href="{% url 'expobanner-create_banner' %}">Банера</a></h6></div> <div class="span4"><h6><a href="{% url 'expobanner-create_banner' %}">Банера</a></h6></div>
</div> </div>
<div class="row-fluid">
<div class="span4"><h6><a href="{% url 'expobanner-create_link' %}">Отслеживаемой ссылки</a></h6></div>
</div>
</div> </div>
</div><!--/span--> </div><!--/span-->
@ -27,6 +30,9 @@
<div class="span4"><h6><a href="{% url 'expobanner-list_group' %}">Груп</a></h6></div> <div class="span4"><h6><a href="{% url 'expobanner-list_group' %}">Груп</a></h6></div>
<div class="span4"><h6><a href="{% url 'expobanner-list_banner' %}">Банеров</a></h6></div> <div class="span4"><h6><a href="{% url 'expobanner-list_banner' %}">Банеров</a></h6></div>
</div> </div>
<div class="row-fluid">
<div class="span4"><h6><a href="{% url 'expobanner-list_link' %}">Отслеживаемых ссылок</a></h6></div>
</div>
</div> </div>
</div><!--/span--> </div><!--/span-->
</div> </div>

@ -2,6 +2,7 @@
{% load static %} {% load static %}
{% block scripts %} {% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
<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> <script>

@ -0,0 +1,38 @@
{% extends 'base.html' %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>{{ verbose }}</h2>
</div>
<div class="box-content">
{% block list_table %}
<table class="table table-hover">
<thead>
<tr>
<th>Объект</th>
<th>ссылка для отслеживания</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item }}</td>
<td>{{request.get_host}}{{ item.get_click_link }}</td>
<td><a href="{% url 'expobanner-update_link' item.id %}">Изменить</a> </td>
<td><a href="{% url 'expobanner_stat_link' item.id %}">Статистика</a> </td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
</div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
{% endblock %}

@ -0,0 +1,40 @@
{% extends 'base.html' %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список выставок на главной</h2>
</div>
<div class="box-content">
{% block list_table %}
<a class="btn btn-success" href="{% url 'expobanner-create_main' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a>
<table class="table table-hover">
<thead>
<tr>
<th>Выставка</th>
<th>Позиция</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item }}</td>
<td>{{ item.main.position }}</td>
<td><a href="{% url 'expobanner-update_main' item.main.id %}">Изменить</a> </td>
<td>{% if item.main.public %}<a href="{% url 'expobanner-main-turn' item.main.id 'off' %}">отключить</a>{% else %}<a href="{% url 'expobanner-main-turn' item.main.id 'on' %}">включить</a>{% endif %} </td>
<td><a href="{% url 'expobanner_stat_main' item.main.id %}">Статистика</a> </td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
</div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
{% endblock %}

@ -0,0 +1,48 @@
{% extends 'base.html' %}
{% load static %}
{% block scripts %}
<script src="{% static 'js/jquery.dataTables.min.js' %}"></script>
{% endblock %}
{% block body %}
<div class="row-fluid sortable">
<div class="box span12">
<div class="box-header well" data-original-title>
<h2><i class="icon-align-justify"></i> {{ object.get_event }}</h2>
</div>
<div class="box-content">
<div class="row-fluid">
<div class="span8">Линк на статистику: <b>{{ request.get_host }}/expo-b/banner/{{ object.link.id }}/stat/</b></div>
<div class="span4">Пароль: <b>{{ object.link.stat_pswd }}</b></div>
</div>
<table class="table table-striped table-bordered bootstrap-datatable datatable">
<thead>
<tr>
<th>Дата</th>
<th>Показы</th>
<th>Клики</th>
<th>Уникальные показы</th>
<th>Уникальные клики</th>
</tr>
</thead>
<tbody>
{% with stats=stats %}
{% for stat in stats %}
<tr>
<td>{{ stat.date|date:"Y-m-d" }}</td>
<td>{{ stat.view }}</td>
<td>{{ stat.click }}</td>
<td>{{ stat.unique_view }}</td>
<td>{{ stat.unique_click }}</td>
</tr>
{% endfor %}
{% endwith %}
</tbody>
</table>
</div>
</div>
</div>
{% endblock %}

@ -12,6 +12,10 @@
<h2><i class="icon-align-justify"></i> {{ object.get_event }} (Пароль: {{ object.stat_pswd }})</h2> <h2><i class="icon-align-justify"></i> {{ object.get_event }} (Пароль: {{ object.stat_pswd }})</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
<div class="row-fluid">
<div class="span8">Линк на статистику: <b>{{ request.get_host }}/expo-b/paid/{{ object.id }}/stat/</b></div>
<div class="span4">Пароль: <b>{{ object.stat_pswd }}</b></div>
</div>
<table class="table table-striped table-bordered bootstrap-datatable datatable"> <table class="table table-striped table-bordered bootstrap-datatable datatable">
<thead> <thead>
<tr> <tr>

@ -61,7 +61,7 @@ $(function(){
<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>{{ form.verbose }}</h2> <h2><i class="icon-pencil"></i>{{ form.verbose }} {% if object %}{{ object.get_event }}{% endif %}</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{% for field in form %} {% for field in form %}

@ -111,6 +111,7 @@
<li><a href="/admin/expobanners/banners/control/">Управление банерами</a></li> <li><a href="/admin/expobanners/banners/control/">Управление банерами</a></li>
<li><a href="/admin/expobanners/paid/list/">Платные выставки</a></li> <li><a href="/admin/expobanners/paid/list/">Платные выставки</a></li>
<li><a href="/admin/expobanners/top/list/">Выставки в топе</a></li> <li><a href="/admin/expobanners/top/list/">Выставки в топе</a></li>
<li><a href="/admin/expobanners/main/list/">Выставки на главной</a></li>
</ul> </ul>
</li> </li>

@ -81,16 +81,7 @@ This template include basic anf main styles and js files,
}); });
</script> </script>
<!--test expo_b -->
<script>
window.sendData = {
"theme": [{{ themes|join:", " }}],
"country": "{{ country }}",
"city": "{{ city }}",
"tag": "{{ tag }}"
};
</script>
<script type="text/javascript" src="{% static 'client/js/rejs/banners.js' %}"></script>
</head> </head>
<body {% block body_class %}{% endblock %}> <body {% block body_class %}{% endblock %}>
@ -139,76 +130,8 @@ This template include basic anf main styles and js files,
{% endif %} {% endif %}
{% include 'client/popups/callback.html' %} {% include 'client/popups/callback.html' %}
{% include 'client/includes/banners/popup.html' %}
{% block popup_banner %} {% block popup_banner %}
{% if not request.COOKIES.popover_test1 %}
{% if theme_for_filter %}
{% if theme_for_filter.id == 54 or theme_for_filter.id == 26 or theme_for_filter.id == 22 or theme_for_filter.id == 15 or theme_for_filter.id == 44 or theme_for_filter.id == 30 %}
{% with r=False|random3 %}
{% if r == 1 %}
{% include 'client/popups/cemat_modal.html' %}
{% else %}
{% if r == 2 %}
{% include 'client/popups/cemat_banner1.html' %}
{% else %}
{% include 'client/popups/cemat_banner2.html' %}
{% endif %}
{% endif %}
{% endwith %}
{% endif %}
{% if theme_for_filter.id == 32 %}
{% with r=False|random3 %}
{% if r == 1 %}
{% include 'client/popups/cemat_modal.html' %}
{% endif %}
{% if r == 2 %}
{% include 'client/popups/cemat_banner1.html' %}
{% endif %}
{% if r == 0 %}
{% include 'client/popups/cemat_banner2.html' %}
{% endif %}
{% endwith %}
{% endif %}
<script>
$(function() {
if ($('#expo-ad-popup').length > 0){
$('#expo-form-popup').on('submit', function(e){
e.preventDefault();
var link = $('#expo-form-popup').attr('action');
window.location = link;
});
setTimeout(function(){
$.fancybox.open(
[{href: '#expo-ad-popup'}],
{}
);
var rdr = $('#expo-ad-popup').attr('data-rdr');
sendData = {'rdr': rdr};
console.log(rdr);
$.ajax({
url: '/ajax/get_popover/',
data: sendData,
type: 'GET',
async: true,
success: function(data){
console.log(data);
}
});
}, 5000);
}
});
</script>
{% endif %}
{% endif %}
{% endblock %} {% endblock %}
{# if user doesnt have url- show form #} {# if user doesnt have url- show form #}
{% if 'partial_pipeline' not in request.session %} {% if 'partial_pipeline' not in request.session %}
@ -239,5 +162,16 @@ This template include basic anf main styles and js files,
<script src="{% static 'client/js_min/vendor.min.js' %}"></script> <script src="{% static 'client/js_min/vendor.min.js' %}"></script>
{% endif %} {% endif %}
<div id="wait-ajax" class="wait-ajax" style="display:none;"><img src="{% static 'client/img/ajax-loader.gif' %}" alt=""/></div> <div id="wait-ajax" class="wait-ajax" style="display:none;"><img src="{% static 'client/img/ajax-loader.gif' %}" alt=""/></div>
<!--test expo_b -->
<script>
window.sendData = {
"theme": [{{ themes|join:", " }}],
"country": "{{ country }}",
"city": "{{ city }}",
"tag": "{{ tag }}"
};
</script>
<script type="text/javascript" src="{% static 'client/js/rejs/banners.js' %}"></script>
</body> </body>

@ -1,5 +1,33 @@
{% extends 'base_catalog.html' %} {% extends 'base_catalog.html' %}
{% block styles %}
<style>
table {
width: 100%;
margin-bottom: 18px;
border: 1px solid #dddddd;
border-collapse: separate;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
border-spacing: 2px;
border-color: grey;
}
table th{
vertical-align: bottom;
font-weight: bold;
text-align: left;
}
table th. table td{
padding: 8px;
line-height: 18px;
text-align: left;
display: table-cell;
}
</style>
{% endblock %}
{% block page_title %} {% block page_title %}
<div class="page-title"> <div class="page-title">
<h1>{{ object }}. Статистика</h1> <h1>{{ object }}. Статистика</h1>

@ -1,4 +1,32 @@
{% extends 'base_catalog.html' %} {% extends 'client/base_catalog.html' %}
{% block styles %}
<style>
table {
width: 100%;
margin-bottom: 18px;
border: 1px solid #dddddd;
border-collapse: separate;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
border-spacing: 2px;
border-color: grey;
}
table th{
vertical-align: bottom;
font-weight: bold;
text-align: left;
}
table th. table td{
padding: 8px;
line-height: 18px;
text-align: left;
display: table-cell;
}
</style>
{% endblock %}
{% block page_title %} {% block page_title %}
<div class="page-title"> <div class="page-title">

@ -27,72 +27,3 @@
{% block paginator %} {% block paginator %}
{% endblock %} {% endblock %}
{% block popup%}
{% if not request.COOKIES.popover_test1 %}
{% with theme_ids=object.theme_ids %}
{% if 32 in theme_ids %}
{% with r=False|random3 %}
{% if r == 0 %}
{% include 'client/popups/cemat_modal.html' %}
{% endif %}
{% if r == 1 %}
{% include 'client/popups/cemat_banner1.html' %}
{% endif %}
{% if r == 2 %}
{% include 'client/popups/cemat_banner2.html' %}
{% endif %}
{% endwith %}
{% else %}
{% if 54 in theme_ids or 26 in theme_ids or 22 in theme_ids or 15 in theme_ids or 44 in theme_ids or 30 in theme_ids %}
{% with r=False|random3 %}
{% if r == 1 %}
{% include 'client/popups/cemat_modal.html' %}
{% else %}
{% if r == 2 %}
{% include 'client/popups/cemat_banner1.html' %}
{% else %}
{% include 'client/popups/cemat_banner2.html' %}
{% endif %}
{% endif %}
{% endwith %}
{% endif %}
{% endif %}
{% endwith %}
<script>
$(function() {
if ($('#expo-ad-popup').length > 0){
$('#expo-form-popup').on('submit', function(e){
e.preventDefault();
var link = $('#expo-form-popup').attr('action');
window.location = link;
});
setTimeout(function(){
$.fancybox.open(
[{href: '#expo-ad-popup'}],
{}
);
var rdr = $('#expo-ad-popup').attr('data-rdr');
sendData = {'rdr': rdr};
$.ajax({
url: '/ajax/get_popover/',
data: sendData,
type: 'GET',
async: true,
success: function(data){
console.log(data);
}
});
}, 5000);
}
});
</script>
{% endif %}
{% endblock %}

@ -1,2 +1,2 @@
<div id="expo_b_popup" class="popup-window" style="width:800px;"> <div id="expo_b_popup" class="popup-window" style="width:900px;">
</div> </div>

@ -5,10 +5,10 @@
<ul class="cat-list cl-exhibitions"> <ul class="cat-list cl-exhibitions">
{% for obj in objects %} {% for obj in objects %}
<li class="cl-item {% if obj.canceled %}canceled{% endif %}"> <li class="cl-item {% if obj.canceled %}canceled{% endif %}" style="border:1px solid #ff6600;">
<div class="cl-item-wrap clearfix"> <div class="cl-item-wrap clearfix">
{% if not obj.canceled %} {% if not obj.canceled %}
<a href="{% if not obj.paid_new_id %}{{ obj.get_permanent_url }}{% else %}{{ obj.get_paid_catalog_url }}{% endif %}"> <a href="{{ obj.get_top_link }}">
{% if obj.expohit %} {% if obj.expohit %}
<div class="hit"></div> <div class="hit"></div>
{% endif %} {% endif %}
@ -35,7 +35,7 @@
</div> </div>
{% endif %} {% endif %}
<header> <header>
<div class="cli-title"><a href="{% if not obj.paid_new_id %}{{ obj.get_permanent_url }}{% else %}{{ obj.get_paid_catalog_url }}{% endif %}">{{ obj.name|safe }}</a></div> <div class="cli-title"><a href="{{ obj.get_top_link }}">{{ obj.name|safe }}</a></div>
</header> </header>
<div class="cli-descr"> <div class="cli-descr">
{{ obj.main_title|safe }} {{ obj.main_title|safe }}

@ -12,7 +12,7 @@
<li class="swiper-slide"> <li class="swiper-slide">
<div class="re-pict pict-over" > <div class="re-pict pict-over" >
{% if event.logo %} {% if event.logo %}
<a href="{{ event.get_permanent_url }}"> <a href="{{ event.get_main_link }}">
<!--<img src="{{ event.logo.url }}">--> <!--<img src="{{ event.logo.url }}">-->
{% thumbnail event.get_preview "220x220" as im %} {% thumbnail event.get_preview "220x220" as im %}
@ -24,7 +24,7 @@
</div> </div>
<div class="re-body"> <div class="re-body">
<div class="re-info"> <div class="re-info">
<a href="{{ event.get_permanent_url }}"> <a href="{{ event.get_main_link }}">
<div class="re-title">{{ event.name|safe }}</div> <div class="re-title">{{ event.name|safe }}</div>
<div class="re-date"> <div class="re-date">
{% include 'client/includes/index/main_date_block.html' with obj=event %} {% include 'client/includes/index/main_date_block.html' with obj=event %}

@ -354,7 +354,7 @@ if (EXPO.common){
$staticFields = $('.'+validErrorClass); $staticFields = $('.'+validErrorClass);
$waiter = $('#wait-ajax:not(.absolute)').css({'z-index': '8031'}); $waiter = $('#wait-ajax:not(.absolute)').css({'z-index': '8031'});
$('.'+addClass+', .'+remClass).on('click', function(event){ $('body').on('click', '.' + addClass + ', .' + remClass, function(event) {
addText = self.opt.addCalendarText; addText = self.opt.addCalendarText;
remText = self.opt.removeCalendarText; remText = self.opt.removeCalendarText;
event.preventDefault(); event.preventDefault();

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

@ -4,18 +4,22 @@
var API_URL_ROOT = "/expo-b/get-banners/"; var API_URL_ROOT = "/expo-b/get-banners/";
var getUrl = function () { var getUrl = function () {
var catalog = ""; var search = [];
var parts = /^\/([^\/]+)(?:\/|$)/i.exec(location.pathname); var parts = /^\/([^\/]+)(?:\/|$)/i.exec(location.pathname);
if (parts) { if (parts) {
catalog = parts[1]; search.push("catalog=" + encodeURIComponent(parts[1]));
} else {
search.push("catalog=");
} }
var data = window.sendData; var elements = $("[id^=\"expo_b_\"]");
for (var j = 0; j < elements.length; j++) {
search.push("places=" + encodeURIComponent($(elements[j]).attr("id")));
}
var data = window.sendData;
if (data instanceof Object) { if (data instanceof Object) {
var search = ["catalog=" + catalog];
for (var key in data) { for (var key in data) {
if (data.hasOwnProperty(key)) { if (data.hasOwnProperty(key)) {
var value = data[key]; var value = data[key];
@ -29,11 +33,9 @@
} }
} }
} }
return API_URL_ROOT + "?" + search.join("&");
} }
return API_URL_ROOT; return API_URL_ROOT + "?" + search.join("&");
}; };
var getBanners = function (url, callback) { var getBanners = function (url, callback) {
@ -59,18 +61,37 @@
var parent = document.getElementById(banner.id); var parent = document.getElementById(banner.id);
if (parent) { if (parent) {
if (banner.is_img) { if (banner.is_popup) {
var a = document.createElement("a"); if (banner.is_img) {
a.href = banner.url; parent.innerHTML =
"<header class=\"clearfix\"><div class=\"pw-title\"></div></header><div class=\"pw-body clearfix\">" +
var img = document.createElement("img"); "<a href=\""+ banner.url + "\"><img src=\"" + banner.img + "\" alt=\"" + banner.alt + "\" /></a></div>";
img.src = banner.img; } else if (banner.is_html) {
img.alt = banner.alt; parent.innerHTML = banner.text;
}
a.appendChild(img);
parent.appendChild(a); $("#expo-form-popup").on("submit", function(e) {
} else if (banner.is_html) { e.preventDefault();
parent.innerHTML = banner.text; window.location = $("#expo-form-popup").attr("action");
});
setTimeout(function(){
$.fancybox.open([{"href": "#" + banner.id}], {});
}, 5000);
} else {
if (banner.is_img) {
var a = document.createElement("a");
a.href = banner.url;
var img = document.createElement("img");
img.src = banner.img;
img.alt = banner.alt;
a.appendChild(img);
parent.appendChild(a);
} else if (banner.is_html) {
parent.innerHTML = banner.text;
}
} }
} }

@ -5,18 +5,17 @@
var PARENT_ID = "expo_top_events"; var PARENT_ID = "expo_top_events";
var getUrl = function () { var getUrl = function () {
var catalog = ""; var search = [];
var parts = /^\/([^\/]+)(?:\/|$)/i.exec(location.pathname); var parts = /^\/([^\/]+)(?:\/|$)/i.exec(location.pathname);
if (parts) { if (parts) {
catalog = parts[1]; search.push("catalog=" + encodeURIComponent(parts[1]));
} else {
search.push("catalog=");
} }
var data = window.sendData; var data = window.sendData;
if (data instanceof Object) { if (data instanceof Object) {
var search = ["catalog=" + catalog];
for (var key in data) { for (var key in data) {
if (data.hasOwnProperty(key)) { if (data.hasOwnProperty(key)) {
var value = data[key]; var value = data[key];
@ -30,11 +29,9 @@
} }
} }
} }
return API_URL_ROOT + "?" + search.join("&");
} }
return API_URL_ROOT; return API_URL_ROOT + "?" + search.join("&");
}; };
var getTops = function (url, callback) { var getTops = function (url, callback) {

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save