""" tagging views""" from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.views import View from bookwyrm import models from bookwyrm.activitypub import ActivitypubResponse from .helpers import is_api_request # pylint: disable= no-self-use class Tag(View): """ tag page """ def get(self, request, tag_id): """ see books related to a tag """ tag_obj = get_object_or_404(models.Tag, identifier=tag_id) if is_api_request(request): return ActivitypubResponse(tag_obj.to_activity(**request.GET)) books = models.Edition.objects.filter( usertag__tag__identifier=tag_id ).distinct() data = { "books": books, "tag": tag_obj, } return TemplateResponse(request, "tag.html", data) @method_decorator(login_required, name="dispatch") class AddTag(View): """ add a tag to a book """ def post(self, request): """ tag a book """ # I'm not using a form here because sometimes "name" is sent as a hidden # field which doesn't validate name = request.POST.get("name") book_id = request.POST.get("book") book = get_object_or_404(models.Edition, id=book_id) tag_obj, _ = models.Tag.objects.get_or_create( name=name, ) models.UserTag.objects.get_or_create( user=request.user, book=book, tag=tag_obj, ) return redirect("/book/%s" % book_id) @method_decorator(login_required, name="dispatch") class RemoveTag(View): """ remove a user's tag from a book """ def post(self, request): """ untag a book """ name = request.POST.get("name") tag_obj = get_object_or_404(models.Tag, name=name) book_id = request.POST.get("book") book = get_object_or_404(models.Edition, id=book_id) user_tag = get_object_or_404( models.UserTag, tag=tag_obj, book=book, user=request.user ) user_tag.delete() return redirect("/book/%s" % book_id)