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.
79 lines
2.4 KiB
79 lines
2.4 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, expo, url, role):
|
|
try:
|
|
name = str(expo.name)
|
|
except UnicodeEncodeError, UnicodeDecodeError:
|
|
name = expo.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
|
|
|
|
|
|
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 |