341 lines
No EOL
12 KiB
Python
341 lines
No EOL
12 KiB
Python
# -*- coding: utf-8 -*-
|
|
import re
|
|
from datetime import datetime
|
|
|
|
from django import forms
|
|
from django.conf import settings
|
|
from django.db.models import Q
|
|
from django.shortcuts import get_object_or_404
|
|
from django.contrib.auth.models import User
|
|
from django.utils.translation import ugettext as _
|
|
|
|
from forum.models import Topic, Post, Profile, Reputation, Report, PrivateMessage, Forum
|
|
from forum.markups import mypostmarkup
|
|
|
|
SORT_USER_BY_CHOICES = (
|
|
('username', _(u'Username')),
|
|
('registered', _(u'Registered')),
|
|
('num_posts', _(u'No. of posts')),
|
|
)
|
|
|
|
SORT_POST_BY_CHOICES = (
|
|
('0', _(u'Post time')),
|
|
('1', _(u'Author')),
|
|
('2', _(u'Subject')),
|
|
('3', _(u'Forum')),
|
|
)
|
|
|
|
SORT_DIR_CHOICES = (
|
|
('ASC', _(u'Ascending')),
|
|
('DESC', _(u'Descending')),
|
|
)
|
|
|
|
SHOW_AS_CHOICES = (
|
|
('topics', _(u'Topics')),
|
|
('posts', _(u'Posts')),
|
|
)
|
|
|
|
SEARCH_IN_CHOICES = (
|
|
('all', _(u'Message text and topic subject')),
|
|
('message', _(u'Message text only')),
|
|
('topic', _(u'Topic subject only')),
|
|
)
|
|
|
|
class AddPostForm(forms.ModelForm):
|
|
name = forms.CharField(label=_('Subject'),
|
|
widget=forms.TextInput(attrs={'size':'115'}))
|
|
|
|
class Meta:
|
|
model = Post
|
|
fields = ['body']
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.user = kwargs.pop('user', None)
|
|
self.topic = kwargs.pop('topic', None)
|
|
self.forum = kwargs.pop('forum', None)
|
|
self.ip = kwargs.pop('ip', None)
|
|
super(AddPostForm, self).__init__(*args, **kwargs)
|
|
if self.topic:
|
|
self.fields['name'].widget = forms.HiddenInput()
|
|
self.fields['name'].required = False
|
|
self.fields['body'].widget = forms.Textarea(attrs={'class':'bbcode', 'rows':'20', 'cols':'95'})
|
|
|
|
|
|
|
|
def save(self):
|
|
if self.forum:
|
|
topic = Topic(forum=self.forum,
|
|
user=self.user,
|
|
name=self.cleaned_data['name'])
|
|
topic.save()
|
|
else:
|
|
topic = self.topic
|
|
|
|
post = Post(topic=topic, user=self.user, user_ip=self.ip,
|
|
markup='bbcode',
|
|
body=self.cleaned_data['body'])
|
|
post.save()
|
|
profile = get_object_or_404(Profile, user=self.user)
|
|
profile.post_count += 1
|
|
profile.save()
|
|
return post
|
|
|
|
class EssentialsProfileForm(forms.ModelForm):
|
|
username = forms.CharField(label=_('Username'))
|
|
email = forms.CharField(label=_('E-mail'))
|
|
|
|
class Meta:
|
|
model = Profile
|
|
fields = ['time_zone', 'language']
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.user = kwargs.pop('user', None)
|
|
super(EssentialsProfileForm, self).__init__(*args, **kwargs)
|
|
self.fields['username'].initial = self.user.username
|
|
self.fields['email'].initial = self.user.email
|
|
|
|
def save(self):
|
|
user = get_object_or_404(User, username=self.user)
|
|
profile = get_object_or_404(Profile, user=self.user)
|
|
if self.cleaned_data:
|
|
user.username = self.cleaned_data['username']
|
|
user.email = self.cleaned_data['email']
|
|
profile.time_zone = self.cleaned_data['time_zone']
|
|
profile.language = self.cleaned_data['language']
|
|
user.save()
|
|
return profile
|
|
|
|
|
|
class PersonalProfileForm(forms.ModelForm):
|
|
name = forms.CharField(label=_('Real name'))
|
|
|
|
class Meta:
|
|
model = Profile
|
|
fields = ['status', 'location', 'site']
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.user = kwargs.pop('user', None)
|
|
super(PersonalProfileForm, self).__init__(*args, **kwargs)
|
|
self.fields['name'].initial = "%s %s" % (self.user.first_name, self.user.last_name)
|
|
|
|
def save(self):
|
|
user = get_object_or_404(User, username=self.user)
|
|
profile = get_object_or_404(Profile, user=self.user)
|
|
profile.status = self.cleaned_data['status']
|
|
profile.location = self.cleaned_data['location']
|
|
profile.site = self.cleaned_data['site']
|
|
if self.cleaned_data['name']:
|
|
if len(self.cleaned_data['name'].split()) > 1:
|
|
user.first_name, user.last_name = self.cleaned_data['name'].split()
|
|
else:
|
|
user.first_name = self.cleaned_data['name'].split()[0]
|
|
user.last_name = ''
|
|
user.save()
|
|
return profile.save()
|
|
|
|
class MessagingProfileForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Profile
|
|
fields = ['jabber', 'icq', 'msn', 'aim', 'yahoo']
|
|
|
|
class PersonalityProfileForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Profile
|
|
fields = ['show_avatar', 'signature']
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(PersonalityProfileForm, self).__init__(*args, **kwargs)
|
|
self.fields['signature'].widget = forms.Textarea(attrs={'class':'bbcode', 'rows':'10', 'cols':'75'})
|
|
|
|
def save(self):
|
|
profile = super(PersonalityProfileForm, self).save(commit=False)
|
|
profile.signature = mypostmarkup.markup(profile.signature, auto_urls=False)
|
|
profile.save()
|
|
return profile
|
|
|
|
class DisplayProfileForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Profile
|
|
fields = ['theme']
|
|
|
|
class PrivacyProfileForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Profile
|
|
fields = ['privacy_permission']
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(PrivacyProfileForm, self).__init__(*args, **kwargs)
|
|
self.fields['privacy_permission'].widget = forms.RadioSelect(
|
|
choices=self.fields['privacy_permission'].choices
|
|
)
|
|
|
|
#class AdminProfileForm(forms.Form):
|
|
# forums = forms.CharField(label=_('Forums'))
|
|
#
|
|
# def __init__(self, *args, **kwargs):
|
|
# self.user = kwargs.pop('user', None)
|
|
# super(AdminProfileForm, self).__init__(*args, **kwargs)
|
|
# forums = [(forum, forum) for forum in Forum.objects.all()]
|
|
# self.fields['forums'].widget = forms.CheckboxSelectMultiple(
|
|
# choices=forums
|
|
# )
|
|
#
|
|
# def save(self):
|
|
# return self.forums
|
|
|
|
class UploadAvatarForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Profile
|
|
fields = ['avatar']
|
|
|
|
class EditPostForm(forms.ModelForm):
|
|
name = forms.CharField(required=False, label=_('Subject'),
|
|
widget=forms.TextInput(attrs={'size':'115'}))
|
|
|
|
class Meta:
|
|
model = Post
|
|
fields = ['body']
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.topic = kwargs.pop('topic', None)
|
|
super(EditPostForm, self).__init__(*args, **kwargs)
|
|
self.fields['name'].initial = self.topic
|
|
self.fields['body'].widget = forms.Textarea(attrs={'class':'bbcode'})
|
|
|
|
def save(self):
|
|
post = super(EditPostForm, self).save(commit=False)
|
|
post.updated = datetime.now()
|
|
post.save()
|
|
return post
|
|
|
|
|
|
class UserSearchForm(forms.Form):
|
|
username = forms.CharField(required=False, label=_('Username'))
|
|
#show_group = forms.ChoiceField(choices=SHOW_GROUP_CHOICES)
|
|
sort_by = forms.ChoiceField(choices=SORT_USER_BY_CHOICES, label=_('Sort by'))
|
|
sort_dir = forms.ChoiceField(choices=SORT_DIR_CHOICES, label=_('Sort order'))
|
|
|
|
def filter(self, qs):
|
|
if self.is_valid():
|
|
username = self.cleaned_data['username']
|
|
#show_group = self.cleaned_data['show_group']
|
|
sort_by = self.cleaned_data['sort_by']
|
|
sort_dir = self.cleaned_data['sort_dir']
|
|
if sort_by=='username':
|
|
if sort_dir=='ASC':
|
|
return qs.filter(username__contains=username).order_by('username')
|
|
elif sort_dir=='DESC':
|
|
return qs.filter(username__contains=username).order_by('-username')
|
|
elif sort_by=='registered':
|
|
if sort_dir=='ASC':
|
|
return qs.filter(username__contains=username).order_by('date_joined')
|
|
elif sort_dir=='DESC':
|
|
return qs.filter(username__contains=username).order_by('-date_joined')
|
|
elif sort_by=='num_posts':
|
|
if sort_dir=='ASC':
|
|
return qs.filter(username__contains=username).order_by('forum_profile__post_count')
|
|
elif sort_dir=='DESC':
|
|
return qs.filter(username__contains=username).order_by('-forum_profile__post_count')
|
|
else:
|
|
return qs
|
|
|
|
|
|
class PostSearchForm(forms.Form):
|
|
keywords = forms.CharField(required=False, label=_('Keyword search'),
|
|
widget=forms.TextInput(attrs={'size':'40', 'maxlength':'100'}))
|
|
author = forms.CharField(required=False, label=_('Author search'),
|
|
widget=forms.TextInput(attrs={'size':'25', 'maxlength':'25'}))
|
|
forum = forms.CharField(required=False, label=_('Forum'))
|
|
search_in = forms.ChoiceField(choices=SEARCH_IN_CHOICES, label=_('Search in'))
|
|
sort_by = forms.ChoiceField(choices=SORT_POST_BY_CHOICES, label=_('Sort by'))
|
|
sort_dir = forms.ChoiceField(choices=SORT_DIR_CHOICES, label=_('Sort order'))
|
|
show_as = forms.ChoiceField(choices=SHOW_AS_CHOICES, label=_('Show results as'))
|
|
|
|
|
|
class ReputationForm(forms.ModelForm):
|
|
|
|
class Meta:
|
|
model = Reputation
|
|
fields = ['reason', 'topic', 'sign']
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.from_user = kwargs.pop('from_user', None)
|
|
self.to_user = kwargs.pop('to_user', None)
|
|
self.topic = kwargs.pop('topic', None)
|
|
self.sign = kwargs.pop('sign', None)
|
|
super(ReputationForm, self).__init__(*args, **kwargs)
|
|
self.fields['topic'].widget = forms.HiddenInput()
|
|
self.fields['sign'].widget = forms.HiddenInput()
|
|
self.fields['reason'].widget = forms.Textarea(attrs={'class':'bbcode'})
|
|
|
|
def clean_to_user(self):
|
|
name = self.cleaned_data['to_user']
|
|
try:
|
|
user = User.objects.get(username=name)
|
|
except User.DoesNotExist:
|
|
raise forms.ValidationError(_('User with login %s does not exist') % name)
|
|
else:
|
|
return user
|
|
|
|
def save(self):
|
|
reputation = super(ReputationForm, self).save(commit=False)
|
|
reputation.from_user = self.from_user
|
|
reputation.to_user = self.to_user
|
|
reputation.time = datetime.now()
|
|
reputation.save()
|
|
return reputation
|
|
|
|
class MailToForm(forms.Form):
|
|
subject = forms.CharField(label=_('Subject'),
|
|
widget=forms.TextInput(attrs={'size':'75', 'maxlength':'70', 'class':'longinput'}))
|
|
body = forms.CharField(required=False, label=_('Message'),
|
|
widget=forms.Textarea(attrs={'rows':'10', 'cols':'75'}))
|
|
|
|
class ReportForm(forms.ModelForm):
|
|
|
|
class Meta:
|
|
model = Report
|
|
fields = ['reason', 'post']
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.reported_by = kwargs.pop('reported_by', None)
|
|
self.post = kwargs.pop('post', None)
|
|
super(ReportForm, self).__init__(*args, **kwargs)
|
|
self.fields['post'].widget = forms.HiddenInput()
|
|
self.fields['post'].initial = self.post
|
|
self.fields['reason'].widget = forms.Textarea(attrs={'rows':'10', 'cols':'75'})
|
|
|
|
def save(self):
|
|
report = super(ReportForm, self).save(commit=False)
|
|
report.created = datetime.now()
|
|
report.reported_by = self.reported_by
|
|
report.save()
|
|
return report
|
|
|
|
class CreatePMForm(forms.ModelForm):
|
|
recipient = forms.CharField(label=_('Recipient'))
|
|
|
|
class Meta:
|
|
model = PrivateMessage
|
|
fields = ['subject', 'body']
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.user = kwargs.pop('user', None)
|
|
super(CreatePMForm, self).__init__(*args, **kwargs)
|
|
self.fields.keyOrder = ['recipient', 'subject', 'body']
|
|
self.fields['subject'].widget = widget=forms.TextInput(attrs={'size':'115'})
|
|
self.fields['body'].widget = forms.Textarea(attrs={'class':'bbcode'})
|
|
|
|
def clean_recipient(self):
|
|
name = self.cleaned_data['recipient']
|
|
try:
|
|
user = User.objects.get(username=name)
|
|
except User.DoesNotExist:
|
|
raise forms.ValidationError(_('User with login %s does not exist') % name)
|
|
else:
|
|
return user
|
|
|
|
def save(self):
|
|
pm = PrivateMessage(src_user=self.user, dst_user=self.cleaned_data['recipient'])
|
|
pm = forms.save_instance(self, pm)
|
|
return pm |