Merge pull request #1772 from bookwyrm-social/cache-tweaks

Cache tweaks
This commit is contained in:
Mouse Reeve 2022-01-06 12:13:56 -08:00 committed by GitHub
commit 00a14e89a0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 47 additions and 32 deletions

View file

@ -47,7 +47,7 @@ jobs:
CELERY_BROKER: ""
REDIS_BROKER_PORT: 6379
REDIS_BROKER_PASSWORD: beep
USE_LOCAL_CACHE: true
USE_DUMMY_CACHE: true
FLOWER_PORT: 8888
EMAIL_HOST: "smtp.mailgun.org"
EMAIL_PORT: 587

View file

@ -120,7 +120,13 @@ STREAMS = [
]
# Redis cache backend
if not env("USE_LOCAL_CACHE", False):
if env("USE_DUMMY_CACHE", False):
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.dummy.DummyCache",
}
}
else:
# pylint: disable=line-too-long
CACHES = {
"default": {

View file

@ -3,10 +3,12 @@
{% block filter %}
<label class="label" for="id_sort">{% trans "Order by" %}</label>
<div class="select">
<select name="sort" id="id_sort">
<option value="recent" {% if request.GET.sort == "recent" %}selected{% endif %}>{% trans "Recently active" %}</option>
<option value="suggested" {% if request.GET.sort == "suggested" %}selected{% endif %}>{% trans "Suggested" %}</option>
</select>
<div class="control">
<div class="select">
<select name="sort" id="id_sort">
<option value="recent" {% if request.GET.sort == "recent" %}selected{% endif %}>{% trans "Recently active" %}</option>
<option value="suggested" {% if request.GET.sort == "suggested" %}selected{% endif %}>{% trans "Suggested" %}</option>
</select>
</div>
</div>
{% endblock %}

View file

@ -3,5 +3,7 @@
{% block filter %}
<label class="label" for="id_server">{% trans "Instance name" %}</label>
<input type="text" class="input" name="server" value="{{ request.GET.server|default:'' }}" id="id_server" placeholder="example.server.com">
<div class="control">
<input type="text" class="input" name="server" value="{{ request.GET.server|default:'' }}" id="id_server" placeholder="example.server.com">
</div>
{% endblock %}

View file

@ -3,6 +3,7 @@
{% block filter %}
<label class="label" for="id_username">{% trans "Username" %}</label>
<input type="text" class="input" name="username" value="{{ request.GET.username|default:'' }}" id="id_username" placeholder="user@domain.com">
<div class="control">
<input type="text" class="input" name="username" value="{{ request.GET.username|default:'' }}" id="id_username" placeholder="user@domain.com">
</div>
{% endblock %}

View file

@ -1,7 +1,6 @@
{% extends 'components/card.html' %}
{% load i18n %}
{% load utilities %}
{% load cache %}
{% block card-header %}
<div
@ -31,7 +30,6 @@
{# nothing here #}
{% elif request.user.is_authenticated %}
{% cache 259200 interact request.user.id status.id %}
<div class="card-footer-item">
{% trans "Reply" as button_text %}
{% include 'snippets/toggle/toggle_button.html' with controls_text="show_comment" controls_uid=status.id text=button_text icon_with_text="comment" class="is-small is-light is-transparent toggle-button" focus="id_content_reply" %}
@ -47,7 +45,6 @@
{% include 'snippets/status/status_options.html' with class="is-small is-light is-transparent" right=True %}
</div>
{% endif %}
{% endcache %}
{% else %}

View file

@ -20,17 +20,21 @@
</li>
{% if status.status_type != 'GeneratedNote' and status.status_type != 'Rating' %}
<li role="menuitem" class="dropdown-item p-0">
<a href="{% url 'edit-status' status.id %}" class="button is-radiusless is-fullwidth is-small" type="submit">
{% trans "Edit" %}
</a>
<span class="control">
<a href="{% url 'edit-status' status.id %}" class="button is-radiusless is-fullwidth is-small" type="submit">
{% trans "Edit" %}
</a>
</span>
</li>
{% endif %}
{% else %}
{# things you can do to other people's statuses #}
<li role="menuitem" class="dropdown-item p-0">
<a href="{% url 'direct-messages-user' status.user|username %}" class="button is-small is-white is-radiusless is-fullwidth">
{% trans "Send direct message" %}
</a>
<span class="control">
<a href="{% url 'direct-messages-user' status.user|username %}" class="button is-small is-white is-radiusless is-fullwidth">
{% trans "Send direct message" %}
</a>
</span>
</li>
<li role="menuitem" class="dropdown-item p-0">
{% include 'snippets/report_button.html' with user=status.user status=status %}

View file

@ -1,5 +1,7 @@
""" template filters for status interaction buttons """
from django import template
from django.core.cache import cache
from bookwyrm import models
@ -9,13 +11,21 @@ register = template.Library()
@register.filter(name="liked")
def get_user_liked(user, status):
"""did the given user fav a status?"""
return models.Favorite.objects.filter(user=user, status=status).exists()
return cache.get_or_set(
f"fav-{user.id}-{status.id}",
models.Favorite.objects.filter(user=user, status=status).exists(),
259200,
)
@register.filter(name="boosted")
def get_user_boosted(user, status):
"""did the given user fav a status?"""
return status.boosters.filter(user=user).exists()
return cache.get_or_set(
f"boost-{user.id}-{status.id}",
status.boosters.filter(user=user).exists(),
259200,
)
@register.filter(name="saved")

View file

@ -1,7 +1,6 @@
""" boosts and favs """
from django.contrib.auth.decorators import login_required
from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key
from django.db import IntegrityError
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound
from django.shortcuts import redirect
@ -19,7 +18,7 @@ class Favorite(View):
def post(self, request, status_id):
"""create a like"""
clear_cache(request.user.id, status_id)
cache.delete(f"fav-{request.user.id}-{status_id}")
status = models.Status.objects.get(id=status_id)
try:
models.Favorite.objects.create(status=status, user=request.user)
@ -38,6 +37,7 @@ class Unfavorite(View):
def post(self, request, status_id):
"""unlike a status"""
cache.delete(f"fav-{request.user.id}-{status_id}")
status = models.Status.objects.get(id=status_id)
try:
favorite = models.Favorite.objects.get(status=status, user=request.user)
@ -46,7 +46,6 @@ class Unfavorite(View):
return HttpResponseNotFound()
favorite.delete()
clear_cache(request.user.id, status_id)
if is_api_request(request):
return HttpResponse()
return redirect(request.headers.get("Referer", "/"))
@ -58,6 +57,7 @@ class Boost(View):
def post(self, request, status_id):
"""boost a status"""
cache.delete(f"boost-{request.user.id}-{status_id}")
status = models.Status.objects.get(id=status_id)
# is it boostable?
if not status.boostable:
@ -74,7 +74,6 @@ class Boost(View):
privacy=status.privacy,
user=request.user,
)
clear_cache(request.user.id, status_id)
if is_api_request(request):
return HttpResponse()
return redirect(request.headers.get("Referer", "/"))
@ -86,19 +85,13 @@ class Unboost(View):
def post(self, request, status_id):
"""boost a status"""
cache.delete(f"boost-{request.user.id}-{status_id}")
status = models.Status.objects.get(id=status_id)
boost = models.Boost.objects.filter(
boosted_status=status, user=request.user
).first()
boost.delete()
clear_cache(request.user.id, status_id)
if is_api_request(request):
return HttpResponse()
return redirect(request.headers.get("Referer", "/"))
def clear_cache(user_id, status_id):
"""clear template cache"""
cache_key = make_template_fragment_key("interact", [user_id, status_id])
cache.delete(cache_key)