Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
 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)
Пример #4
0
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