~widelands-dev/widelands-website/django_staticfiles

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()