Skip to content

Commit bdb9b6c

Browse files
Bugfix(improve unittesting): Moved functionality to prompt user for new/editied value from manage_itineraries.py to main.py, then passed this value as a parameter into edit_itinerary() function.
1 parent 0c24707 commit bdb9b6c

File tree

2 files changed

+56
-54
lines changed

2 files changed

+56
-54
lines changed

Travel_Itinerary_Planner/main.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,16 @@ def run_app():
148148
attractions_available.append(attraction["attraction name"])
149149
attraction_choice, attraction_choice_index = pick(attractions_available, attraction_name_prompt)
150150
attractions_prompt = 'Which attraction property would you like to edit?'
151-
attraction_options = ['attraction_name', 'address', 'summary', 'tag(s)']
151+
attraction_options = ['attraction name', 'address', 'summary', 'tag(s)']
152152
edit_option, attraction_index = pick(attraction_options, attractions_prompt)
153153
elif edit_option != 'flights' or edit_option != 'attractions':
154154
flight_choice = "N/A"
155155
attraction_choice = "N/A"
156+
157+
# Set new value
158+
new_edit_value = input(f"What would you like to change {edit_option} to?\n(If a start/end date use DD-MM-YYYY format. If a flight date/time, use DD-MM-YYYY HH:MM)")
156159

157-
edit_itinerary(itineraries, itinerary_option, edit_option, flight_choice, attraction_choice)
160+
edit_itinerary(itineraries, itinerary_option, edit_option, flight_choice, attraction_choice, new_edit_value)
158161

159162
# Add flight or attraction to existing itinerary
160163
elif user_choice == "3":

Travel_Itinerary_Planner/src/manage_itineraries.py

Lines changed: 51 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -59,101 +59,100 @@ def add_itinerary(itinerary_list, name, location, description, start_date, end_d
5959

6060
save_itineraries(itinerary_list)
6161
return True
62-
else:
63-
return False
62+
return False
6463

6564

66-
def edit_itinerary(itinerary_list, itinerary_option, edit_option, flight_choice, attraction_choice):
65+
def edit_itinerary(itinerary_list, itinerary_option, edit_option, flight_choice, attraction_choice, new_value):
6766
# Edit the itinerary list
6867
for itinerary in itinerary_list:
6968
if itinerary["name"] == itinerary_option:
7069
# Edit DateTime-adjacent data
7170
if edit_option == "start_date":
72-
while True:
73-
start_date = input("Start date in DD-MM-YYYY: ")
74-
if not validate_dates(start_date, itinerary["end_date"], itinerary["flights"]):
75-
print("Invalid date. Please ensure it is in DD-MM-YYYY format (e.g., 12-12-2026)")
76-
else:
77-
itinerary["start_date"] = start_date
78-
break
71+
if not validate_dates(new_value, itinerary["end_date"], itinerary["flights"]):
72+
print("Invalid date. Format required: DD-MM-YYYY (e.g., 12-12-2026)")
73+
return False
74+
else:
75+
itinerary["start_date"] = new_value
76+
break
7977
elif edit_option == "end_date":
80-
while True:
81-
end_date = input("End date in DD-MM-YYYY: ")
82-
if not validate_dates(itinerary["start_date"], end_date, itinerary["flights"]):
83-
print("Invalid date. Please ensure it is in DD-MM-YYYY format (e.g., 12-12-2026)")
84-
else:
85-
itinerary["end_date"] = end_date
86-
break
78+
if not validate_dates(itinerary["start_date"], new_value, itinerary["flights"]):
79+
print("Invalid date. Format required: DD-MM-YYYY (e.g., 12-12-2026)")
80+
return False
81+
else:
82+
itinerary["end_date"] = new_value
83+
break
8784
elif edit_option == "departure date":
8885
for flight_id in itinerary["flights"]:
8986
if flight_id["flight name"] == flight_choice:
90-
while True:
91-
departure = input("Date & time of flight departure (Format: DD-MM-YYYY HH:MM): ")
92-
if not validate_dates(itinerary["start_date"], itinerary["end_date"], itinerary["flights"]):
93-
print("Invalid date. Please ensure it is in DD-MM-YYYY HH:MM format (e.g., 12-12-2026 08:00)")
94-
else:
95-
flight_id["departure date"] = departure
96-
flight_id["flight name"] = f"{flight_id["departure airport"]} to {flight_id["arrival airport"]}"
97-
break
98-
break
87+
test_updated_flight = [flight_id]
88+
test_updated_flight["departure date"] = new_value
89+
if not validate_dates(itinerary["start_date"], itinerary["end_date"], test_updated_flight):
90+
print("Invalid date. Format required: DD-MM-YYYY HH:MM (e.g., 12-12-2026 08:00)")
91+
return False
92+
else:
93+
flight_id["departure date"] = new_value
94+
break
95+
break
9996
elif edit_option == "arrival date":
10097
for flight_id in itinerary["flights"]:
10198
if flight_id["flight name"] == flight_choice:
102-
while True:
103-
arrival = input("Date & time of flight arrival (Format: DD-MM-YYYY HH:MM): ")
104-
if not validate_dates(itinerary["start_date"], itinerary["end_date"], itinerary["flights"]):
105-
print("Invalid date & time. Please ensure it is in DD-MM-YYYY HH:MM format (e.g., 12-12-2026 08:00")
106-
else:
107-
flight_id["arrival date"] = arrival
108-
break
109-
break
99+
test_updated_flight = [flight_id]
100+
test_updated_flight["arrival date"] = new_value
101+
if not validate_dates(itinerary["start_date"], itinerary["end_date"], test_updated_flight):
102+
print("Invalid date & time. Format required: DD-MM-YYYY HH:MM (e.g., 12-12-2026 08:00")
103+
return False
104+
else:
105+
flight_id["arrival date"] = new_value
106+
break
107+
break
110108
else:
111109
# Edit trip's string data (outside of flights & attractions)
112110
if edit_option == 'name' or edit_option == 'location' or edit_option == 'description':
113111
itinerary[edit_option] = input(f"Enter a new {edit_option} for {itinerary['name']}: ")
112+
break
114113

115114
# Flights: string type options
116115
elif edit_option == 'departure airport':
117-
airport_leaving = input("Name of airport you are departing from: ")
118116
for flight_id in itinerary["flights"]:
119117
if flight_id["flight name"] == flight_choice:
120-
flight_id["departure airport"] = airport_leaving
121-
flight_id["flight name"] = f"{airport_leaving} to {flight_id["arrival airport"]}"
118+
flight_id["departure airport"] = new_value
119+
flight_id["flight name"] = f"{new_value} to {flight_id["arrival airport"]}"
122120
break
121+
break
123122

124123
elif edit_option == 'arrival airport':
125-
arrival_airport = input("Name of airport you are arriving at: ")
126124
for flight_id in itinerary["flights"]:
127125
if flight_id["flight name"] == flight_choice:
128-
flight_id.update({"arrival airport": arrival_airport})
129-
flight_id["flight name"] = f"{flight_id["departure airport"]} to {arrival_airport}"
126+
flight_id.update({"arrival airport": new_value})
127+
flight_id["flight name"] = f"{flight_id["departure airport"]} to {new_value}"
130128
break
129+
break
131130

132131
# Attractions: string type options
133132
elif edit_option == 'attraction_name':
134-
attraction_id_name = input("Name of the attraction: ")
135133
for attraction in itinerary["attractions"]:
136134
if attraction["attraction name"] == attraction_choice:
137-
attraction.update({"attraction name": attraction_id_name})
135+
attraction.update({"attraction name": new_value})
138136
break
137+
break
139138
elif edit_option == 'address':
140-
attraction_address = input("New attraction address: ")
141139
for attraction in itinerary["attractions"]:
142140
if attraction["attraction name"] == attraction_choice:
143-
attraction.update({"address": attraction_address})
141+
attraction.update({"address": new_value})
144142
break
143+
break
145144
elif edit_option == 'summary':
146-
attraction_summary = input("Short summary of the attraction: ")
147145
for attraction in itinerary["attractions"]:
148146
if attraction["attraction name"] == attraction_choice:
149-
attraction.update({"summary": attraction_summary})
147+
attraction.update({"summary": new_value})
150148
break
149+
break
151150
elif edit_option == 'tag(s)':
152-
attraction_tags = input("Provide some tags that categorise what kind of activity this involves.\nExample of format required: hike, exciting, views: ")
153151
for attraction in itinerary["attractions"]:
154152
if attraction["attraction name"] == attraction_choice:
155-
attraction.update({"tag(s)": attraction_tags})
153+
attraction.update({"tag(s)": new_value})
156154
break
155+
break
157156
save_itineraries(itinerary_list)
158157
# Uncomment to print for itinerary_list validation:
159158
# print(itinerary_list)
@@ -284,27 +283,27 @@ def validate_dates(start_date, end_date, flights):
284283
"""
285284

286285
try:
287-
datetime.strptime(start_date, "dd-mm-YYYY")
286+
datetime.strptime(start_date, "%d-%m-%Y")
288287
except ValueError:
289288
print("Error: Invalid start date. Use 'DD-MM-YYYY' format.")
290289
return False
291290

292291
try:
293-
datetime.strptime(end_date, "dd-mm-YYYY")
292+
datetime.strptime(end_date, "%d-%m-%Y")
294293
except ValueError:
295294
print("Error: Invalid end date. Use 'DD-MM-YYYY' format.")
296295
return False
297296

298297
# Resource used for following code: https://stackoverflow.com/questions/17322208/multiple-try-codes-in-one-block
299298
for flight_info in flights:
300299
try:
301-
datetime.strptime(flight_info["departure date"], "dd-mm-YYYY HH:MM")
300+
datetime.strptime(flight_info["departure date"], "%d-%m-%Y %H:%M")
302301
except ValueError:
303302
print("Error: Invalid date/time for flight departure. Use 'DD-MM-YYYY HH:MM' format.")
304303
return False
305304

306305
try:
307-
datetime.strptime(flight_info["arrival date"], "dd-mm-YYYY HH:MM")
306+
datetime.strptime(flight_info["arrival date"], "%d-%m-%Y %H:%M")
308307
except ValueError:
309308
print("Error: Invalid date/time for flight arrival. Use 'DD-MM-YYYY HH:MM' format.")
310309
return False

0 commit comments

Comments
 (0)