feat: Refactor DTOs and models to use from_attributes, update database schema references, and implement trailer types

This commit is contained in:
2025-11-11 14:43:07 -06:00
parent 52b8fcd434
commit ac7f8d19d8
28 changed files with 50 additions and 235 deletions

View File

@@ -23,7 +23,7 @@ class CustomsBrokerDTO(BaseModel):
company_id: str
class Config:
orm_mode = True
from_attributes = True
class CustomsBrokerVUCreateDTO(BaseModel):
@@ -48,7 +48,7 @@ class CustomsBrokerVUCreateDTO(BaseModel):
doda_xml_files_path: Optional[str]
class Config:
orm_mode = True
from_attributes = True
class CustomsBrokerPersonnelDTO(BaseModel):
@@ -65,4 +65,4 @@ class CustomsBrokerPersonnelDTO(BaseModel):
email: Optional[str]
class Config:
orm_mode = True
from_attributes = True

View File

@@ -1,37 +1,37 @@
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from . import services, dto
from core.database import get_db
from core.database import get_core_db
router = APIRouter()
@router.get("/customs-broker/{broker_key}", response_model=dto.CustomsBrokerDTO)
def get_customs_broker(broker_key: str, db: Session = Depends(get_db)):
def get_customs_broker(broker_key: str, db: Session = Depends(get_core_db)):
broker = services.CustomsBrokerService.get_by_broker_key(db, broker_key)
if not broker:
raise HTTPException(status_code=404, detail="Customs Broker not found")
return broker
@router.post("/customs-broker", response_model=dto.CustomsBrokerDTO)
def create_customs_broker(broker_data: dto.CustomsBrokerDTO, db: Session = Depends(get_db)):
def create_customs_broker(broker_data: dto.CustomsBrokerDTO, db: Session = Depends(get_core_db)):
return services.CustomsBrokerService.create_customs_broker(db, broker_data)
@router.delete("/customs-broker/{broker_key}", response_model=dto.CustomsBrokerDTO)
def delete_customs_broker(broker_key: str, db: Session = Depends(get_db)):
def delete_customs_broker(broker_key: str, db: Session = Depends(get_core_db)):
broker = services.CustomsBrokerService.delete_customs_broker(db, broker_key)
if not broker:
raise HTTPException(status_code=404, detail="Customs Broker not found")
return broker
@router.put("/customs-broker-vu/{broker_key}", response_model=dto.CustomsBrokerVUCreateDTO)
def update_customs_broker_vu(broker_key: str, vu_data: dto.CustomsBrokerVUCreateDTO, db: Session = Depends(get_db)):
def update_customs_broker_vu(broker_key: str, vu_data: dto.CustomsBrokerVUCreateDTO, db: Session = Depends(get_core_db)):
updated_vu = services.CustomsBrokerVUService.update_vu(db, broker_key, vu_data)
if not updated_vu:
raise HTTPException(status_code=404, detail="Customs Broker VU not found")
return updated_vu
@router.put("/customs-broker-personnel/{broker_key}/{line}", response_model=dto.CustomsBrokerPersonnelDTO)
def update_customs_broker_personnel(broker_key: str, line: int, personnel_data: dto.CustomsBrokerPersonnelDTO, db: Session = Depends(get_db)):
def update_customs_broker_personnel(broker_key: str, line: int, personnel_data: dto.CustomsBrokerPersonnelDTO, db: Session = Depends(get_core_db)):
updated_personnel = services.CustomsBrokerPersonnelService.update_personnel(db, broker_key, line, personnel_data)
if not updated_personnel:
raise HTTPException(status_code=404, detail="Customs Broker Personnel not found")

View File

@@ -34,4 +34,4 @@ class DriverCreateDTO(DriverBaseDTO):
class DriverResponseDTO(DriverBaseDTO):
class Config:
orm_mode = True
from_attributes = True

View File

@@ -29,5 +29,5 @@ class Driver(Base):
badge_number = Column(String(20), nullable=True)
class_type = Column(String(1), nullable=True)
unique_badge_number = Column(String(100), nullable=True)
company_id = Column(String, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(String, ForeignKey("a76.tenants.id"), nullable=False)
company_id = Column(Integer, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(Integer, ForeignKey("a76.tenants.id"), nullable=False)

View File

@@ -21,10 +21,7 @@ from .seal.routes import router as seal_router
from .fraction_rule_octave.routes import router as fraction_rule_octave_router
from .country_rule_oct.routes import router as country_rule_oct_router
from .exchange_rate.routes import router as exchange_rate_router
from .transport_types.routes import router as transport_types_router
from .trailers.routes import router as trailers_router
from .trailer_types.routes import router as trailer_types_router
from .transport_modes.routes import router as transport_modes_router
from .aduanal.routes import router as customs_broker_router
from .drivers.routes import router as drivers_router
from .transporters.routes import router as transporters_router
@@ -57,10 +54,7 @@ router.include_router(
country_rule_oct_router, prefix="/a76", tags=["a76 / CountryRuleOct"]
)
router.include_router(exchange_rate_router, prefix="/a76", tags=["a76 / ExchangeRate"])
router.include_router(transport_types_router, prefix="/a76", tags=["a76 / TransportTypes"])
router.include_router(trailers_router, prefix="/a76", tags=["a76 / Trailers"])
router.include_router(trailer_types_router, prefix="/a76", tags=["a76 / TrailerTypes"])
router.include_router(transport_modes_router, prefix="/a76", tags=["a76 / TransportModes"])
router.include_router(customs_broker_router, prefix="/a76", tags=["a76 / CustomsBroker"])
router.include_router(drivers_router, prefix="/a76", tags=["a76 / Drivers"])
router.include_router(transporters_router, prefix="/a76", tags=["a76 / Transporters"])

View File

@@ -28,7 +28,7 @@ class Tenant(Base):
"""
__tablename__ = "tenants"
__table_args__ = {"schema": "a76"}
__table_args__ = {"schema": "a76", "extend_existing": True}
id = Column(Integer, primary_key=True, index=True)
name = Column(String(255), nullable=False, index=True)

View File

@@ -1,15 +0,0 @@
from pydantic import BaseModel
from typing import Optional
class TrailerTypeBaseDTO(BaseModel):
trailer_type_key: str
description: Optional[str]
company_id: str
tenant_id: str
class TrailerTypeCreateDTO(TrailerTypeBaseDTO):
pass
class TrailerTypeResponseDTO(TrailerTypeBaseDTO):
class Config:
orm_mode = True

View File

@@ -1,11 +0,0 @@
from sqlalchemy import Column, String, ForeignKey
from core.database import Base
class TrailerType(Base):
__tablename__ = "trailer_type"
__table_args__ = {"schema": "a76"}
trailer_type_key = Column(String(2), primary_key=True, nullable=False)
description = Column(String(100), nullable=True)
company_id = Column(String, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(String, ForeignKey("a76.tenants.id"), nullable=False)

View File

@@ -1,24 +0,0 @@
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from . import services, dto
from core.database import get_db
router = APIRouter()
@router.get("/trailer-types/{trailer_type_key}", response_model=dto.TrailerTypeDTO)
def get_trailer_type(trailer_type_key: str, db: Session = Depends(get_db)):
trailer_type = services.TrailerTypeService.get_trailer_type_by_key(db, trailer_type_key)
if not trailer_type:
raise HTTPException(status_code=404, detail="Trailer type not found")
return trailer_type
@router.post("/trailer-types", response_model=dto.TrailerTypeDTO)
def create_trailer_type(trailer_type_data: dto.TrailerTypeCreateDTO, db: Session = Depends(get_db)):
return services.TrailerTypeService.create_trailer_type(db, trailer_type_data)
@router.delete("/trailer-types/{trailer_type_key}", response_model=dto.TrailerTypeDTO)
def delete_trailer_type(trailer_type_key: str, db: Session = Depends(get_db)):
trailer_type = services.TrailerTypeService.delete_trailer_type(db, trailer_type_key)
if not trailer_type:
raise HTTPException(status_code=404, detail="Trailer type not found")
return trailer_type

View File

@@ -1,23 +0,0 @@
from sqlalchemy.orm import Session
from . import models, dto
class TrailerTypeService:
@staticmethod
def get_trailer_type_by_key(db: Session, trailer_type_key: str):
return db.query(models.TrailerType).filter(models.TrailerType.trailer_type_key == trailer_type_key).first()
@staticmethod
def create_trailer_type(db: Session, trailer_type_data: dto.TrailerTypeCreateDTO):
new_trailer_type = models.TrailerType(**trailer_type_data.dict())
db.add(new_trailer_type)
db.commit()
db.refresh(new_trailer_type)
return new_trailer_type
@staticmethod
def delete_trailer_type(db: Session, trailer_type_key: str):
trailer_type = TrailerTypeService.get_trailer_type_by_key(db, trailer_type_key)
if trailer_type:
db.delete(trailer_type)
db.commit()
return trailer_type

View File

@@ -19,4 +19,4 @@ class TrailerCreateDTO(TrailerBaseDTO):
class TrailerResponseDTO(TrailerBaseDTO):
class Config:
orm_mode = True
from_attributes = True

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, String, ForeignKey
from sqlalchemy import Column, Integer, String, ForeignKey
from core.database import Base
class Trailer(Base):
@@ -14,5 +14,5 @@ class Trailer(Base):
state = Column(String(30), nullable=True)
country = Column(String(3), nullable=True)
container_key = Column(String(3), nullable=True)
company_id = Column(String, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(String, ForeignKey("a76.tenants.id"), nullable=False)
company_id = Column(Integer, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(Integer, ForeignKey("a76.tenants.id"), nullable=False)

View File

@@ -1,23 +1,23 @@
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from . import services, dto
from core.database import get_db
from core.database import get_core_db
router = APIRouter()
@router.get("/trailers/{trailer_number}", response_model=dto.TrailerDTO)
def get_trailer(trailer_number: str, db: Session = Depends(get_db)):
@router.get("/trailers/{trailer_number}", response_model=dto.TrailerResponseDTO)
def get_trailer(trailer_number: str, db: Session = Depends(get_core_db)):
trailer = services.TrailerService.get_trailer_by_number(db, trailer_number)
if not trailer:
raise HTTPException(status_code=404, detail="Trailer not found")
return trailer
@router.post("/trailers", response_model=dto.TrailerDTO)
def create_trailer(trailer_data: dto.TrailerCreateDTO, db: Session = Depends(get_db)):
@router.post("/trailers", response_model=dto.TrailerResponseDTO)
def create_trailer(trailer_data: dto.TrailerCreateDTO, db: Session = Depends(get_core_db)):
return services.TrailerService.create_trailer(db, trailer_data)
@router.delete("/trailers/{trailer_number}", response_model=dto.TrailerDTO)
def delete_trailer(trailer_number: str, db: Session = Depends(get_db)):
@router.delete("/trailers/{trailer_number}", response_model=dto.TrailerResponseDTO)
def delete_trailer(trailer_number: str, db: Session = Depends(get_core_db)):
trailer = services.TrailerService.delete_trailer(db, trailer_number)
if not trailer:
raise HTTPException(status_code=404, detail="Trailer not found")

View File

@@ -1,15 +0,0 @@
from pydantic import BaseModel
from typing import Optional
class TransportModeBaseDTO(BaseModel):
mode_key: str
mode_description: Optional[str]
company_id: str
tenant_id: str
class TransportModeCreateDTO(TransportModeBaseDTO):
pass
class TransportModeResponseDTO(TransportModeBaseDTO):
class Config:
orm_mode = True

View File

@@ -1,11 +0,0 @@
from sqlalchemy import Column, String, ForeignKey
from core.database import Base
class TransportMode(Base):
__tablename__ = "transport_mode"
__table_args__ = {"schema": "a76"}
mode_key = Column(String(3), primary_key=True, nullable=False)
mode_description = Column(String(30), nullable=True)
company_id = Column(String, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(String, ForeignKey("a76.tenants.id"), nullable=False)

View File

@@ -1,24 +0,0 @@
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from . import services, dto
from core.database import get_db
router = APIRouter()
@router.get("/transport-modes/{mode_key}", response_model=dto.TransportModeDTO)
def get_transport_mode(mode_key: str, db: Session = Depends(get_db)):
transport_mode = services.TransportModeService.get_transport_mode_by_key(db, mode_key)
if not transport_mode:
raise HTTPException(status_code=404, detail="Transport mode not found")
return transport_mode
@router.post("/transport-modes", response_model=dto.TransportModeDTO)
def create_transport_mode(transport_mode_data: dto.TransportModeCreateDTO, db: Session = Depends(get_db)):
return services.TransportModeService.create_transport_mode(db, transport_mode_data)
@router.delete("/transport-modes/{mode_key}", response_model=dto.TransportModeDTO)
def delete_transport_mode(mode_key: str, db: Session = Depends(get_db)):
transport_mode = services.TransportModeService.delete_transport_mode(db, mode_key)
if not transport_mode:
raise HTTPException(status_code=404, detail="Transport mode not found")
return transport_mode

View File

@@ -1,23 +0,0 @@
from sqlalchemy.orm import Session
from . import models, dto
class TransportModeService:
@staticmethod
def get_transport_mode_by_key(db: Session, mode_key: str):
return db.query(models.TransportMode).filter(models.TransportMode.mode_key == mode_key).first()
@staticmethod
def create_transport_mode(db: Session, transport_mode_data: dto.TransportModeCreateDTO):
new_transport_mode = models.TransportMode(**transport_mode_data.dict())
db.add(new_transport_mode)
db.commit()
db.refresh(new_transport_mode)
return new_transport_mode
@staticmethod
def delete_transport_mode(db: Session, mode_key: str):
transport_mode = TransportModeService.get_transport_mode_by_key(db, mode_key)
if transport_mode:
db.delete(transport_mode)
db.commit()
return transport_mode

View File

@@ -1,15 +0,0 @@
from pydantic import BaseModel
from typing import Optional
class TransportTypeBaseDTO(BaseModel):
transport_type_key: str
description: Optional[str]
company_id: str
tenant_id: str
class TransportTypeCreateDTO(TransportTypeBaseDTO):
pass
class TransportTypeResponseDTO(TransportTypeBaseDTO):
class Config:
orm_mode = True

View File

@@ -1,11 +0,0 @@
from sqlalchemy import Column, String, ForeignKey
from core.database import Base
class TransportType(Base):
__tablename__ = "transport_type"
__table_args__ = {"schema": "a76"}
transport_type_key = Column(String(2), primary_key=True, nullable=False)
description = Column(String(100), nullable=True)
company_id = Column(String, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(String, ForeignKey("a76.tenants.id"), nullable=False)

View File

@@ -1,46 +0,0 @@
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from typing import List
from core.database import get_core_db
from core.security import get_current_user
from .dto import TransportTypeCreateDTO, TransportTypeResponseDTO
from .services import TransportTypeService
router = APIRouter(prefix="/transport-types", tags=["TransportTypes"])
@router.get("/", response_model=List[TransportTypeResponseDTO])
async def list_transport_types(
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
return db.query(TransportTypeService).all()
@router.get("/{transport_type_key}", response_model=TransportTypeResponseDTO)
async def read_transport_type(
transport_type_key: str,
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
transport_type = TransportTypeService.get_transport_type_by_key(db, transport_type_key)
if not transport_type:
raise HTTPException(status_code=404, detail="TransportType not found")
return transport_type
@router.post("/", response_model=TransportTypeResponseDTO, status_code=status.HTTP_201_CREATED)
async def create_transport_type(
transport_type_data: TransportTypeCreateDTO,
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
return TransportTypeService.create_transport_type(db, transport_type_data)
@router.delete("/{transport_type_key}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_transport_type(
transport_type_key: str,
db: Session = Depends(get_core_db),
current_user: dict = Depends(get_current_user)
):
transport_type = TransportTypeService.delete_transport_type(db, transport_type_key)
if not transport_type:
raise HTTPException(status_code=404, detail="TransportType not found")

View File

@@ -1,23 +0,0 @@
from sqlalchemy.orm import Session
from . import models, dto
class TransportTypeService:
@staticmethod
def get_transport_type_by_key(db: Session, transport_type_key: str):
return db.query(models.TransportType).filter(models.TransportType.transport_type_key == transport_type_key).first()
@staticmethod
def create_transport_type(db: Session, transport_type_data: dto.TransportTypeCreateDTO):
new_transport_type = models.TransportType(**transport_type_data.dict())
db.add(new_transport_type)
db.commit()
db.refresh(new_transport_type)
return new_transport_type
@staticmethod
def delete_transport_type(db: Session, transport_type_key: str):
transport_type = TransportTypeService.get_transport_type_by_key(db, transport_type_key)
if transport_type:
db.delete(transport_type)
db.commit()
return transport_type

View File

@@ -29,4 +29,4 @@ class TransporterCreateDTO(TransporterBaseDTO):
class TransporterResponseDTO(TransporterBaseDTO):
class Config:
orm_mode = True
from_attributes = True

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, String, ForeignKey
from sqlalchemy import Column, Integer, String, ForeignKey
from core.database import Base
class Transporter(Base):
@@ -24,5 +24,5 @@ class Transporter(Base):
ftp_password = Column(String(100), nullable=True)
ftp_directory = Column(String(1000), nullable=True)
filler_code = Column(String(4), nullable=True)
company_id = Column(String, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(String, ForeignKey("a76.tenants.id"), nullable=False)
company_id = Column(Integer, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(Integer, ForeignKey("a76.tenants.id"), nullable=False)

View File

@@ -35,7 +35,7 @@ class UserTenant(Base):
UniqueConstraint(
"keycloak_user_id", "tenant_id", "company_id", name="uq_user_tenant"
),
{"schema": "a76"},
{"schema": "a76", "extend_existing": True},
)
# Primary Key

View File

@@ -36,4 +36,4 @@ class VehicleCreateDTO(VehicleBaseDTO):
class VehicleResponseDTO(VehicleBaseDTO):
class Config:
orm_mode = True
from_attributes = True

View File

@@ -31,5 +31,5 @@ class Vehicle(Base):
sct_permission = Column(String(40), nullable=True)
color = Column(String(20), nullable=True)
container_key = Column(String(3), nullable=True)
company_id = Column(String, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(String, ForeignKey("a76.tenants.id"), nullable=False)
company_id = Column(Integer, ForeignKey("a76.company.id"), nullable=False)
tenant_id = Column(Integer, ForeignKey("a76.tenants.id"), nullable=False)