1 from __future__ import absolute_import
3 from django.db.models import Q
4 from django.core.urlresolvers import reverse
5 from django.contrib.comments.models import Comment
6 from django import template
7 from django.utils.translation import ugettext as _
9 from catalogue.models import Chunk, BookPublishRecord
11 register = template.Library()
14 class WallItem(object):
22 def __init__(self, tag):
27 return self.user.email
32 def changes_wall(user, max_len):
33 qs = Chunk.change_model.objects.filter(revision__gt=-1).order_by('-created_at')
34 qs = qs.select_related('author', 'tree', 'tree__book__title')
36 qs = qs.filter(Q(author=user) | Q(tree__user=user))
39 tag = 'stage' if item.tags.count() else 'change'
42 if user and item.author != user:
43 w.header = _('Related edit')
46 w.title = chunk.pretty_name()
47 w.summary = item.description
48 w.url = reverse('wiki_editor',
49 args=[chunk.book.slug, chunk.slug]) + '?diff=%d' % item.revision
50 w.timestamp = item.created_at
52 w.email = item.author_email
56 # TODO: marked for publishing
59 def published_wall(user, max_len):
60 qs = BookPublishRecord.objects.select_related('book__title')
62 # TODO: published my book
63 qs = qs.filter(Q(user=user))
66 w = WallItem('publish')
67 w.header = _('Publication')
68 w.title = item.book.title
69 w.timestamp = item.timestamp
70 w.url = item.book.get_absolute_url()
72 w.email = item.user.email
76 def comments_wall(user, max_len):
77 qs = Comment.objects.filter(is_public=True).select_related().order_by('-submit_date')
79 # TODO: comments concerning my books
80 qs = qs.filter(Q(user=user))
83 w = WallItem('comment')
84 w.header = _('Comment')
85 w.title = item.content_object
86 w.summary = item.comment
87 w.url = item.content_object.get_absolute_url()
88 w.timestamp = item.submit_date
90 w.email = item.user_email
94 def big_wall(max_len, *args):
96 Takes some WallItem iterators and zips them into one big wall.
97 Input iterators must already be sorted by timestamp.
102 subwalls.append([next(w), w])
103 except StopIteration:
106 while max_len and subwalls:
107 i, next_item = max(enumerate(subwalls), key=lambda x: x[1][0].timestamp)
111 next_item[0] = next(next_item[1])
112 except StopIteration:
116 @register.inclusion_tag("catalogue/wall.html", takes_context=True)
117 def wall(context, user=None, max_len=100):
119 "request": context['request'],
120 "STATIC_URL": context['STATIC_URL'],
121 "wall": big_wall(max_len,
122 changes_wall(user, max_len),
123 published_wall(user, max_len),
124 comments_wall(user, max_len),