22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
1 |
from datetime import datetime |
274
by Holger Rapp
Disable wikiwords in the forums |
2 |
from mainpage.templatetags.wl_markdown import do_wl_markdown |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
3 |
import os.path |
254
by Holger Rapp
Fixed a few deprecation warnings and reparied cross site scripting fixes for AJAX requests |
4 |
import hashlib |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
5 |
|
6 |
from django.db import models |
|
7 |
from django.contrib.auth.models import User |
|
489.1.13
by franku
django.conf.urlresolvers -> django.urls |
8 |
from django.urls import reverse |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
9 |
from django.utils.html import strip_tags |
10 |
from django.utils.translation import ugettext_lazy as _ |
|
11 |
from django.conf import settings |
|
12 |
||
192
by Holger Rapp
Trying to fix 338756 |
13 |
from pybb.markups import mypostmarkup |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
14 |
from pybb.util import urlize, memoize_method, unescape |
15 |
from pybb import settings as pybb_settings |
|
90
by Holger Rapp
Sphinx must now be enabled in local_settings.py, otherwise it won't work |
16 |
|
17 |
from django.conf import settings |
|
427.1.8
by franku
moved unhide_post to pybb.models |
18 |
from notification.models import send |
19 |
from django.contrib.auth.models import User |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
20 |
|
209.1.21
by Timo Wingender
Add notifications to forum |
21 |
try: |
22 |
from notification import models as notification |
|
23 |
from django.db.models import signals |
|
24 |
except ImportError: |
|
25 |
notification = None |
|
26 |
||
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
27 |
MARKUP_CHOICES = ( |
28 |
('markdown', 'markdown'), |
|
209.1.68
by Timo Wingender
add field to choose between markdown and bbcode as markup |
29 |
('bbcode', 'bbcode'), |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
30 |
)
|
31 |
||
32 |
||
33 |
class Category(models.Model): |
|
34 |
name = models.CharField(_('Name'), max_length=80) |
|
35 |
position = models.IntegerField(_('Position'), blank=True, default=0) |
|
36 |
||
37 |
class Meta: |
|
38 |
ordering = ['position'] |
|
39 |
verbose_name = _('Category') |
|
40 |
verbose_name_plural = _('Categories') |
|
41 |
||
42 |
def __unicode__(self): |
|
43 |
return self.name |
|
44 |
||
45 |
def forum_count(self): |
|
46 |
return self.forums.all().count() |
|
47 |
||
48 |
def get_absolute_url(self): |
|
49 |
return reverse('pybb_category', args=[self.id]) |
|
50 |
||
51 |
@property
|
|
52 |
def topics(self): |
|
53 |
return Topic.objects.filter(forum__category=self).select_related() |
|
192
by Holger Rapp
Trying to fix 338756 |
54 |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
55 |
@property
|
56 |
def posts(self): |
|
57 |
return Post.objects.filter(topic__forum__category=self).select_related() |
|
58 |
||
59 |
||
60 |
class Forum(models.Model): |
|
438.1.6
by franku
run the script |
61 |
category = models.ForeignKey( |
62 |
Category, related_name='forums', verbose_name=_('Category')) |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
63 |
name = models.CharField(_('Name'), max_length=80) |
64 |
position = models.IntegerField(_('Position'), blank=True, default=0) |
|
65 |
description = models.TextField(_('Description'), blank=True, default='') |
|
438.1.6
by franku
run the script |
66 |
moderators = models.ManyToManyField( |
67 |
User, blank=True, verbose_name=_('Moderators')) |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
68 |
updated = models.DateTimeField(_('Updated'), null=True) |
69 |
||
70 |
class Meta: |
|
71 |
ordering = ['position'] |
|
72 |
verbose_name = _('Forum') |
|
73 |
verbose_name_plural = _('Forums') |
|
74 |
||
75 |
def __unicode__(self): |
|
76 |
return self.name |
|
77 |
||
78 |
def topic_count(self): |
|
79 |
return self.topics.all().count() |
|
80 |
||
81 |
def get_absolute_url(self): |
|
82 |
return reverse('pybb_forum', args=[self.id]) |
|
192
by Holger Rapp
Trying to fix 338756 |
83 |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
84 |
@property
|
85 |
def posts(self): |
|
429.1.2
by franku
reverted changes to pybb views; instead provide only non hidden adat for them; added django command |
86 |
return Post.objects.filter(topic__forum=self).exclude(hidden=True).select_related() |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
87 |
|
88 |
@property
|
|
323
by Holger Rapp
Let post count be calculated automatically instead of keeping track of it manually. Let's see how this affects performance |
89 |
def post_count(self): |
429.1.2
by franku
reverted changes to pybb views; instead provide only non hidden adat for them; added django command |
90 |
return Post.objects.filter(topic__forum=self).exclude(hidden=True).count() |
323
by Holger Rapp
Let post count be calculated automatically instead of keeping track of it manually. Let's see how this affects performance |
91 |
|
92 |
@property
|
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
93 |
def last_post(self): |
438.1.6
by franku
run the script |
94 |
posts = self.posts.exclude(hidden=True).order_by( |
95 |
'-created').select_related() |
|
422.1.1
by franku
add hided field to topic and post; hide topics; added akisemt python library |
96 |
try: |
97 |
return posts[0] |
|
98 |
except IndexError: |
|
99 |
return None |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
100 |
|
438.1.6
by franku
run the script |
101 |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
102 |
class Topic(models.Model): |
438.1.6
by franku
run the script |
103 |
forum = models.ForeignKey( |
104 |
Forum, related_name='topics', verbose_name=_('Forum')) |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
105 |
name = models.CharField(_('Subject'), max_length=255) |
106 |
created = models.DateTimeField(_('Created'), null=True) |
|
107 |
updated = models.DateTimeField(_('Updated'), null=True) |
|
108 |
user = models.ForeignKey(User, verbose_name=_('User')) |
|
109 |
views = models.IntegerField(_('Views count'), blank=True, default=0) |
|
110 |
sticky = models.BooleanField(_('Sticky'), blank=True, default=False) |
|
111 |
closed = models.BooleanField(_('Closed'), blank=True, default=False) |
|
438.1.6
by franku
run the script |
112 |
subscribers = models.ManyToManyField( |
113 |
User, related_name='subscriptions', verbose_name=_('Subscribers'), blank=True) |
|
192
by Holger Rapp
Trying to fix 338756 |
114 |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
115 |
class Meta: |
192
by Holger Rapp
Trying to fix 338756 |
116 |
ordering = ['-updated'] |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
117 |
verbose_name = _('Topic') |
118 |
verbose_name_plural = _('Topics') |
|
119 |
||
120 |
def __unicode__(self): |
|
121 |
return self.name |
|
192
by Holger Rapp
Trying to fix 338756 |
122 |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
123 |
@property
|
124 |
def head(self): |
|
125 |
return self.posts.all().order_by('created').select_related()[0] |
|
126 |
||
127 |
@property
|
|
128 |
def last_post(self): |
|
429.1.4
by franku
exclude hidden posts in models.topic |
129 |
return self.posts.exclude(hidden=True).order_by('-created').select_related()[0] |
422.1.9
by Holger Rapp
Minor nits. |
130 |
|
422.1.8
by GunChleoc
Proofreading. |
131 |
# If the first post of this topic is hidden, the topic is hidden
|
422.1.5
by franku
completed hiding of spam to normal users |
132 |
@property
|
422.1.8
by GunChleoc
Proofreading. |
133 |
def is_hidden(self): |
422.1.5
by franku
completed hiding of spam to normal users |
134 |
try: |
438.1.6
by franku
run the script |
135 |
p = self.posts.order_by('created').filter( |
136 |
hidden=False).select_related()[0] |
|
422.1.5
by franku
completed hiding of spam to normal users |
137 |
except IndexError: |
138 |
return True |
|
139 |
return False |
|
422.1.9
by Holger Rapp
Minor nits. |
140 |
|
422.1.5
by franku
completed hiding of spam to normal users |
141 |
@property
|
323
by Holger Rapp
Let post count be calculated automatically instead of keeping track of it manually. Let's see how this affects performance |
142 |
def post_count(self): |
429.1.2
by franku
reverted changes to pybb views; instead provide only non hidden adat for them; added django command |
143 |
return Post.objects.filter(topic=self).exclude(hidden=True).count() |
323
by Holger Rapp
Let post count be calculated automatically instead of keeping track of it manually. Let's see how this affects performance |
144 |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
145 |
def get_absolute_url(self): |
146 |
return reverse('pybb_topic', args=[self.id]) |
|
147 |
||
148 |
def save(self, *args, **kwargs): |
|
209.1.21
by Timo Wingender
Add notifications to forum |
149 |
new = self.id is None |
150 |
if new: |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
151 |
self.created = datetime.now() |
152 |
super(Topic, self).save(*args, **kwargs) |
|
153 |
||
154 |
def update_read(self, user): |
|
155 |
read, new = Read.objects.get_or_create(user=user, topic=self) |
|
156 |
if not new: |
|
157 |
read.time = datetime.now() |
|
158 |
read.save() |
|
159 |
||
438.1.6
by franku
run the script |
160 |
# def has_unreads(self, user):
|
161 |
# try:
|
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
162 |
#read = Read.objects.get(user=user, topic=self)
|
438.1.6
by franku
run the script |
163 |
# except Read.DoesNotExist:
|
164 |
# return True
|
|
165 |
# else:
|
|
166 |
# return self.updated > read.time
|
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
167 |
|
168 |
||
169 |
class RenderableItem(models.Model): |
|
438.1.6
by franku
run the script |
170 |
"""Base class for models that has markup, body, body_text and body_html
|
171 |
fields."""
|
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
172 |
|
173 |
class Meta: |
|
174 |
abstract = True |
|
175 |
||
176 |
def render(self): |
|
177 |
if self.markup == 'bbcode': |
|
178 |
self.body_html = mypostmarkup.markup(self.body, auto_urls=False) |
|
179 |
elif self.markup == 'markdown': |
|
438.1.6
by franku
run the script |
180 |
self.body_html = unicode(do_wl_markdown( |
449.2.4
by franku
adjusted backlinks; cleanup |
181 |
self.body, 'bleachit')) |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
182 |
else: |
183 |
raise Exception('Invalid markup property: %s' % self.markup) |
|
184 |
||
185 |
# Remove tags which was generated with the markup processor
|
|
186 |
text = strip_tags(self.body_html) |
|
187 |
||
188 |
# Unescape entities which was generated with the markup processor
|
|
189 |
self.body_text = unescape(text) |
|
190 |
||
191 |
self.body_html = urlize(self.body_html) |
|
192 |
||
438.1.6
by franku
run the script |
193 |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
194 |
class Post(RenderableItem): |
438.1.6
by franku
run the script |
195 |
topic = models.ForeignKey( |
196 |
Topic, related_name='posts', verbose_name=_('Topic')) |
|
197 |
user = models.ForeignKey( |
|
198 |
User, related_name='posts', verbose_name=_('User')) |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
199 |
created = models.DateTimeField(_('Created'), blank=True) |
200 |
updated = models.DateTimeField(_('Updated'), blank=True, null=True) |
|
438.1.6
by franku
run the script |
201 |
markup = models.CharField(_('Markup'), max_length=15, |
202 |
default=pybb_settings.DEFAULT_MARKUP, choices=MARKUP_CHOICES) |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
203 |
body = models.TextField(_('Message')) |
204 |
body_html = models.TextField(_('HTML version')) |
|
205 |
body_text = models.TextField(_('Text version')) |
|
404.2.1
by franku
first try on Django1.8 |
206 |
user_ip = models.GenericIPAddressField(_('User IP'), default='') |
422.1.8
by GunChleoc
Proofreading. |
207 |
hidden = models.BooleanField(_('Hidden'), blank=True, default=False) |
192
by Holger Rapp
Trying to fix 338756 |
208 |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
209 |
class Meta: |
210 |
ordering = ['created'] |
|
211 |
verbose_name = _('Post') |
|
212 |
verbose_name_plural = _('Posts') |
|
213 |
||
214 |
def summary(self): |
|
215 |
LIMIT = 50 |
|
192
by Holger Rapp
Trying to fix 338756 |
216 |
tail = len(self.body) > LIMIT and '...' or '' |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
217 |
return self.body[:LIMIT] + tail |
218 |
||
219 |
__unicode__ = summary |
|
220 |
||
221 |
def save(self, *args, **kwargs): |
|
222 |
if self.created is None: |
|
223 |
self.created = datetime.now() |
|
209.1.21
by Timo Wingender
Add notifications to forum |
224 |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
225 |
self.render() |
226 |
||
227 |
new = self.id is None |
|
228 |
||
229 |
if new: |
|
230 |
self.topic.updated = datetime.now() |
|
231 |
self.topic.save() |
|
232 |
self.topic.forum.updated = self.topic.updated |
|
233 |
self.topic.forum.save() |
|
234 |
||
235 |
super(Post, self).save(*args, **kwargs) |
|
236 |
||
237 |
def get_absolute_url(self): |
|
238 |
return reverse('pybb_post', args=[self.id]) |
|
239 |
||
427.1.8
by franku
moved unhide_post to pybb.models |
240 |
def unhide_post(self): |
438.1.6
by franku
run the script |
241 |
"""Unhide post(s) and inform subscribers."""
|
427.1.8
by franku
moved unhide_post to pybb.models |
242 |
self.hidden = False |
243 |
self.save() |
|
244 |
if self.topic.post_count == 1: |
|
245 |
# The topic is new
|
|
438.1.6
by franku
run the script |
246 |
send(User.objects.all(), 'forum_new_topic', |
247 |
{'topic': self.topic, 'post': self, 'user': self.topic.user}) |
|
427.1.8
by franku
moved unhide_post to pybb.models |
248 |
else: |
249 |
# Inform topic subscribers
|
|
438.1.6
by franku
run the script |
250 |
send(self.topic.subscribers.all(), 'forum_new_post', |
251 |
{'post': self, 'topic': self.topic, 'user': self.user}) |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
252 |
|
253 |
def delete(self, *args, **kwargs): |
|
254 |
self_id = self.id |
|
255 |
head_post_id = self.topic.posts.order_by('created')[0].id |
|
256 |
super(Post, self).delete(*args, **kwargs) |
|
257 |
||
258 |
self.topic.save() |
|
259 |
self.topic.forum.save() |
|
260 |
||
261 |
if self_id == head_post_id: |
|
262 |
self.topic.delete() |
|
263 |
||
264 |
||
265 |
class Read(models.Model): |
|
438.1.6
by franku
run the script |
266 |
"""For each topic that user has entered the time is logged to this
|
267 |
model."""
|
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
268 |
|
269 |
user = models.ForeignKey(User, verbose_name=_('User')) |
|
270 |
topic = models.ForeignKey(Topic, verbose_name=_('Topic')) |
|
271 |
time = models.DateTimeField(_('Time'), blank=True) |
|
272 |
||
273 |
class Meta: |
|
274 |
unique_together = ['user', 'topic'] |
|
275 |
verbose_name = _('Read') |
|
276 |
verbose_name_plural = _('Reads') |
|
277 |
||
278 |
def save(self, *args, **kwargs): |
|
279 |
if self.time is None: |
|
280 |
self.time = datetime.now() |
|
281 |
super(Read, self).save(*args, **kwargs) |
|
282 |
||
283 |
def __unicode__(self): |
|
284 |
return u'T[%d], U[%d]: %s' % (self.topic.id, self.user.id, unicode(self.time)) |
|
285 |
||
286 |
||
287 |
class PrivateMessage(RenderableItem): |
|
288 |
||
438.1.6
by franku
run the script |
289 |
dst_user = models.ForeignKey(User, verbose_name=_( |
290 |
'Recipient'), related_name='dst_users') |
|
291 |
src_user = models.ForeignKey(User, verbose_name=_( |
|
292 |
'Author'), related_name='src_users') |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
293 |
read = models.BooleanField(_('Read'), blank=True, default=False) |
294 |
created = models.DateTimeField(_('Created'), blank=True) |
|
438.1.6
by franku
run the script |
295 |
markup = models.CharField(_('Markup'), max_length=15, |
296 |
default=pybb_settings.DEFAULT_MARKUP, choices=MARKUP_CHOICES) |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
297 |
subject = models.CharField(_('Subject'), max_length=255) |
298 |
body = models.TextField(_('Message')) |
|
299 |
body_html = models.TextField(_('HTML version')) |
|
300 |
body_text = models.TextField(_('Text version')) |
|
301 |
||
302 |
class Meta: |
|
303 |
ordering = ['-created'] |
|
304 |
verbose_name = _('Private message') |
|
305 |
verbose_name_plural = _('Private messages') |
|
306 |
||
307 |
# TODO: summary and part of the save method is the same as in the Post model
|
|
308 |
# move to common functions
|
|
309 |
def summary(self): |
|
310 |
LIMIT = 50 |
|
192
by Holger Rapp
Trying to fix 338756 |
311 |
tail = len(self.body) > LIMIT and '...' or '' |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
312 |
return self.body[:LIMIT] + tail |
313 |
||
314 |
def __unicode__(self): |
|
315 |
return self.subject |
|
316 |
||
317 |
def save(self, *args, **kwargs): |
|
318 |
if self.created is None: |
|
319 |
self.created = datetime.now() |
|
320 |
self.render() |
|
321 |
||
322 |
new = self.id is None |
|
323 |
super(PrivateMessage, self).save(*args, **kwargs) |
|
324 |
||
325 |
def get_absolute_url(self): |
|
438.1.6
by franku
run the script |
326 |
return reverse('pybb_show_pm', args=[self.id]) |
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
327 |
|
328 |
||
329 |
class Attachment(models.Model): |
|
438.1.6
by franku
run the script |
330 |
post = models.ForeignKey(Post, verbose_name=_( |
331 |
'Post'), related_name='attachments') |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
332 |
size = models.IntegerField(_('Size')) |
333 |
content_type = models.CharField(_('Content type'), max_length=255) |
|
334 |
path = models.CharField(_('Path'), max_length=255) |
|
335 |
name = models.TextField(_('Name')) |
|
438.1.6
by franku
run the script |
336 |
hash = models.CharField(_('Hash'), max_length=40, |
337 |
blank=True, default='', db_index=True) |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
338 |
|
339 |
def save(self, *args, **kwargs): |
|
340 |
super(Attachment, self).save(*args, **kwargs) |
|
341 |
if not self.hash: |
|
438.1.6
by franku
run the script |
342 |
self.hash = hashlib.sha1( |
343 |
str(self.id) + settings.SECRET_KEY).hexdigest() |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
344 |
super(Attachment, self).save(*args, **kwargs) |
345 |
||
346 |
def __unicode__(self): |
|
347 |
return self.name |
|
348 |
||
349 |
def get_absolute_url(self): |
|
350 |
return reverse('pybb_attachment', args=[self.hash]) |
|
351 |
||
352 |
def size_display(self): |
|
353 |
size = self.size |
|
354 |
if size < 1024: |
|
355 |
return '%b' % size |
|
356 |
elif size < 1024 * 1024: |
|
357 |
return '%dKb' % int(size / 1024) |
|
358 |
else: |
|
359 |
return '%.2fMb' % (size / float(1024 * 1024)) |
|
360 |
||
361 |
def get_absolute_path(self): |
|
362 |
return os.path.join(settings.MEDIA_ROOT, pybb_settings.ATTACHMENT_UPLOAD_TO, |
|
363 |
self.path) |
|
364 |
||
365 |
||
404.2.25
by franku
added old notification app to widelands; deactivated notification feed |
366 |
if notification is not None: |
367 |
signals.post_save.connect(notification.handle_observations, sender=Post) |
|
209.1.21
by Timo Wingender
Add notifications to forum |
368 |
|
22
by Holger Rapp
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :( |
369 |
from pybb import signals |
370 |
signals.setup_signals() |