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 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'^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