remotes/origin/stage6
Alexander Burdeinyi 9 years ago
parent 477599018f
commit 4771fb784d
  1. 2
      expobanner/forms.py
  2. 14
      expobanner/managers.py
  3. 11
      expobanner/models.py
  4. 32
      expobanner/utils.py
  5. 36
      settings/templatetags/tempalte_tags.py
  6. 1
      templates/c_admin/expobanner/default_form.html

@ -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):

@ -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

@ -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)

@ -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', '')

@ -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,15 +122,10 @@ 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
result = {}
banner = get_banner_by_params(banners, good_urls, params, request, choicer=random_choice_top_banners)
if banner:
if banner.html:
text = banner.text
@ -141,18 +137,17 @@ def get_top_banner(context):
try:
img = banner.img.url
except ValueError:
continue
return {}
alt = banner.alt
is_img = True
result = {'id': group,
'url': banner.get_click_link(),
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
'text': text,
}
if banner.popup:
cookie = banner.cookie
@ -162,6 +157,23 @@ def get_top_banner(context):
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)

@ -59,6 +59,7 @@
<label class="control-label">{% if field.field.required %}<b>{{ field.label }}:</b>{% else %}{{ field.label }}{% endif %}</label>
<div class="controls">{{ field }}
<span class="help-inline">{{ field.errors }}</span>
<p class="help-block">{{ field.help_text }}</p>
</div>
</div>
{% endfor %}

Loading…
Cancel
Save