fix
[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)
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 @login_required
55 def unlike_book(request, slug):
56     book = get_object_or_404(Book, slug=slug)
57
58     if request.method != 'POST':
59         return redirect(book)
60
61     book.unlike(request.user)
62
63     if is_ajax(request):
64         return JsonResponse({"success": True, "msg": "ok", "like": False})
65     else:
66         return redirect(book)
67
68
69 @login_required
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]
74     print(suggest)
75         
76     return render(request, template_name, {
77         'tags': tags,
78         'books': Book.tagged.with_any(tags),
79         'suggest': suggest,
80     })
81
82
83 def get_sets_for_book_ids(book_ids, user):
84     data = {}
85     tagged = catalogue.models.tag.TagRelation.objects.filter(
86         tag__user=user,
87         #content_type= # for books,
88         object_id__in=book_ids
89     ).order_by('tag__sort_key')
90     for t in tagged:
91         # related?
92         item = data.setdefault(t.object_id, [])
93         if t.tag.name:
94             item.append({
95                 "slug": t.tag.slug,
96                 "url": t.tag.get_absolute_url(),
97                 "name": t.tag.name,
98             })
99     for b in book_ids:
100         if b not in data:
101             data[b] = None
102     return data
103     
104     
105
106
107 @never_cache
108 def my_liked(request):
109     if not request.user.is_authenticated:
110         return JsonResponse({})
111     try:
112         ids = [int(x) for x in request.GET.get('ids', '').split(',')]
113     except:
114         return JsonResponse({})
115     return JsonResponse(get_sets_for_book_ids(ids, request.user))
116
117
118 @never_cache
119 @login_required
120 def my_tags(request):
121     term = request.GET.get('term', '')
122     tags =             Tag.objects.filter(user=request.user).order_by('sort_key')
123     if term:
124         tags = tags.filter(name__icontains=term)
125     return JsonResponse(
126         [
127             t.name for t in tags
128         ], safe=False
129     )
130
131
132 def confirm_user(request, key):
133     uc = get_object_or_404(models.UserConfirmation, key=key)
134     user = uc.user
135     uc.use()
136     return render(request, 'social/user_confirmation.html', {
137         'user': user,
138     })