Move sets to user lists.
[wolnelektury.git] / src / social / views.py
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.
3 #
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
10
11 from catalogue.models import Book
12 from social import forms, models
13 from wolnelektury.utils import is_ajax
14
15
16 # ====================
17 # = Shelf management =
18 # ====================
19
20
21 @require_POST
22 def like_book(request, slug):
23     if not request.user.is_authenticated:
24         return HttpResponseForbidden('Login required.')
25     book = get_object_or_404(Book, slug=slug)
26
27     models.UserList.like(request.user, book)
28
29     if is_ajax(request):
30         return JsonResponse({"success": True, "msg": "ok", "like": True})
31     else:
32         return redirect(book)
33
34
35 class AddSetView(FormView):
36     form_class = forms.AddSetForm
37     template_name = 'forms/form_detail.html'
38
39     def form_valid(self, form):
40         book, tag = form.save(self.request.user)
41
42         if is_ajax(self.request):
43             return JsonResponse(get_sets_for_book_ids([book.id], self.request.user))
44         else:
45             return redirect(book)
46
47
48 class RemoveSetView(AddSetView):
49     form_class = forms.RemoveSetForm
50
51
52 @require_POST
53 def unlike_book(request, slug):
54     if not request.user.is_authenticated:
55         return HttpResponseForbidden('Login required.')
56     book = get_object_or_404(Book, slug=slug)
57
58     models.UserList.unlike(request.user, book)
59
60     if is_ajax(request):
61         return JsonResponse({"success": True, "msg": "ok", "like": False})
62     else:
63         return redirect(book)
64
65
66 @login_required
67 def my_shelf(request):
68     template_name = 'social/my_shelf.html'
69     ulists = list(request.user.userlist_set.all())
70     suggest = [t for t in ulists if t.name]
71         
72     return render(request, template_name, {
73         'tags': ulists,
74         'books': Book.objects_filter(userlistitem__list__user=request.user),
75         'suggest': suggest,
76     })
77
78
79 def get_sets_for_book_ids(book_ids, user):
80     data = {}
81     tagged = models.UserListItem.objects.filter(
82         list__user=user,
83         book_id__in=book_ids
84     ).order_by('list__name')
85     for t in tagged:
86         item = data.setdefault(t.book_id, [])
87         if t.list.name:
88             item.append({
89                 "slug": t.list.slug,
90                 "url": t.list.get_absolute_url(),
91                 "name": t.list.name,
92             })
93     for b in book_ids:
94         if b not in data:
95             data[b] = None
96     return data
97     
98     
99
100
101 @never_cache
102 def my_liked(request):
103     if not request.user.is_authenticated:
104         return JsonResponse({})
105     try:
106         ids = [int(x) for x in request.GET.get('ids', '').split(',')]
107     except:
108         return JsonResponse({})
109     return JsonResponse(get_sets_for_book_ids(ids, request.user))
110
111
112 @never_cache
113 @login_required
114 def my_tags(request):
115     term = request.GET.get('term', '')
116     tags = models.UserList.objects.filter(user=request.user).order_by('name')
117     if term:
118         ulists = tags.filter(name__icontains=term)
119     return JsonResponse(
120         [
121             ul.name for ul in ulists
122         ], safe=False
123     )
124
125
126 def confirm_user(request, key):
127     uc = get_object_or_404(models.UserConfirmation, key=key)
128     user = uc.user
129     uc.use()
130     return render(request, 'social/user_confirmation.html', {
131         'user': user,
132     })