~widelands-dev/widelands-website/trunk

« back to all changes in this revision

Viewing changes to pybb/models.py

  • Committer: Holger Rapp
  • Date: 2009-02-25 16:55:36 UTC
  • Revision ID: sirver@kallisto.local-20090225165536-3abfhjx8qsgtzyru
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :(

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
from datetime import datetime
2
 
from mainpage.templatetags.wl_markdown import do_wl_markdown
 
2
from markdown import Markdown
3
3
import os.path
4
 
import hashlib
 
4
import sha
5
5
 
6
6
from django.db import models
7
7
from django.contrib.auth.models import User
10
10
from django.utils.translation import ugettext_lazy as _
11
11
from django.conf import settings
12
12
 
13
 
from pybb.markups import mypostmarkup
 
13
from pybb.markups import mypostmarkup 
 
14
from pybb.fields import AutoOneToOneField, ExtendedImageField
14
15
from pybb.util import urlize, memoize_method, unescape
15
16
from pybb import settings as pybb_settings
16
17
 
17
 
from django.conf import settings
18
 
if settings.USE_SPHINX:
19
 
    from djangosphinx.models import SphinxSearch
20
 
 
21
 
try:
22
 
    from notification import models as notification
23
 
    from django.db.models import signals
24
 
except ImportError:
25
 
    notification = None
 
18
TZ_CHOICES = [(float(x[0]), x[1]) for x in (
 
19
    (-12, '-12'), (-11, '-11'), (-10, '-10'), (-9.5, '-09.5'), (-9, '-09'),
 
20
    (-8.5, '-08.5'), (-8, '-08 PST'), (-7, '-07 MST'), (-6, '-06 CST'),
 
21
    (-5, '-05 EST'), (-4, '-04 AST'), (-3.5, '-03.5'), (-3, '-03 ADT'),
 
22
    (-2, '-02'), (-1, '-01'), (0, '00 GMT'), (1, '+01 CET'), (2, '+02'),
 
23
    (3, '+03'), (3.5, '+03.5'), (4, '+04'), (4.5, '+04.5'), (5, '+05'),
 
24
    (5.5, '+05.5'), (6, '+06'), (6.5, '+06.5'), (7, '+07'), (8, '+08'),
 
25
    (9, '+09'), (9.5, '+09.5'), (10, '+10'), (10.5, '+10.5'), (11, '+11'),
 
26
    (11.5, '+11.5'), (12, '+12'), (13, '+13'), (14, '+14'),
 
27
)]
26
28
 
27
29
MARKUP_CHOICES = (
 
30
    ('bbcode', 'bbcode'),
28
31
    ('markdown', 'markdown'),
29
 
    ('bbcode', 'bbcode'),
30
32
)
31
33
 
32
34
 
51
53
    @property
52
54
    def topics(self):
53
55
        return Topic.objects.filter(forum__category=self).select_related()
54
 
 
 
56
    
55
57
    @property
56
58
    def posts(self):
57
59
        return Post.objects.filter(topic__forum__category=self).select_related()
64
66
    description = models.TextField(_('Description'), blank=True, default='')
65
67
    moderators = models.ManyToManyField(User, blank=True, null=True, verbose_name=_('Moderators'))
66
68
    updated = models.DateTimeField(_('Updated'), null=True)
 
69
    post_count = models.IntegerField(_('Post count'), blank=True, default=0)
67
70
 
68
71
    class Meta:
69
72
        ordering = ['position']
78
81
 
79
82
    def get_absolute_url(self):
80
83
        return reverse('pybb_forum', args=[self.id])
81
 
 
 
84
    
82
85
    @property
83
86
    def posts(self):
84
87
        return Post.objects.filter(topic__forum=self).select_related()
85
88
 
86
89
    @property
87
 
    def post_count(self):
88
 
        return Post.objects.filter(topic__forum=self).count()
89
 
 
90
 
    @property
91
90
    def last_post(self):
92
91
        posts = self.posts.order_by('-created').select_related()
93
92
        try:
106
105
    sticky = models.BooleanField(_('Sticky'), blank=True, default=False)
107
106
    closed = models.BooleanField(_('Closed'), blank=True, default=False)
108
107
    subscribers = models.ManyToManyField(User, related_name='subscriptions', verbose_name=_('Subscribers'), blank=True)
109
 
 
110
 
    # Django sphinx
111
 
    if settings.USE_SPHINX:
112
 
        search = SphinxSearch(
113
 
            weights = {
114
 
                'name': 100,
115
 
                }
116
 
            )
 
108
    post_count = models.IntegerField(_('Post count'), blank=True, default=0)
117
109
 
118
110
    class Meta:
119
 
        ordering = ['-updated']
 
111
        ordering = ['-created']
120
112
        verbose_name = _('Topic')
121
113
        verbose_name_plural = _('Topics')
122
114
 
123
115
    def __unicode__(self):
124
116
        return self.name
125
 
 
 
117
    
126
118
    @property
127
119
    def head(self):
128
120
        return self.posts.all().order_by('created').select_related()[0]
131
123
    def last_post(self):
132
124
        return self.posts.all().order_by('-created').select_related()[0]
133
125
 
134
 
    @property
135
 
    def post_count(self):
136
 
        return Post.objects.filter(topic=self).count()
137
 
 
138
126
    def get_absolute_url(self):
139
127
        return reverse('pybb_topic', args=[self.id])
140
128
 
141
129
    def save(self, *args, **kwargs):
142
 
        new = self.id is None
143
 
        if new:
 
130
        if self.id is None:
144
131
            self.created = datetime.now()
145
132
        super(Topic, self).save(*args, **kwargs)
146
133
 
171
158
        if self.markup == 'bbcode':
172
159
            self.body_html = mypostmarkup.markup(self.body, auto_urls=False)
173
160
        elif self.markup == 'markdown':
174
 
            self.body_html = unicode(do_wl_markdown(self.body, safe_mode='escape', wikiwords=False))
 
161
            self.body_html = unicode(Markdown(self.body, safe_mode='escape'))
175
162
        else:
176
163
            raise Exception('Invalid markup property: %s' % self.markup)
177
164
 
195
182
    body_text = models.TextField(_('Text version'))
196
183
    user_ip = models.IPAddressField(_('User IP'), blank=True, default='')
197
184
 
198
 
    # Django sphinx
199
 
    if settings.USE_SPHINX:
200
 
        search = SphinxSearch(
201
 
            weights = {
202
 
                'body_text': 100,
203
 
                'body_html': 0,
204
 
                }
205
 
            )
206
 
 
207
185
 
208
186
    class Meta:
209
187
        ordering = ['created']
212
190
 
213
191
    def summary(self):
214
192
        LIMIT = 50
215
 
        tail = len(self.body) > LIMIT and '...' or ''
 
193
        tail = len(self.body) > LIMIT and '...' or '' 
216
194
        return self.body[:LIMIT] + tail
217
195
 
218
196
    __unicode__ = summary
220
198
    def save(self, *args, **kwargs):
221
199
        if self.created is None:
222
200
            self.created = datetime.now()
223
 
 
224
201
        self.render()
225
202
 
226
203
        new = self.id is None
227
204
 
228
205
        if new:
229
206
            self.topic.updated = datetime.now()
 
207
            self.topic.post_count += 1
230
208
            self.topic.save()
231
209
            self.topic.forum.updated = self.topic.updated
 
210
            self.topic.forum.post_count += 1
232
211
            self.topic.forum.save()
233
212
 
234
213
        super(Post, self).save(*args, **kwargs)
243
222
        head_post_id = self.topic.posts.order_by('created')[0].id
244
223
        super(Post, self).delete(*args, **kwargs)
245
224
 
 
225
        self.topic.post_count -= 1
246
226
        self.topic.save()
 
227
        self.topic.forum.post_count -= 1
247
228
        self.topic.forum.save()
248
229
 
249
230
        if self_id == head_post_id:
250
231
            self.topic.delete()
251
232
 
252
233
 
 
234
class Profile(models.Model):
 
235
    user = AutoOneToOneField(User, related_name='pybb_profile', verbose_name=_('User'))
 
236
    site = models.URLField(_('Site'), verify_exists=False, blank=True, default='')
 
237
    jabber = models.CharField(_('Jabber'), max_length=80, blank=True, default='')
 
238
    icq = models.CharField(_('ICQ'), max_length=12, blank=True, default='')
 
239
    msn = models.CharField(_('MSN'), max_length=80, blank=True, default='')
 
240
    aim = models.CharField(_('AIM'), max_length=80, blank=True, default='')
 
241
    yahoo = models.CharField(_('Yahoo'), max_length=80, blank=True, default='')
 
242
    location = models.CharField(_('Location'), max_length=30, blank=True, default='')
 
243
    signature = models.TextField(_('Signature'), blank=True, default='', max_length=pybb_settings.SIGNATURE_MAX_LENGTH)
 
244
    time_zone = models.FloatField(_('Time zone'), choices=TZ_CHOICES, default=float(pybb_settings.DEFAULT_TIME_ZONE))
 
245
    language = models.CharField(_('Language'), max_length=10, blank=True, default='',
 
246
                                choices=settings.LANGUAGES)
 
247
    avatar = ExtendedImageField(_('Avatar'), blank=True, default='', upload_to=pybb_settings.AVATARS_UPLOAD_TO, width=pybb_settings.AVATAR_WIDTH, height=pybb_settings.AVATAR_HEIGHT)
 
248
    show_signatures = models.BooleanField(_('Show signatures'), blank=True, default=True)
 
249
    markup = models.CharField(_('Default markup'), max_length=15, default=pybb_settings.DEFAULT_MARKUP, choices=MARKUP_CHOICES)
 
250
 
 
251
    class Meta:
 
252
        verbose_name = _('Profile')
 
253
        verbose_name_plural = _('Profiles')
 
254
 
 
255
 
 
256
    @memoize_method
 
257
    def unread_pm_count(self):
 
258
        return PrivateMessage.objects.filter(dst_user=self, read=False).count()
 
259
 
 
260
    def post_count(self):
 
261
        """
 
262
        Return the nr of posts the user has. This uses djangos filter feature
 
263
        will therefore hit the database. This should maybe be reworked when the 
 
264
        database grows to not be always calculated.
 
265
        """
 
266
        return Post.objects.filter(user=self.user).count()
 
267
 
253
268
class Read(models.Model):
254
269
    """
255
 
    For each topic that user has entered the time
 
270
    For each topic that user has entered the time 
256
271
    is logged to this model.
257
272
    """
258
273
 
296
311
    # move to common functions
297
312
    def summary(self):
298
313
        LIMIT = 50
299
 
        tail = len(self.body) > LIMIT and '...' or ''
 
314
        tail = len(self.body) > LIMIT and '...' or '' 
300
315
        return self.body[:LIMIT] + tail
301
316
 
302
317
    def __unicode__(self):
325
340
    def save(self, *args, **kwargs):
326
341
        super(Attachment, self).save(*args, **kwargs)
327
342
        if not self.hash:
328
 
            self.hash = hashlib.sha1(str(self.id) + settings.SECRET_KEY).hexdigest()
 
343
            self.hash = sha.new(str(self.id) + settings.SECRET_KEY).hexdigest()
329
344
        super(Attachment, self).save(*args, **kwargs)
330
345
 
331
346
    def __unicode__(self):
349
364
                            self.path)
350
365
 
351
366
 
352
 
#if notification is not None:
353
 
#    signals.post_save.connect(notification.handle_observations, sender=Post)
354
 
 
355
367
from pybb import signals
356
368
signals.setup_signals()