1 # -*- coding: utf-8 -*-
2 from __future__ import absolute_import
4 from datetime import timedelta
5 from django.db.models import Q
6 from django.core.urlresolvers import reverse
7 from django.contrib.comments.models import Comment
8 from django import template
9 from django.utils.translation import ugettext as _
11 from catalogue.models import Chunk, BookPublishRecord
13 register = template.Library()
16 class WallItem(object):
25 def __init__(self, tag):
30 return self.user.email
35 def changes_wall(user=None, max_len=None, day=None):
36 qs = Chunk.change_model.objects.order_by('-created_at')
37 qs = qs.select_related('author', 'tree', 'tree__book__title')
39 qs = qs.filter(Q(author=user) | Q(tree__user=user))
40 if max_len is not None:
43 next_day = day + timedelta(1)
44 qs = qs.filter(created_at__gte=day, created_at__lt=next_day)
46 tag = 'stage' if item.tags.count() else 'change'
49 if user and item.author != user:
50 w.header = _('Related edit')
53 w.title = chunk.pretty_name()
54 w.summary = item.description
55 w.url = reverse('wiki_editor', args=[chunk.book.slug, chunk.slug]) + '?diff=%d' % item.revision
56 w.timestamp = item.created_at
58 w.user_name = item.author_name
59 w.email = item.author_email
63 # TODO: marked for publishing
66 def published_wall(user=None, max_len=None, day=None):
67 qs = BookPublishRecord.objects.select_related('book__title')
69 # TODO: published my book
70 qs = qs.filter(Q(user=user))
71 if max_len is not None:
74 next_day = day + timedelta(1)
75 qs = qs.filter(timestamp__gte=day, timestamp__lt=next_day)
77 w = WallItem('publish')
78 w.header = _('Publication')
79 w.title = item.book.title
80 w.timestamp = item.timestamp
81 w.url = item.book.get_absolute_url()
83 w.email = item.user.email
87 def comments_wall(user=None, max_len=None, day=None):
88 qs = Comment.objects.filter(is_public=True).select_related().order_by('-submit_date')
90 # TODO: comments concerning my books
91 qs = qs.filter(Q(user=user))
92 if max_len is not None:
95 next_day = day + timedelta(1)
96 qs = qs.filter(submit_date__gte=day, submit_date__lt=next_day)
98 w = WallItem('comment')
99 w.header = _('Comment')
100 w.title = item.content_object
101 w.summary = item.comment
102 w.url = item.content_object.get_absolute_url()
103 w.timestamp = item.submit_date
107 w.user_name = item.name
111 def big_wall(walls, max_len=None):
113 Takes some WallItem iterators and zips them into one big wall.
114 Input iterators must already be sorted by timestamp.
119 subwalls.append([next(w), w])
120 except StopIteration:
125 while max_len and subwalls:
126 i, next_item = max(enumerate(subwalls), key=lambda x: x[1][0].timestamp)
130 next_item[0] = next(next_item[1])
131 except StopIteration:
135 @register.inclusion_tag("catalogue/wall.html", takes_context=True)
136 def wall(context, user=None, max_len=100):
138 "request": context['request'],
139 "STATIC_URL": context['STATIC_URL'],
141 changes_wall(user, max_len),
142 published_wall(user, max_len),
143 comments_wall(user, max_len),
147 @register.inclusion_tag("catalogue/wall.html", takes_context=True)
148 def day_wall(context, day):
150 "request": context['request'],
151 "STATIC_URL": context['STATIC_URL'],
153 changes_wall(day=day),
154 published_wall(day=day),
155 comments_wall(day=day),