backend crear endpoitns para permisos de checklist por mecanico, 1.0.30
This commit is contained in:
@@ -617,7 +617,40 @@ def get_checklists(
|
||||
query = db.query(models.Checklist)
|
||||
if active_only:
|
||||
query = query.filter(models.Checklist.is_active == True)
|
||||
return query.offset(skip).limit(limit).all()
|
||||
|
||||
# Si es mecánico, solo ver checklists con permiso
|
||||
if current_user.role == "mechanic":
|
||||
# Obtener IDs de checklists con permiso o sin permisos (acceso global)
|
||||
permitted_checklist_ids = db.query(models.ChecklistPermission.checklist_id).filter(
|
||||
models.ChecklistPermission.mechanic_id == current_user.id
|
||||
).distinct().all()
|
||||
permitted_ids = [id[0] for id in permitted_checklist_ids]
|
||||
|
||||
# Checklists sin permisos = acceso global
|
||||
checklists_without_permissions = db.query(models.Checklist.id).outerjoin(
|
||||
models.ChecklistPermission
|
||||
).group_by(models.Checklist.id).having(
|
||||
func.count(models.ChecklistPermission.id) == 0
|
||||
).all()
|
||||
global_ids = [id[0] for id in checklists_without_permissions]
|
||||
|
||||
all_allowed_ids = list(set(permitted_ids + global_ids))
|
||||
if all_allowed_ids:
|
||||
query = query.filter(models.Checklist.id.in_(all_allowed_ids))
|
||||
else:
|
||||
# Si no hay permisos, devolver lista vacía
|
||||
return []
|
||||
|
||||
checklists = query.offset(skip).limit(limit).all()
|
||||
|
||||
# Agregar allowed_mechanics a cada checklist
|
||||
for checklist in checklists:
|
||||
permissions = db.query(models.ChecklistPermission.mechanic_id).filter(
|
||||
models.ChecklistPermission.checklist_id == checklist.id
|
||||
).all()
|
||||
checklist.allowed_mechanics = [p[0] for p in permissions]
|
||||
|
||||
return checklists
|
||||
|
||||
|
||||
@app.get("/api/checklists/{checklist_id}", response_model=schemas.ChecklistWithQuestions)
|
||||
@@ -629,6 +662,12 @@ def get_checklist(checklist_id: int, db: Session = Depends(get_db)):
|
||||
if not checklist:
|
||||
raise HTTPException(status_code=404, detail="Checklist no encontrado")
|
||||
|
||||
# Agregar allowed_mechanics
|
||||
permissions = db.query(models.ChecklistPermission.mechanic_id).filter(
|
||||
models.ChecklistPermission.checklist_id == checklist.id
|
||||
).all()
|
||||
checklist.allowed_mechanics = [p[0] for p in permissions]
|
||||
|
||||
return checklist
|
||||
|
||||
|
||||
@@ -641,10 +680,28 @@ def create_checklist(
|
||||
if current_user.role != "admin":
|
||||
raise HTTPException(status_code=403, detail="No autorizado")
|
||||
|
||||
db_checklist = models.Checklist(**checklist.dict(), created_by=current_user.id)
|
||||
# Extraer mechanic_ids antes de crear el checklist
|
||||
checklist_data = checklist.dict(exclude={'mechanic_ids'})
|
||||
mechanic_ids = checklist.mechanic_ids or []
|
||||
|
||||
db_checklist = models.Checklist(**checklist_data, created_by=current_user.id)
|
||||
db.add(db_checklist)
|
||||
db.flush() # Para obtener el ID
|
||||
|
||||
# Crear permisos para mecánicos seleccionados
|
||||
for mechanic_id in mechanic_ids:
|
||||
permission = models.ChecklistPermission(
|
||||
checklist_id=db_checklist.id,
|
||||
mechanic_id=mechanic_id
|
||||
)
|
||||
db.add(permission)
|
||||
|
||||
db.commit()
|
||||
db.refresh(db_checklist)
|
||||
|
||||
# Agregar allowed_mechanics a la respuesta
|
||||
db_checklist.allowed_mechanics = mechanic_ids
|
||||
|
||||
return db_checklist
|
||||
|
||||
|
||||
@@ -662,11 +719,38 @@ def update_checklist(
|
||||
if not db_checklist:
|
||||
raise HTTPException(status_code=404, detail="Checklist no encontrado")
|
||||
|
||||
for key, value in checklist.dict(exclude_unset=True).items():
|
||||
# Extraer mechanic_ids si se envía
|
||||
update_data = checklist.dict(exclude_unset=True, exclude={'mechanic_ids'})
|
||||
mechanic_ids = checklist.mechanic_ids
|
||||
|
||||
# Actualizar campos del checklist
|
||||
for key, value in update_data.items():
|
||||
setattr(db_checklist, key, value)
|
||||
|
||||
# Si se proporcionan mechanic_ids, actualizar permisos
|
||||
if mechanic_ids is not None:
|
||||
# Eliminar permisos existentes
|
||||
db.query(models.ChecklistPermission).filter(
|
||||
models.ChecklistPermission.checklist_id == checklist_id
|
||||
).delete()
|
||||
|
||||
# Crear nuevos permisos
|
||||
for mechanic_id in mechanic_ids:
|
||||
permission = models.ChecklistPermission(
|
||||
checklist_id=checklist_id,
|
||||
mechanic_id=mechanic_id
|
||||
)
|
||||
db.add(permission)
|
||||
|
||||
db.commit()
|
||||
db.refresh(db_checklist)
|
||||
|
||||
# Agregar allowed_mechanics a la respuesta
|
||||
permissions = db.query(models.ChecklistPermission.mechanic_id).filter(
|
||||
models.ChecklistPermission.checklist_id == checklist_id
|
||||
).all()
|
||||
db_checklist.allowed_mechanics = [p[0] for p in permissions]
|
||||
|
||||
return db_checklist
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user