from flask_wtf import FlaskForm from wtforms.fields import StringField, PasswordField, BooleanField, HiddenField, TextAreaField, FileField, IntegerField from wtforms.validators import InputRequired, Email, Length, ValidationError, Regexp, NoneOf, Optional from .model import User, LoginError, re_username, reserved_name, user_exists PASSWORD_LEN = 64 EMAIL_LEN = 64 class SignupForm(FlaskForm): username = StringField('username', [InputRequired(), Regexp(re_username), NoneOf(reserved_name, message='Not available.'), Length(min=3, max=64)], [lambda name: name and name.replace(' ', '_')]) email = StringField('e-mail address', [InputRequired(), Email(), Length(min=5, max=EMAIL_LEN)], description="we never share your e-mail address") password = StringField('password', [InputRequired(), Length(min=4, max=PASSWORD_LEN)]) def validate_username(form, field): if user_exists(User.username, field.data): raise ValidationError('Not available') def validate_email(form, field): if user_exists(User.email, field.data): raise ValidationError('In use by another account') class LoginForm(FlaskForm): user_or_email = StringField('username or e-mail address', [InputRequired(), Length(min=3, max=EMAIL_LEN)], [lambda name: name and name.replace(' ', '_')]) password = PasswordField('password', [InputRequired(), Length(max=PASSWORD_LEN)]) remember = BooleanField('stay logged in') next = HiddenField('next') def validate(self): rv = FlaskForm.validate(self) if not rv: return False try: self.user = User.attempt_login(self.user_or_email.data, self.password.data) return True except LoginError as e: self.user_or_email.errors.append(e.msg) return False class ForgotPasswordForm(FlaskForm): user_or_email = StringField('username or e-mail address', [InputRequired(), Length(max=EMAIL_LEN)]) class PasswordForm(FlaskForm): password = PasswordField('new password', [InputRequired(), Length(min=4, max=PASSWORD_LEN)]) class AccountSettingsForm(FlaskForm): full_name = StringField('full name', [Length(max=64)]) email = StringField('e-mail address', [InputRequired(), Email(), Length(min=5, max=EMAIL_LEN)]) class ChangePasswordForm(FlaskForm): old_password = PasswordField('current password', [InputRequired(), Length(max=PASSWORD_LEN)]) new_password = PasswordField('new password', [InputRequired(), Length(max=PASSWORD_LEN)]) class SourceDocForm(FlaskForm): text = TextAreaField('text', [InputRequired()]) db_price_per_character = IntegerField('price per character', [Optional()]) db_document_price = IntegerField('document price', [Optional()]) class ItemForm(FlaskForm): text = TextAreaField('text', [InputRequired()]) class UploadSourceDocForm(FlaskForm): sourcedoc_file = FileField('SourceDoc', [Regexp(r'^[^/\\]+\.txt$')])