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