This repository has been archived on 2025-05-04. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
s2forums/apps/forum/forms.py

415 lines
17 KiB
Python
Raw Normal View History

2009-01-05 14:30:08 +02:00
# -*- 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 apps.forum.models import Topic, Post, Profile, Reputation, Report, PrivateMessage, Forum
from apps.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()
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.save()
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):
# print self.forums
# 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)
#show_group = forms.ChoiceField(choices=SHOW_GROUP_CHOICES)
sort_by = forms.ChoiceField(choices=SORT_USER_BY_CHOICES)
sort_dir = forms.ChoiceField(choices=SORT_DIR_CHOICES)
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':
#qs = qs.filter(username__contains=username).order_by('posts')
qs.query.group_by = ['username']
return qs
elif sort_dir=='DESC':
#qs = qs.filter(username__contains=username).order_by('-posts')
qs.query.group_by = ['username']
print qs
return qs
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'))
def filter(self, qs):
if self.is_valid():
keywords = self.cleaned_data['keywords']
author = self.cleaned_data['author']
forum = self.cleaned_data['forum']
search_in = self.cleaned_data['search_in']
sort_by = self.cleaned_data['sort_by']
sort_dir = self.cleaned_data['sort_dir']
if sort_by=='0':
if sort_dir=='ASC':
if search_in=='all':
return qs.filter(Q(topic__name__contains=keywords)).order_by('created')
elif search_in=='message':
return qs.filter(body__contains=keywords, user__username__contains=author).order_by('created')
elif search_in=='topic':
return qs.filter(topic__contains=keywords, user__username__contains=author).order_by('created')
elif sort_dir=='DESC':
if search_in=='all':
return qs.filter(Q(topic__contains=keywords) | Q(body__contains=keywords) & Q(user__username__contains=author)).order_by('-created')
elif search_in=='message':
return qs.filter(body__contains=keywords, user__username__contains=author).order_by('-created')
elif search_in=='topic':
return qs.filter(topic__contains=keywords, user__username__contains=author).order_by('-created')
elif sort_by=='1':
if sort_dir=='ASC':
if search_in=='all':
return qs.filter(Q(topic__contains=keywords) | Q(body__contains=keywords) & Q(user__username__contains=author)).order_by('user')
elif search_in=='message':
return qs.filter(body__contains=keywords, user__username__contains=author).order_by('user')
elif search_in=='topic':
return qs.filter(topic__contains=keywords, user__username__contains=author).order_by('user')
elif sort_dir=='DESC':
if search_in=='all':
return qs.filter(Q(topic__contains=keywords) | Q(body__contains=keywords) & Q(user__username__contains=author)).order_by('-user')
elif search_in=='message':
return qs.filter(body__contains=keywords, user__username__contains=author).order_by('-user')
elif search_in=='topic':
return qs.filter(topic__contains=keywords, user__username__contains=author).order_by('-user')
elif sort_by=='2':
if sort_dir=='ASC':
if search_in=='all':
return qs.filter((Q(topic__contains=keywords) | Q(body__contains=keywords)) & Q(user__username__contains=author)).order_by('topic')
elif search_in=='message':
return qs.filter(body__contains=keywords, user__username__contains=author).order_by('topic')
elif search_in=='topic':
return qs.filter(topic__contains=keywords, user__username__contains=author).order_by('topic')
elif sort_dir=='DESC':
if search_in=='all':
return qs.filter((Q(topic__contains=keywords) | Q(body__contains=keywords)) & Q(user__username__contains=author)).order_by('-topic')
elif search_in=='message':
return qs.filter(body__contains=keywords, user__username__contains=author).order_by('-topic')
elif search_in=='topic':
return qs.filter(topic__contains=keywords, user__username__contains=author).order_by('-topic')
elif sort_by=='3':
if sort_dir=='ASC':
if search_in=='all':
return qs.filter((Q(topic__contains=keywords) | Q(body__contains=keywords)) & Q(user__username__contains=author)).order_by('topic__forum')
elif search_in=='message':
return qs.filter(body__contains=keywords, user__username__contains=author).order_by('topic__forum')
elif search_in=='topic':
return qs.filter(topic__contains=keywords, user__username__contains=author).order_by('topic__forum')
elif sort_dir=='DESC':
if search_in=='all':
return qs.filter((Q(topic__contains=keywords) | Q(body__contains=keywords)) & Q(user__username__contains=author)).order_by('-topic__forum')
elif search_in=='message':
return qs.filter(body__contains=keywords, user__username__contains=author).order_by('-topic__forum')
elif search_in=='topic':
return qs.filter(topic__contains=keywords, user__username__contains=author).order_by('-topic__forum')
else:
return qs
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
2009-01-09 16:23:39 +02:00
2009-01-05 14:30:08 +02:00
def save(self):
pm = PrivateMessage(src_user=self.user, dst_user=self.cleaned_data['recipient'])
pm = forms.save_instance(self, pm)
return pm