Librarian in regular requirements.
[redakcja.git] / apps / catalogue / templatetags / wall.py
index 5236eed..d000421 100755 (executable)
@@ -1,12 +1,13 @@
 from __future__ import absolute_import
 
+from datetime import timedelta
 from django.db.models import Q
 from django.core.urlresolvers import reverse
 from django.contrib.comments.models import Comment
 from django import template
 from django.utils.translation import ugettext as _
 
-from catalogue.models import Chunk, BookPublishRecord
+from catalogue.models import Chunk, BookPublishRecord, Image, ImagePublishRecord
 
 register = template.Library()
 
@@ -17,6 +18,7 @@ class WallItem(object):
     url = ''
     timestamp = ''
     user = None
+    user_name = ''
     email = ''
 
     def __init__(self, tag):
@@ -29,16 +31,20 @@ class WallItem(object):
             return self.email
 
 
-def changes_wall(user, max_len):
-    qs = Chunk.change_model.objects.filter(revision__gt=-1).order_by('-created_at')
+def changes_wall(user=None, max_len=None, day=None):
+    qs = Chunk.change_model.objects.order_by('-created_at')
     qs = qs.select_related('author', 'tree', 'tree__book__title')
-    if user:
+    if user is not None:
         qs = qs.filter(Q(author=user) | Q(tree__user=user))
-    qs = qs[:max_len]
+    if max_len is not None:
+        qs = qs[:max_len]
+    if day is not None:
+        next_day = day + timedelta(1)
+        qs = qs.filter(created_at__gte=day, created_at__lt=next_day)
     for item in qs:
         tag = 'stage' if item.tags.count() else 'change'
         chunk = item.tree
-        w  = WallItem(tag)
+        w = WallItem(tag)
         if user and item.author != user:
             w.header = _('Related edit')
         else:
@@ -49,19 +55,54 @@ def changes_wall(user, max_len):
                 args=[chunk.book.slug, chunk.slug]) + '?diff=%d' % item.revision
         w.timestamp = item.created_at
         w.user = item.author
+        w.user_name = item.author_name
+        w.email = item.author_email
+        yield w
+
+
+def image_changes_wall(user=None, max_len=None, day=None):
+    qs = Image.change_model.objects.order_by('-created_at')
+    qs = qs.select_related('author', 'tree', 'tree__title')
+    if user is not None:
+        qs = qs.filter(Q(author=user) | Q(tree__user=user))
+    if max_len is not None:
+        qs = qs[:max_len]
+    if day is not None:
+        next_day = day + timedelta(1)
+        qs = qs.filter(created_at__gte=day, created_at__lt=next_day)
+    for item in qs:
+        tag = 'stage' if item.tags.count() else 'change'
+        image = item.tree
+        w  = WallItem(tag)
+        if user and item.author != user:
+            w.header = _('Related edit')
+        else:
+            w.header = _('Edit')
+        w.title = image.title
+        w.summary = item.description
+        w.url = reverse('wiki_img_editor', 
+                args=[image.slug]) + '?diff=%d' % item.revision
+        w.timestamp = item.created_at
+        w.user = item.author
+        w.user_name = item.author_name
         w.email = item.author_email
         yield w
 
 
+
 # TODO: marked for publishing
 
 
-def published_wall(user, max_len):
+def published_wall(user=None, max_len=None, day=None):
     qs = BookPublishRecord.objects.select_related('book__title')
     if user:
         # TODO: published my book
         qs = qs.filter(Q(user=user))
-    qs = qs[:max_len]
+    if max_len is not None:
+        qs = qs[:max_len]
+    if day is not None:
+        next_day = day + timedelta(1)
+        qs = qs.filter(timestamp__gte=day, timestamp__lt=next_day)
     for item in qs:
         w = WallItem('publish')
         w.header = _('Publication')
@@ -73,12 +114,37 @@ def published_wall(user, max_len):
         yield w
 
 
-def comments_wall(user, max_len):
+def image_published_wall(user=None, max_len=None, day=None):
+    qs = ImagePublishRecord.objects.select_related('image__title')
+    if user:
+        # TODO: published my book
+        qs = qs.filter(Q(user=user))
+    if max_len is not None:
+        qs = qs[:max_len]
+    if day is not None:
+        next_day = day + timedelta(1)
+        qs = qs.filter(timestamp__gte=day, timestamp__lt=next_day)
+    for item in qs:
+        w = WallItem('publish')
+        w.header = _('Publication')
+        w.title = item.image.title
+        w.timestamp = item.timestamp
+        w.url = item.image.get_absolute_url()
+        w.user = item.user
+        w.email = item.user.email
+        yield w
+
+
+def comments_wall(user=None, max_len=None, day=None):
     qs = Comment.objects.filter(is_public=True).select_related().order_by('-submit_date')
     if user:
         # TODO: comments concerning my books
         qs = qs.filter(Q(user=user))
-    qs = qs[:max_len]
+    if max_len is not None:
+        qs = qs[:max_len]
+    if day is not None:
+        next_day = day + timedelta(1)
+        qs = qs.filter(submit_date__gte=day, submit_date__lt=next_day)
     for item in qs:
         w  = WallItem('comment')
         w.header = _('Comment')
@@ -87,22 +153,26 @@ def comments_wall(user, max_len):
         w.url = item.content_object.get_absolute_url()
         w.timestamp = item.submit_date
         w.user = item.user
-        w.email = item.user_email
+        ui = item.userinfo
+        w.email = item.email
+        w.user_name = item.name
         yield w
 
 
-def big_wall(max_len, *args):
+def big_wall(walls, max_len=None):
     """
         Takes some WallItem iterators and zips them into one big wall.
         Input iterators must already be sorted by timestamp.
     """
     subwalls = []
-    for w in args:
+    for w in walls:
         try:
             subwalls.append([next(w), w])
         except StopIteration:
             pass
 
+    if max_len is None:
+        max_len = -1
     while max_len and subwalls:
         i, next_item = max(enumerate(subwalls), key=lambda x: x[1][0].timestamp)
         yield next_item[0]
@@ -118,8 +188,23 @@ def wall(context, user=None, max_len=100):
     return {
         "request": context['request'],
         "STATIC_URL": context['STATIC_URL'],
-        "wall": big_wall(max_len,
+        "wall": big_wall([
             changes_wall(user, max_len),
             published_wall(user, max_len),
+            image_changes_wall(user, max_len),
+            image_published_wall(user, max_len),
             comments_wall(user, max_len),
-        )}
+        ], max_len)}
+
+@register.inclusion_tag("catalogue/wall.html", takes_context=True)
+def day_wall(context, day):
+    return {
+        "request": context['request'],
+        "STATIC_URL": context['STATIC_URL'],
+        "wall": big_wall([
+            changes_wall(day=day),
+            published_wall(day=day),
+            image_changes_wall(day=day),
+            image_published_wall(day=day),
+            comments_wall(day=day),
+        ])}