1 # This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
4 from django.shortcuts import render, get_object_or_404, redirect
5 from django.http import HttpResponseForbidden, JsonResponse
6 from django.contrib.auth.decorators import login_required
7 from django.views.decorators.cache import never_cache
8 from django.views.decorators.http import require_POST
9 from django.views.generic.edit import FormView
11 from catalogue.models import Book, Tag
12 import catalogue.models.tag
13 from social import forms, models
14 from wolnelektury.utils import is_ajax
17 # ====================
18 # = Shelf management =
19 # ====================
23 def like_book(request, slug):
24 book = get_object_or_404(Book, slug=slug)
26 if request.method != 'POST':
29 book.like(request.user)
32 return JsonResponse({"success": True, "msg": "ok", "like": True})
37 class AddSetView(FormView):
38 form_class = forms.AddSetForm
39 template_name = 'forms/form_detail.html'
41 def form_valid(self, form):
42 book, tag = form.save(self.request.user)
44 if is_ajax(self.request):
45 return JsonResponse(get_sets_for_book_ids([book.id], self.request.user))
50 class RemoveSetView(AddSetView):
51 form_class = forms.RemoveSetForm
55 def unlike_book(request, slug):
56 book = get_object_or_404(Book, slug=slug)
58 if request.method != 'POST':
61 book.unlike(request.user)
64 return JsonResponse({"success": True, "msg": "ok", "like": False})
70 def my_shelf(request):
71 template_name = 'social/my_shelf.html'
72 tags = list(request.user.tag_set.all())
73 suggest = [t for t in tags if t.name]
76 return render(request, template_name, {
78 'books': Book.tagged.with_any(tags),
83 def get_sets_for_book_ids(book_ids, user):
85 tagged = catalogue.models.tag.TagRelation.objects.filter(
87 #content_type= # for books,
88 object_id__in=book_ids
89 ).order_by('tag__sort_key')
92 item = data.setdefault(t.object_id, [])
96 "url": t.tag.get_absolute_url(),
108 def my_liked(request):
109 if not request.user.is_authenticated:
110 return JsonResponse({})
112 ids = [int(x) for x in request.GET.get('ids', '').split(',')]
114 return JsonResponse({})
115 return JsonResponse(get_sets_for_book_ids(ids, request.user))
120 def my_tags(request):
121 term = request.GET.get('term', '')
122 tags = Tag.objects.filter(user=request.user).order_by('sort_key')
124 tags = tags.filter(name__icontains=term)
132 def confirm_user(request, key):
133 uc = get_object_or_404(models.UserConfirmation, key=key)
136 return render(request, 'social/user_confirmation.html', {