Merge branch 'dev'
[wolnelektury.git] / src / social / views.py
1 # -*- coding: utf-8 -*-
2 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
3 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
4 #
5 from django.shortcuts import render, get_object_or_404, redirect
6 from django.http import HttpResponseForbidden, JsonResponse
7 from django.contrib.auth.decorators import login_required
8 from django.views.decorators.http import require_POST
9
10 from ajaxable.utils import AjaxableFormView
11
12 from catalogue.models import Book
13 from ssify import ssi_included
14 from social import forms
15 from .models import Cite
16 from social.utils import get_set, likes, set_sets
17
18
19 # ====================
20 # = Shelf management =
21 # ====================
22
23
24 @require_POST
25 def like_book(request, slug):
26     if not request.user.is_authenticated():
27         return HttpResponseForbidden('Login required.')
28     book = get_object_or_404(Book, slug=slug)
29     if not likes(request.user, book):
30         tag = get_set(request.user, '')
31         set_sets(request.user, book, [tag])
32
33     if request.is_ajax():
34         return JsonResponse({"success": True, "msg": "ok", "like": True})
35     else:
36         return redirect(book)
37
38
39 @login_required
40 def my_shelf(request):
41     return render(request, 'social/my_shelf.html', {
42         'books': Book.tagged.with_any(request.user.tag_set.all())
43     })
44
45
46 class ObjectSetsFormView(AjaxableFormView):
47     form_class = forms.ObjectSetsForm
48     placeholdize = True
49     template = 'social/sets_form.html'
50     ajax_redirect = True
51     POST_login = True
52
53     def get_object(self, request, slug):
54         return get_object_or_404(Book, slug=slug)
55
56     def context_description(self, request, obj):
57         return obj.pretty_title()
58
59     def form_args(self, request, obj):
60         return (obj, request.user), {}
61
62
63 @require_POST
64 def unlike_book(request, slug):
65     if not request.user.is_authenticated():
66         return HttpResponseForbidden('Login required.')
67     book = get_object_or_404(Book, slug=slug)
68     if likes(request.user, book):
69         set_sets(request.user, book, [])
70
71     if request.is_ajax():
72         return JsonResponse({"success": True, "msg": "ok", "like": False})
73     else:
74         return redirect(book)
75
76
77 @ssi_included
78 def cite(request, pk, main=False):
79     cite = get_object_or_404(Cite, pk=pk)
80     return render(request, 'social/cite_promo.html', {
81         'main': main,
82         'cite': cite,
83     })
84
85
86 @ssi_included(use_lang=False)
87 def cite_info(request, pk):
88     cite = get_object_or_404(Cite, pk=pk)
89     return render(request, 'social/cite_info.html', {
90         'cite': cite,
91     })