Merge branch 'master' into appdev
[wolnelektury.git] / src / social / views.py
index d9627eb..df944b3 100644 (file)
@@ -1,5 +1,5 @@
-# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
-# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+# This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
 from django.shortcuts import render, get_object_or_404, redirect
 from django.http import HttpResponseForbidden, JsonResponse
@@ -8,11 +8,8 @@ from django.views.decorators.cache import never_cache
 from django.views.decorators.http import require_POST
 from django.views.generic.edit import FormView
 
-from ajaxable.utils import AjaxableFormView
-
-from catalogue.models import Book, Tag
-import catalogue.models.tag
-from social import forms
+from catalogue.models import Book
+from social import forms, models
 from wolnelektury.utils import is_ajax
 
 
@@ -21,13 +18,14 @@ from wolnelektury.utils import is_ajax
 # ====================
 
 
-@require_POST
+@login_required
 def like_book(request, slug):
-    if not request.user.is_authenticated:
-        return HttpResponseForbidden('Login required.')
     book = get_object_or_404(Book, slug=slug)
 
-    book.like(request.user)
+    if request.method != 'POST':
+        return redirect(book)
+
+    models.UserList.like(request.user, book)
 
     if is_ajax(request):
         return JsonResponse({"success": True, "msg": "ok", "like": True})
@@ -52,13 +50,14 @@ class RemoveSetView(AddSetView):
     form_class = forms.RemoveSetForm
 
 
-@require_POST
+@login_required
 def unlike_book(request, slug):
-    if not request.user.is_authenticated:
-        return HttpResponseForbidden('Login required.')
     book = get_object_or_404(Book, slug=slug)
 
-    book.unlike(request.user)
+    if request.method != 'POST':
+        return redirect(book)
+
+    models.UserList.unlike(request.user, book)
 
     if is_ajax(request):
         return JsonResponse({"success": True, "msg": "ok", "like": False})
@@ -68,30 +67,32 @@ def unlike_book(request, slug):
 
 @login_required
 def my_shelf(request):
-    if request.EXPERIMENTS['layout'].value:
-        template_name = 'social/2022/my_shelf.html'
-    else:
-        template_name = 'social/my_shelf.html'
+    template_name = 'social/my_shelf.html'
+    favs = request.user.userlist_set.filter(favorites=True)
+    others = request.user.userlist_set.filter(favorites=False)
+    ulists = list(request.user.userlist_set.all())
+    suggest = [t for t in ulists if t.name]
+        
     return render(request, template_name, {
-        'books': Book.tagged.with_any(request.user.tag_set.all())
+        'favs': favs,
+        'others': others,
+        #'books': Book.objects.filter(userlistitem__list__user=request.user),
     })
 
 
 def get_sets_for_book_ids(book_ids, user):
     data = {}
-    tagged = catalogue.models.tag.TagRelation.objects.filter(
-        tag__user=user,
-        #content_type= # for books,
-        object_id__in=book_ids
-    ).order_by('tag__sort_key')
+    tagged = models.UserListItem.objects.filter(
+        list__user=user,
+        book_id__in=book_ids
+    ).order_by('list__name')
     for t in tagged:
-        # related?
-        item = data.setdefault(t.object_id, [])
-        if t.tag.name:
+        item = data.setdefault(t.book_id, [])
+        if t.list.name:
             item.append({
-                "slug": t.tag.slug,
-                "url": t.tag.get_absolute_url(),
-                "name": t.tag.name,
+                "slug": t.list.slug,
+                "url": t.list.get_absolute_url(),
+                "name": t.list.name,
             })
     for b in book_ids:
         if b not in data:
@@ -116,28 +117,20 @@ def my_liked(request):
 @login_required
 def my_tags(request):
     term = request.GET.get('term', '')
-    tags =             Tag.objects.filter(user=request.user).order_by('sort_key')
+    tags = models.UserList.objects.filter(user=request.user).order_by('name')
     if term:
-        tags = tags.filter(name__icontains=term)
+        ulists = tags.filter(name__icontains=term)
     return JsonResponse(
         [
-            t.name for t in tags
+            ul.name for ul in ulists
         ], safe=False
     )
 
 
-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), {}
+def confirm_user(request, key):
+    uc = get_object_or_404(models.UserConfirmation, key=key)
+    user = uc.user
+    uc.use()
+    return render(request, 'social/user_confirmation.html', {
+        'user': user,
+    })