1 from __future__ import absolute_import
3 from django.db.models import Count, Q
4 from django.core.urlresolvers import reverse
5 from django.contrib.comments.models import Comment
6 from django.template.defaultfilters import stringfilter
7 from django import template
8 from django.utils.translation import ugettext as _
10 from catalogue.models import Book, Chunk, BookPublishRecord
12 register = template.Library()
20 def __init__(self, slug, caption, url):
22 self.caption = caption
26 @register.inclusion_tag("catalogue/main_tabs.html", takes_context=True)
27 def main_tabs(context):
28 active = getattr(context['request'], 'catalogue_active_tab', None)
31 user = context['user']
32 if user.is_authenticated():
33 tabs.append(Tab('my', _('My page'), reverse("catalogue_user")))
35 tabs.append(Tab('all', _('All'), reverse("catalogue_document_list")))
36 tabs.append(Tab('users', _('Users'), reverse("catalogue_users")))
37 tabs.append(Tab('create', _('Add'), reverse("catalogue_create_missing")))
38 tabs.append(Tab('upload', _('Upload'), reverse("catalogue_upload")))
41 tabs.append(Tab('admin', _('Admin'), reverse("admin:index")))
43 return {"tabs": tabs, "active_tab": active}
46 class WallItem(object):
54 def __init__(self, tag):
59 return self.user.email
64 def changes_wall(user, max_len):
65 qs = Chunk.change_model.objects.filter(revision__gt=-1).order_by('-created_at')
66 qs = qs.defer('patch')
67 qs = qs.select_related('author', 'tree', 'tree__book__title')
69 qs = qs.filter(Q(author=user) | Q(tree__user=user))
72 tag = 'stage' if item.tags.count() else 'change'
75 w.title = chunk.pretty_name()
76 w.summary = item.description
77 w.url = reverse('wiki_editor',
78 args=[chunk.book.slug, chunk.slug]) + '?diff=%d' % item.revision
79 w.timestamp = item.created_at
81 w.email = item.author_email
85 # TODO: marked for publishing
88 def published_wall(user, max_len):
89 qs = BookPublishRecord.objects.select_related('book__title')
91 # TODO: published my book
92 qs = qs.filter(Q(user=user))
95 w = WallItem('publish')
96 w.title = item.book.title
98 w.url = chunk.book.get_absolute_url()
102 def comments_wall(user, max_len):
103 qs = Comment.objects.filter(is_public=True).select_related().order_by('-submit_date')
105 # TODO: comments concerning my books
106 qs = qs.filter(Q(user=user))
109 w = WallItem('comment')
110 w.title = item.content_object
111 w.summary = item.comment
112 w.url = item.content_object.get_absolute_url()
113 w.timestamp = item.submit_date
115 w.email = item.user_email
119 def big_wall(max_len, *args):
121 Takes some WallItem iterators and zips them into one big wall.
122 Input iterators must already be sorted by timestamp.
127 subwalls.append([next(w), w])
128 except StopIteration:
131 while max_len and subwalls:
132 i, next_item = max(enumerate(subwalls), key=lambda x: x[1][0].timestamp)
136 next_item[0] = next(next_item[1])
137 except StopIteration:
141 @register.inclusion_tag("catalogue/wall.html", takes_context=True)
142 def wall(context, user=None, max_len=10):
145 "request": context['request'],
146 "STATIC_URL": context['STATIC_URL'],
147 "wall": big_wall(max_len,
148 changes_wall(user, max_len),
149 published_wall(user, max_len),
150 comments_wall(user, max_len),