-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuser_interface.py
205 lines (155 loc) · 9.15 KB
/
user_interface.py
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# IDENTIFICATION - Name: Elley Folks, Student ID: 010139574
# RUBRIC - Section D, Interface.
from delivery import Delivery_Truck
from package import Package
from hash_Table import hash_table
import datetime as dt
class delivery_menu():
# Initializing attributes.
delivery_truck_1 : Delivery_Truck = None
delivery_truck_2 : Delivery_Truck = None
delivery_truck_3 : Delivery_Truck = None
total_miles : int = 0
package_hash_table : hash_table = None
def __init__(self, truck_1: Delivery_Truck, truck_2: Delivery_Truck, truck_3: Delivery_Truck, total_milage, package_hash_table):
"""
Initializes an instance of the UserInterface class.
Args:
truck_1 (Delivery_Truck): The first delivery truck.
truck_2 (Delivery_Truck): The second delivery truck.
truck_3 (Delivery_Truck): The third delivery truck.
total_milage (int): The total mileage of all trucks.
package_hash_table (hash_table): The hash table containing package information.
"""
self.delivery_truck_1 : Delivery_Truck = truck_1
self.delivery_truck_2 : Delivery_Truck = truck_2
self.delivery_truck_3 : Delivery_Truck = truck_3
self.total_miles : int = total_milage
self.package_hash_table : hash_table = package_hash_table
# FLOW - User menu for selecting options.
def user_menu(self):
using_menu: bool = True
# FLOW - User types in number to select option from menu.
while(using_menu == True):
print(" Please select an action below.", "\n")
print(" 1 -*- View ALL packages / delivery status in a given time range.")
print(" 2 -*- View ONE package / delivery status in a given time range.")
print(" 3 -*- View total milage of all trucks.")
print(" 4 -*- Exit program.")
user_choice = input(" Enter the number (1, 2, 3, or 4) of the action you want to perform.\n")
# PROCESS - Option 1, generating status report for all packages at a given time.
if user_choice == '1':
try:
self.generate_report_all_packages()
except ValueError:
print("\n--X-- Not an action. Please select a valid action from below. --X--\n")
# PROCESS - Option 2, generating status report for one package at a given time.
elif user_choice == '2':
try:
self.generate_report_for_package()
except ValueError:
print("\n--X-- Not an action. Please select a valid action from below. --X--\n")
# PROCESS - Option 3, displaying total milage of all trucks.
elif user_choice =='3':
print(f"*--__-- Total milage traveled by all delivery trucks {self.total_miles} miles. --__--*")
# PROCESS - Option 4, exiting program.
elif user_choice == '4':
using_menu = False
print("*--__-- Quitting program. Thankyou for shipping with WGUPS. --__--*")
exit()
# PROCESS - Invalid option entered.
else:
print("--X-- Not an option. Please enter a valid option. --X--\n")
# FLOW - Gets time from user.
def get_user_time(self):
try:
# PROCESS - Gets time string from user.
user_time_str:str = input(" Enter the time (24 hour HH:mm:ss) you want to see the package(s) status.\n")
# PROCESS - Splits time string into hours, minutes, and seconds, separated by the ':'.
(entered_hrs, entered_min, entered_sec) = user_time_str.split(':')
user_time_dt = dt.timedelta(hours = int(entered_hrs), minutes= int(entered_min), seconds= int(entered_sec))
except ValueError:
print("\n--X-- Not a valid time. Please enter a time in the format HH:mm:ss. --X--\n")
self.get_user_time()
return user_time_dt
# FLOW - Generates report for all packages at a given time.
def generate_report_all_packages(self):
'''
Creates a report for all packages, showing individual status at a time entered by user.
The packages are separated by truck. This report displays delivery status, delivery time, address, city, state, zip code and deadline.
'''
desired_time = self.get_user_time()
truck_list = [self.delivery_truck_1, self.delivery_truck_2, self.delivery_truck_3]
# PROCESS - Gets info for packages on truck each truck.
for truck_number, truck_list in enumerate(truck_list, start=1):
print(f"\n--__-- Truck {truck_number} package list: {truck_list.initial_package_list} --__--\n")
# PROCESS - Searches package hash table for information on each package.
for id in truck_list.initial_package_list:
searched_package:Package = self.package_hash_table.search_item(id)
# Package at hub, not in transit.
if desired_time <= searched_package.departure_time:
print(f"-----| Package {searched_package.package_id} status - AT HUB |-----")
self.print_package_status(searched_package, desired_time)
# Package in transit.
elif searched_package.departure_time < desired_time < searched_package.delivery_time:
print("-->--> Package status - EN ROUTE -->-->")
self.print_package_status(searched_package, desired_time)
# Package delivered.
else:
print("-->--x Package status - DELIVERED -->--x")
self.print_package_status(searched_package, desired_time)
print("\n")
# FLOW - Generates report for one package at a given time.
def generate_report_for_package(self):
'''
Creates a report for one searched package, showing package status at a time entered by user.
If the searched package is found, this report displays delivery status, delivery time, address, city, state, zip code and deadline.
'''
desired_time = self.get_user_time()
# PROCESS - Getting package ID from user.
user_package_id: int = int(input(" Please enter package ID.\n"))
# Gets info for one package
if 0 < user_package_id < 41:
searched_package:Package = self.package_hash_table.search_item(user_package_id)
# Package at hub, not in transit.
if desired_time <= searched_package.departure_time:
print("-----| Package status - AT HUB |-----")
self.print_package_status(searched_package, desired_time)
# Package in transit.
elif searched_package.departure_time < desired_time < searched_package.delivery_time:
print("-->--> Package status - EN ROUTE -->-->")
self.print_package_status(searched_package, desired_time)
# Package delivered.
else:
print("-->--x Package status - DELIVERED -->--x")
self.print_package_status(searched_package, desired_time)
else:
raise ValueError("Not a valid package ID. Must be from 1 - 40.")
# FLOW - Prints package status.
def print_package_status(self, package:Package, user_time:dt):
"""
Prints the status of a package based on the time entered by user.
Args:
package (Package): The package object with all information specific to that package.
user_time (datetime): The current time provided by the user.
Returns:
None
"""
# PROCESS - Correcting address for package 9.
if package.package_id == 9:
corrected_time = dt.timedelta(hours=10, minutes=20, seconds=0)
if user_time < corrected_time:
print(f" Package ID: {package.package_id}. \n Delivery time: {package.delivery_time}.",
f"\n Must be delivered to the address: {package.address} {package.city} {package.state} {package.zip_code}",
f"\n by {package.deadline}"
)
if user_time>= corrected_time:
print(f" Package ID: {package.package_id}. \n Delivery time: {package.delivery_time}.",
f"\n Must be delivered to the address: 410 S. State St., Salt Lake City, UT 84111",
f"\n by {package.deadline}"
)
# PROCESS - Reporting package status normally for all other packages.
else:
print(f" Package ID: {package.package_id}. \n Delivery time: {package.delivery_time}.",
f"\n Must be delivered to the address: {package.address} {package.city} {package.state} {package.zip_code}",
f"\n by {package.deadline}")