Skip to content

Commit e66fd78

Browse files
authored
Merge pull request #7392 from akatsoulas/tags-caching
Add caching for tags
2 parents c2b74f0 + 25196ee commit e66fd78

4 files changed

Lines changed: 20 additions & 14 deletions

File tree

kitsune/questions/jinja2/questions/question_list.html

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{% from "sumo/includes/question_entry.html" import question_entry %}
55

66
{% set classes = 'questions' %}
7+
{% set _user_is_contributor = is_contributor(request.user) %}
78

89
{% if all_products %}
910
{% set page_title = _('All Products') %}
@@ -200,7 +201,7 @@ <h1 class="sumo-page-heading {% if not logo %}no-logo{% endif %}">
200201
<section class="forum--question-list questions">
201202
{% for question in questions.object_list %}
202203
<article id="question-{{ question.id }}" class="question-entry">
203-
{{ question_entry(question, request=request) }}
204+
{{ question_entry(question, request=request, user_is_contributor=_user_is_contributor) }}
204205
</article>
205206
{% endfor %}
206207
</section>
@@ -235,7 +236,7 @@ <h1 class="sumo-page-heading {% if not logo %}no-logo{% endif %}">
235236
<nav class="sidebar-nav">
236237
<span class="details-heading"></span>
237238
<ul class="sidebar-nav--list">
238-
{% if filters and is_contributor(request.user) %}
239+
{% if filters and _user_is_contributor %}
239240
<li class="sidebar-subheading sidebar-nav--heading-item">{{ _('Filter by') }}</li>
240241
<li class="{{ 'selected' if filter == None else '' }}"><a href="{{ questions_url(filter=None, page=None) }}">{{ _('All') }}</a></li>
241242
{% for f, desc in filters.items() %}
@@ -360,7 +361,7 @@ <h1 class="sumo-page-heading {% if not logo %}no-logo{% endif %}">
360361
</li>
361362
{% endif %}
362363

363-
{% if show != "spam" and is_contributor(request.user) %}
364+
{% if show != "spam" and _user_is_contributor %}
364365
<li class="sidebar-subheading sidebar-nav--heading-item">{{ _('Show me') }}</li>
365366
<li {{ owner|class_selected(None) }}><a href="{{ questions_url(owner='all', page=None) }}">{{ _('Posts from everyone') }}</a></li>
366367
<li {{ owner|class_selected('mine') }}><a href="{{ questions_url(owner='mine', page=None) }}">{{ _('My contributions') }}</a></li>

kitsune/questions/views.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.contrib.auth.views import redirect_to_login
1111
from django.contrib.contenttypes.models import ContentType
1212
from django.contrib.sites.models import Site
13+
from django.core.cache import cache
1314
from django.core.exceptions import PermissionDenied
1415
from django.core.paginator import EmptyPage, PageNotAnInteger
1516
from django.db.models import Count, Exists, F, OuterRef, Q
@@ -343,14 +344,17 @@ def question_list(request, product_slug=None, topic_slug=None):
343344
question_qs = Question.objects.none()
344345

345346
# Top 50 tags from the pre-tag-filtered set, ordered by frequency.
346-
# Force evaluation here so the template receives a plain list, avoiding
347-
# lazy queryset double-evaluation issues.
348-
available_tags = list(
349-
Question.objects.filter(pk__in=base_qs.values("pk").distinct(), tags__isnull=False)
350-
.values("tags__name", "tags__slug")
351-
.annotate(count=Count("id", distinct=True))
352-
.order_by("-count")[:50]
353-
)
347+
# Cache per product/topic/locale since this query is expensive and rarely changes.
348+
_tags_cache_key = f"available_tags:{product_slug}:{topic_slug}:{request.LANGUAGE_CODE}"
349+
available_tags = cache.get(_tags_cache_key)
350+
if available_tags is None:
351+
available_tags = list(
352+
Question.objects.filter(pk__in=base_qs.values("pk").distinct(), tags__isnull=False)
353+
.values("tags__name", "tags__slug")
354+
.annotate(count=Count("id", distinct=True))
355+
.order_by("-count")[:50]
356+
)
357+
cache.set(_tags_cache_key, available_tags, 60 * 5)
354358
tagged_set = set(tagged.split(",")) if tagged else set()
355359

356360
# Set the order.

kitsune/sumo/jinja2/sumo/includes/question_entry.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474
{% endif %}
7575
{% endmacro %}
7676

77-
{% macro question_entry(question, profile_username=None, request=None) %}
77+
{% macro question_entry(question, profile_username=None, request=None, user_is_contributor=False) %}
7878
{% set _base_url = url('users.questions', username=profile_username) if (question.channel == "direct_support" and profile_username) else None %}
7979
{% if _base_url %}
8080
{% set _product_url = (_base_url + '?channel=direct_support&product=' + question.product.slug) if question.product else None %}
@@ -183,7 +183,7 @@ <h3 class="question-entry--title">
183183
aria-hidden="true">
184184
<circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/>
185185
</svg>
186-
{% if is_contributor(request.user) and not profile_username %}
186+
{% if user_is_contributor and not profile_username %}
187187
{{ _('asked by') }} <a class="question-entry--meta-asked-by"
188188
href="{{ url('users.profile', question.creator.id) }}"
189189
title="{{ display_name(question.creator) }}">{{ display_name(question.creator)|truncate(20) }}</a>

kitsune/users/jinja2/users/questions_contributed.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ <h2 class="sumo-page-subheading">
4040
</p>
4141
{% else %}
4242
<ul class="question-entry-list">
43+
{% set _user_is_contributor = is_contributor(request.user) %}
4344
{% for question in questions %}
4445
<li class="question-entry">
45-
{{ question_entry(question, profile_username=profile.user.username, request=request) }}
46+
{{ question_entry(question, profile_username=profile.user.username, request=request, user_is_contributor=_user_is_contributor) }}
4647
</li>
4748
{% endfor %}
4849
</ul>

0 commit comments

Comments
 (0)