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