##// END OF EJS Templates
Added a short simple cache to the post template
Added a short simple cache to the post template

File last commit:

r533:a9b2c757 default
r543:cc55cb0b 1.7-dev
Show More
forms.py
313 lines | 9.4 KiB | text/x-python | PythonLexer
neko259
Added a regex for validation of tags. This refs #10
r69 import re
neko259
Added image duplicate check
r527 import time
import hashlib
Ilyas
Added django-simple-capthca support...
r78 from captcha.fields import CaptchaField
Ilyas
Added creating new thread form...
r14 from django import forms
neko259
Added form validation, added style for the tag panel. This fixes #13
r76 from django.forms.util import ErrorList
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 from django.utils.translation import ugettext_lazy as _
neko259
Added image duplicate check
r527
neko259
Added a new format panel to the text form
r438 from boards.mdx_neboard import formatters
neko259
Split up user models
r386 from boards.models.post import TITLE_MAX_LENGTH
neko259
Added image duplicate check
r527 from boards.models import User, Post
neko259
Added themes support. Added 'snow white' theme by Mystra_x64.
r35 from neboard import settings
wnc_21
Added captcha support
r95 from boards import utils
neko259
Moved some settings to boards.settings
r333 import boards.settings as board_settings
neko259
Added form validation, added style for the tag panel. This fixes #13
r76
neko259
Added placeholders to forms
r517 ATTRIBUTE_PLACEHOLDER = 'placeholder'
LAST_POST_TIME = 'last_post_time'
LAST_LOGIN_TIME = 'last_login_time'
TEXT_PLACEHOLDER = _('''Type message here. You can reply to message >>123 like
this. 2 new lines are required to start new paragraph.''')
neko259
Fixed tags field placeholder. Fixed thread title
r521 TAGS_PLACEHOLDER = _('tag1 several_words_tag')
neko259
Added localizations to forms. Do not allow users without session to post.
r211
neko259
Added image duplicate check
r527 ERROR_IMAGE_DUPLICATE = _('Such image was already posted')
LABEL_TITLE = _('Title')
LABEL_TEXT = _('Text')
neko259
Implemented posting delay. User must wait some time before posting (a measure against flood).
r153
neko259
Added a new format panel to the text form
r438 class FormatPanel(forms.Textarea):
def render(self, name, value, attrs=None):
output = '<div id="mark-panel">'
for formatter in formatters:
output += u'<span class="mark_btn"' + \
u' onClick="addMarkToMsg(\'' + formatter.format_left + \
'\', \'' + formatter.format_right + '\')">' + \
formatter.preview_left + formatter.name + \
formatter.preview_right + u'</span>'
output += '</div>'
output += super(FormatPanel, self).render(name, value, attrs=None)
return output
neko259
Added form validation, added style for the tag panel. This fixes #13
r76 class PlainErrorList(ErrorList):
def __unicode__(self):
return self.as_text()
def as_text(self):
return ''.join([u'(!) %s ' % e for e in self])
neko259
Added a text area to the posting form. Added a basic CSS style. Changed threads list a bit.
r16
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 class NeboardForm(forms.Form):
neko259
Small style and forms rendering changes
r426 def as_div(self):
neko259
Added a new format panel to the text form
r438 """
Returns this form rendered as HTML <as_div>s.
"""
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 return self._html_output(
neko259
Basic support for the generic forms. Still need to fix some things in the form...
r425 # TODO Do not show hidden rows in the list here
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 normal_row='<div class="form-row">'
'<div class="form-label">'
'%(label)s'
'</div>'
'<div class="form-input">'
'%(field)s'
'</div>'
'%(help_text)s'
'</div>',
neko259
Small style and forms rendering changes
r426 error_row='<div class="form-row">'
'<div class="form-label"></div>'
'<div class="form-errors">%s</div>'
'</div>',
row_ender='</div>',
help_text_html='%s',
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 errors_on_separate_row=True)
neko259
Added posting over ajax
r533 def as_json_errors(self):
errors = []
for name, field in self.fields.items():
if self[name].errors:
errors.append({
'field': name,
'errors': self[name].errors.as_text(),
})
return errors
neko259
Added a new format panel to the text form
r438
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 class PostForm(NeboardForm):
neko259
Added form validation, added style for the tag panel. This fixes #13
r76
neko259
Added some labels to the forms.
r232 title = forms.CharField(max_length=TITLE_MAX_LENGTH, required=False,
neko259
Added image duplicate check
r527 label=LABEL_TITLE)
neko259
Added placeholders to forms
r517 text = forms.CharField(
widget=FormatPanel(attrs={ATTRIBUTE_PLACEHOLDER: TEXT_PLACEHOLDER}),
neko259
Added image duplicate check
r527 required=False, label=LABEL_TEXT)
neko259
Added some labels to the forms.
r232 image = forms.ImageField(required=False, label=_('Image'))
neko259
Implemented form validation. When the form fails validation, showing the index page.
r29
neko259
Added a hidden antispam field to the forms.
r207 # This field is for spam prevention only
neko259
Added some labels to the forms.
r232 email = forms.CharField(max_length=100, required=False, label=_('e-mail'),
widget=forms.TextInput(attrs={
'class': 'form-email'}))
neko259
Added a hidden antispam field to the forms.
r207
neko259
Implemented posting delay. User must wait some time before posting (a measure against flood).
r153 session = None
neko259
Added autoban by the hidden field (to ban spammers and prevent them from trying to post anything).
r271 need_to_ban = False
neko259
Implemented posting delay. User must wait some time before posting (a measure against flood).
r153
neko259
Added form validation, added style for the tag panel. This fixes #13
r76 def clean_title(self):
title = self.cleaned_data['title']
if title:
if len(title) > TITLE_MAX_LENGTH:
neko259
Added localizations to forms. Do not allow users without session to post.
r211 raise forms.ValidationError(_('Title must have less than %s '
'characters') %
str(TITLE_MAX_LENGTH))
neko259
Added form validation, added style for the tag panel. This fixes #13
r76 return title
neko259
Implemented form validation. When the form fails validation, showing the index page.
r29 def clean_text(self):
text = self.cleaned_data['text']
if text:
neko259
Moved some settings to boards.settings
r333 if len(text) > board_settings.MAX_TEXT_LENGTH:
neko259
Added localizations to forms. Do not allow users without session to post.
r211 raise forms.ValidationError(_('Text must have less than %s '
'characters') %
neko259
Moved some settings to boards.settings
r333 str(board_settings
.MAX_TEXT_LENGTH))
neko259
Implemented form validation. When the form fails validation, showing the index page.
r29 return text
def clean_image(self):
image = self.cleaned_data['image']
if image:
neko259
Moved some settings to boards.settings
r333 if image._size > board_settings.MAX_IMAGE_SIZE:
raise forms.ValidationError(
_('Image must be less than %s bytes')
% str(board_settings.MAX_IMAGE_SIZE))
neko259
Added image duplicate check
r527
md5 = hashlib.md5()
for chunk in image.chunks():
md5.update(chunk)
image_hash = md5.hexdigest()
if Post.objects.filter(image_hash=image_hash).exists():
raise forms.ValidationError(ERROR_IMAGE_DUPLICATE)
neko259
Implemented form validation. When the form fails validation, showing the index page.
r29 return image
def clean(self):
cleaned_data = super(PostForm, self).clean()
neko259
Added localizations to forms. Do not allow users without session to post.
r211 if not self.session:
raise forms.ValidationError('Humans have sessions')
if cleaned_data['email']:
neko259
Added autoban by the hidden field (to ban spammers and prevent them from trying to post anything).
r271 self.need_to_ban = True
neko259
Added localizations to forms. Do not allow users without session to post.
r211 raise forms.ValidationError('A human cannot enter a hidden field')
neko259
Added a hidden antispam field to the forms.
r207
neko259
Fixed validation message. 'text or image must be entered' was shown instead of the read one.
r151 if not self.errors:
self._clean_text_image()
neko259
Fixed validation of image without text. This refs #13
r77
neko259
Implemented posting delay. User must wait some time before posting (a measure against flood).
r153 if not self.errors and self.session:
self._validate_posting_speed()
neko259
Added form validation, added style for the tag panel. This fixes #13
r76 return cleaned_data
def _clean_text_image(self):
text = self.cleaned_data.get('text')
image = self.cleaned_data.get('image')
neko259
Implemented form validation. When the form fails validation, showing the index page.
r29
if (not text) and (not image):
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 error_message = _('Either text or image must be entered.')
neko259
Fixed validation of image without text. This refs #13
r77 self._errors['text'] = self.error_class([error_message])
neko259
Implemented posting delay. User must wait some time before posting (a measure against flood).
r153
def _validate_posting_speed(self):
can_post = True
if LAST_POST_TIME in self.session:
now = time.time()
last_post_time = self.session[LAST_POST_TIME]
current_delay = int(now - last_post_time)
if current_delay < settings.POSTING_DELAY:
neko259
Added localizations to forms. Do not allow users without session to post.
r211 error_message = _('Wait %s seconds after last posting') % str(
settings.POSTING_DELAY - current_delay)
neko259
Implemented posting delay. User must wait some time before posting (a measure against flood).
r153 self._errors['text'] = self.error_class([error_message])
can_post = False
if can_post:
self.session[LAST_POST_TIME] = time.time()
neko259
Implemented form validation. When the form fails validation, showing the index page.
r29
class ThreadForm(PostForm):
neko259
Added some labels to the forms.
r232
neko259
Fixed unicode tags validation. Moved constants from classes to modules. Added error 404 when trying to get the non-existent thread. This fixes #19
r71 regex_tags = re.compile(ur'^[\w\s\d]+$', re.UNICODE)
neko259
Added some labels to the forms.
r232
neko259
Added placeholders to forms
r517 tags = forms.CharField(
widget=forms.TextInput(attrs={ATTRIBUTE_PLACEHOLDER: TAGS_PLACEHOLDER}),
max_length=100, label=_('Tags'))
neko259
Changed metadata design. Make space split tags.
r31
def clean_tags(self):
tags = self.cleaned_data['tags']
neko259
Added a regex for validation of tags. This refs #10
r69
neko259
Changed metadata design. Make space split tags.
r31 if tags:
neko259
Added a regex for validation of tags. This refs #10
r69 if not self.regex_tags.match(tags):
raise forms.ValidationError(
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 _('Inappropriate characters in tags.'))
neko259
Changed metadata design. Make space split tags.
r31
return tags
def clean(self):
cleaned_data = super(ThreadForm, self).clean()
neko259
Added themes support. Added 'snow white' theme by Mystra_x64.
r35 return cleaned_data
wnc_21
Added captcha support
r95 class PostCaptchaForm(PostForm):
captcha = CaptchaField()
def __init__(self, *args, **kwargs):
self.request = kwargs['request']
del kwargs['request']
super(PostCaptchaForm, self).__init__(*args, **kwargs)
def clean(self):
cleaned_data = super(PostCaptchaForm, self).clean()
success = self.is_valid()
utils.update_captcha_access(self.request, success)
if success:
return cleaned_data
else:
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 raise forms.ValidationError(_("Captcha validation failed"))
wnc_21
Added captcha support
r95
Ilyas
Added django-simple-capthca support...
r78 class ThreadCaptchaForm(ThreadForm):
captcha = CaptchaField()
wnc_21
Added captcha support
r95 def __init__(self, *args, **kwargs):
self.request = kwargs['request']
del kwargs['request']
super(ThreadCaptchaForm, self).__init__(*args, **kwargs)
def clean(self):
cleaned_data = super(ThreadCaptchaForm, self).clean()
success = self.is_valid()
utils.update_captcha_access(self.request, success)
if success:
return cleaned_data
else:
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 raise forms.ValidationError(_("Captcha validation failed"))
wnc_21
Added captcha support
r95
Ilyas
Added django-simple-capthca support...
r78
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 class SettingsForm(NeboardForm):
theme = forms.ChoiceField(choices=settings.THEMES,
label=_('Theme'))
neko259
Added login functionality.
r144
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 class ModeratorSettingsForm(SettingsForm):
moderate = forms.BooleanField(required=False, label=_('Enable moderation '
'panel'))
class LoginForm(NeboardForm):
neko259
Added localizations to forms. Do not allow users without session to post.
r211
neko259
Added login functionality.
r144 user_id = forms.CharField()
neko259
Added localizations to forms. Do not allow users without session to post.
r211 session = None
neko259
Added login functionality.
r144 def clean_user_id(self):
user_id = self.cleaned_data['user_id']
if user_id:
users = User.objects.filter(user_id=user_id)
if len(users) == 0:
neko259
Added ability to disable moderator panel. Refactored forms code. Translating forms.
r205 raise forms.ValidationError(_('No such user found'))
neko259
Added login functionality.
r144
return user_id
neko259
Added localizations to forms. Do not allow users without session to post.
r211 def _validate_login_speed(self):
can_post = True
if LAST_LOGIN_TIME in self.session:
now = time.time()
last_login_time = self.session[LAST_LOGIN_TIME]
current_delay = int(now - last_login_time)
neko259
Moved some settings to boards.settings
r333 if current_delay < board_settings.LOGIN_TIMEOUT:
neko259
Added localizations to forms. Do not allow users without session to post.
r211 error_message = _('Wait %s minutes after last login') % str(
neko259
Moved some settings to boards.settings
r333 (board_settings.LOGIN_TIMEOUT - current_delay) / 60)
neko259
Added localizations to forms. Do not allow users without session to post.
r211 self._errors['user_id'] = self.error_class([error_message])
can_post = False
if can_post:
self.session[LAST_LOGIN_TIME] = time.time()
neko259
Added login functionality.
r144 def clean(self):
neko259
Added localizations to forms. Do not allow users without session to post.
r211 if not self.session:
raise forms.ValidationError('Humans have sessions')
self._validate_login_speed()
neko259
Added login functionality.
r144 cleaned_data = super(LoginForm, self).clean()
neko259
Added autoban by the hidden field (to ban spammers and prevent them from trying to post anything).
r271 return cleaned_data