|
from flask_wtf import FlaskForm |
|
from flask_wtf.file import FileField, FileAllowed |
|
from wtforms import StringField, PasswordField, BooleanField, TextAreaField, SelectField, HiddenField |
|
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError, URL, Optional |
|
from models import User, Category, Tag |
|
|
|
class LoginForm(FlaskForm): |
|
username = StringField('Username or Email', validators=[DataRequired()]) |
|
password = PasswordField('Password', validators=[DataRequired()]) |
|
remember_me = BooleanField('Remember Me') |
|
|
|
class RegistrationForm(FlaskForm): |
|
username = StringField('Username', validators=[DataRequired(), Length(min=3, max=64)]) |
|
email = StringField('Email', validators=[DataRequired(), Email(), Length(max=120)]) |
|
password = PasswordField('Password', validators=[DataRequired(), Length(min=8, max=128)]) |
|
password2 = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) |
|
|
|
def validate_username(self, username): |
|
user = User.query.filter_by(username=username.data).first() |
|
if user is not None: |
|
raise ValidationError('This username is already taken. Please choose a different one.') |
|
|
|
def validate_email(self, email): |
|
user = User.query.filter_by(email=email.data).first() |
|
if user is not None: |
|
raise ValidationError('This email is already registered. Please use a different one.') |
|
|
|
class EditProfileForm(FlaskForm): |
|
avatar = FileField('Avatar', validators=[ |
|
FileAllowed(['jpg', 'png', 'jpeg', 'gif'], 'Images only!') |
|
]) |
|
signature = StringField('Signature', validators=[Optional(), Length(max=200)]) |
|
location = StringField('Location', validators=[Optional(), Length(max=100)]) |
|
website = StringField('Website', validators=[Optional(), URL(), Length(max=120)]) |
|
bio = TextAreaField('About Me', validators=[Optional(), Length(max=500)]) |
|
|
|
class ChangePasswordForm(FlaskForm): |
|
current_password = PasswordField('Current Password', validators=[DataRequired()]) |
|
password = PasswordField('New Password', validators=[DataRequired(), Length(min=8, max=128)]) |
|
password2 = PasswordField('Confirm New Password', validators=[DataRequired(), EqualTo('password')]) |
|
|
|
def validate_current_password(self, current_password): |
|
|
|
pass |
|
|
|
class CreateTopicForm(FlaskForm): |
|
title = StringField('Title', validators=[DataRequired(), Length(min=5, max=200)]) |
|
content = TextAreaField('Content', validators=[DataRequired(), Length(min=10)]) |
|
category_id = SelectField('Category', coerce=int, validators=[DataRequired()]) |
|
tags = StringField('Tags (comma separated)', validators=[Optional(), Length(max=100)]) |
|
|
|
def __init__(self, *args, **kwargs): |
|
super(CreateTopicForm, self).__init__(*args, **kwargs) |
|
|
|
|
|
class CreatePostForm(FlaskForm): |
|
content = TextAreaField('Content', validators=[DataRequired(), Length(min=10)]) |
|
topic_id = HiddenField('Topic ID', validators=[DataRequired()]) |
|
|
|
class ReportForm(FlaskForm): |
|
reason = TextAreaField('Reason', validators=[DataRequired(), Length(min=10, max=1000)]) |
|
post_id = HiddenField('Post ID', validators=[Optional()]) |
|
topic_id = HiddenField('Topic ID', validators=[Optional()]) |
|
|
|
class CreateCategoryForm(FlaskForm): |
|
name = StringField('Name', validators=[DataRequired(), Length(min=3, max=100)]) |
|
description = TextAreaField('Description', validators=[Optional(), Length(max=500)]) |
|
order = StringField('Order', validators=[DataRequired()]) |
|
|
|
class EditCategoryForm(FlaskForm): |
|
name = StringField('Name', validators=[DataRequired(), Length(min=3, max=100)]) |
|
description = TextAreaField('Description', validators=[Optional(), Length(max=500)]) |
|
order = StringField('Order', validators=[DataRequired()]) |
|
|
|
class EditUserForm(FlaskForm): |
|
role = SelectField('Role', choices=[ |
|
('member', 'Member'), |
|
('moderator', 'Moderator'), |
|
('admin', 'Admin') |
|
], validators=[DataRequired()]) |
|
is_active = BooleanField('Active') |
|
is_banned = BooleanField('Banned') |
|
ban_reason = TextAreaField('Ban Reason', validators=[Optional(), Length(max=500)]) |
|
|
|
class CreateTagForm(FlaskForm): |
|
name = StringField('Name', validators=[DataRequired(), Length(min=2, max=50)]) |
|
|
|
def validate_name(self, name): |
|
tag = Tag.query.filter_by(name=name.data.lower()).first() |
|
if tag is not None: |
|
raise ValidationError('This tag already exists.') |
|
|