Code layout change.
[wolnelektury.git] / src / social / views.py
diff --git a/src/social/views.py b/src/social/views.py
new file mode 100644 (file)
index 0000000..49c9b70
--- /dev/null
@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+#
+from django.shortcuts import render, get_object_or_404, redirect
+from django.http import HttpResponseForbidden, JsonResponse
+from django.contrib.auth.decorators import login_required
+from django.views.decorators.http import require_POST
+
+from ajaxable.utils import AjaxableFormView
+
+from catalogue.models import Book
+from ssify import ssi_included
+from social import forms
+from .models import Cite
+from social.utils import get_set, likes, set_sets
+
+
+# ====================
+# = Shelf management =
+# ====================
+
+
+@require_POST
+def like_book(request, slug):
+    if not request.user.is_authenticated():
+        return HttpResponseForbidden('Login required.')
+    book = get_object_or_404(Book, slug=slug)
+    if not likes(request.user, book):
+        tag = get_set(request.user, '')
+        set_sets(request.user, book, [tag])
+
+    if request.is_ajax():
+        return JsonResponse({"success": True, "msg": "ok", "like": True})
+    else:
+        return redirect(book)
+
+
+@login_required
+def my_shelf(request):
+    books = Book.tagged.with_any(request.user.tag_set.all())
+    return render(request, 'social/my_shelf.html', locals())
+
+
+class ObjectSetsFormView(AjaxableFormView):
+    form_class = forms.ObjectSetsForm
+    placeholdize = True
+    template = 'social/sets_form.html'
+    ajax_redirect = True
+    POST_login = True
+
+    def get_object(self, request, slug):
+        return get_object_or_404(Book, slug=slug)
+
+    def context_description(self, request, obj):
+        return obj.pretty_title()
+
+    def form_args(self, request, obj):
+        return (obj, request.user), {}
+
+
+@require_POST
+def unlike_book(request, slug):
+    if not request.user.is_authenticated():
+        return HttpResponseForbidden('Login required.')
+    book = get_object_or_404(Book, slug=slug)
+    if likes(request.user, book):
+        set_sets(request.user, book, [])
+
+    if request.is_ajax():
+        return JsonResponse({"success": True, "msg": "ok", "like": False})
+    else:
+        return redirect(book)
+
+
+@ssi_included
+def cite(request, pk, main=False):
+    cite = get_object_or_404(Cite, pk=pk)
+    return render(request, 'social/cite_promo.html', {
+        'main': main,
+        'cite': cite,
+    })
+
+
+@ssi_included(use_lang=False)
+def cite_info(request, pk):
+    cite = get_object_or_404(Cite, pk=pk)
+    return render(request, 'social/cite_info.html', {
+        'cite': cite,
+    })