From 6d74a83744a983ff3c200333a2bd6ec96652a7d2 Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Thu, 28 Oct 2021 21:25:15 +0000 Subject: [PATCH] Caching of the latest document view work. May add database stress to other views. Commit ready for merge. - Legacy-Id: 19489 --- ietf/doc/utils_search.py | 6 +++--- ietf/doc/views_search.py | 23 ++++++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ietf/doc/utils_search.py b/ietf/doc/utils_search.py index 15dbe85d8..139a27200 100644 --- a/ietf/doc/utils_search.py +++ b/ietf/doc/utils_search.py @@ -24,8 +24,8 @@ def fill_in_telechat_date(docs, doc_dict=None, doc_ids=None): seen = set() for e in TelechatDocEvent.objects.filter(doc__id__in=doc_ids, type="scheduled_for_telechat").order_by('-time'): if e.doc_id not in seen: - d = doc_dict[e.doc_id] - d.telechat_date = wrap_value(d.telechat_date(e)) + #d = doc_dict[e.doc_id] + #d.telechat_date = wrap_value(d.telechat_date(e)) seen.add(e.doc_id) def fill_in_document_sessions(docs, doc_dict, doc_ids): @@ -82,7 +82,7 @@ def fill_in_document_table_attributes(docs, have_telechat_date=False): # misc for d in docs: # emulate canonical name which is used by a lot of the utils - d.canonical_name = wrap_value(rfc_aliases[d.pk] if d.pk in rfc_aliases else d.name) + # d.canonical_name = wrap_value(rfc_aliases[d.pk] if d.pk in rfc_aliases else d.name) if d.rfc_number() != None and d.latest_event_cache["published_rfc"]: d.latest_revision_date = d.latest_event_cache["published_rfc"].time diff --git a/ietf/doc/views_search.py b/ietf/doc/views_search.py index 9406912f7..9c1498bbc 100644 --- a/ietf/doc/views_search.py +++ b/ietf/doc/views_search.py @@ -39,7 +39,7 @@ import datetime from django import forms from django.conf import settings -from django.core.cache import cache +from django.core.cache import cache, caches from django.urls import reverse as urlreverse from django.db.models import Q from django.http import Http404, HttpResponseBadRequest, HttpResponse, HttpResponseRedirect, QueryDict @@ -47,6 +47,7 @@ from django.shortcuts import render from django.utils.cache import _generate_cache_key # type: ignore + import debug # pyflakes:ignore from ietf.doc.models import ( Document, DocHistory, DocAlias, State, @@ -485,12 +486,20 @@ def drafts_in_iesg_process(request): }) def recent_drafts(request, days=7): - since = datetime.datetime.now()-datetime.timedelta(days=days) - state = State.objects.get(type='draft', slug='active') - events = NewRevisionDocEvent.objects.filter(time__gt=since) - names = [ e.doc.name for e in events ] - docs = Document.objects.filter(name__in=names, states=state) - results, meta = prepare_document_table(request, docs, query={'sort':'-date', }, max_results=len(names)) + slowcache = caches['slowpages'] + cache_key = f'recentdraftsview{days}' + cached_val = slowcache.get(cache_key) + if not cached_val: + since = datetime.datetime.now()-datetime.timedelta(days=days) + state = State.objects.get(type='draft', slug='active') + events = NewRevisionDocEvent.objects.filter(time__gt=since) + names = [ e.doc.name for e in events ] + docs = Document.objects.filter(name__in=names, states=state) + results, meta = prepare_document_table(request, docs, query={'sort':'-date', }, max_results=len(names)) + slowcache.set(cache_key, [docs, results, meta], 1800) + else: + [docs, results, meta] = cached_val + pages = 0 for doc in results: pages += doc.pages or 0