1 from __future__ import absolute_import
3 from datetime import timedelta
4 from django.db.models import Q
5 from django.core.urlresolvers import reverse
6 from django import template
7 from django.utils.translation import ugettext as _
9 from catalogue.models import Chunk, BookPublishRecord, Image, ImagePublishRecord
11 register = template.Library()
14 class WallItem(object):
23 def __init__(self, tag):
28 return self.user.email
33 def changes_wall(user=None, max_len=None, day=None):
34 qs = Chunk.change_model.objects.order_by('-created_at')
35 qs = qs.select_related('author', 'tree', 'tree__book')
37 qs = qs.filter(Q(author=user) | Q(tree__user=user))
38 if max_len is not None:
41 next_day = day + timedelta(1)
42 qs = qs.filter(created_at__gte=day, created_at__lt=next_day)
44 tag = 'stage' if item.tags.count() else 'change'
47 if user and item.author != user:
48 w.header = _('Related edit')
51 w.title = chunk.pretty_name()
52 w.summary = item.description
53 w.url = reverse('wiki_editor',
54 args=[chunk.book.slug, chunk.slug]) + '?diff=%d' % item.revision
55 w.timestamp = item.created_at
57 w.user_name = item.author_name
58 w.email = item.author_email
62 def image_changes_wall(user=None, max_len=None, day=None):
63 qs = Image.change_model.objects.order_by('-created_at')
64 qs = qs.select_related('author', 'tree')
66 qs = qs.filter(Q(author=user) | Q(tree__user=user))
67 if max_len is not None:
70 next_day = day + timedelta(1)
71 qs = qs.filter(created_at__gte=day, created_at__lt=next_day)
73 tag = 'stage' if item.tags.count() else 'change'
76 if user and item.author != user:
77 w.header = _('Related edit')
81 w.summary = item.description
82 w.url = reverse('wiki_img_editor',
83 args=[image.slug]) + '?diff=%d' % item.revision
84 w.timestamp = item.created_at
86 w.user_name = item.author_name
87 w.email = item.author_email
92 # TODO: marked for publishing
95 def published_wall(user=None, max_len=None, day=None):
96 qs = BookPublishRecord.objects.select_related('book')
98 # TODO: published my book
99 qs = qs.filter(Q(user=user))
100 if max_len is not None:
103 next_day = day + timedelta(1)
104 qs = qs.filter(timestamp__gte=day, timestamp__lt=next_day)
106 w = WallItem('publish')
107 w.header = _('Publication')
108 w.title = item.book.title
109 w.timestamp = item.timestamp
110 w.url = item.book.get_absolute_url()
112 w.email = item.user.email
116 def image_published_wall(user=None, max_len=None, day=None):
117 qs = ImagePublishRecord.objects.select_related('image')
119 # TODO: published my book
120 qs = qs.filter(Q(user=user))
121 if max_len is not None:
124 next_day = day + timedelta(1)
125 qs = qs.filter(timestamp__gte=day, timestamp__lt=next_day)
127 w = WallItem('publish')
128 w.header = _('Publication')
129 w.title = item.image.title
130 w.timestamp = item.timestamp
131 w.url = item.image.get_absolute_url()
133 w.email = item.user.email
137 def big_wall(walls, max_len=None):
139 Takes some WallItem iterators and zips them into one big wall.
140 Input iterators must already be sorted by timestamp.
145 subwalls.append([next(w), w])
146 except StopIteration:
151 while max_len and subwalls:
152 i, next_item = max(enumerate(subwalls), key=lambda x: x[1][0].timestamp)
156 next_item[0] = next(next_item[1])
157 except StopIteration:
161 @register.inclusion_tag("catalogue/wall.html", takes_context=True)
162 def wall(context, user=None, max_len=100):
164 "request": context['request'],
165 "STATIC_URL": context['STATIC_URL'],
167 changes_wall(user, max_len),
168 published_wall(user, max_len),
169 image_changes_wall(user, max_len),
170 image_published_wall(user, max_len),
173 @register.inclusion_tag("catalogue/wall.html", takes_context=True)
174 def day_wall(context, day):
176 "request": context['request'],
177 "STATIC_URL": context['STATIC_URL'],
179 changes_wall(day=day),
180 published_wall(day=day),
181 image_changes_wall(day=day),
182 image_published_wall(day=day),