Update NOTICE.
[wolnelektury.git] / apps / lesmianator / views.py
index 2d6d53f..1ef4397 100644 (file)
@@ -1,60 +1,78 @@
-# Create your views here.
-
-import cPickle
-from django.shortcuts import render_to_response
+# -*- 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_to_response, get_object_or_404
 from django.template import RequestContext
-from random import randint
-
-
-def _choose_word(word):
-    try:
-        choices = sum((_dictionary[word][post] for post in _dictionary[word]))
-        r = randint(0, choices - 1)
-
-        for post in _dictionary[word]:
-            r -= _dictionary[word][post]
-            if r < 0:
-                return post
-    except KeyError:
-        return ''
-
-# load dictionary on start, it won't change
-from django.conf import settings
-
-try:
-    f = open(settings.LESMIANATOR_PICKLE)
-    _dictionary = cPickle.load(f)
-except:
-    _dictionary = {}
-
-
-def poem(request):
-    letters = []
-    word = u''
-    empty = -10
-    left = 1000
-    lines = 0
-    if not _dictionary:
-        left = 0
-    # want at least two lines, but let Lesmianator end his stanzas
-    while (empty < 2 or lines < 2) and left:
-        letter = _choose_word(word)
-        letters.append(letter)
-        word = word[-2:] + letter
-        if letter == u'\n':
-            # count non-empty lines
-            if empty == 0:
-                lines += 1
-            # 
-            if lines >= 2:
-                empty += 1
-            lines += 1
-        else:
-            empty = 0
-        left -= 1
-
-    poem = ''.join(letters).strip()
-
-    return render_to_response('lesmianator/poem.html', 
-                {"object": poem},
+from django.views.decorators import cache
+
+from catalogue.utils import get_random_hash
+from catalogue.models import Book, Tag
+from lesmianator.models import Poem, Continuations
+
+
+def main_page(request):
+    last = Poem.objects.all().order_by('-created_at')[:10]
+    shelves = Tag.objects.filter(user__username='lesmianator')
+
+    return render_to_response('lesmianator/lesmianator.html',
+                {"last": last, "shelves": shelves},
+                context_instance=RequestContext(request))
+
+
+@cache.never_cache
+def new_poem(request):
+    user = request.user if request.user.is_authenticated() else None
+    text = Poem.write()
+    p = Poem(slug=get_random_hash(text), text=text, created_by=user)
+    p.save()
+
+    return render_to_response('lesmianator/poem.html',
+                {"poem": p},
                 context_instance=RequestContext(request))
+
+
+@cache.never_cache
+def poem_from_book(request, slug):
+    book = get_object_or_404(Book, slug=slug)
+    user = request.user if request.user.is_authenticated() else None
+    text = Poem.write(Continuations.get(book))
+    p = Poem(slug=get_random_hash(text), text=text, created_by=user)
+    p.created_from = [book.id]
+    p.save()
+
+    return render_to_response('lesmianator/poem.html',
+                {"poem": p, "books": [book], "book": book},
+                context_instance=RequestContext(request))
+
+
+@cache.never_cache
+def poem_from_set(request, shelf):
+    user = request.user if request.user.is_authenticated() else None
+    tag = get_object_or_404(Tag, category='set', slug=shelf)
+    text = Poem.write(Continuations.get(tag))
+    p = Poem(slug=get_random_hash(text), text=text, created_by=user)
+    books = Book.tagged.with_any((tag,))
+    p.created_from = [b.id for b in books]
+    p.save()
+
+    book = books[0] if len(books) == 1 else None
+
+    return render_to_response('lesmianator/poem.html',
+                {"poem": p, "shelf": tag, "books": books, "book": book},
+                context_instance=RequestContext(request))
+
+def get_poem(request, poem):
+    p = get_object_or_404(Poem, slug=poem)
+    p.visit()
+    if p.created_from:
+        books = Book.objects.filter(id__in=p.created_from)
+        book = books[0] if len(books) == 1 else None
+    else:
+        books = book = None
+
+    return render_to_response('lesmianator/poem.html',
+                {"poem": p, "books": books, "book": book},
+                context_instance=RequestContext(request))
+
+