get banner view

remotes/origin/1203
Kotiuk Nazarii 11 years ago
parent 3d90cc78de
commit 6a07142f82
  1. 4
      country/manager.py
  2. 48
      expobanner/forms.py
  3. 28
      expobanner/managers.py
  4. 25
      expobanner/models.py
  5. 110
      expobanner/views.py
  6. 4
      functions/models_methods.py
  7. 14
      templates/admin/expobanner/default_form.html
  8. 1
      templates/client/includes/header.html

@ -7,13 +7,13 @@ from hvad.models import TranslationManager
class CountryManager(TranslationManager): class CountryManager(TranslationManager):
cache_time = 600 cache_time = 600
'''
def all(self): def all(self):
""" """
hack hack
""" """
return super(TranslationManager, self).all().filter(translations__language_code=lang()).order_by('translations__name') return super(TranslationManager, self).all().filter(translations__language_code=lang()).order_by('translations__name')
'''
def safe_get(self, **kwargs): def safe_get(self, **kwargs):
model = self.model model = self.model
try: try:

@ -28,49 +28,13 @@ class BannerGroupUpdateForm(BannerCreateGroupForm):
class BannerCreateForm(forms.ModelForm): class BannerCreateForm(forms.ModelForm):
verbose = u'Создать банер' verbose = u'Создать банер'
country = forms.ChoiceField(label=u'Страна', choices=[('', ' ')] + [(c.id, c.name) for c in Country.objects.all()], required=False) #country = forms.ChoiceField(label=u'Страна', choices=[('', ' ')] + [(c.id, c.name) for c in Country.objects.all()], required=False)
theme = forms.ChoiceField(label=u'Тематика', required=False, #theme = forms.ChoiceField(label=u'Тематика', required=False,
choices=[('', ' ')] + [(item.id, item.name) for item in Theme.objects.language().all()]) # choices=[('', ' ')] + [(item.id, item.name) for item in Theme.objects.language().all()])
city = forms.CharField(label=u'Город', widget=forms.HiddenInput(), required=False) #city = forms.CharField(label=u'Город', widget=forms.HiddenInput(), required=False)
tag = forms.CharField(label=u'Тег', widget=forms.HiddenInput(), required=False) #tag = forms.CharField(label=u'Тег', widget=forms.HiddenInput(), required=False)
class Meta: class Meta:
model = Banner model = Banner
exclude = ['created_at', 'updated_at', 'often', 'paid'] exclude = ['created_at', 'updated_at', 'often', 'paid']
def clean_theme(self):
theme = self.cleaned_data['theme']
if not theme:
return None
try:
return Theme.objects.filter(id=theme)
except Theme.DoesNotExist:
return None
def clean_country(self):
country = self.cleaned_data['country']
if not country:
return None
try:
return Country.objects.get(id=country)
except Country.DoesNotExist:
return None
def clean_tag(self):
tag = self.cleaned_data['tag']
if not tag:
return None
try:
return Tag.objects.get(id=tag)
except Tag.DoesNotExist:
return None
def clean_city(self):
city = self.cleaned_data['city']
if not city:
return None
try:
return City.objects.get(id=city)
except City.DoesNotExist:
return None

@ -1,6 +1,8 @@
# -*- coding: utf-8 -* # -*- coding: utf-8 -*
from datetime import date
from random import choice, shuffle from random import choice, shuffle
from django.db import models from django.db import models
from django.db.models import Q
from django.core.cache import cache from django.core.cache import cache
@ -26,7 +28,31 @@ class BannerGroupCached(models.Manager):
key = 'banner_group_all' key = 'banner_group_all'
result = cache.get(key) result = cache.get(key)
if not result: if not result:
result = list(self.filter()) result = list(self.filter(public=True))
cache.set(key, result, 90) cache.set(key, result, 90)
return result return result
def group_banners(self):
key = 'banner_group_banners'
result = cache.get(key)
if not result:
groups = self.all()
today = date.today()
result = {}
for group in groups:
result[group.slug] = list(group.banners.prefetch_related('urls', 'theme', 'country')\
.filter(public=True, fr__lte=today)\
.filter(Q(to__gte=today) | Q(to__isnull=True)).extra({}))
cache.set(key, result, 70)
return result
class URLCached(models.Manager):
def all(self):
key = 'banner_url_all'
result = cache.get(key)
if not result:
result = list(self.filter(public=True))
cache.set(key, result, 150)
return result

@ -1,13 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import hashlib import hashlib
from datetime import datetime, date from datetime import datetime, date
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.conf import settings from django.conf import settings
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from .managers import BiasedManager, BannerGroupCached, URLCached
from .managers import BiasedManager, BannerGroupCached from theme.models import Theme
from country.models import Country
class URL(models.Model): class URL(models.Model):
@ -20,6 +20,9 @@ class URL(models.Model):
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
objects = models.Manager()
cached = URLCached()
def __unicode__(self): def __unicode__(self):
return self.title return self.title
@ -42,6 +45,8 @@ class BannerGroup (models.Model):
public = models.BooleanField(verbose_name=u'Активная', default=True) public = models.BooleanField(verbose_name=u'Активная', default=True)
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
objects = models.Manager()
cached = BannerGroupCached() cached = BannerGroupCached()
def size(self): def size(self):
@ -68,6 +73,11 @@ class Banner(models.Model):
text = models.TextField(verbose_name=u'Текст', blank=True, null=True) text = models.TextField(verbose_name=u'Текст', blank=True, null=True)
img = models.FileField(verbose_name=u'Картинка', upload_to='expo_upload', blank=True, null=True) img = models.FileField(verbose_name=u'Картинка', upload_to='expo_upload', blank=True, null=True)
url = models.CharField(verbose_name=u'URL', max_length=1024) url = models.CharField(verbose_name=u'URL', max_length=1024)
fr = models.DateField(default=date.today())
to = models.DateField(blank=True, null=True)
theme = models.ManyToManyField(Theme, blank=True, null=True, verbose_name=u'Тематика')
country = models.ManyToManyField(Country, blank=True, null=True, verbose_name=u'Страна')
sort = models.PositiveSmallIntegerField(verbose_name=u'Сорт', default=500) sort = models.PositiveSmallIntegerField(verbose_name=u'Сорт', default=500)
@ -75,7 +85,8 @@ class Banner(models.Model):
often = models.PositiveSmallIntegerField( often = models.PositiveSmallIntegerField(
verbose_name=_('Often'), verbose_name=_('Often'),
help_text=_('A ten will display 10 times more often that a one.'), help_text=_('A ten will display 10 times more often that a one.'),
choices=[[i, i] for i in range(11)] choices=[[i, i] for i in range(11)],
default=1
) )
urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True) urls = models.ManyToManyField(URL, related_name='url_banners', verbose_name=_('URLs'), null=True, blank=True)
@ -88,12 +99,6 @@ class Banner(models.Model):
created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True) created_at = models.DateTimeField(verbose_name=_('Created At'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True) updated_at = models.DateTimeField(verbose_name=_('Updated At'), auto_now=True)
theme = models.ForeignKey('theme.Theme', blank=True, null=True, verbose_name=u'Тематика')
tag = models.ForeignKey('theme.Tag', blank=True, null=True, verbose_name=u'Тег')
country = models.ForeignKey('country.Country', blank=True, null=True, verbose_name=u'Страна')
city = models.ForeignKey('city.City', blank=True, null=True, verbose_name=u'Город')
def get_admin_url(self): def get_admin_url(self):
return '/admin/expobanners/banners/banner/%d/edit/'%self.id return '/admin/expobanners/banners/banner/%d/edit/'%self.id

@ -1,8 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json import json
import re
import random
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import redirect, get_object_or_404 from django.shortcuts import redirect, get_object_or_404
from .models import Banner, BannerGroup from .models import Banner, BannerGroup, URL
def click(request, banner_id, key): def click(request, banner_id, key):
@ -25,22 +27,100 @@ def get_client_ip(request):
ip = request.META.get('REMOTE_ADDR') ip = request.META.get('REMOTE_ADDR')
return ip return ip
def get_by_sort(banner_list):
max_sort = 0
for banner in banner_list:
sort = banner.sort
if sort > max_sort:
max_sort = sort
result = [banner for banner in banner_list if banner.sort == max_sort]
return result
from django.db import connection
def get_banner_by_params(banners_list, urls, params):
print('START. NUMBER of queries = %d'%len(connection.queries))
good_banners = []
for banner in banners_list:
print('-------------------------')
print('number of queries = %d'%len(connection.queries))
print(banner)
# check by theme
banner_theme_ids = [str(theme.id) for theme in banner.theme.all()]
print('number of queries = %d'%len(connection.queries))
if banner_theme_ids:
if params.get('theme'):
theme = params['theme']
if theme in banner_theme_ids:
good_banners.append(banner)
continue
# check by country
banner_country_ids = [str(country.id) for country in banner.country.all()]
print('number of queries = %d'%len(connection.queries))
if banner_country_ids:
if params.get('country'):
country = params['country']
if country in banner_country_ids:
good_banners.append(banner)
continue
# check by url
if urls:
banner_urls = banner.urls.all()
print('number of queries = %d'%len(connection.queries))
if banner_urls:
banner_urls = set(banner_urls)
common_urls = set(urls).intersection(banner_urls)
if common_urls:
good_banners.append(banner)
continue
print('-------------------------')
good_banners = get_by_sort(good_banners)
print('END. NUMBER of queries = %d'%len(connection.queries))
if good_banners:
return random.choice(good_banners)
return []
def get_banners(request): def get_banners(request):
# get urls by current url
url = request.GET.get('url', '/') url = request.GET.get('url', '/')
theme = request.GET.get('theme') urls = URL.cached.all()
country = request.GET.get('country') good_urls = []
city = request.GET.get('city') for u in urls:
tag = request.GET.get('tag') if u.regex:
ip = get_client_ip(request) url_re = re.compile(u.url)
params = {'url': url, if url_re.findall(url):
'theme': theme, good_urls.append(u)
'tag': tag, elif url == u.url:
'country': country, good_urls.append(u)
'city': city, # fill parameters dict
'ip': ip} params = {'theme': request.GET.get('theme'),
b = Banner.objects.get(id=1) 'tag': request.GET.get('tag'),
result = [{'url': b.url, 'id': 'expo_b_%d'%b.id, 'is_html': b.html, 'country': request.GET.get('country'),
'is_flash': b.flash, 'is_img': True, 'html': b.text, 'img': b.img.url}] 'city': request.GET.get('city'),
'ip': get_client_ip(request)}
group_banners = BannerGroup.cached.group_banners()
result = []
for group, banners in group_banners.iteritems():
banner = get_banner_by_params(banners, good_urls, params)
result.append({'id': group,
'url': banner.url,
'is_html': banner.html,
'is_flash': banner.flash,
'is_img': True,
'html': banner.text,
'img': banner.img.url
})
return HttpResponse(json.dumps(result, indent=4), content_type='application/json') return HttpResponse(json.dumps(result, indent=4), content_type='application/json')

@ -11,13 +11,13 @@ class ExpoManager(TranslationManager):
def upcoming(self): def upcoming(self):
return self.language().select_related('country', 'city', 'place').filter(data_begin__gte=datetime.datetime.now().date()).order_by('data_begin') return self.language().select_related('country', 'city', 'place').filter(data_begin__gte=datetime.datetime.now().date()).order_by('data_begin')
"""
def all(self, lang=None): def all(self, lang=None):
if lang: if lang:
return super(ExpoManager, self).language(lang).all().order_by('name') return super(ExpoManager, self).language(lang).all().order_by('name')
else: else:
return super(ExpoManager, self).language(get_language()).all().order_by('name') return super(ExpoManager, self).language(get_language()).all().order_by('name')
"""
def safe_get(self, **kwargs): def safe_get(self, **kwargs):
model = self.model model = self.model
try: try:

@ -6,6 +6,19 @@
<script src="{% static 'js/select/select2.js' %}"></script> <script src="{% static 'js/select/select2.js' %}"></script>
<script> <script>
$(function(){ $(function(){
$('#id_fr').datetimepicker({
todayHighlight: true,
format : 'yyyy-mm-dd',
minView:2
});
$('#id_to').datetimepicker({
todayHighlight: true,
format : 'yyyy-mm-dd',
minView:2
});
$('#id_theme').select2({width: "element"});
$('#id_country').select2({width: "element"});
/*
$('#id_tag').select2({ $('#id_tag').select2({
placeholder: "Тег", placeholder: "Тег",
width: '200px', width: '200px',
@ -26,6 +39,7 @@
} }
} }
}); });
*/
}) })
</script> </script>
{% endblock %} {% endblock %}

@ -37,6 +37,7 @@
{% endfor %} {% endfor %}
{% if user.is_staff %} {% if user.is_staff %}
<li><a href="/admin/">admin</a></li> <li><a href="/admin/">admin</a></li>
<li><a target="_blank" href="/expo-b/get-banners/?country=Russia">TEST</a></li>
{% endif %} {% endif %}
</ul> </ul>
</div> </div>

Loading…
Cancel
Save