bookwyrm/bookwyrm/views/interaction.py
2022-01-05 14:54:51 -08:00

105 lines
3.3 KiB
Python

""" 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
from django.utils.decorators import method_decorator
from django.views import View
from bookwyrm import models
from .helpers import is_api_request
# pylint: disable= no-self-use
@method_decorator(login_required, name="dispatch")
class Favorite(View):
"""like a status"""
def post(self, request, status_id):
"""create a like"""
clear_cache(request.user.id, status_id)
status = models.Status.objects.get(id=status_id)
try:
models.Favorite.objects.create(status=status, user=request.user)
except IntegrityError:
# you already fav'ed that
return HttpResponseBadRequest()
if is_api_request(request):
return HttpResponse()
return redirect(request.headers.get("Referer", "/"))
@method_decorator(login_required, name="dispatch")
class Unfavorite(View):
"""take back a fav"""
def post(self, request, status_id):
"""unlike a status"""
status = models.Status.objects.get(id=status_id)
try:
favorite = models.Favorite.objects.get(status=status, user=request.user)
except models.Favorite.DoesNotExist:
# can't find that status, idk
return HttpResponseNotFound()
favorite.delete()
clear_cache(request.user.id, status_id)
if is_api_request(request):
return HttpResponse()
return redirect(request.headers.get("Referer", "/"))
@method_decorator(login_required, name="dispatch")
class Boost(View):
"""boost a status"""
def post(self, request, status_id):
"""boost a status"""
status = models.Status.objects.get(id=status_id)
# is it boostable?
if not status.boostable:
return HttpResponseBadRequest()
if models.Boost.objects.filter(
boosted_status=status, user=request.user
).exists():
# you already boosted that.
return redirect(request.headers.get("Referer", "/"))
models.Boost.objects.create(
boosted_status=status,
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", "/"))
@method_decorator(login_required, name="dispatch")
class Unboost(View):
"""boost a status"""
def post(self, request, status_id):
"""boost a status"""
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)