from datetime import datetime from typing import Optional from flask_wtf import FlaskForm from wtforms import ( BooleanField, IntegerField, PasswordField, SelectField, StringField, SubmitField, TextAreaField, ) from wtforms.validators import DataRequired, Length, NumberRange, Optional as OptionalValidator class LoginForm(FlaskForm): username = StringField("用户名", validators=[DataRequired(), Length(max=64)]) password = PasswordField("密码", validators=[DataRequired()]) submit = SubmitField("登录") class ApiConfigForm(FlaskForm): name = StringField("名称", validators=[DataRequired(), Length(max=128)]) description = TextAreaField("描述", validators=[OptionalValidator()]) url = StringField("URL 地址", validators=[DataRequired(), Length(max=512)]) http_method = SelectField( "HTTP 方法", choices=[("GET", "GET"), ("POST", "POST"), ("PUT", "PUT"), ("DELETE", "DELETE")], validators=[DataRequired()], ) headers = TextAreaField("请求头(JSON)", validators=[OptionalValidator()]) query_params = TextAreaField("查询参数(JSON)", validators=[OptionalValidator()]) body = TextAreaField("请求体(JSON 或文本)", validators=[OptionalValidator()]) schedule_type = SelectField( "调度类型", choices=[("cron", "cron"), ("interval", "interval"), ("daily", "daily")], validators=[DataRequired()], ) schedule_expression = StringField("调度表达式", validators=[DataRequired(), Length(max=128)]) timeout_seconds = IntegerField("超时时间(秒)", validators=[DataRequired(), NumberRange(min=1, max=600)]) retry_times = IntegerField("重试次数", validators=[DataRequired(), NumberRange(min=0, max=10)]) retry_interval_seconds = IntegerField( "重试间隔(秒)", validators=[DataRequired(), NumberRange(min=1, max=300)] ) enabled = BooleanField("启用", default=True) submit = SubmitField("保存") class LogFilterForm(FlaskForm): api_id = SelectField("API", coerce=int, validators=[OptionalValidator()]) success = SelectField( "成功状态", choices=[("", "全部"), ("1", "成功"), ("0", "失败")], validators=[OptionalValidator()] ) start_date = StringField("开始日期(YYYY-MM-DD)", validators=[OptionalValidator()]) end_date = StringField("结束日期(YYYY-MM-DD)", validators=[OptionalValidator()]) submit = SubmitField("筛选") def parse_date(self, value: str) -> Optional[datetime]: if not value: return None try: return datetime.strptime(value, "%Y-%m-%d") except ValueError: return None