The Muebles Roble system uses SQLAlchemy ORM to define database models. All models follow a consistent structure with audit fields and soft delete support.
Manages the color catalog for furniture references.
app/models/color.py
from sqlalchemy.sql import funcfrom ..extensions import dbclass Color(db.Model): """ Modelo de Color para catálogo de referencias de colores. Attributes: id_color: Identificador único del color. name: Nombre del color. active: Indica si el color está activo o no. created_at: Fecha de creación del color. updated_at: Fecha de última actualización del color. deleted_at: Fecha de eliminación lógica del color. created_by: Usuario que creó el color. updated_by: Usuario que actualizó el color. deleted_by: Usuario que eliminó el color. """ __tablename__ = 'colors' id_color = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False, unique=True) active = db.Column(db.Boolean, nullable=False, default=True) created_at = db.Column( db.TIMESTAMP, nullable=False, server_default=func.current_timestamp() ) updated_at = db.Column( db.TIMESTAMP, nullable=False, server_default=func.current_timestamp(), server_onupdate=func.current_timestamp() ) deleted_at = db.Column(db.TIMESTAMP, nullable=True) created_by = db.Column(db.String(100), nullable=True) updated_by = db.Column(db.String(100), nullable=True) deleted_by = db.Column(db.String(100), nullable=True) def to_dict(self) -> dict: """ Serializa el modelo a diccionario. Returns: dict: Representación del color en formato diccionario """ return { 'id_color': self.id_color, 'name': self.name, 'active': self.active, 'created_at': self.created_at.isoformat() if self.created_at else None, 'updated_at': self.updated_at.isoformat() if self.updated_at else None, }
The to_dict() method is used to serialize model instances for JSON responses or template rendering.
from sqlalchemy.sql import funcfrom ..extensions import dbclass WoodType(db.Model): """ Modelo de Tipo de Madera para catálogo de tipos de madera. Attributes: id_wood_type: Identificador único del tipo de madera. name: Nombre del tipo de madera. description: Descripción opcional del tipo de madera. active: Indica si el tipo de madera está activo o no. """ __tablename__ = 'wood_types' id_wood_type = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False, unique=True) description = db.Column(db.String(255), nullable=True) active = db.Column(db.Boolean, nullable=False, default=True) created_at = db.Column( db.TIMESTAMP, nullable=False, server_default=func.current_timestamp() ) updated_at = db.Column( db.TIMESTAMP, nullable=False, server_default=func.current_timestamp(), server_onupdate=func.current_timestamp() ) deleted_at = db.Column(db.TIMESTAMP, nullable=True) created_by = db.Column(db.String(100), nullable=True) updated_by = db.Column(db.String(100), nullable=True) deleted_by = db.Column(db.String(100), nullable=True) def to_dict(self): return { 'id_wood_type': self.id_wood_type, 'name': self.name, 'description': self.description, 'active': self.active, 'created_at': self.created_at, 'updated_at': self.updated_at, 'deleted_at': self.deleted_at, }
Manages user roles for permissions and access control.
app/models/role.py
from sqlalchemy.sql import funcfrom ..extensions import dbclass Role(db.Model): """ Modelo de Rol para la gestión de permisos y perfiles de usuario. Attributes: id_role: Identificador único del rol. name: Nombre del rol (ej. 'Admin', 'Editor', 'Viewer'). active: Indica si el rol está activo o no. """ __tablename__ = 'roles' id_role = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False, unique=True) active = db.Column(db.Boolean, nullable=False, default=True) created_at = db.Column( db.TIMESTAMP, nullable=False, server_default=func.current_timestamp() ) updated_at = db.Column( db.TIMESTAMP, nullable=False, server_default=func.current_timestamp(), server_onupdate=func.current_timestamp() ) deleted_at = db.Column(db.TIMESTAMP, nullable=True) created_by = db.Column(db.String(100), nullable=True) updated_by = db.Column(db.String(100), nullable=True) deleted_by = db.Column(db.String(100), nullable=True) def to_dict(self) -> dict: """ Serializa el modelo a diccionario. Returns: dict: Representación del rol en formato diccionario """ return { 'id_role': self.id_role, 'name': self.name, 'active': self.active, 'created_at': self.created_at.isoformat() if self.created_at else None, 'updated_at': self.updated_at.isoformat() if self.updated_at else None, }
from sqlalchemy.sql import funcfrom ..extensions import dbclass FurnitureType(db.Model): """ Modelo de Tipo de mueble para catálogo de tipo de mueble. Attributes: id_furniture_type: Identificador único del tipo de mueble. name: Nombre del tipo de mueble. active: Indica si el tipo de mueble está activo o no. """ __tablename__ = 'furniture_type' id_furniture_type = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False, unique=True) active = db.Column(db.Boolean, nullable=False, default=True) created_at = db.Column( db.TIMESTAMP, nullable=False, server_default=func.current_timestamp() ) updated_at = db.Column( db.TIMESTAMP, nullable=False, server_default=func.current_timestamp(), server_onupdate=func.current_timestamp() ) deleted_at = db.Column(db.TIMESTAMP, nullable=True) created_by = db.Column(db.String(100), nullable=True) updated_by = db.Column(db.String(100), nullable=True) deleted_by = db.Column(db.String(100), nullable=True) def to_dict(self) -> dict: """ Serializa el modelo a diccionario. Returns: dict: Representación del tipo de mueble en formato diccionario """ return { 'id_furniture_type': self.id_furniture_type, 'name': self.name, 'active': self.active, 'created_at': self.created_at.isoformat() if self.created_at else None, 'updated_at': self.updated_at.isoformat() if self.updated_at else None, }
name = db.Column(db.String(50), nullable=False, unique=True)
Services check for duplicates before creating or updating:
existing = Color.query.filter( func.lower(Color.name) == name.lower()).first()if existing: raise ConflictError(f"Ya existe un color con el nombre '{name}'")
class Color(db.Model): """ Modelo de Color para catálogo de referencias. Attributes: id_color: Identificador único del color. name: Nombre del color. active: Indica si el color está activo. """
# Get all active recordscolors = Color.query.filter_by(active=True).all()# Get by IDcolor = Color.query.get(id_color)# Case-insensitive searchcolor = Color.query.filter( func.lower(Color.name) == name.lower()).first()# Count recordscount = Color.query.filter_by(active=True).count()
# Exclude soft-deleted recordsactive_colors = Color.query.filter_by(active=True).all()# Include all records (even deleted)all_colors = Color.query.all()# Only deleted recordsdeleted_colors = Color.query.filter_by(active=False).all()