diff --git a/expobanner/management/commands/banner_log_recalc.py b/expobanner/management/commands/banner_log_recalc.py new file mode 100644 index 00000000..2746378a --- /dev/null +++ b/expobanner/management/commands/banner_log_recalc.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +from datetime import date, datetime, timedelta + +from conference.models import Conference +from django.core.management.base import BaseCommand +from expobanner.models import Banner, Log, LogStat, PaidStat +from exposition.models import Exposition +from functions.utils import strfdelta + + +today = date.today() + + +class Command(BaseCommand): + def handle(self, *args, **options): + day = date(year=2016, month=9, day=1) + while day <= date.today(): + print(day) + start = datetime.now() + # banners + banners_ids_with_new_data = Log.objects.filter( + datetime__startswith=day, + type__in=[1, 2], + banner_id__isnull=False, + ).values_list('banner_id', flat=True).distinct() + banners = Banner.objects\ + .filter(public=True, pk__in=banners_ids_with_new_data)\ + .select_related('group') + + for banner in banners: + logstat, created = LogStat.objects.get_or_create(banner=banner, group=banner.group, date=day) + params = { + 'datetime__startswith': day, + 'banner': banner, + 'group': banner.group, + } + if logstat.updated_at is not None: + params.update({'datetime__gte': logstat.updated_at}) + + views = Log.objects.filter(type=1, **params).count() + clicks = Log.objects.filter(type=2, **params).count() + unique_views = Log.objects.filter(type=1, **params).values('ip').distinct().count() + unique_clicks = Log.objects.filter(type=2, **params).values('ip').distinct().count() + + logstat.click += clicks + logstat.view += views + logstat.unique_click += unique_clicks + logstat.unique_view += unique_views + logstat.save() + + print(strfdelta(datetime.now() - start, '%H:%M:%S')) + start = datetime.now() + + for model in [Exposition, Conference]: + self.handle_events(model, day) + + print(strfdelta(datetime.now() - start, '%H:%M:%S')) + day += timedelta(days=1) + + def handle_events(self, model, day): + # paid events + events = list(model.objects.select_related('paid_new').filter(paid_new__isnull=False)) + + for event in events: + paid = event.paid_new + + t_clicks = Log.objects.filter(datetime__startswith=day, banner=paid.tickets, type=2).count() + p_clicks = Log.objects.filter(datetime__startswith=day, banner=paid.participation, type=2).count() + o_clicks = Log.objects.filter(datetime__startswith=day, banner=paid.official, type=2).count() + c_clicks = Log.objects.filter(datetime__startswith=day, banner=paid.catalog, type=2).count() + + if any([t_clicks, p_clicks, o_clicks, c_clicks]): + paidstat, created = PaidStat.objects.get_or_create(paid=paid, date=day) + + paidstat.tickets_clicks = t_clicks + paidstat.participation_clicks = p_clicks + paidstat.official_clicks = o_clicks + paidstat.catalog_clicks = c_clicks + + paidstat.save()