from flask_wtf import FlaskForm from wtforms import StringField, SubmitField, PasswordField, BooleanField, TextAreaField, SelectField from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError, Optional, URL from .models import User from wtforms_sqlalchemy.fields import QuerySelectField from .filters import REASON_TRANSLATIONS def get_active_partner_sites(): return PartnerSite.query.filter_by(is_active=True).order_by(PartnerSite.name) class SearchForm(FlaskForm): search_term = StringField( '输入用户名或邮箱进行查询', validators=[DataRequired(message="查询内容不能为空。"), Length(min=3, max=100)], render_kw={"placeholder": "用户名 / 邮箱"} ) submit = SubmitField('查询') class RegistrationForm(FlaskForm): username = StringField('用户名(与PT站点相同)', validators=[DataRequired(), Length(min=3, max=64)]) email = StringField('邮箱(与PT站点相同)', validators=[DataRequired(), Email()]) password = PasswordField('密码', validators=[DataRequired(), Length(min=6)]) password2 = PasswordField( '确认密码', validators=[DataRequired(), EqualTo('password', message='两次输入的密码必须一致。')]) pt_site = SelectField('所属站点', validators=[DataRequired()]) uid = StringField('你在该站点的 UID', validators=[DataRequired(), Length(max=50)]) submit = SubmitField('提交注册申请') def validate_username(self, username): user = User.query.filter_by(username=username.data).first() if user: raise ValidationError('该用户名已被使用。') def validate_email(self, email): user = User.query.filter_by(email=email.data.lower()).first() if user: raise ValidationError('该邮箱已被注册。') class LoginForm(FlaskForm): email = StringField('邮箱', validators=[DataRequired(), Length(1, 120), Email()]) password = PasswordField('密码', validators=[DataRequired()]) remember_me = BooleanField('记住我') submit = SubmitField('登录') class ReportForm(FlaskForm): # reported_pt_site = StringField( # '被举报用户所在的 PT 站点', # validators=[DataRequired(), Length(min=2, max=100)], # render_kw={"placeholder": "例如:some.site.com"} # ) reported_pt_site = SelectField('违规站点', validators=[DataRequired()]) reported_username = StringField( '被举报的用户名', validators=[Optional(), Length(max=50)], render_kw={"placeholder": "可选"} ) reported_email = StringField( '被举报的邮箱', validators=[DataRequired(), Email(message="请输入有效的邮箱地址。")], render_kw={"placeholder": "必须填写"} ) reason_category = SelectField( '举报原因分类', choices=[(k, v) for k, v in REASON_TRANSLATIONS.items()], validators=[DataRequired()] ) description = TextAreaField( '详细情况描述', validators=[DataRequired(), Length(min=10, max=2000)], render_kw={"rows": 5, "placeholder": "请详细描述事件经过,至少10个字符。"} ) evidences = TextAreaField( '证据图片链接 (每个链接占一行)', validators=[DataRequired(message="请至少提供一个有效的图片链接。")], render_kw={"rows": 4, "placeholder": "https://example.com/image1.png\nhttps://example.com/image2.jpg"} ) submit = SubmitField('提交举报') class RevokeForm(FlaskForm): reason = TextAreaField('撤销理由', validators=[DataRequired(message='必须填写撤销理由。')]) submit = SubmitField('确认撤销') class UpdateUserForm(FlaskForm): role = SelectField('角色', choices=[ ('user', '普通用户 (User)'), ('trust_user', '信任用户 (Trust User)'), ('admin', '管理员 (Admin)') ], validators=[DataRequired()]) status = SelectField('状态', choices=[ ('active', '激活 (Active)'), ('disabled', '禁用 (Disabled)') ], validators=[DataRequired()]) submit = SubmitField('更新') class CommentForm(FlaskForm): body = TextAreaField('添加你的审核建议', validators=[DataRequired()]) submit = SubmitField('提交') class AppealForm(FlaskForm): reason = TextAreaField('申诉理由', validators=[DataRequired()], render_kw={'rows': 5, 'placeholder': '请详细说明您认为该举报不成立的原因,并提供任何可以支持您观点的证据。'}) submit = SubmitField('提交申诉') class AppealMessageForm(FlaskForm): body = TextAreaField('回复内容', validators=[DataRequired()], render_kw={'rows': 4, 'placeholder': '请输入您的回复...'}) submit = SubmitField('发送') class PartnerSiteForm(FlaskForm): name = StringField('站点名称', validators=[DataRequired(), Length(max=100)]) url = StringField('站点 URL (可选)', validators=[Optional(), URL(), Length(max=255)]) submit = SubmitField('添加站点')