fix: solución de bloqueos y estandarización de permisos
This commit is contained in:
@@ -11,4 +11,9 @@ router = TenantCRUDRoutes(
|
||||
tags=["a76.general_catalogs.classification_concepts"],
|
||||
resource_name="Classification Concept",
|
||||
enable_list=True,
|
||||
list_permissions=["cat_classification.view"],
|
||||
get_permissions=["cat_classification.view"],
|
||||
create_permissions=["cat_classification.create"],
|
||||
update_permissions=["cat_classification.edit"],
|
||||
delete_permissions=["cat_classification.delete"],
|
||||
).router
|
||||
|
||||
@@ -11,4 +11,9 @@ router = TenantCRUDRoutes(
|
||||
tags=["a76.general_catalogs.concepts"],
|
||||
resource_name="Concept",
|
||||
enable_list=True,
|
||||
list_permissions=["cat_concepts.view"],
|
||||
get_permissions=["cat_concepts.view"],
|
||||
create_permissions=["cat_concepts.create"],
|
||||
update_permissions=["cat_concepts.edit"],
|
||||
delete_permissions=["cat_concepts.delete"],
|
||||
).router
|
||||
|
||||
@@ -21,6 +21,11 @@ router = TenantCRUDRoutes(
|
||||
enable_filters=True, # Enable filtering
|
||||
default_page_size=50,
|
||||
max_page_size=100,
|
||||
list_permissions=["cat_broker_concepts.view"],
|
||||
get_permissions=["cat_broker_concepts.view"],
|
||||
create_permissions=["cat_broker_concepts.create"],
|
||||
update_permissions=["cat_broker_concepts.edit"],
|
||||
delete_permissions=["cat_broker_concepts.delete"],
|
||||
).router
|
||||
|
||||
|
||||
|
||||
@@ -7,9 +7,8 @@ from .dto import (
|
||||
from .service import EquivalencyService, EquivalencyItemService
|
||||
|
||||
router = APIRouter(prefix="/equivalencies",
|
||||
tags=["a76.general_catalogs.equivalencies"])
|
||||
tags=["a76.general_catalogs.equivalencies"])
|
||||
|
||||
# Pool global de EquivalencyItems
|
||||
item_crud = TenantCRUDRoutes(
|
||||
service=EquivalencyItemService,
|
||||
create_schema=EquivalencyItemCreate,
|
||||
@@ -20,9 +19,13 @@ item_crud = TenantCRUDRoutes(
|
||||
resource_name="EquivalencyItem",
|
||||
enable_list=True,
|
||||
enable_filters=True,
|
||||
list_permissions=["cat_equivalencies.view"],
|
||||
get_permissions=["cat_equivalencies.view"],
|
||||
create_permissions=["cat_equivalencies.create"],
|
||||
update_permissions=["cat_equivalencies.edit"],
|
||||
delete_permissions=["cat_equivalencies.delete"],
|
||||
)
|
||||
|
||||
# Catálogo de equivalencias (referencia item_id)
|
||||
equivalency_crud = TenantCRUDRoutes(
|
||||
service=EquivalencyService,
|
||||
create_schema=EquivalencyCreate,
|
||||
@@ -33,7 +36,12 @@ equivalency_crud = TenantCRUDRoutes(
|
||||
resource_name="Equivalency",
|
||||
enable_list=True,
|
||||
enable_filters=True,
|
||||
list_permissions=["cat_equivalencies.view"],
|
||||
get_permissions=["cat_equivalencies.view"],
|
||||
create_permissions=["cat_equivalencies.create"],
|
||||
update_permissions=["cat_equivalencies.edit"],
|
||||
delete_permissions=["cat_equivalencies.delete"],
|
||||
)
|
||||
|
||||
router.include_router(item_crud.router)
|
||||
router.include_router(equivalency_crud.router)
|
||||
router.include_router(equivalency_crud.router)
|
||||
@@ -25,6 +25,12 @@ route_handler = TenantCRUDRoutes(
|
||||
enable_filters=False,
|
||||
default_page_size=50,
|
||||
max_page_size=100,
|
||||
# Permisos
|
||||
list_permissions=["cat_exchange_rates.view"],
|
||||
get_permissions=["cat_exchange_rates.view"],
|
||||
create_permissions=["cat_exchange_rates.create"],
|
||||
update_permissions=["cat_exchange_rates.edit"],
|
||||
delete_permissions=["cat_exchange_rates.delete"],
|
||||
)
|
||||
|
||||
crud_router = route_handler.router
|
||||
@@ -68,7 +74,7 @@ async def list_exchange_rates(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, ["cat_exchange_rates.view"])
|
||||
|
||||
skip = (page - 1) * page_size
|
||||
filters = {}
|
||||
|
||||
@@ -27,7 +27,8 @@ async def list_fda_catalog(
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Listar entradas del catálogo FDA con búsqueda y paginación"""
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
# 👇 PERMISO DE LECTURA 👇
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.view"])
|
||||
|
||||
filters = {"search": search} if search else {}
|
||||
result = FDACatalogService.get_all(db, tenant_id, company_id, page, page_size, filters)
|
||||
@@ -49,7 +50,8 @@ async def get_fda_catalog(
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Obtener una entrada del catálogo FDA por ID"""
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
# 👇 PERMISO DE LECTURA 👇
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.view"])
|
||||
|
||||
entry = FDACatalogService.get_by_id(db, tenant_id, company_id, id)
|
||||
if not entry:
|
||||
@@ -68,6 +70,7 @@ async def get_fda_catalog(
|
||||
"call_atl": entry.call_atl
|
||||
}
|
||||
|
||||
|
||||
from api.v1.modules.a76.general_catalogs.fda_catalog.dto import FDACatalogCreate, FDACatalogUpdate
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
|
||||
@@ -79,7 +82,8 @@ async def create_fda_catalog(
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Crear nueva entrada en el catálogo FDA"""
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
# 👇 PERMISO DE CREACIÓN 👇
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.create"])
|
||||
try:
|
||||
return FDACatalogService.create(db, tenant_id, company_id, data)
|
||||
except IntegrityError:
|
||||
@@ -96,7 +100,8 @@ async def update_fda_catalog(
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Actualizar entrada del catálogo FDA"""
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
# 👇 PERMISO DE EDICIÓN 👇
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.edit"])
|
||||
|
||||
try:
|
||||
entry = FDACatalogService.update(db, tenant_id, company_id, id, data)
|
||||
@@ -116,12 +121,14 @@ async def delete_fda_catalog(
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Eliminar entrada del catálogo FDA"""
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
# 👇 PERMISO DE ELIMINACIÓN 👇
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.delete"])
|
||||
success = FDACatalogService.delete(db, tenant_id, company_id, id)
|
||||
if not success:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Entrada no encontrada")
|
||||
return {"message": "Eliminado correctamente"}
|
||||
|
||||
|
||||
from typing import List
|
||||
from api.v1.modules.a76.general_catalogs.fda_catalog.service import FDADetailsService
|
||||
from api.v1.modules.a76.general_catalogs.fda_catalog.dto import (
|
||||
@@ -139,7 +146,7 @@ async def get_fda_specifications(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.view"])
|
||||
catalog_entry = FDACatalogService.get_by_id(db, tenant_id, company_id, id)
|
||||
if not catalog_entry:
|
||||
raise HTTPException(status_code=404, detail="Catálogo FDA no encontrado")
|
||||
@@ -154,7 +161,8 @@ async def save_fda_specifications(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
# Aquí usamos .edit porque estamos modificando un catálogo existente
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.edit"])
|
||||
catalog_entry = FDACatalogService.get_by_id(db, tenant_id, company_id, id)
|
||||
if not catalog_entry:
|
||||
raise HTTPException(status_code=404, detail="Catálogo FDA no encontrado")
|
||||
@@ -169,7 +177,7 @@ async def list_fda_constituent_elements(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.view"])
|
||||
return FDADetailsService.get_constituent_elements(db, tenant_id, company_id, id)
|
||||
|
||||
@router.post("/{id}/constituent-elements", response_model=FDAConstituentElementsResponse)
|
||||
@@ -180,7 +188,7 @@ async def create_fda_constituent_element(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.create"])
|
||||
return FDADetailsService.create_constituent_element(db, tenant_id, company_id, id, data.model_dump())
|
||||
|
||||
@router.delete("/{id}/constituent-elements/{element_id}")
|
||||
@@ -191,7 +199,7 @@ async def delete_fda_constituent_element(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.delete"])
|
||||
success = FDADetailsService.delete_constituent_element(db, tenant_id, company_id, element_id)
|
||||
if not success:
|
||||
raise HTTPException(status_code=404, detail="Elemento no encontrado")
|
||||
@@ -205,7 +213,7 @@ async def list_fda_affirmation_codes(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.view"])
|
||||
return FDADetailsService.get_affirmation_codes(db, tenant_id, company_id, id)
|
||||
|
||||
@router.post("/{id}/affirmation-codes", response_model=FDAAffirmationCodesResponse)
|
||||
@@ -216,7 +224,7 @@ async def create_fda_affirmation_code(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.create"])
|
||||
return FDADetailsService.create_affirmation_code(db, tenant_id, company_id, id, data.model_dump())
|
||||
|
||||
@router.delete("/{id}/affirmation-codes/{code_id}")
|
||||
@@ -227,7 +235,7 @@ async def delete_fda_affirmation_code(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.delete"])
|
||||
success = FDADetailsService.delete_affirmation_code(db, tenant_id, company_id, code_id)
|
||||
if not success:
|
||||
raise HTTPException(status_code=404, detail="Código no encontrado")
|
||||
@@ -241,7 +249,7 @@ async def list_fda_lot_productions(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.view"])
|
||||
return FDADetailsService.get_lot_productions(db, tenant_id, company_id, id)
|
||||
|
||||
@router.post("/{id}/lot-productions", response_model=FDALotProductionResponse)
|
||||
@@ -252,7 +260,7 @@ async def create_fda_lot_production(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.create"])
|
||||
return FDADetailsService.create_lot_production(db, tenant_id, company_id, id, data.model_dump())
|
||||
|
||||
@router.delete("/{id}/lot-productions/{lot_id}")
|
||||
@@ -263,8 +271,8 @@ async def delete_fda_lot_production(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, required_permissions=["goods_fda.delete"])
|
||||
success = FDADetailsService.delete_lot_production(db, tenant_id, company_id, lot_id)
|
||||
if not success:
|
||||
raise HTTPException(status_code=404, detail="Lote no encontrado")
|
||||
return {"message": "Eliminado correctamente"}
|
||||
return {"message": "Eliminado correctamente"}
|
||||
@@ -25,6 +25,8 @@ def list_canadian_fractions(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_canadian.view"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
skip = (page - 1) * page_size
|
||||
service = CanadianTariffFractionService(db)
|
||||
@@ -50,6 +52,8 @@ def get_canadian_fraction(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_canadian.view"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
service = CanadianTariffFractionService(db)
|
||||
item = service.get(id, tenant_id, company_id)
|
||||
@@ -64,6 +68,8 @@ def create_canadian_fraction(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_canadian.create"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
service = CanadianTariffFractionService(db)
|
||||
return service.create(item_in, tenant_id, company_id)
|
||||
@@ -76,6 +82,8 @@ def update_canadian_fraction(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_canadian.edit"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
service = CanadianTariffFractionService(db)
|
||||
item = service.get(id, tenant_id, company_id)
|
||||
@@ -90,6 +98,8 @@ def delete_canadian_fraction(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_canadian.delete"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
service = CanadianTariffFractionService(db)
|
||||
item = service.get(id, tenant_id, company_id)
|
||||
|
||||
@@ -20,9 +20,8 @@ def get_historical_fractions(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Get all historical tariff fractions (paginated).
|
||||
"""
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_historical.view"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
skip = (page - 1) * page_size
|
||||
service = HistoricalTariffFractionService(db)
|
||||
@@ -47,9 +46,8 @@ async def get_rate(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Get the historical tariff rate for a specific fraction, nico, and date.
|
||||
"""
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_historical.view"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
|
||||
# Parse date
|
||||
@@ -82,9 +80,8 @@ def get_historical_fraction(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Get a historical tariff fraction by ID.
|
||||
"""
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_historical.view"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
service = HistoricalTariffFractionService(db)
|
||||
fraction = service.get(id, tenant_id, company_id)
|
||||
@@ -99,9 +96,8 @@ def create_historical_fraction(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Create a new historical tariff fraction.
|
||||
"""
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_historical.create"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
service = HistoricalTariffFractionService(db)
|
||||
return service.create(fraction_in, tenant_id, company_id)
|
||||
@@ -114,9 +110,8 @@ def update_historical_fraction(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Update a historical tariff fraction.
|
||||
"""
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_historical.edit"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
service = HistoricalTariffFractionService(db)
|
||||
fraction = service.get(id, tenant_id, company_id)
|
||||
@@ -131,9 +126,8 @@ def delete_historical_fraction(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Delete a historical tariff fraction.
|
||||
"""
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_historical.delete"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
service = HistoricalTariffFractionService(db)
|
||||
fraction = service.get(id, tenant_id, company_id)
|
||||
|
||||
@@ -8,7 +8,7 @@ from fastapi import APIRouter, Depends, Query
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, get_tenant_from_token
|
||||
from core.security import get_current_user, get_tenant_from_token, validate_access_to_resource
|
||||
|
||||
from .dto import (
|
||||
TariffFractionCreateDTO,
|
||||
@@ -36,6 +36,12 @@ async def list_tariff_fractions(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
# Validar permisos según el catálogo solicitado
|
||||
if catalog in ["mex", "usa"]:
|
||||
validate_access_to_resource(db, company_id, current_user, ["frac_sitar.view"])
|
||||
elif catalog == "american":
|
||||
validate_access_to_resource(db, company_id, current_user, ["frac_american.view"])
|
||||
|
||||
skip = (page - 1) * page_size
|
||||
filters = {}
|
||||
if search:
|
||||
@@ -74,9 +80,12 @@ async def list_tariff_fractions(
|
||||
)
|
||||
async def get_tariff_fraction(
|
||||
tariff_fraction_id: int,
|
||||
company_id: int = Query(..., description="Company ID"),
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
# Por defecto asumimos vista de SITAR para este endpoint de consulta por ID general
|
||||
validate_access_to_resource(db, company_id, current_user, ["frac_sitar.view"])
|
||||
item = TariffFractionService.get_by_id(db, tariff_fraction_id)
|
||||
if not item:
|
||||
from fastapi import HTTPException
|
||||
@@ -107,6 +116,7 @@ async def create_tariff_fraction(
|
||||
tenant_id = current_user.get("tenant_id")
|
||||
|
||||
if catalog == "american":
|
||||
validate_access_to_resource(db, company_id, current_user, ["frac_american.create"])
|
||||
from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.service import USTariffFractionService
|
||||
from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.dto import USTariffFractionCreateDTO
|
||||
import re
|
||||
@@ -159,6 +169,7 @@ async def update_tariff_fraction(
|
||||
tenant_id = current_user.get("tenant_id")
|
||||
|
||||
if catalog == "american":
|
||||
validate_access_to_resource(db, company_id, current_user, ["frac_american.edit"])
|
||||
from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.service import USTariffFractionService
|
||||
from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.dto import USTariffFractionUpdateDTO
|
||||
import re
|
||||
@@ -204,6 +215,7 @@ async def delete_tariff_fraction(
|
||||
tenant_id = current_user.get("tenant_id")
|
||||
|
||||
if catalog == "american":
|
||||
validate_access_to_resource(db, company_id, current_user, ["frac_american.delete"])
|
||||
from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.service import USTariffFractionService
|
||||
success = USTariffFractionService.delete(db, tariff_fraction_id, tenant_id, company_id)
|
||||
if not success:
|
||||
|
||||
@@ -28,6 +28,10 @@ crud_router = TenantCRUDRoutes(
|
||||
resource_name="US Tariff Fraction",
|
||||
id_name="id",
|
||||
enable_list=False, # We implement our custom list endpoint
|
||||
create_permissions=["frac_american.create"],
|
||||
update_permissions=["frac_american.edit"],
|
||||
delete_permissions=["frac_american.delete"],
|
||||
get_permissions=["frac_american.view"],
|
||||
)
|
||||
|
||||
# Master router with prefix so all routes live under /us-tariff-fractions
|
||||
@@ -52,6 +56,8 @@ async def list_us_tariff_fractions(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
from core.security import validate_access_to_resource as validate_perm
|
||||
validate_perm(db, company_id, current_user, ["frac_american.view"])
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
|
||||
skip = (page - 1) * page_size
|
||||
|
||||
@@ -18,7 +18,12 @@ identifier_crud = TenantCRUDRoutes(
|
||||
prefix="",
|
||||
tags=["Identifiers"],
|
||||
resource_name="Identifier",
|
||||
enable_list=True
|
||||
enable_list=True,
|
||||
list_permissions=["cat_identifiers.view"],
|
||||
get_permissions=["cat_identifiers.view"],
|
||||
create_permissions=["cat_identifiers.create"],
|
||||
update_permissions=["cat_identifiers.edit"],
|
||||
delete_permissions=["cat_identifiers.delete"],
|
||||
)
|
||||
|
||||
# Identifier Detail CRUD
|
||||
@@ -29,7 +34,12 @@ detail_crud = TenantCRUDRoutes(
|
||||
service=IdentifierDetailService,
|
||||
prefix="/details",
|
||||
tags=["Identifier Details"],
|
||||
resource_name="Identifier Detail"
|
||||
resource_name="Identifier Detail",
|
||||
list_permissions=["cat_identifiers.view"],
|
||||
get_permissions=["cat_identifiers.view"],
|
||||
create_permissions=["cat_identifiers.create"],
|
||||
update_permissions=["cat_identifiers.edit"],
|
||||
delete_permissions=["cat_identifiers.delete"],
|
||||
)
|
||||
|
||||
router.include_router(identifier_crud.router)
|
||||
|
||||
@@ -13,4 +13,10 @@ router = TenantCRUDRoutes(
|
||||
tags=["a76.general_catalogs.inpc"],
|
||||
resource_name="INPC",
|
||||
enable_list=True,
|
||||
# Permisos
|
||||
list_permissions=["cat_inpc.view"],
|
||||
get_permissions=["cat_inpc.view"],
|
||||
create_permissions=["cat_inpc.create"],
|
||||
update_permissions=["cat_inpc.edit"],
|
||||
delete_permissions=["cat_inpc.delete"],
|
||||
).router
|
||||
@@ -13,4 +13,9 @@ router = TenantCRUDRoutes(
|
||||
tags=["a76.general_catalogs.legends"],
|
||||
resource_name="Legend",
|
||||
enable_list=True,
|
||||
list_permissions=["cat_legends.view"],
|
||||
get_permissions=["cat_legends.view"],
|
||||
create_permissions=["cat_legends.create"],
|
||||
update_permissions=["cat_legends.edit"],
|
||||
delete_permissions=["cat_legends.delete"],
|
||||
).router
|
||||
|
||||
@@ -16,6 +16,11 @@ multi_currency_type_crud = TenantCRUDRoutes(
|
||||
tags=["Multi Currency Types"],
|
||||
resource_name="MultiCurrencyType",
|
||||
enable_list=True,
|
||||
list_permissions=["cat_multi_currency_types.view"],
|
||||
get_permissions=["cat_multi_currency_types.view"],
|
||||
create_permissions=["cat_multi_currency_types.create"],
|
||||
update_permissions=["cat_multi_currency_types.edit"],
|
||||
delete_permissions=["cat_multi_currency_types.delete"],
|
||||
)
|
||||
|
||||
router.include_router(multi_currency_type_crud.router)
|
||||
|
||||
@@ -21,4 +21,10 @@ router = TenantCRUDRoutes(
|
||||
enable_filters=True, # Enable filtering by key and description_es
|
||||
default_page_size=50,
|
||||
max_page_size=100,
|
||||
# Permisos
|
||||
list_permissions=["cat_packages.view"],
|
||||
get_permissions=["cat_packages.view"],
|
||||
create_permissions=["cat_packages.create"],
|
||||
update_permissions=["cat_packages.edit"],
|
||||
delete_permissions=["cat_packages.delete"],
|
||||
).router
|
||||
|
||||
@@ -14,4 +14,9 @@ router = TenantCRUDRoutes(
|
||||
resource_name="Port",
|
||||
enable_list=True,
|
||||
max_page_size=1000,
|
||||
list_permissions=["cat_ports.view"],
|
||||
get_permissions=["cat_ports.view"],
|
||||
create_permissions=["cat_ports.create"],
|
||||
update_permissions=["cat_ports.edit"],
|
||||
delete_permissions=["cat_ports.delete"],
|
||||
).router
|
||||
|
||||
@@ -21,4 +21,9 @@ router = TenantCRUDRoutes(
|
||||
enable_filters=True, # Enable filtering by seal
|
||||
default_page_size=50,
|
||||
max_page_size=100,
|
||||
list_permissions=["cat_seals.view"],
|
||||
get_permissions=["cat_seals.view"],
|
||||
create_permissions=["cat_seals.create"],
|
||||
update_permissions=["cat_seals.edit"],
|
||||
delete_permissions=["cat_seals.delete"],
|
||||
).router
|
||||
|
||||
@@ -20,4 +20,9 @@ router = TenantCRUDRoutes(
|
||||
enable_filters=True,
|
||||
default_page_size=50,
|
||||
max_page_size=100,
|
||||
list_permissions=["cat_sectors.view"],
|
||||
get_permissions=["cat_sectors.view"],
|
||||
create_permissions=["cat_sectors.create"],
|
||||
update_permissions=["cat_sectors.edit"],
|
||||
delete_permissions=["cat_sectors.delete"],
|
||||
).router
|
||||
|
||||
@@ -13,4 +13,9 @@ router = TenantCRUDRoutes(
|
||||
id_name="id",
|
||||
enable_list=True,
|
||||
enable_filters=True,
|
||||
list_permissions=["cat_unit_conversions.view"],
|
||||
get_permissions=["cat_unit_conversions.view"],
|
||||
create_permissions=["cat_unit_conversions.create"],
|
||||
update_permissions=["cat_unit_conversions.edit"],
|
||||
delete_permissions=["cat_unit_conversions.delete"],
|
||||
).router
|
||||
|
||||
@@ -18,6 +18,12 @@ ace_router = TenantCRUDRoutes(
|
||||
enable_list=True,
|
||||
enable_filters=True,
|
||||
max_page_size=10000,
|
||||
# Permisos
|
||||
list_permissions=["cat_um_ace.view"],
|
||||
get_permissions=["cat_um_ace.view"],
|
||||
create_permissions=["cat_um_ace.create"],
|
||||
update_permissions=["cat_um_ace.edit"],
|
||||
delete_permissions=["cat_um_ace.delete"],
|
||||
).router
|
||||
router.include_router(ace_router)
|
||||
|
||||
@@ -34,6 +40,12 @@ oma_router = TenantCRUDRoutes(
|
||||
enable_list=True,
|
||||
enable_filters=True,
|
||||
max_page_size=10000,
|
||||
# Permisos
|
||||
list_permissions=["cat_um_oma.view"],
|
||||
get_permissions=["cat_um_oma.view"],
|
||||
create_permissions=["cat_um_oma.create"],
|
||||
update_permissions=["cat_um_oma.edit"],
|
||||
delete_permissions=["cat_um_oma.delete"],
|
||||
).router
|
||||
router.include_router(oma_router)
|
||||
|
||||
@@ -50,6 +62,12 @@ american_router = TenantCRUDRoutes(
|
||||
enable_list=True,
|
||||
enable_filters=True,
|
||||
max_page_size=10000,
|
||||
# Permisos
|
||||
list_permissions=["cat_um_american.view"],
|
||||
get_permissions=["cat_um_american.view"],
|
||||
create_permissions=["cat_um_american.create"],
|
||||
update_permissions=["cat_um_american.edit"],
|
||||
delete_permissions=["cat_um_american.delete"],
|
||||
).router
|
||||
router.include_router(american_router)
|
||||
|
||||
@@ -66,6 +84,12 @@ customs_router = TenantCRUDRoutes(
|
||||
enable_list=True,
|
||||
enable_filters=True,
|
||||
max_page_size=10000,
|
||||
# Permisos
|
||||
list_permissions=["cat_um_customs.view"],
|
||||
get_permissions=["cat_um_customs.view"],
|
||||
create_permissions=["cat_um_customs.create"],
|
||||
update_permissions=["cat_um_customs.edit"],
|
||||
delete_permissions=["cat_um_customs.delete"],
|
||||
).router
|
||||
router.include_router(customs_router)
|
||||
|
||||
@@ -82,6 +106,12 @@ general_router = TenantCRUDRoutes(
|
||||
enable_list=True,
|
||||
enable_filters=True,
|
||||
max_page_size=10000,
|
||||
# Permisos
|
||||
list_permissions=["cat_um_general.view"],
|
||||
get_permissions=["cat_um_general.view"],
|
||||
create_permissions=["cat_um_general.create"],
|
||||
update_permissions=["cat_um_general.edit"],
|
||||
delete_permissions=["cat_um_general.delete"],
|
||||
).router
|
||||
router.include_router(general_router)
|
||||
|
||||
@@ -99,5 +129,11 @@ main_router = TenantCRUDRoutes(
|
||||
enable_list=True,
|
||||
enable_filters=True,
|
||||
max_page_size=10000,
|
||||
# Permisos
|
||||
list_permissions=["cat_um_general.view"],
|
||||
get_permissions=["cat_um_general.view"],
|
||||
create_permissions=["cat_um_general.create"],
|
||||
update_permissions=["cat_um_general.edit"],
|
||||
delete_permissions=["cat_um_general.delete"],
|
||||
).router
|
||||
router.include_router(main_router)
|
||||
|
||||
Reference in New Issue
Block a user