def TDecode(url): """Creates a list of event objects based on a ical url""" if url is None: return None # Nob hasnt given us their timetable yet rawCal = urllib.request.urlopen( url) # Try and download the timetable's ical cal = Calendar.from_ical(rawCal.read()) # Parse the ical events = [] # create a list of events for component in cal.walk(): # for "thing" in the cal if component.name == "VEVENT": # if its an event description = component.get('description').split( "\n") # get all its information location = component.get( 'location' ) # unused location data because description has it more reliably startdt = component.get('dtstart').dt # start date/time enddt = component.get('dtend').dt # end date/time module = "Undefined" room = "Undefined" type = "Undefined" for item in description: item = str(item) if "MODULE TITLE:" in item: # get the modules name module = item.replace("MODULE TITLE: ", "") if "ROOM(S):" in item: # get the room name room = item.replace("ROOM(S): ", "") if "EVENT TYPE:" in item: # is it a lecture? workshop? seminar? type = item.replace("EVENT TYPE: ", "") date = "{:02d}/{:02d}".format(startdt.day, startdt.month) timeFormatted = "{Date}-{hour:02d}:{minute:02d}".format( Date=date, hour=startdt.hour + 1, minute=startdt.minute) endFormatted = "{hour:02d}:{minute:02d}".format( hour=enddt.hour + 1, minute=enddt.minute) event = Event() # create an event object event.module = module event.Ftime = timeFormatted event.date = startdt event.end = endFormatted event.type = type event.room = room if len( events ) != 0: # put the event, in order, in the list of events for i in range(len(events)): if event.date < events[i].date: events.insert(i, event) break if i == len(events) - 1: events.append(event) else: events.append(event) return events