You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

93 lines
3.0 KiB

# -*- coding: utf-8 -*
from datetime import date
from random import choice, shuffle
from django.db import models
from django.db.models import Q
from django.core.cache import cache
class BiasedManager(models.Manager):
def by_time(self, **kwargs):
all = super(BiasedManager, self).get_query_set().filter(**kwargs)
result = []
for i in all:
for j in range(i.often):
result.append(i)
return result
def one(self, **kwargs):
return choice(self.by_time(**kwargs))
def by_often(self, **kwargs):
result = self.by_time(**kwargs)
shuffle(result)
return result
def create_for_paid(self, event, url, role):
try:
name = str(event.name)
except UnicodeEncodeError, UnicodeDecodeError:
name = event.url
alt = u'%s_%s'%(name, role)
return self.create(alt=alt, url=url, paid=True)
class BannerGroupCached(models.Manager):
def all(self):
key = 'banner_group_all'
result = cache.get(key)
if not result:
result = list(self.filter(public=True))
cache.set(key, result, 90)
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)))
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
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
class TopCached(models.Manager):
def all(self):
key = 'expo_b_top_all'
result = cache.get(key)
if not result:
today = date.today()
result = list(self.prefetch_related('theme', 'country', 'excluded_tags', 'excluded_cities').
filter(fr__lte=today).filter(Q(to__gte=today) | Q(to__isnull=True)))
cache.set(key, result, 80)
return result