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

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""" 

5 

6 

7# Error de negocio de los viajes, del que heredan todos los demas 

8class TravelDomainError(Exception): 

9 pass 

10 

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.") 

16 

17# El usuario intenta solicitar plaza en un viaje suyo 

18class RequestOwnTravelError(TravelDomainError): 

19 pass 

20 

21# El usuario ya tiene una solicitud viva en alguno de los viajes indicados 

22class AlreadyRequestedError(TravelDomainError): 

23 pass 

24 

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.") 

30 

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 ) 

39 

40 

41# El estado existe y la transicion puede ser legitima, pero debe hacerse desde su endpoint correspondiente 

42class StatusNotRequestableError(TravelDomainError): 

43 

44 GATEWAY = { 

45 'validated': "validando al pasajero con su código de validación", 

46 'unvalidated': "finalizando el viaje", 

47 } 

48 

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.") 

53 

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.") 

59 

60 

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.") 

66 

67 

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.") 

73 

74 

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.") 

80 

81 

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.") 

87 

88class TravelIsNotPunctualError(TravelDomainError): 

89 pass 

90 

91# No se puede reducir el numero de asientos de un viaje periodico 

92class PeriodicSeatsReductionError(TravelIsNotPunctualError): 

93 pass 

94 

95# No se pueden cambiar los usuarios denegados de un viaje periodico 

96class PeriodicDeniedUsersError(TravelIsNotPunctualError): 

97 pass 

98 

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.") 

104 

105 

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.") 

111 

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.") 

118 

119# No se puede mover la fecha de un viaje que ya tiene plazas ocupadas 

120class DateChangeWithOccupiedSeatsError(SeatsBelowOccupiedError): 

121 pass 

122 

123# El vehiculo indicado no existe 

124class VehicleNotFoundError(TravelDomainError): 

125 pass 

126 

127# El vehiculo elegido tiene menos plazas de las que necesita el viaje 

128class VehicleSeatsInsufficientError(TravelDomainError): 

129 pass 

130 

131# Igual que el anterior, pero mirando toda la serie periodica 

132class SeriesVehicleSeatsInsufficientError(VehicleSeatsInsufficientError): 

133 pass 

134 

135# Falta la fecha de fin para convertir un viaje en periodico 

136class EndDateRequiredError(TravelDomainError): 

137 pass 

138 

139# El intervalo de periodicidad debe estar entre 1 y 31 dias 

140class InvalidPeriodicIntervalError(TravelDomainError): 

141 pass