diff --git a/forms.py b/forms.py index f09107e..5e15b18 100644 --- a/forms.py +++ b/forms.py @@ -1,28 +1,49 @@ from flask_wtf import FlaskForm -from wtforms import StringField, PasswordField, BooleanField +from wtforms import StringField, PasswordField, BooleanField, Form from wtforms.validators import DataRequired, Email, Length, EqualTo - -class LoginForm(FlaskForm): - ''' - Form Login - ''' +class EmailFieldMixin(Form): + """ + mixin class to provide email field to forms + """ email = StringField( 'Email', validators=[ DataRequired(), Email() - ] - ) + ] + ) + +class PasswordFieldMixin(Form): + """ + mixin class to provide password field + """ + def __init__(self, *args, **kwargs): + super(PasswordFieldMixin, self).__init__(*args, **kwargs) + password_field = self._fields.pop('password') + self._fields['password'] = password_field + if 'password_confirm' in self._fields: + self._fields['password'].validators.append( + EqualTo( + 'password_confirm', + 'Passwords are not the same.' + ) + ) + confirm_password_field = self._fields.pop('password_confirm') + self._fields['password_confirm'] = confirm_password_field password = PasswordField( 'Password', validators=[ DataRequired() - ] - ) + ] + ) - -class SignupForm(FlaskForm): +class LoginForm(FlaskForm, EmailFieldMixin, PasswordFieldMixin): + ''' + Form Login + ''' + +class SignupForm(FlaskForm, EmailFieldMixin, PasswordFieldMixin): ''' Form signup ''' @@ -30,63 +51,32 @@ class SignupForm(FlaskForm): 'Username', validators=[ DataRequired(), - Length(5, 30, ''' - You can not have less than 5 characters or more 30. - ''') - ] - ) - email = StringField( - 'Email', - validators=[ - DataRequired(), - Email(), - Length(1, 254, 'Too long.') - ] - ) - password = PasswordField( - 'Password', - validators=[ - DataRequired(), - EqualTo( - 'password_confirm', - 'Passwords are not the same.' - ) - ] - ) + Length( + 5, # min + 30, # max + 'You can not have less than 5 characters or more 30.' # error message + ) + ] + ) password_confirm = PasswordField('Repeat password') accept_tos = BooleanField( 'I accept the terms and conditions.', validators=[ DataRequired('Please accept the terms and conditions.') - ] - ) + ] + ) + def __init__(self, *args, **kwargs): + super(SignupForm, self).__init__(*args, **kwargs) + tos = self._fields.pop('accept_tos') + self._fields['accept_tos'] = tos - -class EmailResetPasswordForm(FlaskForm): +class EmailResetPasswordForm(FlaskForm, EmailFieldMixin): ''' Form send email reset password ''' - email = StringField( - 'Email', - validators=[ - DataRequired(), - Email() - ] - ) - class ResetPasswordForm(FlaskForm): ''' Form update password - ''' - password = PasswordField( - 'Password', - validators=[ - DataRequired(), - EqualTo( - 'password_confirm', - 'Passwords are not the same.' - ) - ] - ) + ''' password_confirm = PasswordField('Repeat password')