def get_novice_queue(self): sender = self.request.user if (sender.is_authenticated and sender == self.profile and sender.is_novice and sender.application_status == "PN"): queue = cached_context( prefix="nqu", vary_on_user=True, timeout=86400)(lambda user: user.novice_queue) return queue(user=sender) return None
def nice_records(self): nice_pk_set = cached_context( prefix="index_nice_pk_set", timeout=self.nice_cache_timeout)(lambda: tuple( Entry.objects.filter(vote_rate__gte=self.nice_bound). values_list("pk", flat=True).order_by()))( ) # Generated cache key: index_nice_pk_set_context__<lambda> return random.sample( nice_pk_set, self.size) if len(nice_pk_set) > self.size else nice_pk_set
def wrapped(self, *args, **kwargs): return cached_context( prefix="usercache_" + method.__name__, vary_on_user=True, timeout=timeout)( lambda user=None: method(self, *args, **kwargs))(user=self)
class Index(ListView): template_name = "dictionary/index.html" context_object_name = "entries" extra_context = {"index_type": settings.INDEX_TYPE} size = 15 """ Number of entries that will show up in homepage. """ page_timeout = 20 """ This many seconds need to passed to collect new set of random entries. """ nice_bound = 100 """ Minimum vote rate an entry needs to have in order to show up in homepage. (nice_records) """ nice_cache_timeout = 86400 """ Refresh list of nice entries (from which a specified number of entries will be randomly selected) after this many seconds. (nice_records) """ def get_queryset(self): queryset = Entry.objects.filter(pk__in=self.get_pk_set()) return entry_prefetch(queryset, self.request.user) @method_decorator(cached_context(timeout=page_timeout, prefix="index_view")) def get_pk_set(self): records = getattr(self, settings.INDEX_TYPE)() return list(records) def random_records(self): """Author: Peter Be <peterbe.com>""" qs = Entry.objects.all() max_pk = qs.aggregate(Max("pk"))["pk__max"] min_pk = qs.aggregate(Min("pk"))["pk__min"] if not max_pk or max_pk < self.size * 2: return [] ids = set() while len(ids) < self.size: next_pk = random.randint(min_pk, max_pk) # nosec while next_pk in ids: next_pk = random.randint(min_pk, max_pk) # nosec found = qs.model.objects.filter(pk=next_pk).exists() if found: ids.add(next_pk) yield next_pk def nice_records(self): nice_pk_set = cached_context(prefix="index_nice_pk_set", timeout=self.nice_cache_timeout)( lambda: tuple(Entry.objects.filter(vote_rate__gte=self.nice_bound).values_list("pk", flat=True).order_by()) )() # Generated cache key: index_nice_pk_set_context__<lambda> return random.sample(nice_pk_set, self.size) if len(nice_pk_set) > self.size else nice_pk_set