-# -*- 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
+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.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 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
+from wolnelektury.forms import RegistrationForm, SocialSignupForm
+@never_cache
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': [],
- 'cite': get_or_choose_cite(request),
}
- # 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.
if Fragment.objects.exists():
while True:
ctx['theme'] = Tag.objects.filter(category='theme').order_by('?')[:1][0]
- tf = Fragment.tagged.with_any([ctx['theme']]).select_related('book').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]
break
break
- # Choose a collection for main.
- try:
- ctx['collection'] = Collection.objects.order_by('?')[:1][0]
- except IndexError:
- pass
-
- ctx['best'] = Book.objects.order_by('?')[:5]
+ # Choose collections for main.
+ ctx['collections'] = Collection.objects.filter(listed=True).order_by('?')[:4]
+
+ best = []
+ best_places = 5
+ recommended_collection = None
+ for recommended in Collection.objects.filter(listed=True, role='recommend').order_by('?'):
+ if recommended_collection is None:
+ recommended_collection = recommended
+ 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
+ ctx['recommended_collection'] = recommended_collection
+ 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)
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})
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 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')
+class SocialSignupView(SignupView):
+ form_class = SocialSignupForm
+
+
def exception_test(request):
msg = request.GET.get('msg')
if msg: