diff --git a/.gitignore b/.gitignore index 44dbbcd..89d8f01 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ database.sqlite +*.pyc +.env \ No newline at end of file diff --git a/forms.py b/forms.py index f09107e..98db7f7 100644 --- a/forms.py +++ b/forms.py @@ -1,28 +1,57 @@ 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() - ] - ) + Email(), + Length(1, 254, 'Too long.'), + ] + ) + +class PasswordConfirmFieldMixin(Form): + """ + mixin class to provide extra password field + + """ + password_confirm = PasswordField('Repeat password') + +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, PasswordConfirmFieldMixin, PasswordFieldMixin): ''' Form signup ''' @@ -30,63 +59,31 @@ 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.' - ) - ] - ) - password_confirm = PasswordField('Repeat password') + Length( + 5, # min + 30, # max + 'You can not have less than 5 characters or more 30.' # error message + ) + ] + ) 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): +class ResetPasswordForm(FlaskForm,PasswordConfirmFieldMixin): ''' Form update password - ''' - password = PasswordField( - 'Password', - validators=[ - DataRequired(), - EqualTo( - 'password_confirm', - 'Passwords are not the same.' - ) - ] - ) - password_confirm = PasswordField('Repeat password') + ''' +