Nicer collection boxes.
[wolnelektury.git] / src / wolnelektury / views.py
index 49f7b24..2cc0fd7 100644 (file)
@@ -1,14 +1,14 @@
-# -*- 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 datetime import date, datetime
 import feedparser
 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 from datetime import date, datetime
 import feedparser
+from allauth.socialaccount.views import SignupView
 
 from django.conf import settings
 from django.contrib import auth
 from django.contrib.auth.decorators import login_required
 
 from django.conf import settings
 from django.contrib import auth
 from django.contrib.auth.decorators import login_required
-from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
+from django.contrib.auth.forms import AuthenticationForm
 from django.core.cache import cache
 from django.http import HttpResponse, HttpResponseRedirect
 from django.shortcuts import render
 from django.core.cache import cache
 from django.http import HttpResponse, HttpResponseRedirect
 from django.shortcuts import render
@@ -19,26 +19,23 @@ from django.views.decorators.cache import never_cache
 from ajaxable.utils import AjaxableFormView
 from ajaxable.utils import placeholdized
 from catalogue.models import Book, Collection, Tag, Fragment
 from ajaxable.utils import AjaxableFormView
 from ajaxable.utils import placeholdized
 from catalogue.models import Book, Collection, Tag, Fragment
-from ssify import ssi_included
 
 
+from social.utils import get_or_choose_cite
+from wolnelektury.forms import RegistrationForm, SocialSignupForm
 
 
+
+@never_cache
 def main_page(request):
     ctx = {
 def main_page(request):
     ctx = {
-        'last_published': Book.objects.exclude(cover_thumb='').filter(parent=None).order_by('-created_at')[:6],
+        'last_published': Book.objects.exclude(cover_thumb='').filter(findable=True, parent=None).order_by('-created_at')[:6],
+        'theme_books': [],
     }
 
     }
 
-    for category in ('author', 'epoch', 'genre', 'kind'):
-        try:
-            ctx[category] = Tag.objects.filter(category=category).order_by('?')[:1][0]
-        except IndexError:
-            pass
-
     # FIXME: find this theme and books properly.
     # FIXME: find this theme and books properly.
-    ctx['theme_books'] = []
-    if Fragment.objects.count():
+    if Fragment.objects.exists():
         while True:
             ctx['theme'] = Tag.objects.filter(category='theme').order_by('?')[:1][0]
         while True:
             ctx['theme'] = Tag.objects.filter(category='theme').order_by('?')[:1][0]
-            tf = Fragment.tagged.with_any([ctx['theme']]).order_by('?')[:100]
+            tf = Fragment.tagged.with_any([ctx['theme']]).select_related('book').filter(book__findable=True).order_by('?')[:100]
             if not tf:
                 continue
             ctx['theme_fragment'] = tf[0]
             if not tf:
                 continue
             ctx['theme_fragment'] = tf[0]
@@ -49,13 +46,24 @@ def main_page(request):
                     break
             break
 
                     break
             break
 
-    # Choose a collection for main.
-    try:
-        ctx['collection'] = Collection.objects.order_by('?')[:1][0]
-    except IndexError:
-        pass
+    # Choose collections for main.
+    ctx['collections'] = Collection.objects.filter(listed=True).order_by('?')[:4]
 
 
-    ctx['best'] = Book.objects.order_by('?')[:5]
+    best = []
+    best_places = 5
+    for recommended in Collection.objects.filter(listed=True, role='recommend').order_by('?'):
+        books = list(recommended.get_books().exclude(id__in=[b.id for b in best]).order_by('?')[:best_places])
+        best.extend(books)
+        best_places -= len(books)
+        if not best_places:
+            break
+    if best_places:
+        best.extend(
+            list(
+                Book.objects.filter(findable=True).exclude(id__in=[b.id for b in best]).order_by('?')[:best_places]
+            )
+        )
+    ctx['best'] = best
 
     return render(request, "main_page.html", ctx)
 
 
     return render(request, "main_page.html", ctx)
 
@@ -69,7 +77,7 @@ class LoginFormView(AjaxableFormView):
     ajax_redirect = True
 
     def __call__(self, request):
     ajax_redirect = True
 
     def __call__(self, request):
-        if request.user.is_authenticated():
+        if request.user.is_authenticated:
             return self.redirect_or_refresh(
                 request, '/',
                 message=_('Already logged in as user %(user)s', ) % {'user': request.user.username})
             return self.redirect_or_refresh(
                 request, '/',
                 message=_('Already logged in as user %(user)s', ) % {'user': request.user.username})
@@ -80,7 +88,7 @@ class LoginFormView(AjaxableFormView):
 
 
 class RegisterFormView(AjaxableFormView):
 
 
 class RegisterFormView(AjaxableFormView):
-    form_class = UserCreationForm
+    form_class = RegistrationForm
     template = "auth/register.html"
     placeholdize = True
     title = _('Register')
     template = "auth/register.html"
     placeholdize = True
     title = _('Register')
@@ -90,7 +98,7 @@ class RegisterFormView(AjaxableFormView):
     honeypot = True
 
     def __call__(self, request):
     honeypot = True
 
     def __call__(self, request):
-        if request.user.is_authenticated():
+        if request.user.is_authenticated:
             return self.redirect_or_refresh(
                 request, '/',
                 message=_('Already logged in as user %(user)s', ) % {'user': request.user.username})
             return self.redirect_or_refresh(
                 request, '/',
                 message=_('Already logged in as user %(user)s', ) % {'user': request.user.username})
@@ -111,7 +119,7 @@ class LoginRegisterFormView(LoginFormView):
 
     def extra_context(self, request, obj):
         return {
 
     def extra_context(self, request, obj):
         return {
-            "register_form": placeholdized(UserCreationForm(prefix='register')),
+            "register_form": placeholdized(RegistrationForm(prefix='register')),
             "register_submit": _('Register'),
         }
 
             "register_submit": _('Register'),
         }
 
@@ -156,27 +164,21 @@ def user_settings(request):
     return render(request, "user.html")
 
 
     return render(request, "user.html")
 
 
-@ssi_included(use_lang=False, timeout=1800)
-def latest_blog_posts(request, feed_url=None, posts_to_show=5):
-    if feed_url is None:
-        feed_url = settings.LATEST_BLOG_POSTS
-    try:
-        feed = feedparser.parse(str(feed_url))
-        posts = []
-        for i in range(posts_to_show):
-            pub_date = feed['entries'][i].published_parsed
-            published = date(pub_date[0], pub_date[1], pub_date[2])
-            posts.append({
-                'title': feed['entries'][i].title,
-                'summary': feed['entries'][i].summary,
-                'link': feed['entries'][i].link,
-                'date': published,
-                })
-    except:
-        posts = []
-    return render(request, 'latest_blog_posts.html', {'posts': posts})
-
-
-@ssi_included(use_lang=False)
 def widget(request):
     return render(request, 'widget.html')
 def widget(request):
     return render(request, 'widget.html')
+
+
+class SocialSignupView(SignupView):
+    form_class = SocialSignupForm
+
+
+def exception_test(request):
+    msg = request.GET.get('msg')
+    if msg:
+        raise Exception('Exception test: %s' % msg)
+    else:
+        raise Exception('Exception test')
+
+
+def post_test(request):
+    return render(request, 'post_test.html', {'action': '/api/reading/jego-zasady/complete/'})