parent
e99456175f
commit
a96fc8ad63
37 changed files with 2027 additions and 107 deletions
@ -0,0 +1,344 @@ |
|||||||
|
# from exposition.models import Exposition |
||||||
|
import json |
||||||
|
import operator |
||||||
|
from datetime import date, timedelta |
||||||
|
|
||||||
|
import numpy |
||||||
|
import pandas |
||||||
|
from city.models import City |
||||||
|
# -*- coding: utf-8 -*- |
||||||
|
# from conference.models import Conference |
||||||
|
from country.models import Country |
||||||
|
from django.contrib.contenttypes.models import ContentType |
||||||
|
from django.core.serializers.json import DjangoJSONEncoder |
||||||
|
from django.db.models import Q |
||||||
|
from django.http import HttpResponse |
||||||
|
from django.template.loader import render_to_string |
||||||
|
from django.utils import timezone |
||||||
|
from django.utils.encoding import force_text |
||||||
|
from django.utils.translation import ugettext_lazy as _ |
||||||
|
from django.views.generic import FormView, TemplateView |
||||||
|
from graphos.renderers import flot, gchart |
||||||
|
from graphos.sources.model import ModelDataSource |
||||||
|
from theme.models import Tag, Theme |
||||||
|
|
||||||
|
from .forms import ( |
||||||
|
ByContentObjectsFilter, |
||||||
|
DateFilter, |
||||||
|
EventsDateFilter, |
||||||
|
EventsParamsFilter, |
||||||
|
event_choices, |
||||||
|
kind_choices |
||||||
|
) |
||||||
|
from .models import ObjectStats, SectionStats |
||||||
|
|
||||||
|
kind_choices_dict = dict(kind_choices) |
||||||
|
|
||||||
|
|
||||||
|
class CustomJSEncoder(DjangoJSONEncoder): |
||||||
|
def default(self, o): |
||||||
|
# See "Date Time String Format" in the ECMA-262 specification. |
||||||
|
if isinstance(o, date): |
||||||
|
return 'Date({y}, {js_m}, {day})'.format( |
||||||
|
y=o.year, js_m=o.month - 1, day=o.day) |
||||||
|
else: |
||||||
|
return super(CustomJSEncoder, self).default(o) |
||||||
|
|
||||||
|
|
||||||
|
def pydate_to_js(o): |
||||||
|
return 'Date({y}, {js_m}, {day})'.format( |
||||||
|
y=o.year, js_m=o.month - 1, day=o.day) |
||||||
|
|
||||||
|
|
||||||
|
class StatBaseView(FormView): |
||||||
|
def get_template_names(self): |
||||||
|
if self.request.is_ajax(): |
||||||
|
return self.ajax_template_name |
||||||
|
return super(StatBaseView, self).get_template_names() |
||||||
|
|
||||||
|
def after_get(self): |
||||||
|
pass |
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs): |
||||||
|
today = timezone.now().date() |
||||||
|
self.qs = self.qs.filter( |
||||||
|
created_at__gte=today - timedelta(days=7), |
||||||
|
created_at__lt=today |
||||||
|
) |
||||||
|
self.after_get() |
||||||
|
return super(StatBaseView, self).get(request, *args, **kwargs) |
||||||
|
|
||||||
|
def form_valid(self, form): |
||||||
|
if form.cleaned_data['date_begin']: |
||||||
|
self.qs = self.qs.filter(created_at__gte=form.cleaned_data['date_begin']) |
||||||
|
if form.cleaned_data['date_end']: |
||||||
|
self.qs = self.qs.filter(created_at__lte=form.cleaned_data['date_end']) |
||||||
|
|
||||||
|
def make_json_response(self, data): |
||||||
|
return HttpResponse(json.dumps(data), content_type='application/json') |
||||||
|
|
||||||
|
def get_dataframe(self): |
||||||
|
if self.df is not None: |
||||||
|
return self.df |
||||||
|
self.df = pandas.DataFrame(list(self.qs)) |
||||||
|
return self.df |
||||||
|
|
||||||
|
def get_pivot_table(self): |
||||||
|
if self.pt is not None: |
||||||
|
return self.pt |
||||||
|
df = self.get_dataframe() |
||||||
|
self.pt = df.pivot_table(values='value', index='created_at', columns=self.pt_columns, aggfunc=numpy.sum) |
||||||
|
return self.pt |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class StatSectionsView(StatBaseView): |
||||||
|
template_name = 'admin/stats/section_stat.html' |
||||||
|
ajax_template_name = 'admin/stats/content_type_form.html' |
||||||
|
form_class = DateFilter |
||||||
|
content_form_class = ByContentObjectsFilter |
||||||
|
|
||||||
|
def get_queryset(self): |
||||||
|
return SectionStats.objects\ |
||||||
|
.all()\ |
||||||
|
.values('created_at', 'section', 'kind', 'value', 'content_type', 'object_id') |
||||||
|
|
||||||
|
def dispatch(self, request, *args, **kwargs): |
||||||
|
self.qs = self.get_queryset() |
||||||
|
self.pt = self.df = self.content_form = self.ct_choices = None |
||||||
|
self.pt_columns = 'kind' |
||||||
|
return super(StatSectionsView, self).dispatch(request, *args, **kwargs) |
||||||
|
|
||||||
|
def form_valid(self, form): |
||||||
|
super(StatSectionsView, self).form_valid(form) |
||||||
|
|
||||||
|
if form.cleaned_data['section']: |
||||||
|
self.qs = self.qs.filter(section=form.cleaned_data['section']) |
||||||
|
if form.cleaned_data['kind']: |
||||||
|
self.qs = self.qs.filter(kind=form.cleaned_data['kind']) |
||||||
|
self.get_and_check_content_form() |
||||||
|
|
||||||
|
if self.request.is_ajax(): |
||||||
|
data = { |
||||||
|
'success': True, |
||||||
|
'html': render_to_string(self.ajax_template_name, self.get_context_data()) |
||||||
|
} |
||||||
|
return self.make_json_response(data) |
||||||
|
return self.render_to_response(self.get_context_data(form=form)) |
||||||
|
|
||||||
|
def form_invalid(self, form): |
||||||
|
if self.request.is_ajax(): |
||||||
|
data = { |
||||||
|
'success': False, |
||||||
|
'errors': form.errors |
||||||
|
} |
||||||
|
return self.make_json_response(data) |
||||||
|
return super(StatSectionsView, self).form_invalid(form) |
||||||
|
|
||||||
|
def get_ct_form(self): |
||||||
|
form = None |
||||||
|
check = False |
||||||
|
pairs = self.qs\ |
||||||
|
.filter(content_type__isnull=False, object_id__isnull=False)\ |
||||||
|
.values_list('content_type', 'object_id') |
||||||
|
if pairs: |
||||||
|
ct_id, object_ids = zip(*pairs) |
||||||
|
ct_id = list(set(ct_id)) |
||||||
|
object_ids = set(object_ids) |
||||||
|
if len(ct_id) == 1: |
||||||
|
ct_id = ct_id[0] |
||||||
|
form_kwargs = {} |
||||||
|
post_data = self.request.POST |
||||||
|
ct_model = ContentType.objects.get_for_id(ct_id) |
||||||
|
self.ct_choices = ct_model.model_class().objects.language().filter(pk__in=object_ids).values_list('pk', 'name').order_by('name') |
||||||
|
self.ct_choices_dict = dict(self.ct_choices) |
||||||
|
|
||||||
|
# detect if we need to validate form |
||||||
|
content_type = post_data.get('content_type', None) |
||||||
|
if content_type and int(content_type) == ct_id: |
||||||
|
check = True |
||||||
|
form_kwargs.update({ |
||||||
|
'data': post_data, |
||||||
|
}) |
||||||
|
|
||||||
|
form_kwargs.update({ |
||||||
|
'initial': {'content_type': ct_id}, |
||||||
|
'choices': self.ct_choices, |
||||||
|
}) |
||||||
|
form = self.content_form_class(**form_kwargs) |
||||||
|
return form, check |
||||||
|
|
||||||
|
def get_and_check_content_form(self): |
||||||
|
self.content_form, check = self.get_ct_form() |
||||||
|
if check and self.content_form.is_valid() and self.content_form.cleaned_data['ct_objects']: |
||||||
|
self.qs = self.qs.filter( |
||||||
|
content_type=self.content_form.cleaned_data['content_type'], |
||||||
|
object_id__in=self.content_form.cleaned_data['ct_objects'] |
||||||
|
) |
||||||
|
self.pt_columns = 'object_id' |
||||||
|
|
||||||
|
def get_col_map(self): |
||||||
|
if self.pt_columns == 'kind': |
||||||
|
return kind_choices_dict |
||||||
|
else: |
||||||
|
return self.ct_choices_dict |
||||||
|
|
||||||
|
def get_column_names(self): |
||||||
|
col_map = self.get_col_map() |
||||||
|
columns = [force_text(col_map[x]) for x in self.pt.columns.tolist()] |
||||||
|
|
||||||
|
return json.dumps(columns).replace('[', '').replace(']', '') |
||||||
|
|
||||||
|
def get_context_data(self, **kwargs): |
||||||
|
context = super(StatSectionsView, self).get_context_data(**kwargs) |
||||||
|
context['content_form'] = self.content_form |
||||||
|
|
||||||
|
if self.request.is_ajax(): |
||||||
|
return context |
||||||
|
|
||||||
|
pt = self.get_pivot_table() |
||||||
|
|
||||||
|
# change numpy.nan values to python's None (js null with json) |
||||||
|
# result = pt.where(pt.notnull(), None) |
||||||
|
result = pt.fillna(value=0) |
||||||
|
result_summary = result.sum().to_dict() |
||||||
|
context['columns'] = self.get_column_names() |
||||||
|
|
||||||
|
# if self.pt_columns != 'kind': |
||||||
|
# result.columns = list(map(lambda x: str(int(x)), result.columns.tolist())) |
||||||
|
|
||||||
|
data = list(map( |
||||||
|
# lambda x: {'date': pydate_to_js(x[0]), 'attrs': json.dumps(x[1:]).replace('[', '').replace(']', '')}, |
||||||
|
lambda x: json.dumps(list(x), cls=CustomJSEncoder), |
||||||
|
result.itertuples() |
||||||
|
)) |
||||||
|
|
||||||
|
data_summary = [] |
||||||
|
for key, val in result_summary.items(): |
||||||
|
data_summary.append({ |
||||||
|
'name': self.get_col_map()[key], |
||||||
|
'val': val |
||||||
|
}) |
||||||
|
|
||||||
|
context['data'] = data |
||||||
|
context['data_summary'] = data_summary |
||||||
|
return context |
||||||
|
|
||||||
|
|
||||||
|
class EventStatView(StatBaseView): |
||||||
|
form_class = EventsDateFilter |
||||||
|
params_form_cls = EventsParamsFilter |
||||||
|
pt_columns = ['content_type', 'object_id'] |
||||||
|
template_name = 'admin/stats/event_stat.html' |
||||||
|
|
||||||
|
def get_queryset(self): |
||||||
|
return ObjectStats.objects\ |
||||||
|
.all()\ |
||||||
|
.select_related()\ |
||||||
|
.values('created_at', 'value') |
||||||
|
|
||||||
|
def dispatch(self, request, *args, **kwargs): |
||||||
|
self.qs = self.get_queryset() |
||||||
|
self.pt = self.df = self.params_form = None |
||||||
|
return super(EventStatView, self).dispatch(request, *args, **kwargs) |
||||||
|
|
||||||
|
def after_get(self): |
||||||
|
self.params_form = self.get_params_form() |
||||||
|
|
||||||
|
def form_valid(self, form): |
||||||
|
super(EventStatView, self).form_valid(form) |
||||||
|
self.event_types = ['conference', 'exposition'] |
||||||
|
if form.cleaned_data['event']: |
||||||
|
params = {'{attr}_id__isnull'.format(attr=form.cleaned_data['event']): False} |
||||||
|
self.qs = self.qs.filter(**params) |
||||||
|
self.event_types = [form.cleaned_data['event'], ] |
||||||
|
|
||||||
|
self.params_form = self.get_params_form() |
||||||
|
self.check_params_form() |
||||||
|
|
||||||
|
return self.render_to_response(self.get_context_data(form=form)) |
||||||
|
|
||||||
|
def get_params_form(self): |
||||||
|
country_ids = set() |
||||||
|
city_ids = set() |
||||||
|
theme_ids = set() |
||||||
|
tag_ids = set() |
||||||
|
val_list = [ |
||||||
|
'exposition__country', |
||||||
|
'conference__country', |
||||||
|
'exposition__city', |
||||||
|
'conference__city', |
||||||
|
'exposition__theme', |
||||||
|
'conference__theme', |
||||||
|
'exposition__tag', |
||||||
|
'conference__tag', |
||||||
|
] |
||||||
|
e_country_ids, c_country_ids, e_city_ids, c_city_ids, e_theme_ids, c_theme_ids, e_tag_ids, c_tag_ids = \ |
||||||
|
zip(*self.qs.values_list(*val_list)) |
||||||
|
country_ids.update(e_country_ids) |
||||||
|
country_ids.update(c_country_ids) |
||||||
|
city_ids.update(e_city_ids) |
||||||
|
city_ids.update(c_city_ids) |
||||||
|
theme_ids.update(e_theme_ids) |
||||||
|
theme_ids.update(e_theme_ids) |
||||||
|
tag_ids.update(e_tag_ids) |
||||||
|
tag_ids.update(c_tag_ids) |
||||||
|
for ids_set in [country_ids, city_ids, theme_ids, tag_ids]: |
||||||
|
if None in ids_set: |
||||||
|
ids_set.remove(None) |
||||||
|
|
||||||
|
form_kwargs = { |
||||||
|
'country_choices': Country.objects.language().filter(pk__in=country_ids).values_list('pk', 'name').order_by('name'), |
||||||
|
'city_choices': City.objects.language().filter(pk__in=city_ids).values_list('pk', 'name').order_by('name'), |
||||||
|
'theme_choices': Theme.objects.language().filter(pk__in=theme_ids).values_list('pk', 'name').order_by('name'), |
||||||
|
'tag_choices': Tag.objects.language().filter(pk__in=tag_ids).values_list('pk', 'name').order_by('name'), |
||||||
|
'data': self.request.POST |
||||||
|
} |
||||||
|
form = self.params_form_cls(**form_kwargs) |
||||||
|
return form |
||||||
|
|
||||||
|
def check_params_form(self): |
||||||
|
if self.params_form.is_valid(): |
||||||
|
query = [] |
||||||
|
for event_type in self.event_types: |
||||||
|
params = {} |
||||||
|
if self.params_form.cleaned_data['country']: |
||||||
|
params.update({ |
||||||
|
event_type + '__country_id__in': self.params_form.cleaned_data['country'] |
||||||
|
}) |
||||||
|
if self.params_form.cleaned_data['city']: |
||||||
|
params.update({ |
||||||
|
event_type + '__city_id__in': self.params_form.cleaned_data['city'] |
||||||
|
}) |
||||||
|
if self.params_form.cleaned_data['theme']: |
||||||
|
params.update({ |
||||||
|
event_type + '__theme__in': self.params_form.cleaned_data['theme'] |
||||||
|
}) |
||||||
|
if self.params_form.cleaned_data['tag']: |
||||||
|
params.update({ |
||||||
|
event_type + '__tag__in': self.params_form.cleaned_data['tag'] |
||||||
|
}) |
||||||
|
query.append(Q(**params)) |
||||||
|
|
||||||
|
if len(query) == 1: |
||||||
|
self.qs = self.qs.filter(query[0]) |
||||||
|
else: |
||||||
|
self.qs = self.qs.filter(reduce(operator.or_, query)) |
||||||
|
|
||||||
|
def get_context_data(self, **kwargs): |
||||||
|
context = super(EventStatView, self).get_context_data(**kwargs) |
||||||
|
context['params_form'] = self.params_form |
||||||
|
|
||||||
|
if self.qs: |
||||||
|
df = self.get_dataframe() |
||||||
|
pt = df.pivot_table(values='value', index='created_at', aggfunc=numpy.sum) |
||||||
|
result = pt.fillna(value=0) |
||||||
|
|
||||||
|
data = list(map( |
||||||
|
lambda x: json.dumps(list(x), cls=CustomJSEncoder), |
||||||
|
result.iteritems() |
||||||
|
)) |
||||||
|
|
||||||
|
context['data'] = data |
||||||
|
context['data_summary'] = int(result.sum()) |
||||||
|
return context |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from django.conf.urls import include, patterns, url |
||||||
|
|
||||||
|
from .admin import StatSectionsView, EventStatView |
||||||
|
|
||||||
|
urlpatterns = patterns('', |
||||||
|
url(r'^events/$', EventStatView.as_view()), |
||||||
|
url(r'^$', StatSectionsView.as_view()), |
||||||
|
) |
||||||
@ -0,0 +1,83 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from datetime import timedelta |
||||||
|
|
||||||
|
from conference.models import Conference |
||||||
|
from django import forms |
||||||
|
from django.contrib.contenttypes.models import ContentType |
||||||
|
from django.utils.translation import ugettext_lazy as _ |
||||||
|
from exposition.models import Exposition |
||||||
|
|
||||||
|
_all = (('', _(u'Все')), ) |
||||||
|
|
||||||
|
section_choices = ( |
||||||
|
('expo', _(u'Конференции')), |
||||||
|
('conf', _(u'Выставки')), |
||||||
|
) |
||||||
|
|
||||||
|
kind_choices = ( |
||||||
|
('city', _(u'Город')), |
||||||
|
('country', _(u'Страна')), |
||||||
|
('tag', _(u'Тег')), |
||||||
|
('theme', _(u'Тема')), |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
class BaseDateFilter(forms.Form): |
||||||
|
date_begin = forms.DateField(label=_(u'Дата начала'), input_formats=['%Y-%m-%d', '%d.%m.%Y'], required=False) |
||||||
|
date_end = forms.DateField(label=_(u'Дата окончания'), input_formats=['%Y-%m-%d', '%d.%m.%Y'], required=False) |
||||||
|
|
||||||
|
def clean(self): |
||||||
|
if not self.cleaned_data['date_begin'] and self.cleaned_data['date_end']: |
||||||
|
self.cleaned_data['date_begin'] = self.cleaned_data['date_end'] - timedelta(days=14) |
||||||
|
return self.cleaned_data |
||||||
|
|
||||||
|
|
||||||
|
class DateFilter(BaseDateFilter): |
||||||
|
section = forms.ChoiceField(label=_(u'Раздел'), choices=_all + section_choices, required=False) |
||||||
|
kind = forms.ChoiceField(label=_(u'Тип'), choices=_all + kind_choices, required=False) |
||||||
|
|
||||||
|
|
||||||
|
class ByContentObjectsFilter(forms.Form): |
||||||
|
content_type = forms.IntegerField(label=_(u'Тип объекта'), widget=forms.HiddenInput(), required=False) |
||||||
|
ct_objects = forms.TypedMultipleChoiceField(label=_(u'Объект'), required=False, coerce=int) |
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs): |
||||||
|
choices = kwargs.pop('choices') |
||||||
|
super(ByContentObjectsFilter, self).__init__(*args, **kwargs) |
||||||
|
self.fields['ct_objects'].choices = choices |
||||||
|
|
||||||
|
def clean_content_type(self): |
||||||
|
pk = self.cleaned_data['content_type'] |
||||||
|
if pk: |
||||||
|
return ContentType.objects.get_for_id(pk) |
||||||
|
return None |
||||||
|
|
||||||
|
|
||||||
|
event_choices = ( |
||||||
|
('conference', _(u'Конференции')), |
||||||
|
('exposition', _(u'Выставки')) |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
class EventsDateFilter(BaseDateFilter): |
||||||
|
event = forms.ChoiceField(label=_(u'Событие'), choices=_all + event_choices, required=False) |
||||||
|
|
||||||
|
|
||||||
|
class EventsParamsFilter(forms.Form): |
||||||
|
country = forms.TypedMultipleChoiceField(label=_(u'Страна'), required=False, coerce=int) |
||||||
|
city = forms.TypedMultipleChoiceField(label=_(u'Город'), required=False, coerce=int) |
||||||
|
theme = forms.TypedMultipleChoiceField(label=_(u'Тема'), required=False, coerce=int) |
||||||
|
tag = forms.TypedMultipleChoiceField(label=_(u'Тег'), required=False, coerce=int) |
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs): |
||||||
|
country_choices = kwargs.pop('country_choices') |
||||||
|
city_choices = kwargs.pop('city_choices') |
||||||
|
theme_choices = kwargs.pop('theme_choices') |
||||||
|
tag_choices = kwargs.pop('tag_choices') |
||||||
|
|
||||||
|
super(EventsParamsFilter, self).__init__(*args, **kwargs) |
||||||
|
|
||||||
|
self.fields['country'].choices = country_choices |
||||||
|
self.fields['city'].choices = city_choices |
||||||
|
self.fields['theme'].choices = theme_choices |
||||||
|
self.fields['tag'].choices = tag_choices |
||||||
@ -0,0 +1,31 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from optparse import make_option |
||||||
|
from datetime import timedelta |
||||||
|
|
||||||
|
from django.core.cache import cache |
||||||
|
from django.core.management.base import BaseCommand |
||||||
|
from django.utils import timezone |
||||||
|
from stats_collector.models import ObjectStats, SectionStats |
||||||
|
from stats_collector.utils import unique_items_iterator |
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand): |
||||||
|
def handle(self, *args, **options): |
||||||
|
prev_day = timezone.now().date() - timedelta(days=1) |
||||||
|
for model in [ObjectStats, SectionStats]: |
||||||
|
key = model.make_key(prev_day) |
||||||
|
|
||||||
|
# pop items from redis |
||||||
|
l = cache._client.lrange(key, 0, -1) |
||||||
|
cache._client.ltrim(key, len(l), -1) |
||||||
|
|
||||||
|
unique_items = {} |
||||||
|
for key, val in unique_items_iterator(l): |
||||||
|
_val = unique_items.get(key, 0) |
||||||
|
unique_items[key] = _val + val |
||||||
|
|
||||||
|
if unique_items: |
||||||
|
model_objects = [] |
||||||
|
for k, v in unique_items.items(): |
||||||
|
model_objects.append(model.create_instance(*k + (v, ), created_at=prev_day)) |
||||||
|
model.objects.bulk_create(model_objects) |
||||||
@ -0,0 +1,25 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from optparse import make_option |
||||||
|
from django.core.management.base import BaseCommand |
||||||
|
|
||||||
|
from django.core.cache import cache |
||||||
|
from stats_collector.models import ObjectStats, SectionStats |
||||||
|
from stats_collector.utils import unique_items_iterator |
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand): |
||||||
|
def handle(self, *args, **options): |
||||||
|
pipe = cache._client.pipeline() |
||||||
|
for model in [ObjectStats, SectionStats]: |
||||||
|
key = model.make_key() |
||||||
|
# pop items from redis |
||||||
|
l = cache._client.lrange(key, 0, -1) |
||||||
|
# cache._client.ltrim(key, len(l), -1) |
||||||
|
pipe.ltrim(key, len(l), -1) |
||||||
|
unique_items = {} |
||||||
|
for k, v in unique_items_iterator(l): |
||||||
|
_val = unique_items.get(k, 0) |
||||||
|
unique_items[k] = _val + v |
||||||
|
for k, v in unique_items.items(): |
||||||
|
pipe.rpush(key, model.dump_item(k + (v,))) |
||||||
|
pipe.execute() |
||||||
@ -0,0 +1,87 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from datetime import timedelta |
||||||
|
from optparse import make_option |
||||||
|
from random import randint |
||||||
|
|
||||||
|
from city.models import City |
||||||
|
from conference.models import Conference |
||||||
|
from country.models import Country |
||||||
|
from django.contrib.contenttypes.models import ContentType |
||||||
|
from django.core.cache import cache |
||||||
|
from django.core.management.base import BaseCommand |
||||||
|
from django.db.models.fields import related |
||||||
|
from django.utils import timezone |
||||||
|
from exposition.models import Exposition |
||||||
|
from stats_collector.models import ObjectStats, SectionStats |
||||||
|
from stats_collector.utils import unique_items_iterator |
||||||
|
from theme.models import Tag, Theme |
||||||
|
|
||||||
|
today = timezone.now().date() |
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand): |
||||||
|
def handle(self, *args, **options): |
||||||
|
self.create_section_test_data() |
||||||
|
self.create_objects_test_data() |
||||||
|
|
||||||
|
def create_section_test_data(self): |
||||||
|
total_objects = [Conference.objects.all()[:30], Exposition.objects.all()[:30]] |
||||||
|
|
||||||
|
bulk_objects = [] |
||||||
|
for day in xrange(92): |
||||||
|
date = today - timedelta(days=day) |
||||||
|
for model, field in [(City, 'city'), (Country, 'country'), (Theme, 'theme'), (Tag, 'tag')]: |
||||||
|
for _objects in total_objects: |
||||||
|
obj = _objects[randint(0, 29)] |
||||||
|
field_value = getattr(obj, field) |
||||||
|
if isinstance(obj._meta.get_field_by_name(field)[0], related.ManyToManyField): |
||||||
|
_field_value = field_value.all() |
||||||
|
if len(_field_value) == 0: |
||||||
|
continue |
||||||
|
field_value = _field_value[randint(0, len(_field_value) - 1)] |
||||||
|
bulk_objects.append( |
||||||
|
SectionStats( |
||||||
|
section=obj.__class__.__name__.lower()[:4], |
||||||
|
kind=field, |
||||||
|
content_object=field_value, |
||||||
|
created_at=date, |
||||||
|
value=randint(11, 898), |
||||||
|
) |
||||||
|
) |
||||||
|
bulk_objects.append( |
||||||
|
SectionStats( |
||||||
|
section=obj.__class__.__name__.lower()[:4], |
||||||
|
kind=field, |
||||||
|
created_at=date, |
||||||
|
value=randint(11, 898), |
||||||
|
) |
||||||
|
) |
||||||
|
bulk_objects.append( |
||||||
|
SectionStats( |
||||||
|
section=obj.__class__.__name__.lower()[:4], |
||||||
|
created_at=date, |
||||||
|
value=randint(11, 898), |
||||||
|
) |
||||||
|
) |
||||||
|
SectionStats.objects.bulk_create(bulk_objects) |
||||||
|
|
||||||
|
def create_objects_test_data(self): |
||||||
|
total_objects = { |
||||||
|
'conference': Conference.objects.all()[:30], |
||||||
|
'exposition': Exposition.objects.all()[:30] |
||||||
|
} |
||||||
|
|
||||||
|
bulk_objects = [] |
||||||
|
for day in xrange(92): |
||||||
|
date = today - timedelta(days=day) |
||||||
|
# for model, field in [(City, 'city'), (Country, 'country'), (Theme, 'theme'), (Tag, 'tag')]: |
||||||
|
for attr, _objects in total_objects.items(): |
||||||
|
for obj in _objects: |
||||||
|
bulk_objects.append( |
||||||
|
ObjectStats( |
||||||
|
created_at=date, |
||||||
|
value=randint(11, 898), |
||||||
|
**{attr: obj} |
||||||
|
) |
||||||
|
) |
||||||
|
ObjectStats.objects.bulk_create(bulk_objects) |
||||||
@ -0,0 +1,605 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from south.utils import datetime_utils as datetime |
||||||
|
from south.db import db |
||||||
|
from south.v2 import SchemaMigration |
||||||
|
from django.db import models |
||||||
|
|
||||||
|
|
||||||
|
class Migration(SchemaMigration): |
||||||
|
|
||||||
|
def forwards(self, orm): |
||||||
|
# Adding model 'SectionStats' |
||||||
|
db.create_table(u'stats_collector_sectionstats', ( |
||||||
|
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), |
||||||
|
('created_at', self.gf('django.db.models.fields.DateField')(db_index=True, null=True, blank=True)), |
||||||
|
('value', self.gf('django.db.models.fields.PositiveIntegerField')(null=True, blank=True)), |
||||||
|
('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'], null=True, blank=True)), |
||||||
|
('object_id', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), |
||||||
|
('section', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)), |
||||||
|
('kind', self.gf('django.db.models.fields.CharField')(max_length=64, null=True, blank=True)), |
||||||
|
)) |
||||||
|
db.send_create_signal(u'stats_collector', ['SectionStats']) |
||||||
|
|
||||||
|
# Adding index on 'SectionStats', fields ['content_type', 'object_id'] |
||||||
|
db.create_index(u'stats_collector_sectionstats', ['content_type_id', 'object_id']) |
||||||
|
|
||||||
|
# Adding model 'ObjectStats' |
||||||
|
db.create_table(u'stats_collector_objectstats', ( |
||||||
|
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), |
||||||
|
('created_at', self.gf('django.db.models.fields.DateField')(db_index=True, null=True, blank=True)), |
||||||
|
('value', self.gf('django.db.models.fields.PositiveIntegerField')(null=True, blank=True)), |
||||||
|
('exposition', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['exposition.Exposition'], null=True, blank=True)), |
||||||
|
('conference', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['conference.Conference'], null=True, blank=True)), |
||||||
|
)) |
||||||
|
db.send_create_signal(u'stats_collector', ['ObjectStats']) |
||||||
|
|
||||||
|
|
||||||
|
def backwards(self, orm): |
||||||
|
# Removing index on 'SectionStats', fields ['content_type', 'object_id'] |
||||||
|
db.delete_index(u'stats_collector_sectionstats', ['content_type_id', 'object_id']) |
||||||
|
|
||||||
|
# Deleting model 'SectionStats' |
||||||
|
db.delete_table(u'stats_collector_sectionstats') |
||||||
|
|
||||||
|
# Deleting model 'ObjectStats' |
||||||
|
db.delete_table(u'stats_collector_objectstats') |
||||||
|
|
||||||
|
|
||||||
|
models = { |
||||||
|
u'accounts.user': { |
||||||
|
'Meta': {'ordering': "['-rating']", 'object_name': 'User'}, |
||||||
|
'blocked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'company': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'users'", 'null': 'True', 'to': u"orm['company.Company']"}), |
||||||
|
'date_joined': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'date_registered': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'email': ('django.db.models.fields.EmailField', [], {'max_length': '255', 'db_index': 'True'}), |
||||||
|
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||||
|
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'is_admin': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), |
||||||
|
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||||
|
'organiser': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['organiser.Organiser']", 'unique': 'True', 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), |
||||||
|
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), |
||||||
|
'position': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'rating': ('django.db.models.fields.IntegerField', [], {'default': '100'}), |
||||||
|
'translator': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['translator.Translator']", 'blank': 'True', 'unique': 'True'}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), |
||||||
|
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), |
||||||
|
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}) |
||||||
|
}, |
||||||
|
u'auth.group': { |
||||||
|
'Meta': {'object_name': 'Group'}, |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), |
||||||
|
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'auth.permission': { |
||||||
|
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, |
||||||
|
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||||
|
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) |
||||||
|
}, |
||||||
|
u'city.city': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'City', 'index_together': '()'}, |
||||||
|
'code_IATA': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['directories.Iata']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'cities'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}), |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'old_url': ('django.db.models.fields.CharField', [], {'max_length': '55'}), |
||||||
|
'phone_code': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'population': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}) |
||||||
|
}, |
||||||
|
u'company.company': { |
||||||
|
'Meta': {'ordering': "['-rating', 'id']", 'unique_together': '()', 'object_name': 'Company', 'index_together': '()'}, |
||||||
|
'address': ('functions.custom_fields.LocationField', [], {'blank': 'True'}), |
||||||
|
'blocked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'city': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), |
||||||
|
'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}), |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'created_company'", 'null': 'True', 'to': u"orm['accounts.User']"}), |
||||||
|
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), |
||||||
|
'facebook': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'foundation': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'linkedin': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'rating': ('django.db.models.fields.IntegerField', [], {'default': '100'}), |
||||||
|
'staff_number': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), |
||||||
|
'tag': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['theme.Tag']"}), |
||||||
|
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['theme.Theme']"}), |
||||||
|
'twitter': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'max_length': '255'}), |
||||||
|
'vk': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'conference.conference': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'Conference', 'index_together': '()'}, |
||||||
|
'audience': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), |
||||||
|
'canceled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'canceled_by_administrator': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'city': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference_city'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), |
||||||
|
'company': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference_companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['company.Company']"}), |
||||||
|
'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference_country'", 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}), |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'currency': ('functions.custom_fields.EnumField', [], {'default': "'RUB'", 'values': "('RUB', 'USD', 'EUR', 'RMB', 'GBP', 'AED', 'SGD', 'TRY', 'CZK', 'CHF', 'SEK', 'LKR', 'UAH', 'IDR', 'PLN', 'JPY')"}), |
||||||
|
'data_begin': ('django.db.models.fields.DateField', [], {}), |
||||||
|
'data_end': ('django.db.models.fields.DateField', [], {}), |
||||||
|
'discount': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'expohit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'foundation_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'link': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), |
||||||
|
'main': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.MainPage']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), |
||||||
|
'main_page': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), |
||||||
|
'max_price': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'members': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'min_price': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'moved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), |
||||||
|
'org': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), |
||||||
|
'organiser': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference_organisers'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['organiser.Organiser']"}), |
||||||
|
'paid_new': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Paid']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), |
||||||
|
'periodic': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'photogallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), |
||||||
|
'place': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference_place'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['place_conference.PlaceConference']"}), |
||||||
|
'place_alt': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), |
||||||
|
'quality_label': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), |
||||||
|
'rating': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), |
||||||
|
'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), |
||||||
|
'tag': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference_tags'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['theme.Tag']"}), |
||||||
|
'tax': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'conference_themes'", 'symmetrical': 'False', 'to': u"orm['theme.Theme']"}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), |
||||||
|
'users': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference_users'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['accounts.User']"}), |
||||||
|
'views': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), |
||||||
|
'visitors': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'contenttypes.contenttype': { |
||||||
|
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, |
||||||
|
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) |
||||||
|
}, |
||||||
|
u'country.area': { |
||||||
|
'Meta': {'ordering': "['translations__name']", 'unique_together': '()', 'object_name': 'Area', 'index_together': '()'}, |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) |
||||||
|
}, |
||||||
|
u'country.country': { |
||||||
|
'Meta': {'ordering': "['translations__name']", 'unique_together': '()', 'object_name': 'Country', 'index_together': '()'}, |
||||||
|
'area': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Area']"}), |
||||||
|
'big_cities': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'cities'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['city.City']"}), |
||||||
|
'capital': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'capital'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), |
||||||
|
'country_code': ('django.db.models.fields.CharField', [], {'max_length': '2'}), |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'currency': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['directories.Currency']", 'null': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'language': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['directories.Language']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'latitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'longitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'old_url': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '55'}), |
||||||
|
'phone_code': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'population': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), |
||||||
|
'teritory': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'time_delivery': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'timezone': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}) |
||||||
|
}, |
||||||
|
u'directories.currency': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'Currency', 'index_together': '()'}, |
||||||
|
'code': ('django.db.models.fields.CharField', [], {'max_length': '3'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) |
||||||
|
}, |
||||||
|
u'directories.iata': { |
||||||
|
'Meta': {'object_name': 'Iata'}, |
||||||
|
'airport': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||||
|
'code': ('django.db.models.fields.CharField', [], {'max_length': '4'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) |
||||||
|
}, |
||||||
|
u'directories.language': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'Language', 'index_together': '()'}, |
||||||
|
'code': ('django.db.models.fields.CharField', [], {'max_length': '2'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'language': ('django.db.models.fields.CharField', [], {'max_length': '255'}) |
||||||
|
}, |
||||||
|
u'expobanner.banner': { |
||||||
|
'Meta': {'ordering': "['sort']", 'object_name': 'Banner'}, |
||||||
|
'alt': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||||
|
'cookie': ('django.db.models.fields.CharField', [], {'default': "'expo_b_default_popup'", 'max_length': '30', 'null': 'True', 'blank': 'True'}), |
||||||
|
'country': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['country.Country']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'flash': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2016, 5, 18, 0, 0)'}), |
||||||
|
'group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'banners'", 'null': 'True', 'to': u"orm['expobanner.BannerGroup']"}), |
||||||
|
'html': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'img': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), |
||||||
|
'link': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'often': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '1'}), |
||||||
|
'paid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'popup': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'sort': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '500'}), |
||||||
|
'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}), |
||||||
|
'text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Theme']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'to': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'url': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), |
||||||
|
'urls': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'url_banners'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['expobanner.URL']"}) |
||||||
|
}, |
||||||
|
u'expobanner.bannergroup': { |
||||||
|
'Meta': {'ordering': "['name']", 'object_name': 'BannerGroup'}, |
||||||
|
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'height': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), |
||||||
|
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), |
||||||
|
'speed': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '2000'}), |
||||||
|
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '0'}) |
||||||
|
}, |
||||||
|
u'expobanner.mainpage': { |
||||||
|
'Meta': {'ordering': "['-public']", 'object_name': 'MainPage'}, |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'link': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Banner']"}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'position': ('django.db.models.fields.PositiveIntegerField', [], {'default': '2', 'null': 'True', 'blank': 'True'}), |
||||||
|
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}) |
||||||
|
}, |
||||||
|
u'expobanner.paid': { |
||||||
|
'Meta': {'ordering': "['-public']", 'object_name': 'Paid'}, |
||||||
|
'catalog': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_catalog'", 'to': u"orm['expobanner.Banner']"}), |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'kind': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': '1', 'db_index': 'True'}), |
||||||
|
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'official': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_official'", 'to': u"orm['expobanner.Banner']"}), |
||||||
|
'organiser': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}), |
||||||
|
'participation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_participation'", 'to': u"orm['expobanner.Banner']"}), |
||||||
|
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}), |
||||||
|
'tickets': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'paid_tickets'", 'to': u"orm['expobanner.Banner']"}) |
||||||
|
}, |
||||||
|
u'expobanner.top': { |
||||||
|
'Meta': {'ordering': "['position']", 'object_name': 'Top'}, |
||||||
|
'catalog': ('django.db.models.fields.CharField', [], {'max_length': '16'}), |
||||||
|
'cities': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'top_in_set'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['city.City']"}), |
||||||
|
'country': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['country.Country']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'excluded_cities': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['city.City']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'excluded_tags': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Tag']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'fr': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2016, 5, 18, 0, 0)'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'link': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Banner']"}), |
||||||
|
'months': ('functions.custom_fields.MonthMultiSelectField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}), |
||||||
|
'position': ('django.db.models.fields.PositiveIntegerField', [], {'default': '2', 'null': 'True', 'blank': 'True'}), |
||||||
|
'stat_pswd': ('django.db.models.fields.CharField', [], {'max_length': '16'}), |
||||||
|
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Theme']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'to': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'years': ('django.db.models.fields.PositiveSmallIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'expobanner.url': { |
||||||
|
'Meta': {'ordering': "['-created_at']", 'object_name': 'URL'}, |
||||||
|
'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'regex': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'sites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'site_urls'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['sites.Site']"}), |
||||||
|
'title': ('django.db.models.fields.CharField', [], {'max_length': '256'}), |
||||||
|
'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'url': ('django.db.models.fields.CharField', [], {'max_length': '2048'}) |
||||||
|
}, |
||||||
|
u'exposition.exposition': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'Exposition', 'index_together': '()'}, |
||||||
|
'application_deadline': ('django.db.models.fields.DateField', [], {'null': 'True'}), |
||||||
|
'area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'audience': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), |
||||||
|
'canceled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'canceled_by_administrator': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'city': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'exposition_city'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), |
||||||
|
'company': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_companies'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['company.Company']"}), |
||||||
|
'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'exposition_country'", 'on_delete': 'models.PROTECT', 'to': u"orm['country.Country']"}), |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'exposition_creator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['accounts.User']"}), |
||||||
|
'currency': ('functions.custom_fields.EnumField', [], {'default': "'RUB'", 'values': "('RUB', 'USD', 'EUR', 'RMB', 'GBP', 'AED', 'SGD', 'TRY', 'CZK', 'CHF', 'SEK', 'LKR', 'UAH', 'IDR', 'PLN', 'JPY')"}), |
||||||
|
'data_begin': ('django.db.models.fields.DateField', [], {}), |
||||||
|
'data_end': ('django.db.models.fields.DateField', [], {}), |
||||||
|
'discount': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'expohit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'foundation_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), |
||||||
|
'main': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.MainPage']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), |
||||||
|
'main_page': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), |
||||||
|
'max_closed_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'max_closed_equipped_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'max_open_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'members': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'min_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'min_closed_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'min_closed_equipped_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'min_open_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'min_stand_size': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'moved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), |
||||||
|
'org': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), |
||||||
|
'organiser': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_organisers'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['organiser.Organiser']"}), |
||||||
|
'paid_new': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Paid']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), |
||||||
|
'periodic': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'photogallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), |
||||||
|
'place': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'exposition_place'", 'null': 'True', 'on_delete': 'models.PROTECT', 'to': u"orm['place_exposition.PlaceExposition']"}), |
||||||
|
'place_alt': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), |
||||||
|
'price_catalog': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'quality_label': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), |
||||||
|
'rating': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||||
|
'registration_link': ('django.db.models.fields.URLField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'registration_payment': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'services': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), |
||||||
|
'tag': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_tags'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['theme.Tag']"}), |
||||||
|
'tax': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'exposition_themes'", 'symmetrical': 'False', 'to': u"orm['theme.Theme']"}), |
||||||
|
'top': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['expobanner.Top']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), |
||||||
|
'users': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'exposition_users'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['accounts.User']"}), |
||||||
|
'views': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), |
||||||
|
'visitors': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'file.filemodel': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'FileModel', 'index_together': '()'}, |
||||||
|
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True'}), |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'file_path': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), |
||||||
|
'file_type': ('functions.custom_fields.EnumField', [], {'default': "'PDF'", 'values': "('PDF', 'DOC', 'TXT', 'OTHER', 'JPG', 'BMP', 'PNG', 'GIF')", 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'img_height': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'img_width': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'purpose': ('functions.custom_fields.EnumField', [], {'default': "'photo'", 'values': "['photo', 'flat', 'logo', 'map', 'scheme teritory', 'diplom', 'preview', 'preview2']"}) |
||||||
|
}, |
||||||
|
u'note.note': { |
||||||
|
'Meta': {'object_name': 'Note'}, |
||||||
|
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), |
||||||
|
'text': ('django.db.models.fields.TextField', [], {}), |
||||||
|
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['accounts.User']"}) |
||||||
|
}, |
||||||
|
u'organiser.organiser': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'Organiser', 'index_together': '()'}, |
||||||
|
'active': ('django.db.models.fields.NullBooleanField', [], {'default': '0', 'null': 'True', 'blank': 'True'}), |
||||||
|
'address': ('functions.custom_fields.LocationField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'city': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['city.City']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), |
||||||
|
'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Country']", 'null': 'True', 'on_delete': 'models.PROTECT', 'blank': 'True'}), |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), |
||||||
|
'events_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'facebook': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'foundation': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'linkedin': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'place_conference': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'organiser_place_conference'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['place_conference.PlaceConference']"}), |
||||||
|
'place_exposition': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'organiser_place_exposition'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['place_exposition.PlaceExposition']"}), |
||||||
|
'rating': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||||
|
'staff_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'tag': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Tag']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'theme': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['theme.Theme']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'twitter': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'vk': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'web_page': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'photologue.gallery': { |
||||||
|
'Meta': {'ordering': "['-date_added']", 'unique_together': '()', 'object_name': 'Gallery', 'index_together': '()'}, |
||||||
|
'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'photos': ('sortedm2m.fields.SortedManyToManyField', [], {'blank': 'True', 'related_name': "'galleries'", 'null': 'True', 'symmetrical': 'False', 'to': u"orm['photologue.Photo']"}), |
||||||
|
'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '200'}), |
||||||
|
'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'photologue.photo': { |
||||||
|
'Meta': {'ordering': "['sort']", 'unique_together': '()', 'object_name': 'Photo', 'index_together': '()'}, |
||||||
|
'crop_from': ('django.db.models.fields.CharField', [], {'default': "'center'", 'max_length': '10', 'blank': 'True'}), |
||||||
|
'date_added': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), |
||||||
|
'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'effect': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'photo_related'", 'null': 'True', 'to': u"orm['photologue.PhotoEffect']"}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), |
||||||
|
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '200'}), |
||||||
|
'sort': ('django.db.models.fields.PositiveIntegerField', [], {'default': '10', 'null': 'True', 'db_index': 'True'}), |
||||||
|
'tags': ('photologue.models.TagField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['photologue.UserMark']", 'null': 'True', 'symmetrical': 'False'}), |
||||||
|
'view_count': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}) |
||||||
|
}, |
||||||
|
u'photologue.photoeffect': { |
||||||
|
'Meta': {'object_name': 'PhotoEffect'}, |
||||||
|
'background_color': ('django.db.models.fields.CharField', [], {'default': "'#FFFFFF'", 'max_length': '7'}), |
||||||
|
'brightness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), |
||||||
|
'color': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), |
||||||
|
'contrast': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), |
||||||
|
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), |
||||||
|
'filters': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), |
||||||
|
'reflection_size': ('django.db.models.fields.FloatField', [], {'default': '0'}), |
||||||
|
'reflection_strength': ('django.db.models.fields.FloatField', [], {'default': '0.6'}), |
||||||
|
'sharpness': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), |
||||||
|
'transpose_method': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'photologue.usermark': { |
||||||
|
'Meta': {'object_name': 'UserMark'}, |
||||||
|
'height': ('django.db.models.fields.PositiveSmallIntegerField', [], {}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'left': ('django.db.models.fields.PositiveSmallIntegerField', [], {}), |
||||||
|
'top': ('django.db.models.fields.PositiveSmallIntegerField', [], {}), |
||||||
|
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'marks'", 'to': u"orm['accounts.User']"}), |
||||||
|
'width': ('django.db.models.fields.PositiveSmallIntegerField', [], {}) |
||||||
|
}, |
||||||
|
u'place_conference.placeconference': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'PlaceConference', 'index_together': '()'}, |
||||||
|
'address': ('functions.custom_fields.LocationField', [], {}), |
||||||
|
'amount_halls': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'banquet_hall': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'catering': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'city': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'place_conferences'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), |
||||||
|
'conference_call': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Country']", 'on_delete': 'models.PROTECT'}), |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), |
||||||
|
'exp_hall_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'exposition_hall': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'foundation_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'hotel': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'multimedia_equipment': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'total_capacity': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'translate_equipment': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'type': ('functions.custom_fields.EnumField', [], {'default': "'Convention centre'", 'values': "['Convention centre', 'Exposition centre']"}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), |
||||||
|
'video_link': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'views': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), |
||||||
|
'virtual_tour': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'web_page': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'wifi': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'place_exposition.placeexposition': { |
||||||
|
'Meta': {'ordering': "['-rating', 'id']", 'unique_together': '()', 'object_name': 'PlaceExposition', 'index_together': '()'}, |
||||||
|
'address': ('functions.custom_fields.LocationField', [], {}), |
||||||
|
'bank': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'business_centre': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'cafe': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'children_room': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'city': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'place_expositions'", 'on_delete': 'models.PROTECT', 'to': u"orm['city.City']"}), |
||||||
|
'closed_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'conference_centre': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'country': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['country.Country']", 'on_delete': 'models.PROTECT'}), |
||||||
|
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), |
||||||
|
'disabled_service': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), |
||||||
|
'event_in_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'fax': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'foundation_year': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'is_published': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), |
||||||
|
'logo': ('django.db.models.fields.files.ImageField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'mobile_application': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), |
||||||
|
'online_registration': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'open_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'parking': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'partner': ('django.db.models.fields.NullBooleanField', [], {'default': '0', 'null': 'True', 'blank': 'True'}), |
||||||
|
'phone': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'photogallery': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['photologue.Gallery']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), |
||||||
|
'press_centre': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'rating': ('django.db.models.fields.IntegerField', [], {'default': '0'}), |
||||||
|
'terminals': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'total_area': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'total_halls': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'total_pavilions': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'type': ('functions.custom_fields.EnumField', [], {'default': "'Exposition complex'", 'values': "['Exposition complex', 'Convention centre', 'Exposition centre']"}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), |
||||||
|
'views': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), |
||||||
|
'virtual_tour': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'web_page': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}), |
||||||
|
'wifi': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'sites.site': { |
||||||
|
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"}, |
||||||
|
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) |
||||||
|
}, |
||||||
|
u'stats_collector.objectstats': { |
||||||
|
'Meta': {'ordering': "('created_at',)", 'object_name': 'ObjectStats'}, |
||||||
|
'conference': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['conference.Conference']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'created_at': ('django.db.models.fields.DateField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), |
||||||
|
'exposition': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['exposition.Exposition']", 'null': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'value': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'stats_collector.sectionstats': { |
||||||
|
'Meta': {'ordering': "('created_at',)", 'object_name': 'SectionStats', 'index_together': "[('content_type', 'object_id')]"}, |
||||||
|
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}), |
||||||
|
'created_at': ('django.db.models.fields.DateField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'kind': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), |
||||||
|
'object_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), |
||||||
|
'section': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), |
||||||
|
'value': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}) |
||||||
|
}, |
||||||
|
u'theme.tag': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'Tag', 'index_together': '()'}, |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), |
||||||
|
'theme': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tags'", 'on_delete': 'models.PROTECT', 'to': u"orm['theme.Theme']"}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}) |
||||||
|
}, |
||||||
|
u'theme.theme': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'Theme', 'index_together': '()'}, |
||||||
|
'blogtheme_linking': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['theme.ThemeBlog']", 'null': 'True'}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'main_page': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'db_index': 'True'}), |
||||||
|
'old_url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}), |
||||||
|
'types': ('django.db.models.fields.BigIntegerField', [], {'default': 'None'}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}) |
||||||
|
}, |
||||||
|
u'theme.themeblog': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'ThemeBlog', 'index_together': '()'}, |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), |
||||||
|
'inflect': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), |
||||||
|
'url': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '255'}) |
||||||
|
}, |
||||||
|
u'translator.translator': { |
||||||
|
'Meta': {'unique_together': '()', 'object_name': 'Translator', 'index_together': '()'}, |
||||||
|
'birth': ('django.db.models.fields.DateField', [], {}), |
||||||
|
'car': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), |
||||||
|
'gender': ('functions.custom_fields.EnumField', [], {'default': "'male'", 'values': "('male', 'female')"}), |
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
complete_apps = ['stats_collector'] |
||||||
@ -0,0 +1,79 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
from django.contrib.contenttypes.models import ContentType |
||||||
|
|
||||||
|
from .models import SectionStats, ObjectStats |
||||||
|
|
||||||
|
|
||||||
|
class SectionBaseMixin(object): |
||||||
|
""" |
||||||
|
Section stat base mixin |
||||||
|
""" |
||||||
|
section = None |
||||||
|
stat_kind = None |
||||||
|
|
||||||
|
def render_to_response(self, context, **response_kwargs): |
||||||
|
try: |
||||||
|
SectionStats.cache_count_add( |
||||||
|
self.section, self.stat_kind, None, None, 1) |
||||||
|
# ['section', 'kind', 'content_type', 'object_id', 'value'] |
||||||
|
except: |
||||||
|
pass |
||||||
|
return super(SectionBaseMixin, self).render_to_response(context, **response_kwargs) |
||||||
|
|
||||||
|
|
||||||
|
class ExpoSectionBaseMixin(object): |
||||||
|
section = 'expo' |
||||||
|
|
||||||
|
|
||||||
|
class ExpoSectionMixin(ExpoSectionBaseMixin, SectionBaseMixin): |
||||||
|
pass |
||||||
|
|
||||||
|
|
||||||
|
class ConfSectionBaseMixin(object): |
||||||
|
section = 'conf' |
||||||
|
|
||||||
|
|
||||||
|
class ConfSectionMixin(ConfSectionBaseMixin, SectionBaseMixin): |
||||||
|
pass |
||||||
|
|
||||||
|
|
||||||
|
class SectionKindBaseMixin(object): |
||||||
|
section = None |
||||||
|
stat_kind = None |
||||||
|
|
||||||
|
def render_to_response(self, context, **response_kwargs): |
||||||
|
if self.stat_kind is not None and self.stat_kind in self.kwargs: |
||||||
|
try: |
||||||
|
obj = self.kwargs.get(self.stat_kind) |
||||||
|
content_type = ContentType.objects.get_for_model(obj) |
||||||
|
SectionStats.cache_count_add( |
||||||
|
self.section, self.stat_kind, content_type.pk, obj.pk, 1) |
||||||
|
# ['section', 'kind', 'content_type', 'object_id', 'value'] |
||||||
|
except: |
||||||
|
pass |
||||||
|
# except Exception as e: |
||||||
|
# print(e) |
||||||
|
return super(SectionKindBaseMixin, self).render_to_response(context, **response_kwargs) |
||||||
|
|
||||||
|
|
||||||
|
class ExpoSectionKindMixin(ExpoSectionBaseMixin, SectionKindBaseMixin): |
||||||
|
pass |
||||||
|
|
||||||
|
|
||||||
|
class ConfSectionKindMixin(ConfSectionBaseMixin, SectionKindBaseMixin): |
||||||
|
pass |
||||||
|
|
||||||
|
|
||||||
|
class ObjectStatMixin(object): |
||||||
|
def render_to_response(self, context, **response_kwargs): |
||||||
|
try: |
||||||
|
obj = self.object |
||||||
|
if obj.__class__.__name__.lower() == 'conference': |
||||||
|
ObjectStats.cache_count_add(obj.pk, None, 1) |
||||||
|
else: |
||||||
|
ObjectStats.cache_count_add(None, obj.pk, 1) |
||||||
|
# ['conference_id', 'exposition_id', 'value'] |
||||||
|
except: |
||||||
|
pass |
||||||
|
return super(ObjectStatMixin, self).render_to_response(context, **response_kwargs) |
||||||
|
|
||||||
@ -0,0 +1,102 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
import json |
||||||
|
import time |
||||||
|
from collections import namedtuple |
||||||
|
from datetime import timedelta |
||||||
|
|
||||||
|
from conference.models import Conference |
||||||
|
from django.contrib.contenttypes.generic import GenericForeignKey |
||||||
|
from django.contrib.contenttypes.models import ContentType |
||||||
|
from django.core.cache import cache |
||||||
|
from django.core.serializers.json import DjangoJSONEncoder |
||||||
|
from django.db import models |
||||||
|
from django.utils import timezone |
||||||
|
from django_pandas.managers import DataFrameManager |
||||||
|
from exposition.models import Exposition |
||||||
|
|
||||||
|
|
||||||
|
class StatsSuperBase(models.Model): |
||||||
|
_strftime_format = '%d.%m.%Y' |
||||||
|
_cache_key = 'section_stats_{date}' |
||||||
|
|
||||||
|
created_at = models.DateField('created at', blank=True, null=True, db_index=True) |
||||||
|
value = models.PositiveIntegerField('value', blank=True, null=True) |
||||||
|
|
||||||
|
class Meta: |
||||||
|
verbose_name = 'Stats Object' |
||||||
|
verbose_name_plural = 'Stats Objects' |
||||||
|
ordering = ('created_at',) |
||||||
|
abstract = True |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def make_key(cls, date=None): |
||||||
|
if date is None: |
||||||
|
date = timezone.now().date() |
||||||
|
return cls._cache_key.format(date=date.isoformat()) |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def dump_item(self, item): |
||||||
|
return json.dumps(item, cls=DjangoJSONEncoder) |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def create_item(cls, *args, **kwargs): |
||||||
|
return cls._collector_class(*args, **kwargs) |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def create_instance(cls, *args, **kwargs): |
||||||
|
created_at = kwargs.pop('created_at', None) |
||||||
|
item = cls.create_item(*args, **kwargs) |
||||||
|
return cls(created_at=created_at, **item._asdict()) |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def create_cache_item(cls, *args, **kwargs): |
||||||
|
return cls.dump_item(cls.create_item(*args, **kwargs)) |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def cache_count_add(cls, *args, **kwargs): |
||||||
|
item = cls.create_cache_item(*args, **kwargs) |
||||||
|
key = cls.make_key() |
||||||
|
cache._client.rpush(key, item) |
||||||
|
return item |
||||||
|
|
||||||
|
@property |
||||||
|
def created_at_(self): |
||||||
|
return self.created_at.strftime(self._strftime_format) |
||||||
|
|
||||||
|
|
||||||
|
# class StatsBase(StatsSuperBase): |
||||||
|
|
||||||
|
|
||||||
|
class SectionStats(StatsSuperBase): |
||||||
|
_collector_class = namedtuple( |
||||||
|
'SectionCollector', |
||||||
|
['section', 'kind', 'content_type_id', 'object_id', 'value'] |
||||||
|
) |
||||||
|
|
||||||
|
content_type = models.ForeignKey(ContentType, blank=True, null=True) |
||||||
|
object_id = models.IntegerField(blank=True, null=True) |
||||||
|
content_object = GenericForeignKey('content_type', 'object_id') |
||||||
|
|
||||||
|
class Meta(StatsSuperBase.Meta): |
||||||
|
index_together = [ |
||||||
|
("content_type", "object_id"), |
||||||
|
] |
||||||
|
|
||||||
|
section = models.CharField('section', blank=True, null=True, max_length=32) |
||||||
|
kind = models.CharField('kind', blank=True, null=True, max_length=64) |
||||||
|
|
||||||
|
def __unicode__(self): |
||||||
|
return u'{0}:{1} {2}'.format(self.section, self.kind, self.created_at.strftime(self._strftime_format)) |
||||||
|
|
||||||
|
|
||||||
|
class ObjectStats(StatsSuperBase): |
||||||
|
_cache_key = 'obj_stats_{date}' |
||||||
|
_collector_class = namedtuple( |
||||||
|
'ObjectCollector', |
||||||
|
['conference_id', 'exposition_id', 'value'] |
||||||
|
) |
||||||
|
exposition = models.ForeignKey(Exposition, null=True, blank=True) |
||||||
|
conference = models.ForeignKey(Conference, null=True, blank=True) |
||||||
|
|
||||||
|
def __unicode__(self): |
||||||
|
return u'{0}'.format(self.created_at.strftime(self._strftime_format)) |
||||||
@ -0,0 +1,16 @@ |
|||||||
|
""" |
||||||
|
This file demonstrates writing tests using the unittest module. These will pass |
||||||
|
when you run "manage.py test". |
||||||
|
|
||||||
|
Replace this with more appropriate tests for your application. |
||||||
|
""" |
||||||
|
|
||||||
|
from django.test import TestCase |
||||||
|
|
||||||
|
|
||||||
|
class SimpleTest(TestCase): |
||||||
|
def test_basic_addition(self): |
||||||
|
""" |
||||||
|
Tests that 1 + 1 always equals 2. |
||||||
|
""" |
||||||
|
self.assertEqual(1 + 1, 2) |
||||||
@ -0,0 +1,15 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
import json |
||||||
|
from collections import Counter |
||||||
|
|
||||||
|
|
||||||
|
def items_iterator(objects_list, model): |
||||||
|
for string_item, count in Counter(objects_list).items(): |
||||||
|
item = model._collector_class(*json.loads(string_item)) |
||||||
|
yield item._replace(value=item.value * count) |
||||||
|
|
||||||
|
|
||||||
|
def unique_items_iterator(objects_list): |
||||||
|
for string_item, count in Counter(objects_list).items(): |
||||||
|
item = json.loads(string_item) |
||||||
|
yield tuple(item[:-1]), item[-1] * count |
||||||
@ -0,0 +1 @@ |
|||||||
|
# Create your views here. |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
{% if content_form %} |
||||||
|
{{ content_form.content_type }} |
||||||
|
<div class="control-group {% if content_form.ct_objects.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ content_form.ct_objects.label }}:</b></label> |
||||||
|
<div class="controls">{{ content_form.ct_objects }} |
||||||
|
<span class="help-inline">{{ content_form.ct_objects.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
@ -0,0 +1,40 @@ |
|||||||
|
{% if params_form %} |
||||||
|
|
||||||
|
<div class="span4" style="margin-left: 0px;"> |
||||||
|
{# country #} |
||||||
|
<div class="control-group {% if params_form.country.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ params_form.country.label }}:</b></label> |
||||||
|
<div class="controls">{{ params_form.country }} |
||||||
|
<span class="help-inline">{{ params_form.country.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{# theme #} |
||||||
|
<div class="control-group {% if params_form.theme.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ params_form.theme.label }}:</b></label> |
||||||
|
<div class="controls">{{ params_form.theme }} |
||||||
|
<span class="help-inline">{{ params_form.theme.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="span4" style="margin-left: 0px;"> |
||||||
|
{# city #} |
||||||
|
<div class="control-group {% if params_form.city.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ params_form.city.label }}:</b></label> |
||||||
|
<div class="controls">{{ params_form.city }} |
||||||
|
<span class="help-inline">{{ params_form.city.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
|
||||||
|
{# tag #} |
||||||
|
<div class="control-group {% if params_form.tag.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ params_form.tag.label }}:</b></label> |
||||||
|
<div class="controls">{{ params_form.tag }} |
||||||
|
<span class="help-inline">{{ params_form.tag.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{% endif %} |
||||||
@ -0,0 +1,152 @@ |
|||||||
|
{% extends "base.html" %} |
||||||
|
{% load static %} |
||||||
|
{% load i18n %} |
||||||
|
|
||||||
|
{% block main_js_exlude %} |
||||||
|
{% endblock main_js_exlude %} |
||||||
|
|
||||||
|
|
||||||
|
{% block scripts %} |
||||||
|
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> |
||||||
|
|
||||||
|
<script type="text/javascript"> |
||||||
|
google.charts.load('current', {'packages':['corechart'], 'language': '{{ LANGUAGE_CODE }}'}); |
||||||
|
|
||||||
|
{% if data %} |
||||||
|
function drawChart() { |
||||||
|
var data = google.visualization.arrayToDataTable([ |
||||||
|
{% autoescape off %} |
||||||
|
[{type: 'date', label: '{% trans "Дата" %}'}, '{% trans "Просмотры" %}'], |
||||||
|
{% for item in data %} |
||||||
|
{{ item }}, |
||||||
|
{% endfor %} |
||||||
|
{% endautoescape %} |
||||||
|
]); |
||||||
|
var options = { |
||||||
|
title: '{% trans "Статистика разделов" %}', |
||||||
|
legend: { position: 'bottom' }, |
||||||
|
vAxis: { |
||||||
|
title: '{% trans "Просмотры" %}' |
||||||
|
}, |
||||||
|
width: 900, |
||||||
|
height: 500, |
||||||
|
}; |
||||||
|
|
||||||
|
var chart = new google.visualization.LineChart(document.getElementById('curve_chart')); |
||||||
|
|
||||||
|
chart.draw(data, options); |
||||||
|
} |
||||||
|
|
||||||
|
google.charts.setOnLoadCallback(drawChart); |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
{% if data_summary %} |
||||||
|
function drawSummaryChart() { |
||||||
|
var data = google.visualization.arrayToDataTable([ |
||||||
|
{% autoescape off %} |
||||||
|
['name', '{% trans "Просмотры" %}', { role: 'annotation' }], |
||||||
|
['{% trans "События" %}', {{ data_summary }}, {{ data_summary }}], |
||||||
|
{% endautoescape %} |
||||||
|
]); |
||||||
|
var options = { |
||||||
|
title: '{% trans "Сумарные данные" %}', |
||||||
|
// legend: { position: 'bottom' }, |
||||||
|
// xAxis: { |
||||||
|
// title: '{% trans "Просмотры" %}' |
||||||
|
// }, |
||||||
|
legend: { position: "none" }, |
||||||
|
width: 900, |
||||||
|
height: 500, |
||||||
|
}; |
||||||
|
|
||||||
|
var rchart = new google.visualization.BarChart(document.getElementById('bar_chart')); |
||||||
|
|
||||||
|
rchart.draw(data, options); |
||||||
|
} |
||||||
|
|
||||||
|
google.charts.setOnLoadCallback(drawSummaryChart); |
||||||
|
{% endif %} |
||||||
|
|
||||||
|
$(document).ready(function(){ |
||||||
|
$('#id_date_begin').datetimepicker({ |
||||||
|
todayHighlight: true, |
||||||
|
format : 'dd.mm.yyyy', |
||||||
|
minView: 2, |
||||||
|
language: '{{ LANGUAGE_CODE }}' |
||||||
|
}); |
||||||
|
$('#id_date_end').datetimepicker({ |
||||||
|
todayHighlight: true, |
||||||
|
format : 'dd.mm.yyyy', |
||||||
|
minView: 2, |
||||||
|
language: '{{ LANGUAGE_CODE }}' |
||||||
|
}); |
||||||
|
|
||||||
|
$('select').select2('destroy'); |
||||||
|
$('select:not(#id_event)').select2({width: "element"}); |
||||||
|
|
||||||
|
}); |
||||||
|
</script> |
||||||
|
{% endblock scripts %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-arrow-down"></i>Фильтр</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
<form id="stat_filter_form" action="." method="POST"> |
||||||
|
{% csrf_token %} |
||||||
|
|
||||||
|
<div class="span8"> |
||||||
|
<div class="span4" style="margin-left: 0px;"> |
||||||
|
{# date_begin #} |
||||||
|
<div class="control-group {% if form.date_begin.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ form.date_begin.label }}:</b></label> |
||||||
|
<div class="controls">{{ form.date_begin }} |
||||||
|
<span class="help-inline">{{ form.date_begin.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{# event #} |
||||||
|
<div class="control-group {% if form.event.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ form.event.label }}:</b></label> |
||||||
|
<div class="controls">{{ form.event }} |
||||||
|
<span class="help-inline">{{ form.event.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="span4" style="margin-left: 0px;"> |
||||||
|
{# date_end #} |
||||||
|
<div class="control-group {% if form.date_end.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ form.date_end.label }}:</b></label> |
||||||
|
<div class="controls">{{ form.date_end }} |
||||||
|
<span class="help-inline">{{ form.date_end.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="span8 params_form"> |
||||||
|
{% include "admin/stats/event_params_form.html" %} |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="span8"> |
||||||
|
{% if form.errors %} |
||||||
|
<div class="alert alert-error"> |
||||||
|
{% for key, value in form.errors.items %} |
||||||
|
<p>{{ value }}</p> |
||||||
|
{% endfor %} |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
<button type="submit">{% trans "Применить" %}</button> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="span9"> |
||||||
|
<div id="curve_chart"></div> |
||||||
|
<div id="bar_chart"></div> |
||||||
|
</div> |
||||||
|
{% endblock body %} |
||||||
@ -0,0 +1,191 @@ |
|||||||
|
{% extends "base.html" %} |
||||||
|
{% load static %} |
||||||
|
{% load i18n %} |
||||||
|
|
||||||
|
{% block scripts %} |
||||||
|
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> |
||||||
|
|
||||||
|
<script type="text/javascript"> |
||||||
|
google.charts.load('current', {'packages':['corechart'], 'language': '{{ LANGUAGE_CODE }}'}); |
||||||
|
|
||||||
|
function drawChart() { |
||||||
|
var data = google.visualization.arrayToDataTable([ |
||||||
|
{% autoescape off %} |
||||||
|
[{type: 'date', label: '{% trans "Дата" %}'}, {{ columns }}], |
||||||
|
{% for item in data %} |
||||||
|
{{ item }}, |
||||||
|
{% endfor %} |
||||||
|
{% endautoescape %} |
||||||
|
]); |
||||||
|
var options = { |
||||||
|
title: 'Статистика разделов', |
||||||
|
legend: { position: 'bottom' }, |
||||||
|
vAxis: { |
||||||
|
title: '{% trans "Просмотры" %}' |
||||||
|
}, |
||||||
|
width: 900, |
||||||
|
height: 500, |
||||||
|
}; |
||||||
|
|
||||||
|
var chart = new google.visualization.LineChart(document.getElementById('curve_chart')); |
||||||
|
|
||||||
|
chart.draw(data, options); |
||||||
|
} |
||||||
|
|
||||||
|
function drawSummaryChart() { |
||||||
|
var data = google.visualization.arrayToDataTable([ |
||||||
|
{% autoescape off %} |
||||||
|
['name', '{% trans "Просмотры" %}', { role: 'annotation' }], |
||||||
|
{% for item in data_summary %} |
||||||
|
['{{ item.name }}', {{ item.val }}, {{ item.val }}], |
||||||
|
{% endfor %} |
||||||
|
{% endautoescape %} |
||||||
|
]); |
||||||
|
var options = { |
||||||
|
title: '{% trans "Сумарные данные" %}', |
||||||
|
// legend: { position: 'bottom' }, |
||||||
|
// xAxis: { |
||||||
|
// title: '{% trans "Просмотры" %}' |
||||||
|
// }, |
||||||
|
legend: { position: "none" }, |
||||||
|
width: 900, |
||||||
|
height: 500, |
||||||
|
}; |
||||||
|
|
||||||
|
var rchart = new google.visualization.BarChart(document.getElementById('bar_chart')); |
||||||
|
|
||||||
|
rchart.draw(data, options); |
||||||
|
} |
||||||
|
|
||||||
|
google.charts.setOnLoadCallback(drawChart); |
||||||
|
google.charts.setOnLoadCallback(drawSummaryChart); |
||||||
|
|
||||||
|
function initStatFilterForm() { |
||||||
|
form = $('form#stat_filter_form'); |
||||||
|
ct_form_div = form.find('div#ct_form'); |
||||||
|
|
||||||
|
form.find('input:not(#id_content_type), select:not(#id_ct_objects)').on('change', function() { |
||||||
|
form.find('div.alert').remove(); |
||||||
|
form.find('select#id_ct_objects').select2('val', ''); |
||||||
|
|
||||||
|
$.ajax({ |
||||||
|
url: form.attr('action'), |
||||||
|
type: 'POST', |
||||||
|
dataType: 'json', |
||||||
|
data: form.serializeArray(), |
||||||
|
}) |
||||||
|
.done(function(data) { |
||||||
|
if (data.success) { |
||||||
|
// form.find('select#id_ct_objects').select2('destroy'); |
||||||
|
ct_form_div.html(data.html); |
||||||
|
form.find('select#id_ct_objects').select2({width: "element"}); |
||||||
|
|
||||||
|
} else { |
||||||
|
$.each(data.errors, function(i, val) { |
||||||
|
if (i == '__all__') { |
||||||
|
form.find('button').before('<div class="alert alert-error"></div>'); |
||||||
|
alert_div = form.find('div.alert'); |
||||||
|
for (var error = 0; error < val.length; error++) { |
||||||
|
alert_div.prepend('<p>' + val[error] + '</p>'); |
||||||
|
} |
||||||
|
} else { |
||||||
|
field = form.find('input[name="' + i + '"]') |
||||||
|
field.parents('div.control-group').addClass('error'); |
||||||
|
field.siblings('div.help-inline').html(val); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
console.log(data); |
||||||
|
}) |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
$(document).ready(function(){ |
||||||
|
$('#id_date_begin').datetimepicker({ |
||||||
|
todayHighlight: true, |
||||||
|
format : 'dd.mm.yyyy', |
||||||
|
minView: 2, |
||||||
|
language: '{{ LANGUAGE_CODE }}' |
||||||
|
}); |
||||||
|
$('#id_date_end').datetimepicker({ |
||||||
|
todayHighlight: true, |
||||||
|
format : 'dd.mm.yyyy', |
||||||
|
minView: 2, |
||||||
|
language: '{{ LANGUAGE_CODE }}' |
||||||
|
}); |
||||||
|
|
||||||
|
$('select:not(#id_ct_objects)').select2('destroy'); |
||||||
|
// $('#id_ct_objects').select2({width: "element"}); |
||||||
|
|
||||||
|
initStatFilterForm(); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
{% endblock scripts %} |
||||||
|
|
||||||
|
{% block body %} |
||||||
|
<div class="box span8"> |
||||||
|
<div class="box-header well"> |
||||||
|
<h2><i class="icon-arrow-down"></i>Фильтр</h2> |
||||||
|
</div> |
||||||
|
<div class="box-content"> |
||||||
|
<form id="stat_filter_form" action="." method="POST"> |
||||||
|
{% csrf_token %} |
||||||
|
|
||||||
|
<div class="span4" style="margin-left: 0px;"> |
||||||
|
{# date_begin #} |
||||||
|
<div class="control-group {% if form.date_begin.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ form.date_begin.label }}:</b></label> |
||||||
|
<div class="controls">{{ form.date_begin }} |
||||||
|
<span class="help-inline">{{ form.date_begin.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{# section #} |
||||||
|
<div class="control-group {% if form.section.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ form.section.label }}:</b></label> |
||||||
|
<div class="controls">{{ form.section }} |
||||||
|
<span class="help-inline">{{ form.section.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="span4" style="margin-left: 0px;"> |
||||||
|
{# date_end #} |
||||||
|
<div class="control-group {% if form.date_end.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ form.date_end.label }}:</b></label> |
||||||
|
<div class="controls">{{ form.date_end }} |
||||||
|
<span class="help-inline">{{ form.date_end.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{# kind #} |
||||||
|
<div class="control-group {% if form.kind.errors %}error{% endif %}"> |
||||||
|
<label class="control-label"><b>{{ form.kind.label }}:</b></label> |
||||||
|
<div class="controls">{{ form.kind }} |
||||||
|
<span class="help-inline">{{ form.kind.errors }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="ct_form"> |
||||||
|
{% include "admin/stats/content_type_form.html" %} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
{% if form.errors %} |
||||||
|
<div class="alert alert-error"> |
||||||
|
{% for key, value in form.errors.items %} |
||||||
|
<p>{{ value }}</p> |
||||||
|
{% endfor %} |
||||||
|
</div> |
||||||
|
{% endif %} |
||||||
|
<button type="submit">{% trans "Применить" %}</button> |
||||||
|
</form> |
||||||
|
{# style="width: 900px; height: 500px" #} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="span9"> |
||||||
|
<div id="curve_chart"></div> |
||||||
|
<div id="bar_chart"></div> |
||||||
|
</div> |
||||||
|
{% endblock body %} |
||||||
Loading…
Reference in new issue