# HG changeset patch # User Paul Boddie # Date 1328402984 -3600 # Node ID 66d5499060e688ed9a8256528bfb5f689fe006fc # Parent a2297e8dd36cd4f5035fc27f0178b0d0e462effb Added an action which provides in-page updates to displayed calendars when navigating between months. diff -r a2297e8dd36c -r 66d5499060e6 EventAggregatorSupport.py --- a/EventAggregatorSupport.py Sun Feb 05 01:29:45 2012 +0100 +++ b/EventAggregatorSupport.py Sun Feb 05 01:49:44 2012 +0100 @@ -1540,13 +1540,31 @@ process the page or any macro invocation. """ - return "calendar=%s&%s&%s&%s=%s&%s=%s" % ( - self.calendar_name, - self.getRawDateQueryString("start", start), - self.getRawDateQueryString("end", end), - self.getQualifiedParameterName("mode"), mode or self.mode, - self.getQualifiedParameterName("resolution"), resolution or self.resolution - ) + parameters = [ + self.getRawDateQueryString("start", start, 0), + self.getRawDateQueryString("end", end, 0), + self.category_name_parameters, + self.remote_source_parameters, + ] + + pairs = [ + ("calendar", self.calendar_name or ""), + ("calendarstart", self.raw_calendar_start or ""), + ("calendarend", self.raw_calendar_end or ""), + ("mode", mode or self.mode), + ("resolution", resolution or self.resolution), + ("parent", self.parent_name or ""), + ("template", self.template_name or ""), + ("names", self.name_usage), + ("map", self.map_name or ""), + ] + + url = self.page.url(self.page.request, + "action=EventAggregatorUpdate&%s" % ( + "&".join([("%s=%s" % pair) for pair in pairs] + parameters) + ), relative=True) + + return "return replaceCalendar('EventAggregator-%s', '%s')" % (self.getIdentifier(), url) def getNewEventLink(self, start): @@ -1631,7 +1649,7 @@ page = self.page request = page.request - fmt = page.formatter + fmt = request.formatter _ = request.getText output = [] @@ -1792,7 +1810,7 @@ page = self.page request = page.request - fmt = page.formatter + fmt = request.formatter _ = request.getText output = [] @@ -1853,7 +1871,7 @@ label = self.getCalendarPeriod() if self.raw_calendar_start is None or self.raw_calendar_end is None: - fmt = self.page.formatter + fmt = self.page.request.formatter output = [] output.append(fmt.span(on=1)) output.append(fmt.text(label)) @@ -1900,7 +1918,7 @@ page = self.page request = page.request - fmt = page.formatter + fmt = request.formatter _ = request.getText output = [] @@ -1919,6 +1937,12 @@ previous_link = self.getNavigationLink( self.previous_start, self.previous_end ) + previous_set_update_link = self.getUpdateLink( + self.previous_set_start, self.previous_set_end + ) + previous_update_link = self.getUpdateLink( + self.previous_start, self.previous_end + ) # Links to the next set of months and to a calendar shifted # forward one month. @@ -1929,24 +1953,31 @@ next_link = self.getNavigationLink( self.next_start, self.next_end ) + next_set_update_link = self.getUpdateLink( + self.next_set_start, self.next_set_end + ) + next_update_link = self.getUpdateLink( + self.next_start, self.next_end + ) # A link leading to this date being at the top of the calendar. date_link = self.getNavigationLink(start, end) + date_update_link = self.getUpdateLink(start, end) output.append(fmt.span(on=1, css_class="previous")) - output.append(linkToPage(request, page, "<<", previous_set_link)) + output.append(linkToPage(request, page, "<<", previous_set_link, onclick=previous_set_update_link)) output.append(fmt.text(" ")) - output.append(linkToPage(request, page, "<", previous_link)) + output.append(linkToPage(request, page, "<", previous_link, onclick=previous_update_link)) output.append(fmt.span(on=0)) output.append(fmt.span(on=1, css_class="next")) - output.append(linkToPage(request, page, ">", next_link)) + output.append(linkToPage(request, page, ">", next_link, onclick=next_update_link)) output.append(fmt.text(" ")) - output.append(linkToPage(request, page, ">>", next_set_link)) + output.append(linkToPage(request, page, ">>", next_set_link, onclick=next_set_update_link)) output.append(fmt.span(on=0)) - output.append(linkToPage(request, page, label, date_link)) + output.append(linkToPage(request, page, label, date_link, onclick=date_update_link)) else: output.append(fmt.span(on=1)) @@ -1965,7 +1996,7 @@ page = self.page request = page.request - fmt = page.formatter + fmt = request.formatter _ = request.getText output = [] @@ -2026,7 +2057,7 @@ page = self.page request = page.request - fmt = page.formatter + fmt = request.formatter output = [] @@ -2066,7 +2097,7 @@ def writeMonthTableHeading(self, year_month): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] output.append(fmt.table_row(on=1)) @@ -2082,7 +2113,7 @@ def writeWeekdayHeadings(self): page = self.page request = page.request - fmt = page.formatter + fmt = request.formatter _ = request.getText output = [] @@ -2098,7 +2129,7 @@ def writeDayNumbers(self, first_day, number_of_days, month, coverage): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] output.append(fmt.table_row(on=1)) @@ -2129,7 +2160,7 @@ def writeEmptyWeek(self, first_day, number_of_days): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] output.append(fmt.table_row(on=1)) @@ -2180,7 +2211,7 @@ def writeWeekSlot(self, first_day, number_of_days, month, week_end, events): page = self.page request = page.request - fmt = page.formatter + fmt = request.formatter output = [] output.append(fmt.table_row(on=1)) @@ -2352,7 +2383,7 @@ def writeWeekSpacer(self, first_day, number_of_days): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] output.append(fmt.table_row(on=1)) @@ -2376,7 +2407,7 @@ def writeDayTableHeading(self, date, colspan=1): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] output.append(fmt.table_row(on=1)) @@ -2390,7 +2421,7 @@ def writeEmptyDay(self, date): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] output.append(fmt.table_row(on=1)) @@ -2410,7 +2441,7 @@ """ page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] @@ -2536,7 +2567,7 @@ def writeDayScaleHeading(self, heading): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] output.append(fmt.table_cell(on=1, attrs={"class" : "event-scale-heading"})) @@ -2555,7 +2586,7 @@ def writeDaySlot(self, period, event, rowspan): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] @@ -2577,7 +2608,7 @@ def writeEmptyDaySlot(self): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] @@ -2589,7 +2620,7 @@ def writeDaySpacer(self, colspan=1, cls="timespan"): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] output.append(fmt.table_cell(on=1, attrs={ @@ -2602,7 +2633,7 @@ def writeMapTableHeading(self): page = self.page - fmt = page.formatter + fmt = page.request.formatter output = [] output.append(fmt.table_cell(on=1, attrs={"class" : "event-map-heading"})) @@ -2613,8 +2644,8 @@ def showDictError(self, text, pagename): page = self.page - fmt = page.formatter request = page.request + fmt = request.formatter output = [] @@ -2630,8 +2661,8 @@ def writeMapEventSummaries(self, events): page = self.page - fmt = page.formatter request = page.request + fmt = request.formatter # Sort the events by date. @@ -2680,15 +2711,15 @@ """ page = self.page - fmt = page.formatter request = page.request + fmt = request.formatter _ = request.getText # Make a calendar. output = [] - output.append(fmt.div(on=1, css_class="event-calendar")) + output.append(fmt.div(on=1, css_class="event-calendar", id=("EventAggregator-%s" % self.getIdentifier()))) # Output download controls. @@ -3207,6 +3238,36 @@ output.append(fmt.div(on=0)) + # Add any scripts. + + if isinstance(fmt, request.html_formatter.__class__): + output.append(self.update_script) + return ''.join(output) + update_script = """\ + +""" + # vim: tabstop=4 expandtab shiftwidth=4 diff -r a2297e8dd36c -r 66d5499060e6 actions/EventAggregatorUpdate.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/actions/EventAggregatorUpdate.py Sun Feb 05 01:49:44 2012 +0100 @@ -0,0 +1,87 @@ +# -*- coding: iso-8859-1 -*- +""" + MoinMoin - EventAggregatorUpdate Action + + @copyright: 2012 by Paul Boddie + @license: GNU GPL (v2 or later), see COPYING.txt for details. +""" + +from MoinMoin.Page import Page +from MoinMoin import config +from EventAggregatorSupport import * + +Dependencies = ['pages'] + +# Action function. + +def execute(pagename, request): + + """ + On the given 'pagename', for the given 'request', write a page fragment + producing the rendered calendar information for inclusion in an existing Web + page. Since the page is not processed, all necessary parameters need to be + supplied in the request. + """ + + form = get_form(request) + page = Page(request, pagename) + + # Find settings from the request parameters only. + + calendar_name = form.get("calendar", [None])[0] + category_names = form.get("category", []) + remote_sources = form.get("source", []) + name_usage = getParameter(request, "names", "weekly") + template_name = getParameter(request, "template") + parent_name = getParameter(request, "parent") + mode = getParameter(request, "mode", "calendar") + resolution = getParameter(request, "resolution", mode == "day" and "date" or "month") + map_name = getParameter(request, "map") + + # The underlying dimensions of the calendar are supplied in special + # parameters. + + raw_calendar_start = getParameter(request, "calendarstart") + raw_calendar_end = getParameter(request, "calendarend") + + # Different modes require different levels of precision by default. + + resolution = mode == "calendar" and "month" or resolution + + if resolution == "date": + get_date = getParameterDate + else: + get_date = getParameterMonth + + # Determine the limits of the calendar. + + original_calendar_start = calendar_start = get_date(raw_calendar_start) + original_calendar_end = calendar_end = get_date(raw_calendar_end) + + calendar_start = get_date(getParameter(request, "start")) or calendar_start + calendar_end = get_date(getParameter(request, "end")) or calendar_end + + # Get the events according to the resolution of the calendar. + + pages = getPagesFromResults(getAllCategoryPages(category_names, request), request) + events = getEventsFromResources(getEventPages(pages)) + events += getEventsFromResources(getEventResources(remote_sources, calendar_start, calendar_end, request)) + all_shown_events = getEventsInPeriod(events, getCalendarPeriod(calendar_start, calendar_end)) + earliest, latest = getEventLimits(all_shown_events) + + # Get a concrete period of time. + + first, last = getConcretePeriod(calendar_start, calendar_end, earliest, latest, resolution) + + # Define a view of the calendar, retaining useful navigational information. + + view = View(page, calendar_name, raw_calendar_start, raw_calendar_end, + original_calendar_start, original_calendar_end, calendar_start, calendar_end, + first, last, category_names, remote_sources, template_name, parent_name, + mode, resolution, name_usage, map_name) + + send_headers = get_send_headers(request) + send_headers(["Content-Type: text/html; charset=%s" % config.charset]) + request.write(view.render(all_shown_events)) + +# vim: tabstop=4 expandtab shiftwidth=4