@staticmethoddef create(data: dict) -> dict: name = data.get("name", "").strip() abbreviation = data.get("abbreviation", "").strip() active = data.get("active", True) if not name: raise ValidationError("El nombre de la unidad de medida es requerido") if not abbreviation: raise ValidationError("La abreviatura de la unidad de medida es requerida") existing = UnitOfMeasure.query.filter( func.lower(UnitOfMeasure.name) == func.lower(name) ).first() if existing: raise ConflictError(f"Ya existe una unidad de medida con el nombre '{name}'") unit_of_measure = UnitOfMeasure( name=name, abbreviation=abbreviation, active=active ) db.session.add(unit_of_measure) db.session.commit() return unit_of_measure.to_dict()
The service performs case-insensitive name validation using func.lower() to ensure uniqueness.
unit = UnitOfMeasureService.get_by_id(id_unit_of_measure)
Implementation from services.py:66:
@staticmethoddef get_by_id(id_unit_of_measure: int) -> UnitOfMeasure: unit_of_measure = UnitOfMeasure.query.get(id_unit_of_measure) if not unit_of_measure: raise NotFoundError("Unidad de medida no encontrada") return unit_of_measure
data = { "name": "Square Meters", "abbreviation": "m²"}UnitOfMeasureService.update(id_unit_of_measure, data)
Implementation from services.py:85:
@staticmethoddef update(id_unit_of_measure: int, data: dict) -> dict: unit_of_measure = UnitOfMeasureService.get_by_id(id_unit_of_measure) name = data.get("name", "").strip() abbreviation = data.get("abbreviation", "").strip() if not name: raise ValidationError("El nombre de la unidad de medida es requerido") if not abbreviation: raise ValidationError("La abreviatura de la unidad de medida es requerida") existing = UnitOfMeasure.query.filter( func.lower(UnitOfMeasure.name) == func.lower(name), UnitOfMeasure.id_unit_of_measure != id_unit_of_measure ).first() if existing: raise ConflictError(f"Ya existe una unidad de medida con el nombre '{name}'") unit_of_measure.name = name unit_of_measure.abbreviation = abbreviation db.session.commit() return unit_of_measure.to_dict()
The UnitOfMeasureForm class in app/catalogs/unit_of_measures/forms.py:10 defines the input form:
class UnitOfMeasureForm(FlaskForm): name = StringField( "Nombre", validators=[ DataRequired(message="El nombre de la unidad de medida es requerido"), Length(max=50, message="El nombre no puede exceder 50 caracteres"), ], ) abbreviation = StringField( "Abreviatura", validators=[ DataRequired(message="La abreviatura de la unidad de medida es requerida"), Length(max=10, message="La abreviatura no puede exceder 10 caracteres"), ] ) active = BooleanField("Activo", default=True)
# Get all active unitsunits = UnitOfMeasureService.get_all()for unit in units: print(f"{unit.name} ({unit.abbreviation})")# Get specific unitunit = UnitOfMeasureService.get_by_id(1)print(f"Unit: {unit.name} - {unit.abbreviation}")