commit
e1c343b3c9
84 changed files with 1745 additions and 939 deletions
@ -0,0 +1 @@ |
|||||||
|
__author__ = 'kotzilla' |
||||||
@ -0,0 +1 @@ |
|||||||
|
__author__ = 'kotzilla' |
||||||
@ -0,0 +1,42 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from datetime import date, timedelta |
||||||
|
from django.core.management.base import BaseCommand |
||||||
|
from expobanner.models import Log, LogStat, Banner |
||||||
|
from django.conf import settings |
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand): |
||||||
|
def handle(self, *args, **options): |
||||||
|
prev_day = date.today() - timedelta(days=1) |
||||||
|
for banner in Banner.objects.select_related('group').filter(): |
||||||
|
try: |
||||||
|
logstat = LogStat.objects.get(banner=banner, group=banner.group, date=prev_day) |
||||||
|
except LogStat.DoesNotExist: |
||||||
|
logstat = LogStat(banner=banner, group=banner.group, date=prev_day) |
||||||
|
|
||||||
|
views = Log.objects.filter(datetime__startswith=prev_day, |
||||||
|
banner=banner, |
||||||
|
group=banner.group, |
||||||
|
type=1).count() |
||||||
|
clicks = Log.objects.filter(datetime__startswith=prev_day, |
||||||
|
banner=banner, |
||||||
|
group=banner.group, |
||||||
|
type=2).count() |
||||||
|
unique_views = Log.objects.filter(datetime__startswith=prev_day, |
||||||
|
banner=banner, |
||||||
|
group=banner.group, |
||||||
|
type=1).values('ip').distinct().count() |
||||||
|
unique_clicks = Log.objects.filter(datetime__startswith=prev_day, |
||||||
|
banner=banner, |
||||||
|
group=banner.group, |
||||||
|
type=2).values('ip').distinct().count() |
||||||
|
|
||||||
|
if not logstat.click or logstat.click < clicks: |
||||||
|
logstat.click = clicks |
||||||
|
if not logstat.view or logstat.view < views: |
||||||
|
logstat.view = views |
||||||
|
if not logstat.unique_click or logstat.unique_click < unique_clicks: |
||||||
|
logstat.unique_click = unique_clicks |
||||||
|
if not logstat.unique_view or logstat.unique_view < unique_views: |
||||||
|
logstat.unique_view = unique_views |
||||||
|
logstat.save() |
||||||
@ -0,0 +1,67 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from datetime import date |
||||||
|
from django.core.management.base import BaseCommand |
||||||
|
from expobanner.models import Log, LogStat, Banner, PaidStat |
||||||
|
from exposition.models import Exposition |
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand): |
||||||
|
def handle(self, *args, **options): |
||||||
|
today = date.today() |
||||||
|
# banners |
||||||
|
for banner in Banner.objects.select_related('group').filter(public=True, group__isnull=False): |
||||||
|
try: |
||||||
|
logstat = LogStat.objects.get(banner=banner, group=banner.group, date=today) |
||||||
|
except LogStat.DoesNotExist: |
||||||
|
logstat = LogStat(banner=banner, group=banner.group, date=today) |
||||||
|
|
||||||
|
views = Log.objects.filter(datetime__startswith=today, |
||||||
|
banner=banner, |
||||||
|
group=banner.group, |
||||||
|
type=1).count() |
||||||
|
clicks = Log.objects.filter(datetime__startswith=today, |
||||||
|
banner=banner, |
||||||
|
group=banner.group, |
||||||
|
type=2).count() |
||||||
|
unique_views = Log.objects.filter(datetime__startswith=today, |
||||||
|
banner=banner, |
||||||
|
group=banner.group, |
||||||
|
type=1).values('ip').distinct().count() |
||||||
|
unique_clicks = Log.objects.filter(datetime__startswith=today, |
||||||
|
banner=banner, |
||||||
|
group=banner.group, |
||||||
|
type=2).values('ip').distinct().count() |
||||||
|
logstat.click = clicks |
||||||
|
logstat.view = views |
||||||
|
logstat.unique_click = unique_clicks |
||||||
|
logstat.unique_view = unique_views |
||||||
|
logstat.save() |
||||||
|
|
||||||
|
# paid expos |
||||||
|
expos = list(Exposition.objects.select_related('paid_new').filter(paid_new__isnull=False)) |
||||||
|
for expo in expos: |
||||||
|
paid = expo.paid_new |
||||||
|
try: |
||||||
|
paidstat = PaidStat.objects.get(paid=paid, date=today) |
||||||
|
except PaidStat.DoesNotExist: |
||||||
|
paidstat = PaidStat(paid=paid, date=today) |
||||||
|
|
||||||
|
t_clicks = Log.objects.filter(datetime__startswith=today, banner=paid.tickets, type=2).count() |
||||||
|
p_clicks = Log.objects.filter(datetime__startswith=today, banner=paid.participation, type=2).count() |
||||||
|
o_clicks = Log.objects.filter(datetime__startswith=today, banner=paid.official, type=2).count() |
||||||
|
c_clicks = Log.objects.filter(datetime__startswith=today, banner=paid.catalog, type=2).count() |
||||||
|
|
||||||
|
paidstat.tickets_clicks = t_clicks |
||||||
|
paidstat.participation_clicks = p_clicks |
||||||
|
paidstat.official_clicks = o_clicks |
||||||
|
paidstat.catalog_clicks = c_clicks |
||||||
|
|
||||||
|
paidstat.save() |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,3 @@ |
|||||||
|
class StatMixin(object): |
||||||
|
def get_cookie_name(self): |
||||||
|
return u'%s_%d'%(self._meta.db_table, self.id) |
||||||
@ -0,0 +1,57 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from django.http import HttpResponseRedirect |
||||||
|
from django.views.generic import TemplateView, CreateView, ListView, UpdateView, DetailView |
||||||
|
from django.views.generic.edit import FormMixin |
||||||
|
from django.forms.util import ErrorList |
||||||
|
from django.conf import settings |
||||||
|
from django.core.urlresolvers import reverse |
||||||
|
from expobanner.models import Banner, Paid |
||||||
|
from expobanner.forms import ClientStatForm |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class BannerStat(FormMixin, DetailView): |
||||||
|
model = Banner |
||||||
|
form_class = ClientStatForm |
||||||
|
template_name = 'client/expobanners/banner_stat.html' |
||||||
|
|
||||||
|
def get_success_url(self): |
||||||
|
return reverse('banner_stat_client', kwargs={'pk': self.object.pk}) |
||||||
|
|
||||||
|
def get_context_data(self, **kwargs): |
||||||
|
context = super(BannerStat, self).get_context_data(**kwargs) |
||||||
|
obj = self.object |
||||||
|
cookie_name = obj.get_cookie_name() |
||||||
|
cookie = self.request.session.get(cookie_name) |
||||||
|
if not cookie: |
||||||
|
form = context.get('form') |
||||||
|
# form in context if form invalid called |
||||||
|
if not form: |
||||||
|
context['form'] = self.get_form(self.form_class) |
||||||
|
|
||||||
|
return context |
||||||
|
|
||||||
|
def post(self, request, *args, **kwargs): |
||||||
|
self.object = self.get_object() |
||||||
|
form = self.get_form(self.form_class) |
||||||
|
if form.is_valid(): |
||||||
|
return self.form_valid(form) |
||||||
|
else: |
||||||
|
return self.form_invalid(form) |
||||||
|
|
||||||
|
def form_valid(self, form): |
||||||
|
obj = self.object |
||||||
|
success = form.check_pass(obj) |
||||||
|
if success: |
||||||
|
self.request.session[obj.get_cookie_name()] = 1 |
||||||
|
return HttpResponseRedirect(self.get_success_url()) |
||||||
|
else: |
||||||
|
form.errors['stat_pswd'] = ErrorList([u'Неправильный пароль']) |
||||||
|
return self.form_invalid(form) |
||||||
|
|
||||||
|
class PaidStat(BannerStat): |
||||||
|
model = Paid |
||||||
|
template_name = 'client/expobanners/paid_stat.html' |
||||||
|
|
||||||
|
def get_success_url(self): |
||||||
|
return reverse('paid_stat_client', kwargs={'pk': self.object.pk}) |
||||||
@ -1,11 +1,13 @@ |
|||||||
from django.conf.urls import url |
from django.conf.urls import url |
||||||
|
from expobanner.stat_views import * |
||||||
from . import views |
from . import views |
||||||
|
|
||||||
urlpatterns = [ |
urlpatterns = [ |
||||||
url(r'^click/(?P<banner_id>\d{1,4})/(?P<key>[-\w]+)/$', 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+)/(?P<key>[-\w]+)/$', 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'^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'), |
||||||
] |
] |
||||||
|
|||||||
@ -0,0 +1,112 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
import random |
||||||
|
from django.db import connection |
||||||
|
|
||||||
|
def get_client_ip(request): |
||||||
|
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') |
||||||
|
if x_forwarded_for: |
||||||
|
ip = x_forwarded_for.split(',')[0] |
||||||
|
else: |
||||||
|
ip = request.META.get('REMOTE_ADDR') |
||||||
|
return ip |
||||||
|
|
||||||
|
def get_by_sort(banner_list): |
||||||
|
max_sort = 0 |
||||||
|
for banner in banner_list: |
||||||
|
sort = banner.sort |
||||||
|
if sort > max_sort: |
||||||
|
max_sort = sort |
||||||
|
result = [banner for banner in banner_list if banner.sort == max_sort] |
||||||
|
return result |
||||||
|
|
||||||
|
|
||||||
|
def get_banner_by_params(banners_list, urls, params): |
||||||
|
thematic_banners = [] |
||||||
|
url_banners = [] |
||||||
|
|
||||||
|
for banner in banners_list: |
||||||
|
# check by theme |
||||||
|
banner_theme_ids = [str(theme.id) for theme in banner.theme.all()] |
||||||
|
if banner_theme_ids: |
||||||
|
if params.get('theme'): |
||||||
|
theme = params['theme'] |
||||||
|
|
||||||
|
flag = False |
||||||
|
for th in theme: |
||||||
|
if th in banner_theme_ids: |
||||||
|
flag = True |
||||||
|
if flag: |
||||||
|
thematic_banners.append(banner) |
||||||
|
continue |
||||||
|
# check by country |
||||||
|
banner_country_ids = [str(country.id) for country in banner.country.all()] |
||||||
|
#print('number of queries = %d'%len(connection.queries)) |
||||||
|
if banner_country_ids: |
||||||
|
if params.get('country'): |
||||||
|
|
||||||
|
country = params['country'] |
||||||
|
if country in banner_country_ids: |
||||||
|
thematic_banners.append(banner) |
||||||
|
continue |
||||||
|
|
||||||
|
# check by url |
||||||
|
if urls: |
||||||
|
banner_urls = banner.urls.all() |
||||||
|
print('number of queries = %d'%len(connection.queries)) |
||||||
|
|
||||||
|
if banner_urls: |
||||||
|
|
||||||
|
banner_urls = set(banner_urls) |
||||||
|
common_urls = set(urls).intersection(banner_urls) |
||||||
|
|
||||||
|
if common_urls: |
||||||
|
url_banners.append(banner) |
||||||
|
continue |
||||||
|
|
||||||
|
if thematic_banners: |
||||||
|
return random.choice(thematic_banners) |
||||||
|
if url_banners: |
||||||
|
return random.choice(url_banners) |
||||||
|
return None |
||||||
|
|
||||||
|
#print('END. NUMBER of queries = %d'%len(connection.queries)) |
||||||
|
|
||||||
|
def get_top_events(tops, params): |
||||||
|
catalog = params.get('catalog') |
||||||
|
country = params.get('country', '') |
||||||
|
theme = params.get('theme', []) |
||||||
|
city = params.get('city', '') |
||||||
|
tag = params.get('tag', '') |
||||||
|
catalog_tops = [item for item in tops if item.catalog == catalog] |
||||||
|
good_tops = [] |
||||||
|
for top in catalog_tops: |
||||||
|
|
||||||
|
country_ids = [str(item.id) for item in top.country.all()] |
||||||
|
theme_ids = [str(item.id) for item in top.theme.all()] |
||||||
|
excluded_tags_ids = [str(item.id) for item in top.excluded_tags.all()] |
||||||
|
excluded_cities_ids = [str(item.id) for item in top.excluded_cities.all()] |
||||||
|
if not country_ids and not theme_ids: |
||||||
|
# universal top |
||||||
|
good_tops.append(top) |
||||||
|
continue |
||||||
|
# check country |
||||||
|
if country in country_ids and city not in excluded_cities_ids : |
||||||
|
good_tops.append(top) |
||||||
|
continue |
||||||
|
# check theme |
||||||
|
if tag in excluded_tags_ids: |
||||||
|
continue |
||||||
|
flag = False |
||||||
|
for th in theme: |
||||||
|
if th in theme_ids: |
||||||
|
flag = True |
||||||
|
continue |
||||||
|
if flag: |
||||||
|
good_tops.append(top) |
||||||
|
sorted_top = sorted(good_tops, key=lambda x: x.position) |
||||||
|
events = [] |
||||||
|
for top in sorted_top: |
||||||
|
event = top.get_event() |
||||||
|
if event: |
||||||
|
events.append(event) |
||||||
|
return events |
||||||
@ -0,0 +1,36 @@ |
|||||||
|
{% 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> </th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
{% for item in object_list %} |
||||||
|
<tr> |
||||||
|
<td>{{ item }}</td> |
||||||
|
<td><a href="{{ item.get_admin_url }}">Изменить</a> </td> |
||||||
|
<td><a href="{% url 'expobanner_stat_banner' 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,43 @@ |
|||||||
|
{% 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 }} (Пароль: {{ object.stat_pswd }})</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
<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=object.banner_stat.all %} |
||||||
|
{% 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 %} |
||||||
@ -0,0 +1,71 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% load static %} |
||||||
|
|
||||||
|
{% block scripts %} |
||||||
|
{# selects #} |
||||||
|
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
||||||
|
<script src="{% static 'js/select/select2.js' %}"></script> |
||||||
|
<script> |
||||||
|
$(function(){ |
||||||
|
$('#id_exposition').select2({ |
||||||
|
placeholder: 'Найти', |
||||||
|
width: 'element', |
||||||
|
ajax: { |
||||||
|
url: '/admin/exposition/search/', |
||||||
|
dataType: "json", |
||||||
|
quietMillis: 200, |
||||||
|
multiple: true, |
||||||
|
|
||||||
|
data: function(term, page, theme){ |
||||||
|
return {term: term, |
||||||
|
page: page}; |
||||||
|
}, |
||||||
|
|
||||||
|
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}); |
||||||
|
|
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<form method="post" class="form-horizontal" name="form2" id="form2" enctype="multipart/form-data"> {% csrf_token %} |
||||||
|
<fieldset> |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-pencil"></i>{{ form.verbose }}</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
{% for field in form %} |
||||||
|
<div class="control-group {% if field.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{% if field.field.required %}<b>{{ field.label }}:</b>{% else %}{{ field.label }}{% endif %}</label> |
||||||
|
<div class="controls">{{ field }} |
||||||
|
<span class="help-inline">{{ field.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endfor %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</fieldset> |
||||||
|
|
||||||
|
<div class="controls"> |
||||||
|
<input class="btn btn-large btn-primary" type="submit" value="Готово"> |
||||||
|
<input class="btn btn-large" type="reset" value="Отмена"> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
{% endblock %} |
||||||
@ -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>Список проплаченых выставок</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
{% block list_table %} |
||||||
|
<a class="btn btn-success" href="{% url 'expobanner-create_paid' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a> |
||||||
|
<table class="table table-hover"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
<th>Выставка</th> |
||||||
|
<th> </th> |
||||||
|
<th> </th> |
||||||
|
<th> </th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
{% for item in object_list %} |
||||||
|
<tr> |
||||||
|
<td>{{ item }}</td> |
||||||
|
<td><a href="{% url 'expobanner-update_paid' item.paid_new.id %}">Изменить</a> </td> |
||||||
|
<td>{% if item.paid_new.public %}<a href="{% url 'expobanner-paid-turn' item.paid_new.id 'off' %}">отключить</a>{% else %}<a href="{% url 'expobanner-paid-turn' item.paid_new.id 'on' %}">включить</a>{% endif %} </td> |
||||||
|
<td><a href="{% url 'expobanner_stat_paid' item.paid_new.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,43 @@ |
|||||||
|
{% 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 }} (Пароль: {{ object.stat_pswd }})</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
<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=object.paidstat_set.all %} |
||||||
|
{% for stat in stats %} |
||||||
|
<tr> |
||||||
|
<td>{{ stat.date|date:"Y-m-d" }}</td> |
||||||
|
<td>{{ stat.official_clicks }}</td> |
||||||
|
<td>{{ stat.tickets_clicks }}</td> |
||||||
|
<td>{{ stat.participation_clicks }}</td> |
||||||
|
<td>{{ stat.catalog_clicks }}</td> |
||||||
|
</tr> |
||||||
|
{% endfor %} |
||||||
|
{% endwith %} |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% load static %} |
||||||
|
|
||||||
|
{% block scripts %} |
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<form method="post" class="form-horizontal" name="form2" id="form2" enctype="multipart/form-data"> {% csrf_token %} |
||||||
|
<fieldset> |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-pencil"></i>{{ exposition }}</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
{% for field in form %} |
||||||
|
<div class="control-group {% if field.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{% if field.field.required %}<b>{{ field.label }}:</b>{% else %}{{ field.label }}{% endif %}</label> |
||||||
|
<div class="controls">{{ field }} |
||||||
|
<span class="help-inline">{{ field.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endfor %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</fieldset> |
||||||
|
|
||||||
|
<div class="controls"> |
||||||
|
<input class="btn btn-large btn-primary" type="submit" value="Готово"> |
||||||
|
<input class="btn btn-large" type="reset" value="Отмена"> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,84 @@ |
|||||||
|
{% extends 'base.html' %} |
||||||
|
{% load static %} |
||||||
|
|
||||||
|
{% block scripts %} |
||||||
|
{# selects #} |
||||||
|
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
||||||
|
<script src="{% static 'js/select/select2.js' %}"></script> |
||||||
|
<script> |
||||||
|
$(function(){ |
||||||
|
$('#id_fr').datetimepicker({ |
||||||
|
todayHighlight: true, |
||||||
|
format : 'yyyy-mm-dd', |
||||||
|
minView:2 |
||||||
|
}); |
||||||
|
$('#id_to').datetimepicker({ |
||||||
|
todayHighlight: true, |
||||||
|
format : 'yyyy-mm-dd', |
||||||
|
minView:2 |
||||||
|
}); |
||||||
|
$('#id_theme').select2({width: "element"}); |
||||||
|
$('#id_country').select2({width: "element"}); |
||||||
|
$('#id_exposition').select2({ |
||||||
|
placeholder: 'Найти', |
||||||
|
width: 'element', |
||||||
|
ajax: { |
||||||
|
url: '/admin/exposition/search/', |
||||||
|
dataType: "json", |
||||||
|
quietMillis: 200, |
||||||
|
multiple: true, |
||||||
|
|
||||||
|
data: function(term, page, theme){ |
||||||
|
return {term: term, |
||||||
|
page: page}; |
||||||
|
}, |
||||||
|
|
||||||
|
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}); |
||||||
|
|
||||||
|
} |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
</script> |
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<form method="post" class="form-horizontal" name="form2" id="form2" enctype="multipart/form-data"> {% csrf_token %} |
||||||
|
<fieldset> |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-pencil"></i>{{ form.verbose }}</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
{% for field in form %} |
||||||
|
<div class="control-group {% if field.errors %}error{% endif %}"> |
||||||
|
<label class="control-label">{% if field.field.required %}<b>{{ field.label }}:</b>{% else %}{{ field.label }}{% endif %}</label> |
||||||
|
<div class="controls">{{ field }} |
||||||
|
<span class="help-inline">{{ field.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endfor %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</fieldset> |
||||||
|
|
||||||
|
<div class="controls"> |
||||||
|
<input class="btn btn-large btn-primary" type="submit" value="Готово"> |
||||||
|
<input class="btn btn-large" type="reset" value="Отмена"> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,36 @@ |
|||||||
|
{% 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_top' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a> |
||||||
|
<table class="table table-hover"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
<th>Выставка</th> |
||||||
|
<th> </th> |
||||||
|
<th> </th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
{% for item in object_list %} |
||||||
|
<tr> |
||||||
|
<td>{{ item }}</td> |
||||||
|
<td><a href="{% url 'expobanner-update_top' item.top_id %}">Изменить</a> </td> |
||||||
|
<td><a href="{% url 'expobanner_stat_top' item.top_id %}">Статистика</a> </td> |
||||||
|
</tr> |
||||||
|
{% endfor %} |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
{% endblock %} |
||||||
|
</div> |
||||||
|
{# pagination #} |
||||||
|
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %} |
||||||
|
</div> |
||||||
|
|
||||||
|
{% endblock %} |
||||||
@ -1,113 +0,0 @@ |
|||||||
{% extends 'blank.html' %} |
|
||||||
|
|
||||||
{% load static %} |
|
||||||
{% load i18n %} |
|
||||||
{% load template_filters %} |
|
||||||
|
|
||||||
|
|
||||||
{% block main_part %} |
|
||||||
<section class="layout main-part"> |
|
||||||
<div class="layout-wrap"> |
|
||||||
<aside> |
|
||||||
<div class="sbg"></div> |
|
||||||
{% include 'menu.html' %} |
|
||||||
<hr/> |
|
||||||
|
|
||||||
{% include 'client/includes/feedback.html' %} |
|
||||||
<hr /> |
|
||||||
|
|
||||||
{% include 'client/includes/online_consult.html' %} |
|
||||||
|
|
||||||
{% block aside_banner1 %} |
|
||||||
{% if theme_for_filter.id == 27 or theme_for_filter.id == 9 or theme_for_filter.id == 48 %} |
|
||||||
<div class="sbnr"> |
|
||||||
<div class="sbnr-wrap"> |
|
||||||
<a href="/redirect/redirect/11/" target="_blank"> |
|
||||||
<img src="{% static 'client/img/partners/ipsa_.gif' %}" alt="" /> |
|
||||||
</a> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
{% endif %} |
|
||||||
{% endblock %} |
|
||||||
|
|
||||||
{% include 'client/includes/services.html' %} |
|
||||||
<hr /> |
|
||||||
|
|
||||||
{% include 'client/includes/announces.html' %} |
|
||||||
|
|
||||||
{% block asside_banner2 %} |
|
||||||
|
|
||||||
<!-- task EXPO-145--> |
|
||||||
{% comment %} |
|
||||||
<div class="sbnr"> |
|
||||||
<div class="sbnr-wrap"> |
|
||||||
<a href="/redirect/redirect/11/"> |
|
||||||
<img src="{% static 'client/img/partners/imgo.jpg' %}" alt="" /> |
|
||||||
</a> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
{% endcomment %} |
|
||||||
|
|
||||||
|
|
||||||
{% endblock %} |
|
||||||
{% include 'client/includes/side_confs.html' %} |
|
||||||
<hr /> |
|
||||||
<div class="s-news-list"> |
|
||||||
{% include 'client/includes/news.html' with news=news_list %} |
|
||||||
</div> |
|
||||||
|
|
||||||
{% block aside_vk %} |
|
||||||
<div class="vk-widget"> |
|
||||||
{% include 'client/includes/social_widjet.html' %} |
|
||||||
</div> |
|
||||||
{% endblock %} |
|
||||||
</aside> |
|
||||||
|
|
||||||
<div class="mcl"> |
|
||||||
{% with search_form=search_form %} |
|
||||||
{% include 'client/includes/catalog_search.html' %} |
|
||||||
{% endwith %} |
|
||||||
{% block under_search_baner %} |
|
||||||
{% include 'client/includes/banners/under_search.html' %} |
|
||||||
{% endblock %} |
|
||||||
|
|
||||||
{% block bread_scrumbs %} |
|
||||||
|
|
||||||
{% endblock %} |
|
||||||
|
|
||||||
<div class="page-title"> |
|
||||||
{% block page_title %} |
|
||||||
|
|
||||||
{% endblock %} |
|
||||||
</div> |
|
||||||
|
|
||||||
{% block page_filter %} |
|
||||||
{% endblock %} |
|
||||||
|
|
||||||
{% block page_body %} |
|
||||||
<div class="page-body clearfix"> |
|
||||||
{% block content_list %} |
|
||||||
{% endblock %} |
|
||||||
|
|
||||||
{% block paginator %} |
|
||||||
|
|
||||||
|
|
||||||
{% endblock %} |
|
||||||
|
|
||||||
{% block content_footer_banner %} |
|
||||||
{% endblock %} |
|
||||||
</div> |
|
||||||
|
|
||||||
{% block content_text %} |
|
||||||
{% comment %} |
|
||||||
{% with filter=filter %} |
|
||||||
{% include 'includes/event_list_description.html' %} |
|
||||||
{% endwith %} |
|
||||||
{% endcomment %} |
|
||||||
|
|
||||||
{% endblock %} |
|
||||||
{% endblock %} |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</section> |
|
||||||
{% endblock %} |
|
||||||
@ -0,0 +1,67 @@ |
|||||||
|
{% extends 'base_catalog.html' %} |
||||||
|
|
||||||
|
{% block page_title %} |
||||||
|
<div class="page-title"> |
||||||
|
<h1>{{ object }}. Статистика</h1> |
||||||
|
</div> |
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block content_list %} |
||||||
|
<div class="m-article recovery-page"> |
||||||
|
{% if form %} |
||||||
|
<form class="pw-form" method="post">{% csrf_token %} |
||||||
|
|
||||||
|
<div> |
||||||
|
<div class="input"> |
||||||
|
<p class="label">{{ form.stat_pswd.label }}</p> |
||||||
|
</div> |
||||||
|
{% if form.errors %} |
||||||
|
{# если есть ошибка #} |
||||||
|
<div class="required err input"> |
||||||
|
{{ form.stat_pswd }} |
||||||
|
</div> |
||||||
|
<div class="error-text"> |
||||||
|
{{ form.errors.stat_pswd.0 }}{# текст ошибки #} |
||||||
|
</div> |
||||||
|
|
||||||
|
{% else %} |
||||||
|
{# ошибки нет #} |
||||||
|
<div class="input"> |
||||||
|
{{ form.stat_pswd }} |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
<div class="input"> |
||||||
|
<button type="submit" class="icon-check submit">Подтвердить</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</form> |
||||||
|
|
||||||
|
{% else %} |
||||||
|
<table width="100%"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
<th>Дата</th> |
||||||
|
<th>Показы</th> |
||||||
|
<th>Клики</th> |
||||||
|
<th>Уникальные показы</th> |
||||||
|
<th>Уникальные клики</th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
{% with stats=object.banner_stat.all %} |
||||||
|
{% 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> |
||||||
|
{% endif %} |
||||||
|
</div> |
||||||
|
{% endblock %} |
||||||
@ -0,0 +1,67 @@ |
|||||||
|
{% extends 'base_catalog.html' %} |
||||||
|
|
||||||
|
{% block page_title %} |
||||||
|
<div class="page-title"> |
||||||
|
<h1>{{ object.get_event }}. Статистика</h1> |
||||||
|
</div> |
||||||
|
{% endblock %} |
||||||
|
|
||||||
|
{% block content_list %} |
||||||
|
<div class="m-article recovery-page"> |
||||||
|
{% if form %} |
||||||
|
<form class="pw-form" method="post">{% csrf_token %} |
||||||
|
|
||||||
|
<div> |
||||||
|
<div class="input"> |
||||||
|
<p class="label">{{ form.stat_pswd.label }}</p> |
||||||
|
</div> |
||||||
|
{% if form.errors %} |
||||||
|
{# если есть ошибка #} |
||||||
|
<div class="required err input"> |
||||||
|
{{ form.stat_pswd }} |
||||||
|
</div> |
||||||
|
<div class="error-text"> |
||||||
|
{{ form.errors.stat_pswd.0 }}{# текст ошибки #} |
||||||
|
</div> |
||||||
|
|
||||||
|
{% else %} |
||||||
|
{# ошибки нет #} |
||||||
|
<div class="input"> |
||||||
|
{{ form.stat_pswd }} |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
<div class="input"> |
||||||
|
<button type="submit" class="icon-check submit">Подтвердить</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</form> |
||||||
|
|
||||||
|
{% else %} |
||||||
|
<table width="100%"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
<th>Дата</th> |
||||||
|
<th>Официальный сайт</th> |
||||||
|
<th>Билеты</th> |
||||||
|
<th>Участие</th> |
||||||
|
<th>Переходы с каталога</th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
{% with stats=object.paidstat_set.all %} |
||||||
|
{% for stat in stats %} |
||||||
|
<tr> |
||||||
|
<td>{{ stat.date|date:"Y-m-d" }}</td> |
||||||
|
<td>{{ stat.official_clicks }}</td> |
||||||
|
<td>{{ stat.tickets_clicks }}</td> |
||||||
|
<td>{{ stat.participation_clicks }}</td> |
||||||
|
<td>{{ stat.catalog_clicks }}</td> |
||||||
|
</tr> |
||||||
|
{% endfor %} |
||||||
|
{% endwith %} |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
{% endif %} |
||||||
|
</div> |
||||||
|
{% endblock %} |
||||||
@ -1,219 +0,0 @@ |
|||||||
{% extends 'base_catalog.html' %} |
|
||||||
{% load static %} |
|
||||||
{% load i18n %} |
|
||||||
{% load template_filters %} |
|
||||||
|
|
||||||
|
|
||||||
{% block content_list %} |
|
||||||
|
|
||||||
{% block content_text %} |
|
||||||
{% block page_body %} |
|
||||||
<div class="m-article"> |
|
||||||
<div class="item-wrap event clearfix"> |
|
||||||
<aside> |
|
||||||
{% if object_list.0.expohit %} |
|
||||||
<div class="hit"></div> |
|
||||||
{% endif %} |
|
||||||
<div class="i-pict"> |
|
||||||
{% with obj=object_list.0 %} |
|
||||||
{% include 'client/includes/show_logo.html' %} |
|
||||||
{% endwith %} |
|
||||||
</div> |
|
||||||
<!-- |
|
||||||
<div class="i-rating" title="Рейтинг: 551">551</div> |
|
||||||
--> |
|
||||||
<div class="i-stats"> |
|
||||||
|
|
||||||
{% if object_list.0.visitors %} |
|
||||||
<span class="visitors" title="Посетители">{{ object_list.0.visitors }}</span> |
|
||||||
{% endif %} |
|
||||||
{% if object_list.0.members %} |
|
||||||
<span class="participants" title="Участники">{{ object_list.0.members }}</span> |
|
||||||
{% endif %} |
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="i-discount"> |
|
||||||
{% if object_list.0.discount %} |
|
||||||
<a class="discount-button" href="#">{% trans 'Скидка' %} -{{ object_list.0.discount }}%</a> |
|
||||||
|
|
||||||
<div class="dsc-text">{{ object_list.0.discount_description|safe }}</div> |
|
||||||
{% endif %} |
|
||||||
</div> |
|
||||||
</aside> |
|
||||||
|
|
||||||
<div class="i-info"> |
|
||||||
<header> |
|
||||||
<div class="i-title"> |
|
||||||
{% if object_list.0.main_title %} |
|
||||||
{{ object_list.0.main_title|safe }} |
|
||||||
{% else %} |
|
||||||
{{ object_list.0.name|safe }} |
|
||||||
{% endif %} |
|
||||||
</div> |
|
||||||
</header> |
|
||||||
|
|
||||||
<div class="i-date"> |
|
||||||
{% with obj=object_list.0 %} |
|
||||||
{% include 'client/includes/show_date_block.html' %} |
|
||||||
{% endwith %} |
|
||||||
</div> |
|
||||||
{% if object_list.0.place %} |
|
||||||
<div class="i-address"> |
|
||||||
<header> |
|
||||||
<div class="address"> |
|
||||||
{{ object_list.0.place.address.address }} |
|
||||||
</div> |
|
||||||
<div class="show-map"><a class="toggle-map" href="#">{% trans 'Раскрыть карту' %}</a></div> |
|
||||||
</header> |
|
||||||
|
|
||||||
<div class="i-map"> |
|
||||||
<div class="close-map"><a class="toggle-map" href="#">{% trans 'Скрыть карту' %}</a> |
|
||||||
</div> |
|
||||||
<div class="map-canvas" id="map-canvas" |
|
||||||
data-coords="{{ object_list.0.place.address.lat }},{{ exposition.place.address.lng }}"></div> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
{% endif %} |
|
||||||
|
|
||||||
|
|
||||||
</div> |
|
||||||
</div> |
|
||||||
<div class="e-price"> |
|
||||||
<div class="sect-title">{% trans 'Стоимость посещения и участия' %}</div> |
|
||||||
<div class="ep-wrap"> |
|
||||||
|
|
||||||
<div class="e-price-wrap"> |
|
||||||
<div class="epr-layout"> |
|
||||||
|
|
||||||
<div class="eprl-col"> |
|
||||||
<div class="epr-title"><span>{% trans 'Для посещения' %}</span></div> |
|
||||||
|
|
||||||
<div class="epr-subtitle">{% trans 'Стоимость билетов' %}</div> |
|
||||||
|
|
||||||
<div class="tp-wrap"> |
|
||||||
|
|
||||||
<ul class="pr-list"> |
|
||||||
{% if object_list.0.price_day %} |
|
||||||
<li> |
|
||||||
<div class="prl-value">{{ object_list.0.price_day }} €</div> |
|
||||||
<div class="prl-descr"><span>{% trans 'на 1 день' %}</span></div> |
|
||||||
</li> |
|
||||||
{% endif %} |
|
||||||
{% if object_list.0.price_all %} |
|
||||||
<li> |
|
||||||
<div class="prl-value">{{ object_list.0.price_all }} €</div> |
|
||||||
<div class="prl-descr"><span>{% trans 'на все дни' %}</span></div> |
|
||||||
</li> |
|
||||||
{% endif %} |
|
||||||
|
|
||||||
</ul> |
|
||||||
|
|
||||||
<div class="tp-descr">{% trans 'Предварительная регистрация' %}</div> |
|
||||||
|
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="tp-wrap"> |
|
||||||
|
|
||||||
<ul class="pr-list gray"> |
|
||||||
{% if object_list.0.price_day_bar %} |
|
||||||
<li> |
|
||||||
<div class="prl-value">{{ object_list.0.price_day_bar }} €</div> |
|
||||||
|
|
||||||
<div class="prl-descr"><span>на 1 день</span></div> |
|
||||||
</li> |
|
||||||
{% endif %} |
|
||||||
{% if object_list.0.price_all_bar %} |
|
||||||
<li> |
|
||||||
<div class="prl-value">{{ object_list.0.price_all_bar }} €</div> |
|
||||||
<div class="prl-descr"><span>{% trans 'на все дни' %}</span></div> |
|
||||||
</li> |
|
||||||
{% endif %} |
|
||||||
|
|
||||||
</ul> |
|
||||||
|
|
||||||
<div class="tp-descr gray">{% trans 'Регистрация на' %} {% trans 'стойке' %}</div> |
|
||||||
|
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="tp-btn-wrap"> |
|
||||||
<div class="tp-btn"> |
|
||||||
<a class="button big orange b-more" href="#">{% trans 'Заказать билет' %}</a> |
|
||||||
</div> |
|
||||||
<div class="tp-categories"> |
|
||||||
<div class="tpc-title">{% trans 'Выставка открыта для' %}:</div> |
|
||||||
<ul> |
|
||||||
{{ object_list.0.get_audience }} |
|
||||||
|
|
||||||
</ul> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="eprl-col"> |
|
||||||
<div class="epr-title"><span>{% trans 'Для участия' %}</span></div> |
|
||||||
|
|
||||||
<div class="epr-subtitle">{% trans 'Стоимость аренды 1м²' %}</div> |
|
||||||
|
|
||||||
<ul class="pr-list"> |
|
||||||
{% if object_list.0.max_closed_equipped_area %} |
|
||||||
<li> |
|
||||||
|
|
||||||
<div class="prl-value">{{ object_list.0.max_closed_equipped_area }} €</div> |
|
||||||
<div class="prl-descr"><span>{% trans 'оборудованная площадь' %}</span></div> |
|
||||||
</li> |
|
||||||
{% endif %} |
|
||||||
|
|
||||||
{% if object_list.0.max_closed_area %} |
|
||||||
<li> |
|
||||||
<div class="prl-value">{{ object_list.0.max_closed_area }} €</div> |
|
||||||
<div class="prl-descr"><span>{% trans 'необорудованная площадь' %}</span></div> |
|
||||||
</li> |
|
||||||
{% endif %} |
|
||||||
|
|
||||||
{% if object_list.0.max_open_area %} |
|
||||||
<li> |
|
||||||
<div class="prl-value">{{ object_list.0.max_open_area }} €</div> |
|
||||||
<div class="prl-descr"><span>{% trans 'открытая площадь' %}</span></div> |
|
||||||
</li> |
|
||||||
{% endif %} |
|
||||||
|
|
||||||
</ul> |
|
||||||
|
|
||||||
<a class="button big orange b-more" href="#">{% trans 'Заявка на участие' %}</a> |
|
||||||
|
|
||||||
<div class="epr-conditons"> |
|
||||||
{% if object_list.0.min_stand_size %} |
|
||||||
<p>{% trans 'Минимальный размер стенда' %} — {{ object_list.0.min_stand_size }}м²</p> |
|
||||||
{% endif %} |
|
||||||
{% if object_list.0.registration_payment %} |
|
||||||
<p>{% trans 'Регистрационный взнос' %} — {{ object_list.0.registration_payment }}€</p> |
|
||||||
{% endif %} |
|
||||||
{% if object_list.0.application_deadline %} |
|
||||||
<p>{% trans 'Крайний срок подачи заявки' %} — {{ object_list.0.application_deadline }}</p> |
|
||||||
{% endif %} |
|
||||||
|
|
||||||
</div> |
|
||||||
|
|
||||||
</div> |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
</div> |
|
||||||
</div> |
|
||||||
|
|
||||||
</div> |
|
||||||
<div class="ed-back"> |
|
||||||
<a href="/{{ filter|generate_url:'event' }}">{{ object_list.0.name|safe }}</a> |
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="i-sub-articles"> |
|
||||||
<ul> |
|
||||||
{% for service in object_list.0.get_services %} |
|
||||||
<li><a href="#">{{ service.name }}</a></li> |
|
||||||
{% endfor %} |
|
||||||
</ul> |
|
||||||
</div> |
|
||||||
{% endblock %} |
|
||||||
{% endblock %} |
|
||||||
{% endblock %} |
|
||||||
@ -0,0 +1,4 @@ |
|||||||
|
<div class="sbnr"> |
||||||
|
<div class="sbnr-wrap" id="expo_b_aside_1"> |
||||||
|
</div> |
||||||
|
</div> |
||||||
@ -0,0 +1,24 @@ |
|||||||
|
<div class="sbnr"> |
||||||
|
<div class="sbnr-wrap" id="expo_b_aside_2"> |
||||||
|
<!-- Яндекс.Директ --> |
||||||
|
<script type="text/javascript"> |
||||||
|
yandex_partner_id = 58151; |
||||||
|
yandex_site_bg_color = 'FFFFF'; |
||||||
|
yandex_ad_format = 'direct'; |
||||||
|
yandex_font_size = 1; |
||||||
|
yandex_direct_type = 'vertical'; |
||||||
|
yandex_direct_limit = 3; |
||||||
|
yandex_direct_title_font_size = 3; |
||||||
|
yandex_direct_links_underline = false; |
||||||
|
yandex_direct_title_color = '666666'; |
||||||
|
yandex_direct_url_color = '000000'; |
||||||
|
yandex_direct_text_color = '000000'; |
||||||
|
yandex_direct_hover_color = 'FF8000'; |
||||||
|
yandex_direct_sitelinks_color = 'FF8000'; |
||||||
|
yandex_direct_favicon = false; |
||||||
|
yandex_no_sitelinks = false; |
||||||
|
document.write('<scr'+'ipt type="text/javascript" src="//an.yandex.ru/system/context.js"></scr'+'ipt>'); |
||||||
|
</script> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
@ -0,0 +1,4 @@ |
|||||||
|
<div class="sbnr"> |
||||||
|
<div class="sbnr-wrap" id="expo_b_aside_3"> |
||||||
|
</div> |
||||||
|
</div> |
||||||
@ -0,0 +1,4 @@ |
|||||||
|
<div class="sbnr"> |
||||||
|
<div class="sbnr-wrap" id="expo_b_aside_4"> |
||||||
|
</div> |
||||||
|
</div> |
||||||
@ -0,0 +1,26 @@ |
|||||||
|
<div id="expo_b_catalog_inner"> |
||||||
|
<script type="text/javascript"> |
||||||
|
yandex_partner_id = 58151; |
||||||
|
yandex_site_bg_color = 'FFFFFF'; |
||||||
|
yandex_ad_format = 'direct'; |
||||||
|
yandex_font_size = 1; |
||||||
|
yandex_direct_type = 'horizontal'; |
||||||
|
yandex_direct_border_type = 'block'; |
||||||
|
yandex_direct_limit = 3; |
||||||
|
yandex_direct_title_font_size = 3; |
||||||
|
yandex_direct_border_radius = true; |
||||||
|
yandex_direct_links_underline = false; |
||||||
|
yandex_direct_header_bg_color = 'FEEAC7'; |
||||||
|
yandex_direct_bg_color = 'FFF9F0'; |
||||||
|
yandex_direct_border_color = 'FBE5C0'; |
||||||
|
yandex_direct_title_color = '666666'; |
||||||
|
yandex_direct_url_color = '000000'; |
||||||
|
yandex_direct_text_color = '000000'; |
||||||
|
yandex_direct_hover_color = 'FF3333'; |
||||||
|
yandex_direct_sitelinks_color = '666666'; |
||||||
|
yandex_direct_favicon = false; |
||||||
|
yandex_no_sitelinks = false; |
||||||
|
document.write('<scr'+'ipt type="text/javascript" src="//an.yandex.ru/system/context.js"></scr'+'ipt>'); |
||||||
|
</script> |
||||||
|
|
||||||
|
</div> |
||||||
@ -0,0 +1,2 @@ |
|||||||
|
<div id="expo_b_catalog_inner_2"> |
||||||
|
</div> |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
<div id="expo_b_detail_inner"> |
||||||
|
<script type="text/javascript"> |
||||||
|
yandex_partner_id = 58151; |
||||||
|
yandex_site_bg_color = 'FFFFFF'; |
||||||
|
yandex_ad_format = 'direct'; |
||||||
|
yandex_font_size = 1; |
||||||
|
yandex_direct_type = 'horizontal'; |
||||||
|
yandex_direct_border_type = 'block'; |
||||||
|
yandex_direct_limit = 3; |
||||||
|
yandex_direct_title_font_size = 3; |
||||||
|
yandex_direct_border_radius = true; |
||||||
|
yandex_direct_links_underline = false; |
||||||
|
yandex_direct_header_bg_color = 'FEEAC7'; |
||||||
|
yandex_direct_bg_color = 'FFF9F0'; |
||||||
|
yandex_direct_border_color = 'FBE5C0'; |
||||||
|
yandex_direct_title_color = '666666'; |
||||||
|
yandex_direct_url_color = '000000'; |
||||||
|
yandex_direct_text_color = '000000'; |
||||||
|
yandex_direct_hover_color = 'FF3333'; |
||||||
|
yandex_direct_sitelinks_color = '666666'; |
||||||
|
yandex_direct_favicon = false; |
||||||
|
yandex_no_sitelinks = false; |
||||||
|
document.write('<scr'+'ipt type="text/javascript" src="//an.yandex.ru/system/context.js"></scr'+'ipt>'); |
||||||
|
</script> |
||||||
|
</div> |
||||||
@ -1,12 +1,6 @@ |
|||||||
{% load static %} |
{% load static %} |
||||||
{% load template_filters %} |
{% load template_filters %} |
||||||
|
|
||||||
<div class="abn"> |
<div class="abn" id="expo_b_detail_inner_2"> |
||||||
{% if object.theme.all.0.id in banner_themes %} |
|
||||||
<a target="_blank" href="/redirect/redirect/24/"><img src="{% static 'client/img/partners/unnamed_2.gif' %}" alt="" /></a> |
|
||||||
{% else %} |
|
||||||
{% if object.theme.all.1.id in banner_themes %} |
|
||||||
<a target="_blank" href="/redirect/redirect/24/"><img src="{% static 'client/img/partners/unnamed_2.gif' %}" alt="" /></a> |
|
||||||
{% endif %} |
|
||||||
{% endif %} |
|
||||||
</div> |
</div> |
||||||
@ -1,6 +0,0 @@ |
|||||||
{% load static %} |
|
||||||
<div class="abn"> |
|
||||||
{% if theme_for_filter.id in banner_themes or tag_for_filter.id in banner_tags %} |
|
||||||
<a target="_blank" href="/redirect/redirect/24/"><img src="{% static 'client/img/partners/unnamed_2.gif' %}" alt="" /></a> |
|
||||||
{% endif %} |
|
||||||
</div> |
|
||||||
@ -0,0 +1,12 @@ |
|||||||
|
<div class="abn" id="expo_b_header"> |
||||||
|
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> |
||||||
|
<!-- 468 на 60 --> |
||||||
|
<ins class="adsbygoogle" |
||||||
|
style="display:inline-block;width:468px;height:60px" |
||||||
|
data-ad-client="ca-pub-5242360491829403" |
||||||
|
data-ad-slot="4482648777"></ins> |
||||||
|
<script> |
||||||
|
(adsbygoogle = window.adsbygoogle || []).push({}); |
||||||
|
</script> |
||||||
|
|
||||||
|
</div> |
||||||
@ -0,0 +1,2 @@ |
|||||||
|
<div class="abn"> |
||||||
|
</div> |
||||||
@ -0,0 +1,3 @@ |
|||||||
|
<div class="abn" id="expo_b_under_search"> |
||||||
|
|
||||||
|
</div> |
||||||
@ -0,0 +1,13 @@ |
|||||||
|
<div id="expo_top_events"> |
||||||
|
|
||||||
|
</div> |
||||||
|
<script> |
||||||
|
/* НУЖНО ЛИ??? */ |
||||||
|
window.sendData = { |
||||||
|
"theme": [{{ themes|join:", " }}], |
||||||
|
"country": "{{ country }}", |
||||||
|
"city": "{{ city }}", |
||||||
|
"tag": "{{ tag }}" |
||||||
|
}; |
||||||
|
var url = "/expo-b/get-tops/"; |
||||||
|
</script> |
||||||
@ -1,19 +0,0 @@ |
|||||||
{% load static %} |
|
||||||
{% load template_filters %} |
|
||||||
|
|
||||||
<div class="abn"> |
|
||||||
{% with r=False|random4 %} |
|
||||||
{% ifequal r 0 %} |
|
||||||
<a target="_blank" href="/redirect/redirect/57/"><img src="{% static 'client/img/partners/cemat15_900x130_bilet.gif' %}" alt="" /></a> |
|
||||||
{% endifequal %} |
|
||||||
{% ifequal r 1 %} |
|
||||||
<a target="_blank" href="/redirect/redirect/58/"><img src="{% static 'client/img/partners/beach.png' %}" alt="" /></a> |
|
||||||
{% endifequal %} |
|
||||||
{% ifequal r 2 %} |
|
||||||
<a target="_blank" href="/redirect/redirect/59/"><img src="{% static 'client/img/partners/mims15_900x130_bilet.gif' %}" alt="" /></a> |
|
||||||
{% endifequal %} |
|
||||||
{% ifequal r 3 %} |
|
||||||
<a target="_blank" href="/redirect/redirect/61/"><img src="{% static 'client/img/partners/IPSA_2015_web_900x130.gif' %}" alt="" /></a> |
|
||||||
{% endifequal %} |
|
||||||
{% endwith %} |
|
||||||
</div> |
|
||||||
@ -0,0 +1,87 @@ |
|||||||
|
(function () { |
||||||
|
"use strict"; |
||||||
|
|
||||||
|
var API_URL_ROOT = "/expo-b/get-banners/"; |
||||||
|
|
||||||
|
var getUrl = function () { |
||||||
|
var data = window.sendData; |
||||||
|
|
||||||
|
if (data instanceof Object) { |
||||||
|
var search = []; |
||||||
|
|
||||||
|
for (var key in data) { |
||||||
|
if (data.hasOwnProperty(key)) { |
||||||
|
var value = data[key]; |
||||||
|
|
||||||
|
if (value instanceof Array) { |
||||||
|
for (var i = 0, l = value.length; i < l; i++) { |
||||||
|
search.push(encodeURIComponent(key) + "=" + encodeURIComponent(value[i])); |
||||||
|
} |
||||||
|
} else { |
||||||
|
search.push(encodeURIComponent(key) + "=" + encodeURIComponent(value)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (search.length) { |
||||||
|
return API_URL_ROOT + "?" + search.join("&"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return API_URL_ROOT; |
||||||
|
}; |
||||||
|
|
||||||
|
var getBanners = function (url, callback) { |
||||||
|
var xhr = new XMLHttpRequest(); |
||||||
|
xhr.open("GET", url, true); |
||||||
|
|
||||||
|
xhr.onreadystatechange = function (event) { |
||||||
|
if (event.target.readyState === 4) { |
||||||
|
if (event.target.status === 200) { |
||||||
|
try { |
||||||
|
callback(JSON.parse(event.target.responseText)); |
||||||
|
} catch (error) { |
||||||
|
// do nothing
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
xhr.send(); |
||||||
|
}; |
||||||
|
|
||||||
|
var addBanner = function (banner) { |
||||||
|
var parent = document.getElementById(banner.id); |
||||||
|
|
||||||
|
if (parent) { |
||||||
|
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; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
var insertBanners = function (data) { |
||||||
|
if (data instanceof Array) { |
||||||
|
for (var i = 0, l = data.length; i < l; i++) { |
||||||
|
addBanner(data[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
var main = function () { |
||||||
|
getBanners(getUrl(), insertBanners); |
||||||
|
}; |
||||||
|
|
||||||
|
window.addEventListener("load", main); |
||||||
|
})(); |
||||||
Loading…
Reference in new issue