X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/ce8d791a5298e0cb2569034aec4c8b57afac97b2..8132fc186eb0c5fd02c86828c3a4735754296d02:/apps/catalogue/templatetags/wall.py diff --git a/apps/catalogue/templatetags/wall.py b/apps/catalogue/templatetags/wall.py index 5236eedf..d000421a 100755 --- a/apps/catalogue/templatetags/wall.py +++ b/apps/catalogue/templatetags/wall.py @@ -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), + ])}