Files
mold_cost_online_tool/app/forms/auth.py
T
Gan, Jimmy 6c0d5a4e63 Initial commit: Clean Mold Cost Calculator application
- Flask-based mold cost calculation application
- PostgreSQL database with SQLAlchemy ORM
- Docker/Podman containerization
- Comprehensive documentation in docs/
- Clean, organized codebase without obsolete files
- Production-ready deployment configuration
- Enhanced pytest configuration with coverage reporting
- Master/Development branch structure
2025-06-24 02:30:09 +08:00

108 lines
3.7 KiB
Python

from flask_wtf import FlaskForm
from wtforms import (
StringField,
PasswordField,
BooleanField,
SubmitField
)
from wtforms.validators import (
DataRequired,
Email,
Length,
ValidationError,
EqualTo
)
from sqlalchemy import func
from app.models import User
import re
class LoginForm(FlaskForm):
email = StringField('Email', validators=[
DataRequired(),
Email(),
Length(max=120)
])
password = PasswordField('Password', validators=[
DataRequired(),
Length(min=8)
])
remember_me = BooleanField('Remember Me')
submit = SubmitField('Log In')
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[
DataRequired(),
Length(min=3, max=64)
])
email = StringField('Email', validators=[
DataRequired(),
Email(),
Length(max=120)
])
company = StringField('Company', validators=[
DataRequired(),
Length(max=100)
])
password = PasswordField('Password', validators=[
DataRequired(),
Length(min=8)
])
password_confirm = PasswordField('Confirm Password', validators=[
DataRequired(),
EqualTo('password', message='Passwords must match')
])
terms = BooleanField('I agree to the terms and conditions', validators=[
DataRequired(message='You must agree to the terms and conditions')
])
submit = SubmitField('Register')
def validate_username(self, username):
if not re.match(r'^[a-zA-Z0-9_-]+$', username.data):
raise ValidationError('Username can only contain letters, numbers, underscores and hyphens')
user = User.query.filter_by(username=username.data).first()
if user:
raise ValidationError('Username already taken')
def validate_email(self, email):
user = User.query.filter_by(email=email.data).first()
if user:
raise ValidationError('Email already registered')
def validate_password(self, password):
if not re.search(r'[A-Z]', password.data):
raise ValidationError('Password must contain at least one uppercase letter')
if not re.search(r'[a-z]', password.data):
raise ValidationError('Password must contain at least one lowercase letter')
if not re.search(r'[0-9]', password.data):
raise ValidationError('Password must contain at least one number')
if not re.search(r'[!@#$%^&*(),.?":{}|<>]', password.data):
raise ValidationError('Password must contain at least one special character')
class RequestPasswordResetForm(FlaskForm):
email = StringField('Email', validators=[
DataRequired(),
Email(),
Length(max=120)
])
submit = SubmitField('Request Password Reset')
class ResetPasswordForm(FlaskForm):
password = PasswordField('New Password', validators=[
DataRequired(),
Length(min=8)
])
password_confirm = PasswordField('Confirm New Password', validators=[
DataRequired(),
EqualTo('password', message='Passwords must match')
])
submit = SubmitField('Reset Password')
def validate_password(self, password):
if not re.search(r'[A-Z]', password.data):
raise ValidationError('Password must contain at least one uppercase letter')
if not re.search(r'[a-z]', password.data):
raise ValidationError('Password must contain at least one lowercase letter')
if not re.search(r'[0-9]', password.data):
raise ValidationError('Password must contain at least one number')
if not re.search(r'[!@#$%^&*(),.?":{}|<>]', password.data):
raise ValidationError('Password must contain at least one special character')