~widelands-dev/widelands-website/trunk

« back to all changes in this revision

Viewing changes to pybb/models.py

  • Committer: franku
  • Date: 2016-12-13 18:28:51 UTC
  • mto: This revision was merged to the branch mainline in revision 443.
  • Revision ID: somal@arcor.de-20161213182851-bo5ebf8pdvw5beua
run the script

Show diffs side-by-side

added added

removed removed

Lines of Context:
60
60
 
61
61
 
62
62
class Forum(models.Model):
63
 
    category = models.ForeignKey(Category, related_name='forums', verbose_name=_('Category'))
 
63
    category = models.ForeignKey(
 
64
        Category, related_name='forums', verbose_name=_('Category'))
64
65
    name = models.CharField(_('Name'), max_length=80)
65
66
    position = models.IntegerField(_('Position'), blank=True, default=0)
66
67
    description = models.TextField(_('Description'), blank=True, default='')
67
 
    moderators = models.ManyToManyField(User, blank=True, verbose_name=_('Moderators'))
 
68
    moderators = models.ManyToManyField(
 
69
        User, blank=True, verbose_name=_('Moderators'))
68
70
    updated = models.DateTimeField(_('Updated'), null=True)
69
71
 
70
72
    class Meta:
91
93
 
92
94
    @property
93
95
    def last_post(self):
94
 
        posts = self.posts.exclude(hidden=True).order_by('-created').select_related()
 
96
        posts = self.posts.exclude(hidden=True).order_by(
 
97
            '-created').select_related()
95
98
        try:
96
99
            return posts[0]
97
100
        except IndexError:
98
101
            return None
99
102
 
 
103
 
100
104
class Topic(models.Model):
101
 
    forum = models.ForeignKey(Forum, related_name='topics', verbose_name=_('Forum'))
 
105
    forum = models.ForeignKey(
 
106
        Forum, related_name='topics', verbose_name=_('Forum'))
102
107
    name = models.CharField(_('Subject'), max_length=255)
103
108
    created = models.DateTimeField(_('Created'), null=True)
104
109
    updated = models.DateTimeField(_('Updated'), null=True)
106
111
    views = models.IntegerField(_('Views count'), blank=True, default=0)
107
112
    sticky = models.BooleanField(_('Sticky'), blank=True, default=False)
108
113
    closed = models.BooleanField(_('Closed'), blank=True, default=False)
109
 
    subscribers = models.ManyToManyField(User, related_name='subscriptions', verbose_name=_('Subscribers'), blank=True)
 
114
    subscribers = models.ManyToManyField(
 
115
        User, related_name='subscriptions', verbose_name=_('Subscribers'), blank=True)
110
116
 
111
117
    # Django sphinx
112
118
    if settings.USE_SPHINX:
113
119
        search = SphinxSearch(
114
 
            weights = {
 
120
            weights={
115
121
                'name': 100,
116
 
                }
117
 
            )
 
122
            }
 
123
        )
118
124
 
119
125
    class Meta:
120
126
        ordering = ['-updated']
136
142
    @property
137
143
    def is_hidden(self):
138
144
        try:
139
 
            p = self.posts.order_by('created').filter(hidden=False).select_related()[0]
 
145
            p = self.posts.order_by('created').filter(
 
146
                hidden=False).select_related()[0]
140
147
        except IndexError:
141
148
            return True
142
149
        return False
160
167
            read.time = datetime.now()
161
168
            read.save()
162
169
 
163
 
    #def has_unreads(self, user):
164
 
        #try:
 
170
    # def has_unreads(self, user):
 
171
        # try:
165
172
            #read = Read.objects.get(user=user, topic=self)
166
 
        #except Read.DoesNotExist:
167
 
            #return True
168
 
        #else:
169
 
            #return self.updated > read.time
 
173
        # except Read.DoesNotExist:
 
174
            # return True
 
175
        # else:
 
176
            # return self.updated > read.time
170
177
 
171
178
 
172
179
class RenderableItem(models.Model):
173
 
    """
174
 
    Base class for models that has markup, body, body_text and body_html fields.
175
 
    """
 
180
    """Base class for models that has markup, body, body_text and body_html
 
181
    fields."""
176
182
 
177
183
    class Meta:
178
184
        abstract = True
181
187
        if self.markup == 'bbcode':
182
188
            self.body_html = mypostmarkup.markup(self.body, auto_urls=False)
183
189
        elif self.markup == 'markdown':
184
 
            self.body_html = unicode(do_wl_markdown(self.body, 'bleachit', wikiwords=False))
 
190
            self.body_html = unicode(do_wl_markdown(
 
191
                self.body, 'bleachit', wikiwords=False))
185
192
        else:
186
193
            raise Exception('Invalid markup property: %s' % self.markup)
187
194
 
193
200
 
194
201
        self.body_html = urlize(self.body_html)
195
202
 
 
203
 
196
204
class Post(RenderableItem):
197
 
    topic = models.ForeignKey(Topic, related_name='posts', verbose_name=_('Topic'))
198
 
    user = models.ForeignKey(User, related_name='posts', verbose_name=_('User'))
 
205
    topic = models.ForeignKey(
 
206
        Topic, related_name='posts', verbose_name=_('Topic'))
 
207
    user = models.ForeignKey(
 
208
        User, related_name='posts', verbose_name=_('User'))
199
209
    created = models.DateTimeField(_('Created'), blank=True)
200
210
    updated = models.DateTimeField(_('Updated'), blank=True, null=True)
201
 
    markup = models.CharField(_('Markup'), max_length=15, default=pybb_settings.DEFAULT_MARKUP, choices=MARKUP_CHOICES)
 
211
    markup = models.CharField(_('Markup'), max_length=15,
 
212
                              default=pybb_settings.DEFAULT_MARKUP, choices=MARKUP_CHOICES)
202
213
    body = models.TextField(_('Message'))
203
214
    body_html = models.TextField(_('HTML version'))
204
215
    body_text = models.TextField(_('Text version'))
208
219
    # Django sphinx
209
220
    if settings.USE_SPHINX:
210
221
        search = SphinxSearch(
211
 
            weights = {
 
222
            weights={
212
223
                'body_text': 100,
213
224
                'body_html': 0,
214
 
                }
215
 
            )
216
 
 
 
225
            }
 
226
        )
217
227
 
218
228
    class Meta:
219
229
        ordering = ['created']
243
253
 
244
254
        super(Post, self).save(*args, **kwargs)
245
255
 
246
 
 
247
256
    def get_absolute_url(self):
248
257
        return reverse('pybb_post', args=[self.id])
249
258
 
250
259
    def unhide_post(self):
251
 
        "Unhide post(s) and inform subscribers"
 
260
        """Unhide post(s) and inform subscribers."""
252
261
        self.hidden = False
253
262
        self.save()
254
263
        if self.topic.post_count == 1:
255
264
            # The topic is new
256
 
            send(User.objects.all(), "forum_new_topic",
257
 
                 {'topic': self.topic, 'post':self, 'user':self.topic.user})
 
265
            send(User.objects.all(), 'forum_new_topic',
 
266
                 {'topic': self.topic, 'post': self, 'user': self.topic.user})
258
267
        else:
259
268
            # Inform topic subscribers
260
 
            send(self.topic.subscribers.all(), "forum_new_post",
261
 
                    {'post':self, 'topic':self.topic, 'user':self.user})
 
269
            send(self.topic.subscribers.all(), 'forum_new_post',
 
270
                 {'post': self, 'topic': self.topic, 'user': self.user})
262
271
 
263
272
    def delete(self, *args, **kwargs):
264
273
        self_id = self.id
273
282
 
274
283
 
275
284
class Read(models.Model):
276
 
    """
277
 
    For each topic that user has entered the time
278
 
    is logged to this model.
279
 
    """
 
285
    """For each topic that user has entered the time is logged to this
 
286
    model."""
280
287
 
281
288
    user = models.ForeignKey(User, verbose_name=_('User'))
282
289
    topic = models.ForeignKey(Topic, verbose_name=_('Topic'))
292
299
            self.time = datetime.now()
293
300
        super(Read, self).save(*args, **kwargs)
294
301
 
295
 
 
296
302
    def __unicode__(self):
297
303
        return u'T[%d], U[%d]: %s' % (self.topic.id, self.user.id, unicode(self.time))
298
304
 
299
305
 
300
306
class PrivateMessage(RenderableItem):
301
307
 
302
 
    dst_user = models.ForeignKey(User, verbose_name=_('Recipient'), related_name='dst_users')
303
 
    src_user = models.ForeignKey(User, verbose_name=_('Author'), related_name='src_users')
 
308
    dst_user = models.ForeignKey(User, verbose_name=_(
 
309
        'Recipient'), related_name='dst_users')
 
310
    src_user = models.ForeignKey(User, verbose_name=_(
 
311
        'Author'), related_name='src_users')
304
312
    read = models.BooleanField(_('Read'), blank=True, default=False)
305
313
    created = models.DateTimeField(_('Created'), blank=True)
306
 
    markup = models.CharField(_('Markup'), max_length=15, default=pybb_settings.DEFAULT_MARKUP, choices=MARKUP_CHOICES)
 
314
    markup = models.CharField(_('Markup'), max_length=15,
 
315
                              default=pybb_settings.DEFAULT_MARKUP, choices=MARKUP_CHOICES)
307
316
    subject = models.CharField(_('Subject'), max_length=255)
308
317
    body = models.TextField(_('Message'))
309
318
    body_html = models.TextField(_('HTML version'))
333
342
        super(PrivateMessage, self).save(*args, **kwargs)
334
343
 
335
344
    def get_absolute_url(self):
336
 
        return  reverse('pybb_show_pm', args=[self.id])
 
345
        return reverse('pybb_show_pm', args=[self.id])
337
346
 
338
347
 
339
348
class Attachment(models.Model):
340
 
    post = models.ForeignKey(Post, verbose_name=_('Post'), related_name='attachments')
 
349
    post = models.ForeignKey(Post, verbose_name=_(
 
350
        'Post'), related_name='attachments')
341
351
    size = models.IntegerField(_('Size'))
342
352
    content_type = models.CharField(_('Content type'), max_length=255)
343
353
    path = models.CharField(_('Path'), max_length=255)
344
354
    name = models.TextField(_('Name'))
345
 
    hash = models.CharField(_('Hash'), max_length=40, blank=True, default='', db_index=True)
 
355
    hash = models.CharField(_('Hash'), max_length=40,
 
356
                            blank=True, default='', db_index=True)
346
357
 
347
358
    def save(self, *args, **kwargs):
348
359
        super(Attachment, self).save(*args, **kwargs)
349
360
        if not self.hash:
350
 
            self.hash = hashlib.sha1(str(self.id) + settings.SECRET_KEY).hexdigest()
 
361
            self.hash = hashlib.sha1(
 
362
                str(self.id) + settings.SECRET_KEY).hexdigest()
351
363
        super(Attachment, self).save(*args, **kwargs)
352
364
 
353
365
    def __unicode__(self):
365
377
        else:
366
378
            return '%.2fMb' % (size / float(1024 * 1024))
367
379
 
368
 
 
369
380
    def get_absolute_path(self):
370
381
        return os.path.join(settings.MEDIA_ROOT, pybb_settings.ATTACHMENT_UPLOAD_TO,
371
382
                            self.path)