from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, IntegerField, TextAreaField, SelectField from wtforms.validators import DataRequired, Email, Length, NumberRange, Optional from wtforms.validators import Optional, Length class LoginForm(FlaskForm): email = StringField("Email", validators=[DataRequired(), Email()]) password = PasswordField("Password", validators=[DataRequired(), Length(min=8, max=128)]) class RegisterForm(FlaskForm): email = StringField("Email", validators=[DataRequired(), Email()]) password = PasswordField("Password", validators=[DataRequired(), Length(min=8, max=128)]) class DeviceForm(FlaskForm): name = StringField("Name", validators=[DataRequired(), Length(max=120)]) host = StringField("Host", validators=[DataRequired(), Length(max=255)]) rest_port = IntegerField("REST Port", validators=[DataRequired(), NumberRange(min=1, max=65535)]) rest_base_path = StringField("REST Base Path", validators=[DataRequired(), Length(max=64)]) username = StringField("Username", validators=[DataRequired(), Length(max=128)]) password = PasswordField("Password", validators=[DataRequired(), Length(max=128)]) allow_insecure_tls = BooleanField("Allow insecure TLS (self-signed)") ssh_enabled = BooleanField("Enable SSH connector") ssh_port = IntegerField("SSH Port", validators=[Optional(), NumberRange(min=1, max=65535)]) class EditDeviceForm(DeviceForm): password = PasswordField("Password", validators=[Optional(), Length(max=128)]) class DashboardForm(FlaskForm): name = StringField("Name", validators=[DataRequired(), Length(max=120)]) description = StringField("Description", validators=[Optional(), Length(max=500)]) class WidgetWizardForm(FlaskForm): preset_key = SelectField("Preset", validators=[DataRequired()], choices=[]) title = StringField("Title", validators=[DataRequired(), Length(max=120)]) refresh_seconds = IntegerField("Refresh (seconds)", validators=[DataRequired(), NumberRange(min=1, max=3600)]) # Optional selector for presets that support it (interfaces/queues etc.). item_name = SelectField("Item", validators=[Optional()], choices=[]) # Layout controls col_span = SelectField( "Width", validators=[DataRequired()], choices=[("12", "Full"), ("6", "Half"), ("4", "1/3"), ("3", "1/4")], default="6", ) height_px = IntegerField("Height (px)", validators=[DataRequired(), NumberRange(min=160, max=1000)], default=260) # JSON advanced override query_json = TextAreaField("Query JSON (advanced)", validators=[Optional()]) class ForgotPasswordForm(FlaskForm): email = StringField("Email", validators=[DataRequired(), Email()]) class ResetPasswordForm(FlaskForm): password = PasswordField("New password", validators=[DataRequired(), Length(min=8, max=128)]) class ShareForm(FlaskForm): email = StringField("User email", validators=[DataRequired(), Email()]) permission = SelectField("Permission", validators=[DataRequired()], choices=[("view","View"),("edit","Edit"),("manage","Manage")]) class SmtpTestForm(FlaskForm): to_email = StringField("To", validators=[DataRequired(), Email()])