from flask_wtf import FlaskForm from wtforms import StringField, IntegerField, TextAreaField, BooleanField, SubmitField, SelectField from wtforms.validators import DataRequired, InputRequired, Length, NumberRange, Optional, ValidationError from flask_babel import lazy_gettext as _l def validate_capacity(form, field): val = str(field.data or '').strip() if not val: raise ValidationError(_l('La capacidad es obligatoria (ingrese un número o el símbolo ∞).')) if val in ['∞', 'inf', 'INF', 'Infinity', 'infinity', '0', 'ilimitada', 'Ilimitada', 'sin limite', 'Sin límite']: return try: num = int(val) if num < 0: raise ValidationError(_l('La capacidad no puede ser negativa.')) if num > 10000: raise ValidationError(_l('La capacidad máxima numérica es 10.000.')) except ValueError: raise ValidationError(_l('Ingrese un número entero o el símbolo ∞ para capacidad ilimitada.')) class ClassroomForm(FlaskForm): building = StringField(_l('Building'), validators=[ DataRequired(), Length(min=2, max=100) ]) room_number = StringField(_l('Room Number'), validators=[ DataRequired(), Length(min=1, max=50) ]) floor = IntegerField(_l('Floor'), validators=[ InputRequired(message=_l('El piso es obligatorio (0 para Planta Baja)')), NumberRange(min=0, max=50, message=_l('El piso debe estar entre 0 (Planta Baja) y 50')) ]) capacity = StringField(_l('Capacity'), validators=[ validate_capacity ]) description = TextAreaField(_l('Description'), validators=[ Optional(), Length(max=500) ]) is_active = BooleanField(_l('Active'), default=True) submit = SubmitField(_l('Save Classroom')) class ClassroomResourceForm(FlaskForm): resource_type = SelectField(_l('Resource Type'), choices=[ ('PROJECTOR', _l('Projector')), ('WHITEBOARD', _l('Whiteboard')), ('COMPUTER', _l('Computer')), ('SOUND_SYSTEM', _l('Sound System')), ('MICROPHONE', _l('Microphone')), ('AIR_CONDITIONER', _l('Air Conditioner')), ('OTHER', _l('Other')) ], validators=[DataRequired()]) brand = StringField(_l('Brand'), validators=[Optional(), Length(max=100)]) model = StringField(_l('Model'), validators=[Optional(), Length(max=100)]) specifications = TextAreaField(_l('Specifications'), validators=[Optional()]) functional = BooleanField(_l('Functional'), default=True) submit = SubmitField(_l('Save Resource'))