Skip to content

Commit

Permalink
zds/forum/forums: refactor clean_data field checking
Browse files Browse the repository at this point in the history
  • Loading branch information
gasche authored and artragis committed Nov 11, 2018
1 parent 4cbe828 commit f8d4404
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 32 deletions.
50 changes: 18 additions & 32 deletions zds/forum/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
from crispy_forms.layout import Layout, Field, Hidden, HTML
from crispy_forms.bootstrap import StrictButton
from zds.forum.models import Forum, Topic
from zds.utils.forms import CommonLayoutEditor, TagValidator
from zds.utils.forms import CommonLayoutEditor, TagValidator, FieldValidatorMixin


class TopicForm(forms.Form):
class TopicForm(forms.Form, FieldValidatorMixin):
title = forms.CharField(
label=_('Titre'),
max_length=Topic._meta.get_field('title').max_length,
Expand Down Expand Up @@ -77,34 +77,24 @@ def __init__(self, *args, **kwargs):
def clean(self):
cleaned_data = super(TopicForm, self).clean()

title = cleaned_data.get('title')
text = cleaned_data.get('text')
tags = cleaned_data.get('tags')
self.get_non_empty_field_or_error(cleaned_data, 'title',
lambda: _('Le champ titre ne peut être vide'))
text = self.get_non_empty_field_or_error(cleaned_data, 'text',
lambda: _('Le champ text ne peut être vide'))

if title is not None:
if not title.strip():
self._errors['title'] = self.error_class(
[_('Le champ titre ne peut être vide')])
if 'title' in cleaned_data:
del cleaned_data['title']
if text is not None and not text.strip():
self._errors['text'] = self.error_class(
[_('Le champ text ne peut être vide')])
if 'text' in cleaned_data:
del cleaned_data['text']

if text is not None and len(text) > settings.ZDS_APP['forum']['max_post_length']:
self._errors['text'] = self.error_class(
[_('Ce message est trop long, il ne doit pas dépasser {0} '
'caractères').format(settings.ZDS_APP['forum']['max_post_length'])])
if text:
self.check_text_length_limit(text, settings.ZDS_APP['forum']['max_post_length'],
lambda: _('Ce message est trop long, '
'il ne doit pas dépasser {0} caractères'))

tags = cleaned_data.get('tags')
validator = TagValidator()
if not validator.validate_raw_string(tags):
self._errors['tags'] = self.error_class(validator.errors)
return cleaned_data


class PostForm(forms.Form):
class PostForm(forms.Form, FieldValidatorMixin):
text = forms.CharField(
label='',
widget=forms.Textarea(
Expand Down Expand Up @@ -149,17 +139,13 @@ def __init__(self, topic, user, *args, **kwargs):
def clean(self):
cleaned_data = super(PostForm, self).clean()

text = cleaned_data.get('text')

if text is None or not text.strip():
self._errors['text'] = self.error_class(
[_('Vous devez écrire une réponse !')])

elif len(text) > settings.ZDS_APP['forum']['max_post_length']:
self._errors['text'] = self.error_class(
[_('Ce message est trop long, il ne doit pas dépasser {0} '
'caractères').format(settings.ZDS_APP['forum']['max_post_length'])])
text = self.get_non_empty_field_or_error(cleaned_data, 'text',
lambda: _('Vous devez écrire une réponse !'))

if text:
self.check_text_length_limit(text, settings.ZDS_APP['forum']['max_post_length'],
lambda: _('Ce message est trop long, '
'il ne doit pas dépasser {0} caractères'))
return cleaned_data


Expand Down
16 changes: 16 additions & 0 deletions zds/utils/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,3 +143,19 @@ def validate_no_empty_slug(self, tag):
@property
def errors(self):
return self.__errors


class FieldValidatorMixin:
def get_non_empty_field_or_error(self, cleaned_data, key, error_message):
value = cleaned_data.get(key)
if value is not None and value.strip():
return value
else:
self._errors[key] = self.error_class([error_message()])
if key in cleaned_data:
del cleaned_data[key]
return None

def check_text_length_limit(self, text, max_length, message_format):
if len(text) > max_length:
self._errors['text'] = [message_format().format(max_length)]

0 comments on commit f8d4404

Please sign in to comment.