X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/8830e06ad0b466c40747540b5122e6825114a90a..bb551d54ea65621cae28c6acbfd91b22dc441dae:/apps/wiki/templatetags/wiki.py diff --git a/apps/wiki/templatetags/wiki.py b/apps/wiki/templatetags/wiki.py index 8acf7619..db2eca3e 100644 --- a/apps/wiki/templatetags/wiki.py +++ b/apps/wiki/templatetags/wiki.py @@ -1,10 +1,13 @@ from __future__ import absolute_import +from django.db.models import Count from django.core.urlresolvers import reverse +from django.contrib.comments.models import Comment from django.template.defaultfilters import stringfilter from django import template from django.utils.translation import ugettext as _ +from wiki.models import Book, Chunk register = template.Library() @@ -30,6 +33,7 @@ def main_tabs(context): tabs.append(Tab('my', _('Assigned to me'), reverse("wiki_user"))) tabs.append(Tab('unassigned', _('Unassigned'), reverse("wiki_unassigned"))) + tabs.append(Tab('users', _('Users'), reverse("wiki_users"))) tabs.append(Tab('all', _('All'), reverse("wiki_document_list"))) tabs.append(Tab('create', _('Add'), reverse("wiki_create_missing"))) tabs.append(Tab('upload', _('Upload'), reverse("wiki_upload"))) @@ -38,3 +42,102 @@ def main_tabs(context): tabs.append(Tab('admin', _('Admin'), reverse("admin:index"))) return {"tabs": tabs, "active_tab": active} + + +class WallItem(object): + title = '' + summary = '' + url = '' + timestamp = '' + user = None + email = '' + + def __init__(self, tag): + self.tag = tag + + def get_email(self): + if self.user: + return self.user.email + else: + return self.email + + +def changes_wall(max_len): + qs = Chunk.change_model.objects.filter(revision__gt=-1).order_by('-created_at') + qs = qs.defer('patch') + qs = qs.select_related('author', 'tree') + #qs = qs.annotate(book_length=Count('chunk__book__chunk')) + qs = qs[:max_len] + for item in qs: + tag = 'stage' if item.tags.count() else 'change' + chunk = item.tree + w = WallItem(tag) + w.title = chunk.pretty_name() + w.summary = item.description + w.url = reverse('wiki_editor', + args=[chunk.book.slug, chunk.slug]) + '?diff=%d' % item.revision + w.timestamp = item.created_at + w.user = item.author + w.email = item.author_email + yield w + + +def published_wall(max_len): + qs = Book.objects.exclude(last_published=None).order_by('-last_published') + qs = qs[:max_len] + for item in qs: + w = WallItem('publish') + w.title = item.title + w.summary = item.title + w.url = chunk.book.get_absolute_url() + w.timestamp = item.last_published + w.user = item.last_published_by + yield w + + +def comments_wall(max_len): + qs = Comment.objects.filter(is_public=True).select_related().order_by('-submit_date') + qs = qs[:max_len] + for item in qs: + w = WallItem('comment') + w.title = item.content_object + w.summary = item.comment + w.url = item.content_object.get_absolute_url() + w.timestamp = item.submit_date + w.user = item.user + w.email = item.user_email + yield w + + +def big_wall(max_len, *args): + """ + Takes some WallItem iterators and zips them into one big wall. + Input iterators must already be sorted by timestamp. + """ + subwalls = [] + for w in args: + try: + subwalls.append([next(w), w]) + except StopIteration: + pass + + while max_len and subwalls: + i, next_item = max(enumerate(subwalls), key=lambda x: x[1][0].timestamp) + yield next_item[0] + max_len -= 1 + try: + next_item[0] = next(next_item[1]) + except StopIteration: + del subwalls[i] + + +@register.inclusion_tag("wiki/wall.html", takes_context=True) +def wall(context, max_len=10): + return { + "request": context['request'], + "STATIC_URL": context['STATIC_URL'], + "wall": big_wall(max_len, + changes_wall(max_len), + published_wall(max_len), + comments_wall(max_len), + )}