# HG changeset patch # User Paul Boddie # Date 1396905409 -7200 # Node ID 62f611b64ff264a30911927298b33059790b8e89 # Parent ecf85f4f1907ab7cddef239f5ec08b754016f4bb Added initial support for iTIP method display, fixing the iCalendar format retrieval of method information. diff -r ecf85f4f1907 -r 62f611b64ff2 EventAggregatorSupport/Formatting.py --- a/EventAggregatorSupport/Formatting.py Sun Apr 06 23:35:52 2014 +0200 +++ b/EventAggregatorSupport/Formatting.py Mon Apr 07 23:16:49 2014 +0200 @@ -79,7 +79,26 @@ write(fmt.definition_list(on=0)) -def formatEventsForOutputType(events, request, mimetype, parent=None, descriptions=None, latest_timestamp=None, write=None): +def formatMethod(resource, request, fmt, write=None): + + "Where the 'resource' has a method, offer iTIP actions." + + method = resource.getMethod() + + if method: + _ = request.getText + write = write or request.write + write(fmt.paragraph(on=1)) + write(fmt.span(on=1)) + write(fmt.text(_("iTIP method"))) + write(fmt.span(on=0)) + write(" ") + write(fmt.span(on=1)) + write(fmt.text(method)) + write(fmt.span(on=0)) + write(fmt.paragraph(on=0)) + +def formatEventsForOutputType(events, request, mimetype, parent=None, descriptions=None, latest_timestamp=None, write=None, resource=None): """ Format the given 'events' using the 'request' for the given 'mimetype'. @@ -95,6 +114,9 @@ of the page or event collection. If the 'write' parameter is specified, use it to write output. + + If the 'resource' parameter is specified, use it to write any resource-level + information such as iTIP method information. """ write = write or request.write @@ -136,7 +158,7 @@ # Output the collection one by one. for event in events: - formatEventForOutputType(event, request, mimetype, parent, descriptions, write) + formatEventForOutputType(event, request, mimetype, parent, descriptions, write, resource) # End the collection. @@ -151,7 +173,7 @@ write('') write('') -def formatEventForOutputType(event, request, mimetype, parent=None, descriptions=None, write=None): +def formatEventForOutputType(event, request, mimetype, parent=None, descriptions=None, write=None, resource=None): """ Format the given 'event' using the 'request' for the given 'mimetype'. @@ -164,6 +186,9 @@ for events in the output resource. If the 'write' parameter is specified, use it to write output. + + If the 'resource' parameter is specified, use it to write any resource-level + information such as iTIP method information. """ write = write or request.write @@ -260,6 +285,8 @@ fmt = request.html_formatter fmt.setPage(request.page) formatEvent(event, request, fmt, write=write) + if resource: + formatMethod(resource, request, fmt, write) # iCalendar format helper functions. diff -r ecf85f4f1907 -r 62f611b64ff2 EventAggregatorSupport/Types.py --- a/EventAggregatorSupport/Types.py Sun Apr 06 23:35:52 2014 +0200 +++ b/EventAggregatorSupport/Types.py Mon Apr 07 23:16:49 2014 +0200 @@ -352,6 +352,12 @@ return self.metadata or {} + def getMethod(self): + + "Return the iTIP-related method associated with this resource." + + return None + def getEvents(self): "Return a list of events from this resource." @@ -412,9 +418,15 @@ "An iCalendar resource." + calendar_properties = ("METHOD",) + def __init__(self, url, calendar, metadata): EventCalendarResource.__init__(self, url, metadata) self.calendar = calendar + self.properties = {} + + def getMethod(self): + return self.properties.get("METHOD") def getEvents(self): @@ -482,6 +494,11 @@ self.events.append(CalendarEvent(self, details)) + # Obtain calendar-level information. + + elif objtype in self.calendar_properties: + self.properties[objtype] = obj + return self.events class EventXMLCalendar(EventCalendarResource): @@ -492,7 +509,11 @@ # See: http://tools.ietf.org/html/draft-daboo-et-al-icalendar-in-xml-11#section-3.4 - properties = [ + calendar_properties = [ + ("method", "xcal:properties/xcal:method", "getText"), + ] + + event_properties = [ ("summary", "xcal:properties/xcal:summary", "getText"), ("location", "xcal:properties/xcal:location", "getText"), ("start", "xcal:properties/xcal:dtstart", "getDateTime"), @@ -509,6 +530,10 @@ def __init__(self, url, doc, metadata): EventCalendarResource.__init__(self, url, metadata) self.doc = doc + self.properties = self.getProperties(self.calendar_properties, doc) + + def getMethod(self): + return self.properties.get("method") def getEvents(self): @@ -518,28 +543,34 @@ self.events = [] for event in self.doc.xpath("//xcal:vevent", namespaces=self.XCAL): - details = {} - - for property, path, converter in self.properties: - values = event.xpath(path, namespaces=self.XCAL) - - try: - value = getattr(self, converter)(property, values) - details[property] = value - except (IndexError, ValueError): - pass - + details = self.getProperties(self.event_properties, event) self.events.append(CalendarEvent(self, details)) return self.events + # Retrieval methods. + + def getProperties(self, definitions, root): + details = {} + + for property, path, converter in definitions: + values = root.xpath(path, namespaces=self.XCAL) + + try: + value = getattr(self, converter)(property, values) + details[property] = value + except (IndexError, ValueError), exc: + pass + + return details + # Parsing methods. def _getValue(self, values, type): - for element in values[0].xpath("xcal:%s" % type, namespaces=self.XCAL): - return element.textContent - else: - return None + if values: + for element in values[0].xpath("xcal:%s" % type, namespaces=self.XCAL): + return element.textContent + return None def getText(self, property, values): return self._getValue(values, "text") diff -r ecf85f4f1907 -r 62f611b64ff2 parsers/calendar.py --- a/parsers/calendar.py Sun Apr 06 23:35:52 2014 +0200 +++ b/parsers/calendar.py Mon Apr 07 23:16:49 2014 +0200 @@ -8,7 +8,7 @@ from MoinSupport import parseAttributes, RawParser, getPageURL from EventAggregatorSupport.Formatting import formatEventsForOutputType, \ - formatEvent + formatEvent, formatMethod from EventAggregatorSupport.Types import parseEventsInCalendar Dependencies = ["pages"] @@ -51,9 +51,13 @@ using the request. """ - for event in parseEventsInCalendar(self.raw, getPageURL(self.request.page)).getEvents(): + resource = parseEventsInCalendar(self.raw, getPageURL(self.request.page)) + + for event in resource.getEvents(): formatEvent(event, self.request, fmt, write=write, parser_cls=RawParser) + formatMethod(resource, self.request, fmt, write) + # Extra API methods. def formatForOutputType(self, mimetype, write=None): @@ -69,8 +73,9 @@ if mimetype == "text/calendar": (write or request.write)(self.raw) else: - events = parseEventsInCalendar(self.raw, getPageURL(self.request.page)).getEvents() - formatEventsForOutputType(events, self.request, mimetype, write=write) + resource = parseEventsInCalendar(self.raw, getPageURL(self.request.page)) + events = resource.getEvents() + formatEventsForOutputType(events, self.request, mimetype, write=write, resource=resource) # Class methods. diff -r ecf85f4f1907 -r 62f611b64ff2 parsers/xcalendar.py --- a/parsers/xcalendar.py Sun Apr 06 23:35:52 2014 +0200 +++ b/parsers/xcalendar.py Mon Apr 07 23:16:49 2014 +0200 @@ -8,7 +8,7 @@ from MoinSupport import parseAttributes, RawParser, getPageURL from EventAggregatorSupport.Formatting import formatEventsForOutputType, \ - formatEvent + formatEvent, formatMethod from EventAggregatorSupport.Types import parseEventsInXMLCalendar Dependencies = ["pages"] @@ -51,9 +51,13 @@ using the request. """ - for event in parseEventsInXMLCalendar(self.raw, getPageURL(self.request.page)).getEvents(): + resource = parseEventsInXMLCalendar(self.raw, getPageURL(self.request.page)) + + for event in resource.getEvents(): formatEvent(event, self.request, fmt, write=write, parser_cls=RawParser) + formatMethod(resource, self.request, fmt, write) + # Extra API methods. def formatForOutputType(self, mimetype, write=None): @@ -69,8 +73,9 @@ if mimetype == "application/calendar+xml": (write or request.write)(self.raw) else: - events = parseEventsInXMLCalendar(self.raw, getPageURL(self.request.page)).getEvents() - formatEventsForOutputType(events, self.request, mimetype, write=write) + resource = parseEventsInXMLCalendar(self.raw, getPageURL(self.request.page)) + events = resource.getEvents() + formatEventsForOutputType(events, self.request, mimetype, write=write, resource=resource) # Class methods.