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 expobanner.stat_views import * |
||||
from . import views |
||||
|
||||
urlpatterns = [ |
||||
url(r'^click/(?P<banner_id>\d{1,4})/(?P<key>[-\w]+)/$', views.click, name='banner_click'), |
||||
url(r'^view/(?P<banner_id>\d+)/(?P<key>[-\w]+)/$', views.view, name='banner_view'), |
||||
|
||||
url(r'^click/(?P<banner_id>\d{1,4})/$', views.click, name='banner_click'), |
||||
#url(r'^view/(?P<banner_id>\d+)/$', views.view, name='banner_view'), |
||||
# |
||||
url(r'^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 template_filters %} |
||||
|
||||
<div class="abn"> |
||||
{% 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 class="abn" id="expo_b_detail_inner_2"> |
||||
|
||||
</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> |
||||
@ -1,3 +1,3 @@ |
||||
<div class="seo-text"> |
||||
<div class="seo-text"> |
||||
<h2>{{ object.title }}</h2>{{ object.body|safe }} |
||||
</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