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
|
||||
|
||||
|
||||
|
||||
@@ -55,6 +55,7 @@ class Checklist(Base):
|
||||
creator = relationship("User", back_populates="checklists_created")
|
||||
questions = relationship("Question", back_populates="checklist", cascade="all, delete-orphan")
|
||||
inspections = relationship("Inspection", back_populates="checklist")
|
||||
permissions = relationship("ChecklistPermission", back_populates="checklist", cascade="all, delete-orphan")
|
||||
|
||||
|
||||
class Question(Base):
|
||||
@@ -186,3 +187,17 @@ class AIConfiguration(Base):
|
||||
is_active = Column(Boolean, default=True)
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||||
|
||||
|
||||
class ChecklistPermission(Base):
|
||||
"""Tabla intermedia para permisos de checklist por mecánico"""
|
||||
__tablename__ = "checklist_permissions"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
checklist_id = Column(Integer, ForeignKey("checklists.id", ondelete="CASCADE"), nullable=False)
|
||||
mechanic_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
|
||||
# Relationships
|
||||
checklist = relationship("Checklist", back_populates="permissions")
|
||||
mechanic = relationship("User")
|
||||
|
||||
@@ -70,10 +70,11 @@ class ChecklistBase(BaseModel):
|
||||
logo_url: Optional[str] = None
|
||||
|
||||
class ChecklistCreate(ChecklistBase):
|
||||
pass
|
||||
mechanic_ids: Optional[List[int]] = [] # IDs de mecánicos autorizados
|
||||
|
||||
class ChecklistUpdate(ChecklistBase):
|
||||
is_active: Optional[bool] = None
|
||||
mechanic_ids: Optional[List[int]] = None # IDs de mecánicos autorizados
|
||||
|
||||
class Checklist(ChecklistBase):
|
||||
id: int
|
||||
@@ -81,6 +82,7 @@ class Checklist(ChecklistBase):
|
||||
is_active: bool
|
||||
created_by: int
|
||||
created_at: datetime
|
||||
allowed_mechanics: Optional[List[int]] = [] # IDs de mecánicos permitidos
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
Reference in New Issue
Block a user