fix: solución de bloqueos y estandarización de permisos

This commit is contained in:
2026-04-27 10:47:30 -05:00
parent fa3cbb4d0a
commit 5c2a84e95d
312 changed files with 13889 additions and 7911 deletions

View File

@@ -1,5 +1,5 @@
import logging
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi import APIRouter, Depends, HTTPException, status, Query
from sqlalchemy.orm import Session
from typing import List, Union
@@ -38,6 +38,7 @@ router = APIRouter(
)
def get_temporary_import_movements(
filters: ImportTemporaryFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -60,6 +61,9 @@ def get_temporary_import_movements(
f"User {current_user.get('preferred_username', 'unknown')} "
f"requesting temporary import movements"
)
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_temporary_import_movements(
db=db,
filters=filters
@@ -100,6 +104,7 @@ def get_temporary_import_movements(
)
def get_temporary_import_movements_detailed(
filters: ImportTemporaryFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -122,6 +127,9 @@ def get_temporary_import_movements_detailed(
f"User {current_user.get('preferred_username', 'unknown')} "
f"requesting DETAILED temporary import movements"
)
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_temporary_import_movements_detailed(
db=db,
filters=filters
@@ -168,6 +176,7 @@ def get_temporary_import_movements_detailed(
)
def get_definitive_import_movements(
filters: ImportDefinitiveFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -190,6 +199,9 @@ def get_definitive_import_movements(
f"User {current_user.get('preferred_username', 'unknown')} "
f"requesting definitive import movements"
)
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_definitive_import_movements(
db=db,
filters=filters
@@ -231,6 +243,7 @@ def get_definitive_import_movements(
)
def get_definitive_import_movements_detailed(
filters: ImportDefinitiveFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -253,6 +266,9 @@ def get_definitive_import_movements_detailed(
f"User {current_user.get('preferred_username', 'unknown')} "
f"requesting DETAILED definitive import movements"
)
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_definitive_import_movements_detailed(
db=db,
filters=filters
@@ -299,6 +315,7 @@ def get_definitive_import_movements_detailed(
)
def get_repair_import_movements(
filters: ImportRepairFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -321,6 +338,9 @@ def get_repair_import_movements(
f"User {current_user.get('preferred_username', 'unknown')} "
f"requesting repair import movements"
)
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_repair_import_movements(
db=db,
filters=filters
@@ -374,6 +394,7 @@ def get_repair_import_movements(
)
async def get_import_repair_movements_detailed(
filters: ImportRepairFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -383,6 +404,9 @@ async def get_import_repair_movements_detailed(
"""
try:
logger.info(f"User {current_user.get('sub')} requesting detailed repair movements")
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_repair_import_movements_detailed(
db=db,
filters=filters
@@ -438,6 +462,7 @@ async def get_import_repair_movements_detailed(
)
async def get_export_movements(
filters: ExportFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -447,6 +472,9 @@ async def get_export_movements(
"""
try:
logger.info(f"User {current_user.get('sub')} requesting export movements")
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_export_movements(
db=db,
filters=filters
@@ -509,6 +537,7 @@ async def get_export_movements(
)
async def get_export_movements_detailed(
filters: ExportFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -518,6 +547,9 @@ async def get_export_movements_detailed(
"""
try:
logger.info(f"User {current_user.get('sub')} requesting detailed export movements")
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_export_movements_detailed(
db=db,
filters=filters
@@ -535,6 +567,7 @@ async def get_export_movements_detailed(
@router.post("/export-repair", response_model=List[MovementItem])
def get_export_repair_movements(
filters: ExportRepairFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -555,6 +588,9 @@ def get_export_repair_movements(
"""
try:
logger.info(f"User {current_user.get('sub')} requesting export repair movements")
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_export_repair_movements(
db=db,
filters=filters
@@ -572,6 +608,7 @@ def get_export_repair_movements(
@router.post("/export-repair-detailed", response_model=List[MovementItemDetailed])
def get_export_repair_movements_detailed(
filters: ExportRepairFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -581,6 +618,9 @@ def get_export_repair_movements_detailed(
"""
try:
logger.info(f"User {current_user.get('sub')} requesting detailed export repair movements")
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_export_repair_movements_detailed(
db=db,
filters=filters
@@ -611,6 +651,7 @@ def get_export_repair_movements_detailed(
)
async def get_all_movements(
filters: AllMovementsFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -633,6 +674,9 @@ async def get_all_movements(
f"User {current_user.get('preferred_username', 'unknown')} "
f"requesting all invoice movements (send_email={filters.send_email})"
)
from core.security import validate_access_to_resource
validate_access_to_resource(db, company_id, current_user, ["report.view"])
movements = movement_service.get_all_movements(
db=db,
filters=filters
@@ -701,6 +745,7 @@ async def get_all_movements(
)
def generate_invoice_report_async(
filters: AllMovementsFilter,
company_id: int = Query(..., description="ID de la empresa"),
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
@@ -709,9 +754,13 @@ def generate_invoice_report_async(
Returns task_id to poll status.
"""
from .tasks import generate_invoice_movements_async
from core.security import validate_access_to_resource
logger.info(f"User {current_user.get('preferred_username', 'unknown')} triggering async report generation")
# validate_access_to_resource returns the integer tenant_id from DB
tenant_id = validate_access_to_resource(db, company_id, current_user, ["report.process"])
# Serialize filters to dict for Celery
filter_data = filters.model_dump()
user_email = current_user.get('email')
@@ -729,7 +778,7 @@ def generate_invoice_report_async(
db=db,
task=generate_invoice_movements_async,
tenant_id=int(tenant_id),
company_id=filters.company_id,
company_id=company_id,
requested_by_user=current_user.get("preferred_username") or current_user.get("email") or current_user.get("sub"),
task_name="generate_invoice_movements_async",
task_group="reports",

View File

@@ -43,7 +43,7 @@ def generate_saldos_report_async(
)
# validate_access_to_resource returns the integer tenant_id from DB
tenant_id = validate_access_to_resource(db, company_id, current_user)
tenant_id = validate_access_to_resource(db, company_id, current_user, ["report.process"])
# Inject scoping fields (not from the UI body)
filters.company_id = company_id