from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, Form from wtforms.validators import DataRequired, Email, Length, EqualTo class EmailFieldMixin(Form): """ mixin class to provide email field to forms """ email = StringField( 'Email', validators=[ DataRequired(), 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 LoginForm(FlaskForm, EmailFieldMixin, PasswordFieldMixin): ''' Form Login ''' class SignupForm(FlaskForm, EmailFieldMixin, PasswordConfirmFieldMixin, PasswordFieldMixin): ''' Form signup ''' username = StringField( 'Username', validators=[ DataRequired(), 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, EmailFieldMixin): ''' Form send email reset password ''' class ResetPasswordForm(FlaskForm,PasswordConfirmFieldMixin): ''' Form update password '''