parent
41271c05a7
commit
897b23b592
46 changed files with 1016 additions and 476 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,12 @@ |
||||
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'^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,73 @@ |
||||
# -*- 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): |
||||
print('START. NUMBER of queries = %d'%len(connection.queries)) |
||||
thematic_banners = [] |
||||
url_banners = [] |
||||
|
||||
for banner in banners_list: |
||||
#print('-------------------------') |
||||
#print('number of queries = %d'%len(connection.queries)) |
||||
|
||||
# check by theme |
||||
banner_theme_ids = [str(theme.id) for theme in banner.theme.all()] |
||||
#print('number of queries = %d'%len(connection.queries)) |
||||
|
||||
if banner_theme_ids: |
||||
if params.get('theme'): |
||||
theme = params['theme'] |
||||
if theme in banner_theme_ids: |
||||
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 |
||||
print('-------------------------') |
||||
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)) |
||||
@ -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,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,4 @@ |
||||
<div class="sbnr"> |
||||
<div class="sbnr-wrap" id="expo_b_aside_2"> |
||||
</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,3 @@ |
||||
<div id="expo_b_catalog_inner"> |
||||
|
||||
</div> |
||||
@ -0,0 +1,3 @@ |
||||
<div id="expo_b_detail_inner"> |
||||
|
||||
</div> |
||||
@ -0,0 +1,3 @@ |
||||
<div class="abn" id="expo_b_header"> |
||||
|
||||
</div> |
||||
@ -0,0 +1,3 @@ |
||||
<div class="abn" id="expo_b_under_search"> |
||||
|
||||
</div> |
||||
Loading…
Reference in new issue