# HG changeset patch # User Paul Boddie # Date 1257624496 -3600 # Node ID d919e2bb13e0fc7bad91c642d23c4eb6c51fe7e1 # Parent 4b0e0c5022a1090462677ff5d363c5aaf6ff3321 Fixed errors when events do not have topics. Added navigation between viewing modes. Expanded the View class to do more of the presentation work. Merged the getMonthQueryString method and getMonthActionQueryString function. diff -r 4b0e0c5022a1 -r d919e2bb13e0 css/event-aggregator.css --- a/css/event-aggregator.css Sat Oct 31 01:36:05 2009 +0100 +++ b/css/event-aggregator.css Sat Nov 07 21:08:16 2009 +0100 @@ -11,10 +11,25 @@ /* Controls. */ +.event-controls { + display: block; +} + +.event-download-controls { +} + .event-download { padding-right: 2em; } +.event-view-controls { + text-align: right; +} + +.event-view { + padding-right: 2em; +} + /* Calendar view. */ .event-month { @@ -230,6 +245,10 @@ /* Table view */ +.event-table { + width: 98%; +} + .event-table-heading { font-weight: bold; } diff -r 4b0e0c5022a1 -r d919e2bb13e0 macros/EventAggregator.py --- a/macros/EventAggregator.py Sat Oct 31 01:36:05 2009 +0100 +++ b/macros/EventAggregator.py Sat Nov 07 21:08:16 2009 +0100 @@ -27,15 +27,27 @@ "A view of the event calendar." - def __init__(self, page, calendar_name, first, last): + def __init__(self, page, calendar_name, calendar_start, calendar_end, + first, last, category_names, template_name, parent_name, mode): """ Initialise the view with the current 'page', a 'calendar_name' (which - may be None), and the 'first' and 'last' months. + may be None), the requested 'calendar_start' and 'calendar_end', and the + 'first' and 'last' months of event coverage. + + The additional 'category_names', 'template_name', 'parent_name' and + 'mode' parameters are used to configure the links employed by the view. """ self.page = page self.calendar_name = calendar_name + self.calendar_start = calendar_start + self.calendar_end = calendar_end + self.template_name = template_name + self.parent_name = parent_name + self.mode = mode + + self.category_name_parameters = "&".join([("category=%s" % name) for name in category_names]) if self.calendar_name is not None: @@ -54,12 +66,93 @@ self.previous_set_end = EventAggregatorSupport.monthupdate(last, -self.number_of_months) self.next_set_end = EventAggregatorSupport.monthupdate(last, self.number_of_months) - def getMonthQueryString(self, argname, month): + def getMonthQueryString(self, argname, month, prefix=1): if month is not None: - return "%s-%s=%04d-%02d" % ((self.calendar_name, argname) + month) + if prefix: + return "%s-%s=%04d-%02d" % ((self.calendar_name, argname) + month) + else: + return "%s=%04d-%02d" % ((argname,) + month) else: return "" + def getNavigationLink(self, start, end, mode=None): + return "%s&%s&mode=%s" % ( + self.getMonthQueryString("start", start), + self.getMonthQueryString("end", end), + mode or self.mode + ) + + def writeDownloadControls(self): + page = self.page + request = page.request + fmt = page.formatter + _ = request.getText + + output = [] + + # Generate the links. + + download_all_link = "action=EventAggregatorSummary&doit=1&%s" % self.category_name_parameters + download_link = download_all_link + ("&%s&%s" % ( + self.getMonthQueryString("start", self.calendar_start, prefix=0), + self.getMonthQueryString("end", self.calendar_end, prefix=0) + )) + subscribe_all_link = download_all_link + "&format=RSS" + subscribe_link = download_link + "&format=RSS" + + # Write the controls. + + output.append(fmt.div(on=1, css_class="event-download-controls")) + output.append(fmt.span(on=1, css_class="event-download")) + output.append(linkToPage(request, page, _("Download this view"), download_link)) + output.append(fmt.span(on=0)) + output.append(fmt.span(on=1, css_class="event-download")) + output.append(linkToPage(request, page, _("Download this calendar"), download_all_link)) + output.append(fmt.span(on=0)) + output.append(fmt.span(on=1, css_class="event-download")) + output.append(linkToPage(request, page, _("Subscribe to this view"), subscribe_link)) + output.append(fmt.span(on=0)) + output.append(fmt.span(on=1, css_class="event-download")) + output.append(linkToPage(request, page, _("Subscribe to this calendar"), subscribe_all_link)) + output.append(fmt.span(on=0)) + output.append(fmt.div(on=0)) + + return "".join(output) + + def writeViewControls(self): + page = self.page + request = page.request + fmt = page.formatter + _ = request.getText + + output = [] + + calendar_link = self.getNavigationLink( + self.calendar_start, self.calendar_end, "calendar" + ) + list_link = self.getNavigationLink( + self.calendar_start, self.calendar_end, "list" + ) + table_link = self.getNavigationLink( + self.calendar_start, self.calendar_end, "table" + ) + + # Write the controls. + + output.append(fmt.div(on=1, css_class="event-view-controls")) + output.append(fmt.span(on=1, css_class="event-view")) + output.append(linkToPage(request, page, _("View as calendar"), calendar_link)) + output.append(fmt.span(on=0)) + output.append(fmt.span(on=1, css_class="event-view")) + output.append(linkToPage(request, page, _("View as list"), list_link)) + output.append(fmt.span(on=0)) + output.append(fmt.span(on=1, css_class="event-view")) + output.append(linkToPage(request, page, _("View as table"), table_link)) + output.append(fmt.span(on=0)) + output.append(fmt.div(on=0)) + + return "".join(output) + def writeMonthHeading(self, year, month): page = self.page request = page.request @@ -78,25 +171,21 @@ # Links to the previous set of months and to a calendar shifted # back one month. - previous_set_link = "%s&%s" % ( - self.getMonthQueryString("start", self.previous_set_start), - self.getMonthQueryString("end", self.previous_set_end) + previous_set_link = self.getNavigationLink( + self.previous_set_start, self.previous_set_end ) - previous_month_link = "%s&%s" % ( - self.getMonthQueryString("start", self.previous_month_start), - self.getMonthQueryString("end", self.previous_month_end) + previous_month_link = self.getNavigationLink( + self.previous_month_start, self.previous_month_end ) # Links to the next set of months and to a calendar shifted # forward one month. - next_set_link = "%s&%s" % ( - self.getMonthQueryString("start", self.next_set_start), - self.getMonthQueryString("end", self.next_set_end) + next_set_link = self.getNavigationLink( + self.next_set_start, self.next_set_end ) - next_month_link = "%s&%s" % ( - self.getMonthQueryString("start", self.next_month_start), - self.getMonthQueryString("end", self.next_month_end) + next_month_link = self.getNavigationLink( + self.next_month_start, self.next_month_end ) # A link leading to this month being at the top of the calendar. @@ -104,9 +193,8 @@ full_month_label = "%s %s" % (month_label, year) end_month = EventAggregatorSupport.monthupdate((year, month), self.number_of_months - 1) - month_link = "%s&%s" % ( - self.getMonthQueryString("start", (year, month)), - self.getMonthQueryString("end", end_month) + month_link = self.getNavigationLink( + (year, month), end_month ) output.append(fmt.span(on=1, css_class="previous-month")) @@ -134,6 +222,26 @@ return "".join(output) + def writeDayNumberLinked(self, day, month, year): + page = self.page + request = page.request + fmt = page.formatter + _ = request.getText + + output = [] + + new_event_link = "action=EventAggregatorNewEvent&start-day=%d&start-month=%d&start-year=%d" \ + "&%s&template=%s&parent=%s" % ( + day, month, year, self.category_name_parameters, self.template_name, self.parent_name or "") + + output.append(fmt.div(on=1)) + output.append(fmt.span(on=1, css_class="event-day-number")) + output.append(linkToPage(request, page, unicode(day), new_event_link)) + output.append(fmt.span(on=0)) + output.append(fmt.div(on=0)) + + return "".join(output) + # HTML-related functions. def getColour(s): @@ -152,12 +260,6 @@ else: return (255, 255, 255) -def getMonthActionQueryString(argname, month): - if month is not None: - return "%s=%04d-%02d" % ((argname,) + month) - else: - return "" - # Macro functions. def execute(macro, args): @@ -208,7 +310,7 @@ category_names = [] calendar_start = None calendar_end = None - mode = "calendar" + mode = None name_usage = "weekly" calendar_name = None template_name = getattr(request.cfg, "event_aggregator_new_event_template", "EventTemplate") @@ -245,9 +347,7 @@ calendar_start = EventAggregatorSupport.getFormMonth(request, calendar_name, "start") or calendar_start calendar_end = EventAggregatorSupport.getFormMonth(request, calendar_name, "end") or calendar_end - # HTML link fragments. - - category_name_parameters = "&".join([("category=%s" % name) for name in category_names]) + mode = EventAggregatorSupport.getParameter(request, "mode", mode or "calendar") # Get the events. @@ -260,7 +360,7 @@ # Define a view of the calendar, retaining useful navigational information. - view = View(page, calendar_name, first, last) + view = View(page, calendar_name, calendar_start, calendar_end, first, last, category_names, template_name, parent_name, mode) # Make a calendar. @@ -268,27 +368,8 @@ # Output download controls. - download_all_link = "action=EventAggregatorSummary&doit=1&%s" % category_name_parameters - download_link = download_all_link + ("&%s&%s" % ( - getMonthActionQueryString("start", calendar_start), - getMonthActionQueryString("end", calendar_end) - )) - subscribe_all_link = download_all_link + "&format=RSS" - subscribe_link = download_link + "&format=RSS" - output.append(fmt.div(on=1, css_class="event-controls")) - output.append(fmt.span(on=1, css_class="event-download")) - output.append(linkToPage(request, page, _("Download this view"), download_link)) - output.append(fmt.span(on=0)) - output.append(fmt.span(on=1, css_class="event-download")) - output.append(linkToPage(request, page, _("Download this calendar"), download_all_link)) - output.append(fmt.span(on=0)) - output.append(fmt.span(on=1, css_class="event-download")) - output.append(linkToPage(request, page, _("Subscribe to this view"), subscribe_link)) - output.append(fmt.span(on=0)) - output.append(fmt.span(on=1, css_class="event-download")) - output.append(linkToPage(request, page, _("Subscribe to this calendar"), subscribe_all_link)) - output.append(fmt.span(on=0)) + output.append(view.writeDownloadControls()) output.append(fmt.div(on=0)) # Output top-level information. @@ -396,19 +477,10 @@ else: output.append(fmt.table_cell(on=1, attrs={"class" : "event-day-heading event-day-empty", "colspan" : "3"})) - # Make a link to a new event action. - - new_event_link = "action=EventAggregatorNewEvent&start-day=%d&start-month=%d&start-year=%d" \ - "&%s&template=%s&parent=%s" % ( - day, month, year, category_name_parameters, template_name, parent_name or "") + # Output the day number, making a link to a new event + # action. - # Output the day number. - - output.append(fmt.div(on=1)) - output.append(fmt.span(on=1, css_class="event-day-number")) - output.append(linkToPage(request, page, unicode(day), new_event_link)) - output.append(fmt.span(on=0)) - output.append(fmt.div(on=0)) + output.append(view.writeDayNumberLinked(day, month, year)) # End of day. @@ -720,7 +792,7 @@ if event_details.has_key("topics") or event_details.has_key("categories"): output.append(fmt.bullet_list(on=1, attr={"class" : "event-topics"})) - for topic in event_details.get("topics") or event_details.get("categories"): + for topic in event_details.get("topics") or event_details.get("categories") or []: output.append(fmt.listitem(on=1)) output.append(fmt.text(topic)) output.append(fmt.listitem(on=0)) @@ -748,7 +820,7 @@ css_classes = ["event-table-details"] - for topic in event_details.get("topics") or event_details.get("categories"): + for topic in event_details.get("topics") or event_details.get("categories") or []: # Filter the category text to avoid illegal characters. @@ -802,6 +874,12 @@ elif mode == "table": output.append(fmt.table(on=0)) + # Output view controls. + + output.append(fmt.div(on=1, css_class="event-controls")) + output.append(view.writeViewControls()) + output.append(fmt.div(on=0)) + return ''.join(output) # vim: tabstop=4 expandtab shiftwidth=4