fix: normalizar sync de google sheets para todos los dias, reparar 500 en ciclos lectivos, selector de ciclo lectivo en comisiones y opciones --keep-db --keep-users en install.sh

This commit is contained in:
2026-09-23 19:36:54 -03:00
parent 5771476ee9
commit 195bfd915e
10 changed files with 270 additions and 85 deletions
+65 -58
View File
@@ -1,4 +1,5 @@
import sys
import os
# Asegurar codificación UTF-8 en consola de Windows
if hasattr(sys.stdout, 'reconfigure'):
@@ -68,6 +69,7 @@ def init_database():
ALTER TABLE commissions ADD COLUMN IF NOT EXISTS grades_closed_at TIMESTAMP WITHOUT TIME ZONE;
ALTER TABLE commissions ADD COLUMN IF NOT EXISTS grades_closed_by INTEGER REFERENCES users(id) ON DELETE SET NULL;
ALTER TABLE commissions ADD COLUMN IF NOT EXISTS acta_number VARCHAR(50);
ALTER TABLE commissions ADD COLUMN IF NOT EXISTS academic_term_id INTEGER REFERENCES academic_terms(id) ON DELETE SET NULL;
"""))
# Columnas extendidas de reservations
@@ -310,67 +312,72 @@ def init_database():
print(" [OK] Sin duplicados de Bedelia.")
# 4. Verificar o crear usuarios institucionales de cada rol
print("[*] Verificando usuarios institucionales y credenciales...")
roles_by_name = {r.name: r for r in Role.query.all()}
keep_users = ('--keep-users' in sys.argv) or (os.environ.get('KEEP_USERS', '').lower() in ['1', 'true', 'yes'])
if keep_users:
print("[*] Opción --keep-users activa: Preservando usuarios, roles y contraseñas existentes intactos (no se modifican ni pisan).")
else:
print("[*] Verificando usuarios institucionales y credenciales...")
roles_by_name = {r.name: r for r in Role.query.all()}
institutional_users = [
{
'email': 'admin@edu-space.com',
'name': 'Administrador del Sistema',
'role_name': 'Admin',
'role_code': 'ADMIN'
},
{
'email': 'bedelia@edu-space.com',
'name': 'Operador de Bedelía',
'role_name': 'Bedelia',
'role_code': 'BEDELIA'
},
{
'email': 'docente@edu-space.com',
'name': 'Profesor Titular',
'role_name': 'Docente',
'role_code': 'DOCENTE'
},
{
'email': 'alumno@edu-space.com',
'name': 'Estudiante Regular',
'role_name': 'Alumno',
'role_code': 'ALUMNO'
}
]
institutional_users = [
{
'email': 'admin@edu-space.com',
'name': 'Administrador del Sistema',
'role_name': 'Admin',
'role_code': 'ADMIN'
},
{
'email': 'bedelia@edu-space.com',
'name': 'Operador de Bedelía',
'role_name': 'Bedelia',
'role_code': 'BEDELIA'
},
{
'email': 'docente@edu-space.com',
'name': 'Profesor Titular',
'role_name': 'Docente',
'role_code': 'DOCENTE'
},
{
'email': 'alumno@edu-space.com',
'name': 'Estudiante Regular',
'role_name': 'Alumno',
'role_code': 'ALUMNO'
}
]
for u_info in institutional_users:
u_obj = User.query.filter_by(email=u_info['email']).first()
r_match = roles_by_name.get(u_info['role_name'])
for u_info in institutional_users:
u_obj = User.query.filter_by(email=u_info['email']).first()
r_match = roles_by_name.get(u_info['role_name'])
if not u_obj:
u_obj = User(
email=u_info['email'],
name=u_info['name'],
role=u_info['role_code'],
role_id=r_match.id if r_match else None,
is_active=True,
preferred_language="es",
theme_preference="auto"
)
u_obj.set_password("admin123")
db.session.add(u_obj)
db.session.commit()
print(f" [+] Usuario creado: {u_info['email']} | Clave: admin123 | Rol: {u_info['role_name']}")
else:
# Garantizar sincronización de rol, estado activo y clave
if r_match and u_obj.role_id != r_match.id:
u_obj.role_id = r_match.id
u_obj.role = u_info['role_code']
u_obj.is_active = True
u_obj.set_password("admin123")
if not u_obj.preferred_language:
u_obj.preferred_language = "es"
if not u_obj.theme_preference:
u_obj.theme_preference = "auto"
db.session.commit()
print(f" [OK] Usuario {u_info['email']} validado (Rol: {u_info['role_name']}, Clave: admin123).")
if not u_obj:
u_obj = User(
email=u_info['email'],
name=u_info['name'],
role=u_info['role_code'],
role_id=r_match.id if r_match else None,
is_active=True,
preferred_language="es",
theme_preference="auto"
)
u_obj.set_password("admin123")
db.session.add(u_obj)
db.session.commit()
print(f" [+] Usuario creado: {u_info['email']} | Clave: admin123 | Rol: {u_info['role_name']}")
else:
# Preservar contraseña y estado si ya existen para no pisar cambios administrativos
if r_match and u_obj.role_id != r_match.id:
u_obj.role_id = r_match.id
if not u_obj.role:
u_obj.role = u_info['role_code']
if not u_obj.password_hash:
u_obj.set_password("admin123")
if not u_obj.preferred_language:
u_obj.preferred_language = "es"
if not u_obj.theme_preference:
u_obj.theme_preference = "auto"
db.session.commit()
print(f" [OK] Usuario {u_info['email']} validado (Rol: {u_info['role_name']}).")
# 5. Inicializar edificios institucionales oficiales
print("[*] Verificando edificios institucionales...")