-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdriver.py
More file actions
46 lines (39 loc) · 1.68 KB
/
driver.py
File metadata and controls
46 lines (39 loc) · 1.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from user import User
from exceptions import DataFormatError, RideLogicError
class Driver(User):
def __init__(self, name, user_id, car = None, current_location = None, preference = None, language = None):
super().__init__(name, user_id)
self.is_available = False
self.car = car
self.preference = preference
self.language = language
self.current_location = current_location
if current_location is not None:
self.set_location(current_location)
def set_location(self, node_id: int):
if not isinstance(node_id, int):
raise DataFormatError(f"Driver.current_location must be an int node id. Got {type(node_id).__name__}: {node_id}")
if not (0 <= node_id <= 99):
raise DataFormatError(f"Driver.current_location must be between 0 and 99. Got {node_id}")
self.current_location = node_id
def go_online(self):
self.is_available = True
#print(f"Driver {self.name} is now online.")
def go_offline(self):
self.is_available = False
#print(f"Driver {self.name} is now offline.")
def accept_ride(self, rider):
if not self.is_available:
raise RideLogicError(f"Driver {self.name} is not available to accept a ride.")
self.is_available = False
#print(f"Driver {self.name} accepted the ride from {rider.name}.")
return True
def rate_rider(self, rider, rating):
try:
rider.add_rating(rating)
print(f"{self.name} rated rider {rider.name}: {rating} stars")
except ValueError as e:
raise RideLogicError(f"Invalid rating {rating} for rider {rider.name}.") from e
def __str__(self):
status = "available" if self.is_available else "unavailable"
return f"Driver {self.name} is currently {status}."