# -*- 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