Cambios en backend: - Actualizado ClassResponseDTO con campos de tenant y timestamps - Agregados métodos estáticos en servicio (get_all, get_by_id, create, update, delete) - Reemplazados endpoints de rutas con inicialización de TenantCRUDRoutes - Corregida ruta de importación del modelo Company en security.py - Actualizados nombres de campos en DTO para coincidir con modelo (description_es/en) - Agregada validación para constraint de foreign key de material_key - Agregada validación de class_code duplicado en método create - Agregado TimestampMixin al modelo Class - Creada migración de Alembic para agregar columnas timestamp a tabla classes - Corregido orden de parámetros en firma del método update Cambios en frontend: - Actualizados componentes de UI para módulo de clases
68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
"""Add timestamp fields to classes table
|
|
|
|
Revision ID: add_timestamps_classes
|
|
Revises: 7937209f9718
|
|
Create Date: 2025-11-16 00:20:00.000000
|
|
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = 'add_timestamps_classes'
|
|
down_revision: Union[str, None] = '7937209f9718'
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# Add created_at column with default value
|
|
op.execute("""
|
|
ALTER TABLE a76.classes
|
|
ADD COLUMN created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL
|
|
""")
|
|
|
|
# Add updated_at column with default value
|
|
op.execute("""
|
|
ALTER TABLE a76.classes
|
|
ADD COLUMN updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL
|
|
""")
|
|
|
|
# Add deleted_at column (nullable for soft deletes)
|
|
op.execute("""
|
|
ALTER TABLE a76.classes
|
|
ADD COLUMN deleted_at TIMESTAMP WITH TIME ZONE
|
|
""")
|
|
|
|
# Create trigger to auto-update updated_at
|
|
op.execute("""
|
|
CREATE OR REPLACE FUNCTION a76.update_classes_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = CURRENT_TIMESTAMP;
|
|
RETURN NEW;
|
|
END;
|
|
$$ language 'plpgsql';
|
|
""")
|
|
|
|
op.execute("""
|
|
CREATE TRIGGER update_classes_updated_at
|
|
BEFORE UPDATE ON a76.classes
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION a76.update_classes_updated_at();
|
|
""")
|
|
|
|
|
|
def downgrade() -> None:
|
|
# Drop trigger and function
|
|
op.execute("DROP TRIGGER IF EXISTS update_classes_updated_at ON a76.classes")
|
|
op.execute("DROP FUNCTION IF EXISTS a76.update_classes_updated_at()")
|
|
|
|
# Drop columns
|
|
op.execute("ALTER TABLE a76.classes DROP COLUMN IF EXISTS deleted_at")
|
|
op.execute("ALTER TABLE a76.classes DROP COLUMN IF EXISTS updated_at")
|
|
op.execute("ALTER TABLE a76.classes DROP COLUMN IF EXISTS created_at")
|