1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
import re
from datetime import datetime
import os.path
from django import forms
from django.conf import settings
from django.utils.translation import ugettext as _
from django.contrib.auth.models import User
from pybb.models import Topic, Post, PrivateMessage, Attachment
from pybb import settings as pybb_settings
from django.conf import settings
class AddPostForm(forms.ModelForm):
name = forms.CharField(label=_('Subject'))
attachment = forms.FileField(label=_('Attachment'), required=False)
class Meta:
model = Post
# Listing fields again to get the the right order; See also the TODO
fields = ['name', 'body', 'markup', 'attachment', ]
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
self.topic = kwargs.pop('topic', None)
self.forum = kwargs.pop('forum', None)
super(AddPostForm, self).__init__(*args, **kwargs)
if self.topic:
self.fields['name'].widget = forms.HiddenInput()
self.fields['name'].required = False
if not pybb_settings.ATTACHMENT_ENABLE:
self.fields['attachment'].widget = forms.HiddenInput()
self.fields['attachment'].required = False
def clean_attachment(self):
if self.cleaned_data['attachment']:
memfile = self.cleaned_data['attachment']
if memfile.size > pybb_settings.ATTACHMENT_SIZE_LIMIT:
raise forms.ValidationError(_('Attachment is too big'))
return self.cleaned_data['attachment']
def save(self, *args, **kwargs):
if self.forum:
topic_is_new = True
topic = Topic(forum=self.forum,
user=self.user,
name=self.cleaned_data['name'])
topic.save(*args, **kwargs)
else:
topic_is_new = False
topic = self.topic
post = Post(topic=topic, user=self.user,
markup=self.cleaned_data['markup'],
body=self.cleaned_data['body'])
post.save(*args, **kwargs)
if pybb_settings.ATTACHMENT_ENABLE:
self.save_attachment(post, self.cleaned_data['attachment'])
return post
def save_attachment(self, post, memfile):
if memfile:
obj = Attachment(size=memfile.size, content_type=memfile.content_type,
name=memfile.name, post=post)
dir = os.path.join(settings.MEDIA_ROOT,
pybb_settings.ATTACHMENT_UPLOAD_TO)
fname = '%d.0' % post.id
path = os.path.join(dir, fname)
file(path, 'w').write(memfile.read())
obj.path = fname
obj.save()
class EditPostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['body', 'markup']
def save(self, *args, **kwargs):
post = super(EditPostForm, self).save(commit=False)
post.updated = datetime.now()
post.save(*args, **kwargs)
return post
class UserSearchForm(forms.Form):
query = forms.CharField(required=False, label='')
def filter(self, qs):
if self.is_valid():
query = self.cleaned_data['query']
return qs.filter(username__contains=query)
else:
return qs
|