# HG changeset patch # User Paul Boddie # Date 1418062333 -3600 # Node ID 97703ae835abcb1347855d1b57b4450070902527 # Parent 9d5fb143d88bc0c196afce85a1492a7513fb066e Added initial support for showing a calendar of scheduled events. diff -r 9d5fb143d88b -r 97703ae835ab imip_manager.py --- a/imip_manager.py Thu Nov 27 16:29:21 2014 +0100 +++ b/imip_manager.py Mon Dec 08 19:12:13 2014 +0100 @@ -9,7 +9,7 @@ get_item, get_uri, get_utc_datetime, get_values, \ parse_object, to_part, to_timezone from imiptools.mail import Messenger -from imiptools.period import have_conflict +from imiptools.period import have_conflict, get_slots, get_spans from vCalendar import to_node import markup import imip_store @@ -171,6 +171,8 @@ requests = self.store.get_requests(self.user) if requests: + self.page.p("Pending requests:") + self.page.ul() for request in requests: @@ -280,6 +282,59 @@ return True + def show_calendar(self): + + "Show the calendar for the current user." + + self.new_page(title="Calendar") + + freebusy = self.store.get_freebusy(self.user) + page = self.page + + if not freebusy: + page.p("No events scheduled.") + return + + # Day view: start at the earliest known day and produce days until the + # latest known day, perhaps with expandable sections of empty days. + + # Month view: start at the earliest known month and produce months until + # the latest known month, perhaps with expandable sections of empty + # months. + + # Details of users to invite to new events could be superimposed on the + # calendar. + + # Requests could be listed and linked to their tentative positions in + # the calendar. + + slots = get_slots(freebusy) + spans = get_spans(slots) + + page.table(border=1, cellspacing=0, cellpadding=5) + + for point, active in slots: + page.tr() + page.th(class_="timeslot") + page.add(point) + page.th.close() + + for t in active: + if t: + start, end, uid, transp = t + span = spans[uid] + if point == start: + page.td(class_="event", rowspan=span) + page.add(uid) + page.td.close() + else: + page.td(class_="empty") + page.td.close() + + page.tr.close() + + page.table.close() + def select_action(self): "Select the desired action and show the result." @@ -287,6 +342,8 @@ path_info = self.env.get_path_info().rstrip("/") if not path_info: self.show_requests() + elif path_info.rsplit("/", 1)[-1] == "calendar": + self.show_calendar() elif self.show_request(path_info): pass else: diff -r 9d5fb143d88b -r 97703ae835ab imiptools/period.py --- a/imiptools/period.py Thu Nov 27 16:29:21 2014 +0100 +++ b/imiptools/period.py Mon Dec 08 19:12:13 2014 +0100 @@ -144,4 +144,21 @@ return slots +def get_spans(slots): + + "Inspect the given 'slots', returning a mapping of event uids to spans." + + points = [point for point, active in slots] + spans = {} + + for point, active in slots: + for t in active: + if t: + start, end, uid, transp = t + start_slot = points.index(start) + end_slot = points.index(end) + spans[uid] = end_slot - start_slot + + return spans + # vim: tabstop=4 expandtab shiftwidth=4