import datetime
from collections import defaultdict
[docs]class Trip:
"""Trip object that everything else in Splitinerary gets added to.
Attributes:
dates_list (list of datetime.date): sortable list of datetime.date,
used to keep track of which dates have events on them.
dates_dict (dict of datetime.date : event.Event):
keys can be used to see if date exists in trip, values are lists
(that can be sorted) of each day's events.
user_activities (dict of user: {date: [event1, event2]}):
Maps users to their activities on dates
"""
def __init__(self):
"""Inits Trip."""
self.dates_list = []
self.dates_dict = {}
self.user_activities = defaultdict(lambda: defaultdict(list))
[docs] def add_event(self, event):
"""Add an Event object to the Trip.
This involves adding the date of the event to self.dates_list and
adding the event to self.dates_dict[date].
Args:
event (Event): The event to be added to the Trip.
"""
date = event.get_date()
if date not in self.dates_dict:
self.dates_list.append(date)
self.dates_dict[date] = []
self.dates_dict[date].append(event)
users = event.get_users()
if users is not None:
for user in users:
self.user_activities[user][date].append(event)
[docs] def get_events_on_date(self, date):
"""Returns of the events on a certain day in order of start time.
Args:
date (datetime.date): the date whose events are to be returned.
Returns:
list of (datetime.time, Event): sorted list of tuples of
events on the input date if it exists, else None.
"""
if date not in self.dates_dict:
return None
else:
self.dates_dict[date].sort()
return self.dates_dict[date]
[docs] def get_eventful_dates(self):
"""Print all of the dates that have an event on them in order of start
time.
Returns:
list of datetime.date: sorted list of dates that have
events on them if it exists, else None.
"""
if not self.dates_list:
return None
self.dates_list.sort()
return self.dates_list
[docs] def get_all_events(self):
"""Returns all events in the Trip in order of start time.
Returns:
list of Event: sorted list of all events in the
trip.
"""
if not self.dates_dict:
return None
all_events = []
for events in self.dates_dict.values():
all_events.extend(events)
all_events.sort()
return all_events
[docs] def get_next_event(self):
"""Returns the next event that will take place for any user.
Returns:
Event: the next event that will take place for any
User if it exists, else None.
"""
now = datetime.datetime.now()
all_events = self.get_all_events()
for event in all_events:
if event.datetime < now:
continue
return event
return None
[docs] def get_users_list(self):
"""Gets list of users participating in Trip.
Returns:
list of Users: A list of users participating in Trip.
"""
return list(self.user_activities.keys())
[docs] def get_events_of_user(self, user):
"""Gets the events of a given User.
Args:
user (User): A User in the Trip.
Returns:
dict of user: {date: [event1, event2]} : dictionary of user's
events for each day.
"""
if user not in self.user_activities:
return None
return self.user_activities[user]
[docs] def remove_event_by_index(self, date, index):
"""Remove an Event from a Trip given a date and index of Event on date.
Args:
date (datetime.Date): Date of event.
index (int): Index of Event on date, in order of time.
"""
if date not in self.dates_dict:
return
days_events_list = self.dates_dict[date]
if index < 0 or index >= len(days_events_list):
return
removed_event = days_events_list.pop(index)
event_date = removed_event.get_date()
# remove from dates_list if necessary
if len(days_events_list) == 0:
self.dates_list.remove(event_date)
# remove event from each affected user's user_activities dict entry
affected_users = removed_event.get_users()
for user in affected_users:
users_events = self.user_activities[user]
users_events[event_date].remove(removed_event)
[docs] def remove_user_from_event(self, user, event):
"""Remove a User from an Event in the Trip.
Args:
user (User): User to remove from Event.
event (Event): Event from which User is being removed.
"""
event_date = event.get_date()
users_events = self.user_activities[user]
users_events[event_date].remove(event)
users_list = event.get_users()
users_list.remove(user)
[docs] def add_user_to_event(self, user, event):
"""Add a user to an Event in the Trip.
Args:
user (User): User to add to the Event.
event (Event): Event from which User is being added.
"""
event_date = event.get_date()
users_events = self.user_activities[user]
users_events[event_date].append(event)
event.add_user(user)