# HG changeset patch # User Paul Boddie # Date 1238453000 -7200 # Node ID c59f92f89613b4b838869454acfa53b1726f1297 # Parent 77ef65cf6512788480813360800c6c5123c2810f Introduced a support function for getting events in order. Added iCalendar download links and tidied up link generation. diff -r 77ef65cf6512 -r c59f92f89613 EventAggregatorSupport.py --- a/EventAggregatorSupport.py Mon Mar 30 01:37:45 2009 +0200 +++ b/EventAggregatorSupport.py Tue Mar 31 00:43:20 2009 +0200 @@ -421,6 +421,35 @@ return events, shown_events, all_shown_events, earliest, latest +def compareEvents(event1, event2): + + """ + Compare 'event1' and 'event2' by start and end date, where both parameters + are of the following form: + + (event_page, event_details) + """ + + event_page1, event_details1 = event1 + event_page2, event_details2 = event2 + return cmp( + (event_details1["start"], event_details1["end"]), + (event_details2["start"], event_details2["end"]) + ) + +def getOrderedEvents(events): + + """ + Return a list with the given 'events' ordered according to their start and + end dates. Each list element must be of the following form: + + (event_page, event_details) + """ + + ordered_events = events[:] + ordered_events.sort(compareEvents) + return ordered_events + def getConcretePeriod(calendar_start, calendar_end, earliest, latest): """ diff -r 77ef65cf6512 -r c59f92f89613 css/event-aggregator.css --- a/css/event-aggregator.css Mon Mar 30 01:37:45 2009 +0200 +++ b/css/event-aggregator.css Tue Mar 31 00:43:20 2009 +0200 @@ -9,6 +9,16 @@ Licensed under the GNU GPL (v2 or later), see COPYING.txt for details. */ +/* Controls. */ + +.event-download-calendar { + padding-right: 2em; +} + +.event-download-all { + padding-right: 2em; +} + /* Calendar view. */ .event-month { diff -r 77ef65cf6512 -r c59f92f89613 macros/EventAggregator.py --- a/macros/EventAggregator.py Mon Mar 30 01:37:45 2009 +0200 +++ b/macros/EventAggregator.py Tue Mar 31 00:43:20 2009 +0200 @@ -37,6 +37,18 @@ else: return (255, 255, 255) +def getMonthActionQueryString(argname, month): + if month is not None: + return "%s=%04d-%02d" % ((argname,) + month) + else: + return "" + +def getMonthQueryString(calendar_name, argname, month): + if month is not None: + return "%s-%s=%04d-%02d" % ((calendar_name, argname) + month) + else: + return "" + # Macro functions. def execute(macro, args): @@ -139,6 +151,25 @@ output = [] + # Output download controls. + + download_all_link = "action=EventAggregatorSummary&doit=1&%s" % ( + "&".join([("category=%s" % name) for name in category_names]) + ) + download_link = download_all_link + ("&%s&%s" % ( + getMonthActionQueryString("start", calendar_start), + getMonthActionQueryString("end", calendar_end) + )) + + output.append(fmt.div(on=1, css_class="event-controls")) + output.append(fmt.span(on=1, css_class="event-download-calendar")) + output.append(page.link_to_raw(request, wikiutil.escape(_("Download this calendar in iCalendar format")), download_link)) + output.append(fmt.span(on=0)) + output.append(fmt.span(on=1, css_class="event-download-all")) + output.append(page.link_to_raw(request, wikiutil.escape(_("Download all events in iCalendar format")), download_all_link)) + output.append(fmt.span(on=0)) + output.append(fmt.div(on=0)) + # Output top-level information. if mode == "list": @@ -169,11 +200,13 @@ # Links to the previous set of months and to a calendar shifted # back one month. - previous_set_link = "%s-start=%04d-%02d&%s-end=%04d-%02d" % ( - (calendar_name,) + previous_set_start + (calendar_name,) + previous_set_end + previous_set_link = "%s&%s" % ( + getMonthQueryString(calendar_name, "start", previous_set_start), + getMonthQueryString(calendar_name, "end", previous_set_end) ) - previous_month_link = "%s-start=%04d-%02d&%s-end=%04d-%02d" % ( - (calendar_name,) + previous_month_start + (calendar_name,) + previous_month_end + previous_month_link = "%s&%s" % ( + getMonthQueryString(calendar_name, "start", previous_month_start), + getMonthQueryString(calendar_name, "end", previous_month_end) ) output.append(fmt.span(on=1, css_class="previous-month")) @@ -185,11 +218,13 @@ # Links to the next set of months and to a calendar shifted # forward one month. - next_set_link = "%s-start=%04d-%02d&%s-end=%04d-%02d" % ( - (calendar_name,) + next_set_start + (calendar_name,) + next_set_end + next_set_link = "%s&%s" % ( + getMonthQueryString(calendar_name, "start", next_set_start), + getMonthQueryString(calendar_name, "end", next_set_end) ) - next_month_link = "%s-start=%04d-%02d&%s-end=%04d-%02d" % ( - (calendar_name,) + next_month_start + (calendar_name,) + next_month_end + next_month_link = "%s&%s" % ( + getMonthQueryString(calendar_name, "start", next_month_start), + getMonthQueryString(calendar_name, "end", next_month_end) ) output.append(fmt.span(on=1, css_class="next-month")) @@ -201,9 +236,11 @@ # A link leading to this month being at the top of the calendar. full_month_label = "%s %s" % (month_label, year) - month_link = "%s-start=%04d-%02d&%s-end=%04d-%02d" % ( - (calendar_name, year, month, calendar_name) + - EventAggregatorSupport.monthupdate((year, month), number_of_months - 1) + end_month = EventAggregatorSupport.monthupdate((year, month), number_of_months - 1) + + month_link = "%s&%s" % ( + getMonthQueryString(calendar_name, "start", (year, month)), + getMonthQueryString(calendar_name, "end", end_month) ) output.append(page.link_to_raw(request, wikiutil.escape(full_month_label), month_link)) @@ -418,16 +455,11 @@ # Get the events in order. - ordered_events = [] - - for event_page, event_details in shown_events.get((year, month), []): - ordered_events.append((event_details["start"], event_details["end"], (event_page, event_details))) - - ordered_events.sort(lambda x, y: cmp((x[0], x[1]), (y[0], y[1]))) + ordered_events = EventAggregatorSummary.getOrderedEvents(shown_events.get((year, month), [])) # Show the events in order. - for start, end, (event_page, event_details) in ordered_events: + for event_page, event_details in ordered_events: event_summary = EventAggregatorSupport.getEventSummary(event_page, event_details) output.append(fmt.listitem(on=1, attr={"class" : "event-listing"}))