From 4771fb784d844952275a87578c8a7c00354eef3d Mon Sep 17 00:00:00 2001 From: Alexander Burdeinyi Date: Tue, 13 Dec 2016 16:40:40 +0200 Subject: [PATCH 1/4] m --- expobanner/forms.py | 2 +- expobanner/managers.py | 14 ++++ expobanner/models.py | 11 +-- expobanner/utils.py | 32 +++---- settings/templatetags/tempalte_tags.py | 84 +++++++++++-------- .../c_admin/expobanner/default_form.html | 1 + 6 files changed, 86 insertions(+), 58 deletions(-) diff --git a/expobanner/forms.py b/expobanner/forms.py index ff9dcea5..b457b5b3 100644 --- a/expobanner/forms.py +++ b/expobanner/forms.py @@ -57,7 +57,7 @@ class BannerCreateForm(forms.ModelForm): text = forms.CharField(label=u'Текст', required=False, widget=CKEditorWidget) class Meta: model = Banner - exclude = ['created_at', 'updated_at', 'often', 'paid', 'stat_pswd', 'cookie', 'link'] + exclude = ['created_at', 'updated_at', 'paid', 'stat_pswd', 'cookie', 'link'] class CustomerCreateForm(forms.ModelForm): diff --git a/expobanner/managers.py b/expobanner/managers.py index e7982fc8..ab33c1f4 100644 --- a/expobanner/managers.py +++ b/expobanner/managers.py @@ -53,7 +53,21 @@ class BannerGroupCached(models.Manager): .filter(public=True, fr__lte=today)\ .filter(Q(to__gte=today) | Q(to__isnull=True))) cache.set(key, result, 70) + return result + def top_page_banners(self): + key = 'top_page_banners' + result = cache.get(key) + if not result: + try: + group = self.get(slug='top_page_banner', public=True) + today = date.today() + result = list(group.banners.prefetch_related('urls', 'theme', 'country') + .filter(public=True, fr__lte=today) + .filter(Q(to__gte=today) | Q(to__isnull=True))) + except self.DoesNotExist: + result = [] + cache.set(key, result, 70) return result diff --git a/expobanner/models.py b/expobanner/models.py index 8e2a677d..4b7587d1 100644 --- a/expobanner/models.py +++ b/expobanner/models.py @@ -104,7 +104,9 @@ class Banner(models.Model, StatMixin): """ objects = BiasedManager() - customer = models.ForeignKey(Customer, verbose_name=_(u'Заказчик'), null=True, blank=True) + customer = models.ForeignKey(Customer, verbose_name=_(u'Заказчик'), null=True, blank=True, + help_text=_(u'Работает для всех баннеров кроме верхнего.'), + ) title = models.CharField(verbose_name=_(u'Заголовок'), max_length=255, blank=True) alt = models.CharField(verbose_name=_('Alt'), max_length=255) @@ -119,10 +121,9 @@ class Banner(models.Model, StatMixin): sort = models.PositiveSmallIntegerField(verbose_name=_(u'Сорт'), default=500) group = models.ForeignKey(BannerGroup, related_name='banners', verbose_name=_(u'Место'), null=True, blank=True) often = models.PositiveSmallIntegerField( - verbose_name=_('Often'), - help_text=_('A ten will display 10 times more often that a one.'), - choices=[[i, i] for i in range(11)], - default=1 + verbose_name=_(u'Частота показа'), default=1, null=True, blank=True, + help_text=_(u'Задается в %. 20 будет соответствовать 20% показа банера из всех просмотров. Работает только для верхнего банера.'), + # choices=[[i, i] for i in xrange(11)], ) urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True) diff --git a/expobanner/utils.py b/expobanner/utils.py index 2f18bba4..81d67345 100644 --- a/expobanner/utils.py +++ b/expobanner/utils.py @@ -57,7 +57,19 @@ def set_cookie(response, key, value, days_expire = 7): return response -def get_banner_by_params(banners_list, urls, params, request): +def random_choice_banners(banners): + ''' + Include weight of customers model. + ''' + choice_from = {} + for i, banner in enumerate(banners): + key = 'customer{pk}'.format(pk=banner.customer_id) if banner.customer_id else i + choice_from.setdefault(key, []).append(banner) + pre_choiced = random.choice(choice_from.values()) + return random.choice(pre_choiced) + + +def get_banner_by_params(banners_list, urls, params, request, choicer=random_choice_banners): thematic_banners = [] url_banners = [] @@ -94,13 +106,13 @@ def get_banner_by_params(banners_list, urls, params, request): # check by url if urls: banner_urls = banner.urls.all() - print('number of queries = %d'%len(connection.queries)) + # print('number of queries = %d'%len(connection.queries)) if banner_urls: banner_urls = set(banner_urls) common_urls = set(urls).intersection(banner_urls) - print(banner, common_urls, banner_urls, urls) + # print(banner, common_urls, banner_urls, urls) if common_urls: url_banners.append(banner) continue @@ -114,23 +126,11 @@ def get_banner_by_params(banners_list, urls, params, request): if result: sort_result = get_by_sort(result) # return random.choice(sort_result) - return random_choice_banners(sort_result) + return choicer(sort_result) else: return None -def random_choice_banners(banners): - ''' - Include weight of customers model. - ''' - choice_from = {} - for i, banner in enumerate(banners): - key = 'customer{pk}'.format(pk=banner.customer_id) if banner.customer_id else i - choice_from.setdefault(key, []).append(banner) - pre_choiced = random.choice(choice_from.values()) - return random.choice(pre_choiced) - - def get_top_events(tops, params, request): catalog = params.get('catalog') country = params.get('country', '') diff --git a/settings/templatetags/tempalte_tags.py b/settings/templatetags/tempalte_tags.py index b2afe714..0446a881 100644 --- a/settings/templatetags/tempalte_tags.py +++ b/settings/templatetags/tempalte_tags.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import datetime import re +from numpy.random import choice from django import template from django.utils.translation import ugettext as _ @@ -121,47 +122,58 @@ def get_top_banner(context): elif url == u.url: good_urls.append(u) - group_banners = BannerGroup.cached.group_banners() - result = {} + banners = BannerGroup.cached.top_page_banners() cookie = None - places = ['top_page_banner'] - for group, banners in group_banners.iteritems(): - if group not in places: - continue - banner = get_banner_by_params(banners, good_urls, params, request) - # import pdb; pdb.set_trace() # on this page there is no such group - if banner: - if banner.html: - text = banner.text - img = '' - alt = '' - is_img = False - else: - text = '' - try: - img = banner.img.url - except ValueError: - continue - alt = banner.alt - is_img = True - result = {'id': group, - 'url': banner.get_click_link(), - 'is_html': banner.html, - 'is_flash': banner.flash, - 'is_img': is_img, - 'is_popup': banner.popup, - 'img': img, - 'alt': alt, - 'text': text - } - if banner.popup: - cookie = banner.cookie - # add view log - banner.log(request, 1) + result = {} + banner = get_banner_by_params(banners, good_urls, params, request, choicer=random_choice_top_banners) + if banner: + if banner.html: + text = banner.text + img = '' + alt = '' + is_img = False + else: + text = '' + try: + img = banner.img.url + except ValueError: + return {} + alt = banner.alt + is_img = True + result = {'url': banner.get_click_link(), + 'is_html': banner.html, + 'is_flash': banner.flash, + 'is_img': is_img, + 'is_popup': banner.popup, + 'img': img, + 'alt': alt, + 'text': text, + } + if banner.popup: + cookie = banner.cookie + # add view log + banner.log(request, 1) return result +def random_choice_top_banners(banners): + ''' + Include weight of often. + ''' + p = [float(x.often or 1)/100 for x in banners] + if sum(p) < 1: + p.append(1-sum(p)) + banners.append('nobanner') + elif sum(p) > 1: + _p , _p_sum = p, sum(p) + p = [1/_p_sum*x for x in _p] + banner = choice(banners, 1, p=p).item() + if banner == 'nobanner': + banner = None + return banner + + register.tag('set', set_var) register.tag('get_date', get_date) register.tag('get_date_reverse', get_date_reverse) diff --git a/templates/c_admin/expobanner/default_form.html b/templates/c_admin/expobanner/default_form.html index 46a441d9..8bf58a56 100644 --- a/templates/c_admin/expobanner/default_form.html +++ b/templates/c_admin/expobanner/default_form.html @@ -59,6 +59,7 @@
{{ field }} {{ field.errors }} +

{{ field.help_text }}

{% endfor %} From 0266fd9147f4200f189fe1c1e2df2dc21462cf63 Mon Sep 17 00:00:00 2001 From: Alexander Burdeinyi Date: Tue, 13 Dec 2016 16:43:20 +0200 Subject: [PATCH 2/4] m --- .../newsletter/templates/newsletter/AutomaticEmail_v2.html | 5 +++-- settings/templatetags/template_filters.py | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/emencia/django/newsletter/templates/newsletter/AutomaticEmail_v2.html b/emencia/django/newsletter/templates/newsletter/AutomaticEmail_v2.html index 91729a50..de89fd0a 100644 --- a/emencia/django/newsletter/templates/newsletter/AutomaticEmail_v2.html +++ b/emencia/django/newsletter/templates/newsletter/AutomaticEmail_v2.html @@ -1,4 +1,5 @@ -{% load i18n %}{% spaceless %} +{% load i18n %} +{% load tempalte_tags %}{% spaceless %}