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