Django 1.11; removed unused comments app.
[redakcja.git] / src / catalogue / templatetags / wall.py
1 from __future__ import absolute_import
2
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 _
8
9 from catalogue.models import Chunk, BookPublishRecord, Image, ImagePublishRecord
10
11 register = template.Library()
12
13
14 class WallItem(object):
15     title = ''
16     summary = ''
17     url = ''
18     timestamp = ''
19     user = None
20     user_name = ''
21     email = ''
22
23     def __init__(self, tag):
24         self.tag = tag
25
26     def get_email(self):
27         if self.user:
28             return self.user.email
29         else:
30             return self.email
31
32
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')
36     if user is not None:
37         qs = qs.filter(Q(author=user) | Q(tree__user=user))
38     if max_len is not None:
39         qs = qs[:max_len]
40     if day is not None:
41         next_day = day + timedelta(1)
42         qs = qs.filter(created_at__gte=day, created_at__lt=next_day)
43     for item in qs:
44         tag = 'stage' if item.tags.count() else 'change'
45         chunk = item.tree
46         w = WallItem(tag)
47         if user and item.author != user:
48             w.header = _('Related edit')
49         else:
50             w.header = _('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
56         w.user = item.author
57         w.user_name = item.author_name
58         w.email = item.author_email
59         yield w
60
61
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')
65     if user is not None:
66         qs = qs.filter(Q(author=user) | Q(tree__user=user))
67     if max_len is not None:
68         qs = qs[:max_len]
69     if day is not None:
70         next_day = day + timedelta(1)
71         qs = qs.filter(created_at__gte=day, created_at__lt=next_day)
72     for item in qs:
73         tag = 'stage' if item.tags.count() else 'change'
74         image = item.tree
75         w  = WallItem(tag)
76         if user and item.author != user:
77             w.header = _('Related edit')
78         else:
79             w.header = _('Edit')
80         w.title = image.title
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
85         w.user = item.author
86         w.user_name = item.author_name
87         w.email = item.author_email
88         yield w
89
90
91
92 # TODO: marked for publishing
93
94
95 def published_wall(user=None, max_len=None, day=None):
96     qs = BookPublishRecord.objects.select_related('book')
97     if user:
98         # TODO: published my book
99         qs = qs.filter(Q(user=user))
100     if max_len is not None:
101         qs = qs[:max_len]
102     if day is not None:
103         next_day = day + timedelta(1)
104         qs = qs.filter(timestamp__gte=day, timestamp__lt=next_day)
105     for item in qs:
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()
111         w.user = item.user
112         w.email = item.user.email
113         yield w
114
115
116 def image_published_wall(user=None, max_len=None, day=None):
117     qs = ImagePublishRecord.objects.select_related('image')
118     if user:
119         # TODO: published my book
120         qs = qs.filter(Q(user=user))
121     if max_len is not None:
122         qs = qs[:max_len]
123     if day is not None:
124         next_day = day + timedelta(1)
125         qs = qs.filter(timestamp__gte=day, timestamp__lt=next_day)
126     for item in qs:
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()
132         w.user = item.user
133         w.email = item.user.email
134         yield w
135
136
137 def big_wall(walls, max_len=None):
138     """
139         Takes some WallItem iterators and zips them into one big wall.
140         Input iterators must already be sorted by timestamp.
141     """
142     subwalls = []
143     for w in walls:
144         try:
145             subwalls.append([next(w), w])
146         except StopIteration:
147             pass
148
149     if max_len is None:
150         max_len = -1
151     while max_len and subwalls:
152         i, next_item = max(enumerate(subwalls), key=lambda x: x[1][0].timestamp)
153         yield next_item[0]
154         max_len -= 1
155         try:
156             next_item[0] = next(next_item[1])
157         except StopIteration:
158             del subwalls[i]
159
160
161 @register.inclusion_tag("catalogue/wall.html", takes_context=True)
162 def wall(context, user=None, max_len=100):
163     return {
164         "request": context['request'],
165         "STATIC_URL": context['STATIC_URL'],
166         "wall": big_wall([
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),
171         ], max_len)}
172
173 @register.inclusion_tag("catalogue/wall.html", takes_context=True)
174 def day_wall(context, day):
175     return {
176         "request": context['request'],
177         "STATIC_URL": context['STATIC_URL'],
178         "wall": big_wall([
179             changes_wall(day=day),
180             published_wall(day=day),
181             image_changes_wall(day=day),
182             image_published_wall(day=day),
183         ])}