- Introduced Pydantic schemas for profitability calculations in `schemas/calculations.py`. - Implemented service functions for profitability calculations in `services/calculations.py`. - Added new exception class `ProfitabilityValidationError` for handling validation errors. - Created repositories for managing project and scenario profitability snapshots. - Developed a utility script for verifying authenticated routes. - Added a new HTML template for the profitability calculator interface. - Implemented a script to fix user ID sequence in the database.
40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
"""Domain-level exceptions for service and repository layers."""
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Sequence
|
|
|
|
|
|
class EntityNotFoundError(Exception):
|
|
"""Raised when a requested entity cannot be located."""
|
|
|
|
|
|
class EntityConflictError(Exception):
|
|
"""Raised when attempting to create or update an entity that violates uniqueness."""
|
|
|
|
|
|
class AuthorizationError(Exception):
|
|
"""Raised when a user lacks permission to perform an action."""
|
|
|
|
|
|
@dataclass(eq=False)
|
|
class ScenarioValidationError(Exception):
|
|
"""Raised when scenarios fail comparison validation rules."""
|
|
|
|
code: str
|
|
message: str
|
|
scenario_ids: Sequence[int] | None = None
|
|
|
|
def __str__(self) -> str: # pragma: no cover - mirrors message for logging
|
|
return self.message
|
|
|
|
|
|
@dataclass(eq=False)
|
|
class ProfitabilityValidationError(Exception):
|
|
"""Raised when profitability calculation inputs fail domain validation."""
|
|
|
|
message: str
|
|
field_errors: Sequence[str] | None = None
|
|
|
|
def __str__(self) -> str: # pragma: no cover - mirrors message for logging
|
|
return self.message
|