Coverage for travels\services\exceptions.py: 100.0%
76 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-30 20:58 +0200
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-30 20:58 +0200
1"""
2Excepciones de dominio de Travel y RequestTravel
3El servicio las lanza y es el view el que las traduce a su ErrorCode y a su Response
4"""
7# Error de negocio de los viajes, del que heredan todos los demas
8class TravelDomainError(Exception):
9 pass
11# No quedan asientos libres en el viaje
12class SeatsFullError(TravelDomainError):
13 def __init__(self, travel_id=None):
14 self.travel_id = travel_id
15 super().__init__(f"Travel {travel_id} has no remaining seats.")
17# El usuario intenta solicitar plaza en un viaje suyo
18class RequestOwnTravelError(TravelDomainError):
19 pass
21# El usuario ya tiene una solicitud viva en alguno de los viajes indicados
22class AlreadyRequestedError(TravelDomainError):
23 pass
25# El codigo de estado de solicitud recibido no existe
26class InvalidRequestStatusError(TravelDomainError):
27 def __init__(self, status_code=None):
28 self.status_code = status_code
29 super().__init__(f"Request status {status_code} is not valid.")
31# El estado destino existe, pero el salto desde el actual no esta permitido
32class InvalidStatusTransitionError(TravelDomainError):
33 def __init__(self, current_status, new_status):
34 self.current_status = current_status
35 self.new_status = new_status
36 super().__init__(
37 f"Transition {current_status} -> {new_status} is not allowed."
38 )
41# El estado existe y la transicion puede ser legitima, pero debe hacerse desde su endpoint correspondiente
42class StatusNotRequestableError(TravelDomainError):
44 GATEWAY = {
45 'validated': "validando al pasajero con su código de validación",
46 'unvalidated': "finalizando el viaje",
47 }
49 def __init__(self, status_code):
50 self.status_code = status_code
51 self.gateway = self.GATEWAY.get(status_code)
52 super().__init__(f"Status {status_code} can not be requested through the API.")
54# No existe ningun usuario con ese nombre de usuario
55class PassengerNotFoundError(TravelDomainError):
56 def __init__(self, username=None):
57 self.username = username
58 super().__init__(f"Passenger {username} not found.")
61# El usuario existe pero no tiene una solicitud aceptada en el viaje
62class PassengerNotInTravelError(TravelDomainError):
63 def __init__(self, username=None):
64 self.username = username
65 super().__init__(f"Passenger {username} has no accepted request in this travel.")
68# El codigo de validacion no corresponde a ninguna solicitud del viaje
69class InvalidValidationCodeError(TravelDomainError):
70 def __init__(self, code=None):
71 self.code = code
72 super().__init__(f"Validation code {code} is not valid.")
75# El pasajero ya habia sido validado
76class PassengerAlreadyValidatedError(TravelDomainError):
77 def __init__(self, username=None):
78 self.username = username
79 super().__init__(f"Passenger {username} is already validated.")
82# El pasajero no esta en estado aceptado, asi que no se puede validar
83class PassengerNotAcceptedError(TravelDomainError):
84 def __init__(self, username=None):
85 self.username = username
86 super().__init__(f"Passenger {username} is not in accepted state.")
88class TravelIsNotPunctualError(TravelDomainError):
89 pass
91# No se puede reducir el numero de asientos de un viaje periodico
92class PeriodicSeatsReductionError(TravelIsNotPunctualError):
93 pass
95# No se pueden cambiar los usuarios denegados de un viaje periodico
96class PeriodicDeniedUsersError(TravelIsNotPunctualError):
97 pass
99# No existe el punto de recogida indicado dentro del viaje
100class PickUpPointNotFoundError(TravelDomainError):
101 def __init__(self, point_id=None):
102 self.point_id = point_id
103 super().__init__(f"Pickup point {point_id} not found.")
106# Se intenta tocar algo que depende de un viaje que no es del usuario
107class NotTravelOwnerError(TravelDomainError):
108 def __init__(self, travel_id=None):
109 self.travel_id = travel_id
110 super().__init__(f"Travel {travel_id} does not belong to the caller.")
112# Se intenta dejar menos asientos de los que ya estan ocupados
113class SeatsBelowOccupiedError(TravelDomainError):
114 def __init__(self, seats=None, occupied_seats=None):
115 self.seats = seats
116 self.occupied_seats = occupied_seats
117 super().__init__(f"Cannot set {seats} seats, {occupied_seats} are already occupied.")
119# No se puede mover la fecha de un viaje que ya tiene plazas ocupadas
120class DateChangeWithOccupiedSeatsError(SeatsBelowOccupiedError):
121 pass
123# El vehiculo indicado no existe
124class VehicleNotFoundError(TravelDomainError):
125 pass
127# El vehiculo elegido tiene menos plazas de las que necesita el viaje
128class VehicleSeatsInsufficientError(TravelDomainError):
129 pass
131# Igual que el anterior, pero mirando toda la serie periodica
132class SeriesVehicleSeatsInsufficientError(VehicleSeatsInsufficientError):
133 pass
135# Falta la fecha de fin para convertir un viaje en periodico
136class EndDateRequiredError(TravelDomainError):
137 pass
139# El intervalo de periodicidad debe estar entre 1 y 31 dias
140class InvalidPeriodicIntervalError(TravelDomainError):
141 pass