Files
checklist/backend/migrate_roles.py
2025-11-19 11:33:57 -03:00

129 lines
4.9 KiB
Python

"""
Script de migración para implementar sistema de roles
Crea tabla roles y migra usuarios existentes
"""
from sqlalchemy import create_engine, text
from app.core.config import settings
def migrate():
engine = create_engine(settings.DATABASE_URL)
with engine.connect() as conn:
print("🔄 Iniciando migración de roles...")
# 1. Crear tabla roles
print("📋 Creando tabla roles...")
conn.execute(text("""
CREATE TABLE IF NOT EXISTS roles (
id SERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE NOT NULL,
display_name VARCHAR(100) NOT NULL,
description VARCHAR(255),
can_manage_users BOOLEAN DEFAULT FALSE,
can_manage_roles BOOLEAN DEFAULT FALSE,
can_manage_checklists BOOLEAN DEFAULT FALSE,
can_create_inspections BOOLEAN DEFAULT FALSE,
can_view_all_inspections BOOLEAN DEFAULT FALSE,
can_view_reports BOOLEAN DEFAULT FALSE,
can_deactivate_inspections BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
)
"""))
conn.commit()
# 2. Insertar roles predefinidos
print("👥 Insertando roles predefinidos...")
conn.execute(text("""
INSERT INTO roles (name, display_name, description,
can_manage_users, can_manage_roles, can_manage_checklists,
can_create_inspections, can_view_all_inspections,
can_view_reports, can_deactivate_inspections)
VALUES
('administrador', 'Administrador', 'Acceso completo al sistema',
TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE),
('asesor', 'Asesor', 'Acceso a reportes e informes',
FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE),
('mecanico', 'Mecánico', 'Realizar inspecciones',
FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE)
ON CONFLICT (name) DO NOTHING
"""))
conn.commit()
# 3. Agregar columna role_id a users (temporal)
print("🔧 Agregando columna role_id a usuarios...")
conn.execute(text("""
ALTER TABLE users ADD COLUMN IF NOT EXISTS role_id INTEGER
"""))
conn.commit()
# 4. Migrar datos: admin -> administrador (id=1)
print("🔄 Migrando usuarios admin -> administrador...")
conn.execute(text("""
UPDATE users
SET role_id = (SELECT id FROM roles WHERE name = 'administrador')
WHERE role = 'admin' AND role_id IS NULL
"""))
conn.commit()
# 5. Migrar datos: mechanic -> mecanico (id=3)
print("🔄 Migrando usuarios mechanic -> mecanico...")
conn.execute(text("""
UPDATE users
SET role_id = (SELECT id FROM roles WHERE name = 'mecanico')
WHERE role IN ('mechanic', 'mecanico') AND role_id IS NULL
"""))
conn.commit()
# 6. Verificar que todos tienen role_id
result = conn.execute(text("SELECT COUNT(*) FROM users WHERE role_id IS NULL"))
null_count = result.scalar()
if null_count > 0:
print(f"⚠️ Advertencia: {null_count} usuarios sin role_id asignado")
print(" Asignando rol de mecánico por defecto...")
conn.execute(text("""
UPDATE users
SET role_id = (SELECT id FROM roles WHERE name = 'mecanico')
WHERE role_id IS NULL
"""))
conn.commit()
# 7. Hacer role_id NOT NULL y crear foreign key
print("🔒 Aplicando restricciones...")
conn.execute(text("""
ALTER TABLE users ALTER COLUMN role_id SET NOT NULL
"""))
conn.execute(text("""
ALTER TABLE users
ADD CONSTRAINT fk_users_role_id
FOREIGN KEY (role_id) REFERENCES roles(id)
"""))
conn.commit()
# 8. Eliminar columna role antigua
print("🗑️ Eliminando columna role antigua...")
conn.execute(text("""
ALTER TABLE users DROP COLUMN IF EXISTS role
"""))
conn.commit()
# 9. Mostrar resumen
print("\n✅ Migración completada!")
print("\n📊 Resumen de roles:")
result = conn.execute(text("""
SELECT r.name, r.display_name, COUNT(u.id) as user_count
FROM roles r
LEFT JOIN users u ON u.role_id = r.id
GROUP BY r.id, r.name, r.display_name
ORDER BY r.id
"""))
for row in result:
print(f" {row[1]}: {row[2]} usuario(s)")
print("\n🎉 Sistema de roles implementado correctamente!")
if __name__ == "__main__":
migrate()