sourcing/sourcing/forms.py

83 lines
3.4 KiB
Python

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$')])