1.1 --- a/EventAggregatorSupport/Types.py Wed Jan 29 19:20:21 2014 +0100
1.2 +++ b/EventAggregatorSupport/Types.py Wed Jan 29 19:21:20 2014 +0100
1.3 @@ -15,6 +15,7 @@
1.4 import vCalendar
1.5
1.6 from codecs import getreader
1.7 +from email.parser import Parser
1.8 from email.utils import parsedate
1.9 import re
1.10
1.11 @@ -131,6 +132,34 @@
1.12 else:
1.13 return None
1.14
1.15 +def parseEventsInXMLCalendarsFromResource(f, encoding=None, url=None, metadata=None):
1.16 +
1.17 + """
1.18 + Parse a collection of events in xCalendar format from the given file-like
1.19 + object 'f', with content having any specified 'encoding' and being described
1.20 + by the given 'url' and 'metadata'.
1.21 + """
1.22 +
1.23 + message = Parser().parse(f)
1.24 + resources = EventResourceCollection(url or "", metadata or {})
1.25 +
1.26 + for data in message.get_payload():
1.27 +
1.28 + # Find the calendar data.
1.29 +
1.30 + if data.is_multipart():
1.31 + for part in data.get_payload():
1.32 + if part.get_content_type() == "application/calendar+xml":
1.33 + text = part
1.34 + else:
1.35 + text = data
1.36 +
1.37 + # Obtain a calendar and merge it into the collection.
1.38 +
1.39 + resources.append(parseEventsInXMLCalendarFromResource(StringIO(text.get_payload(decode=True))))
1.40 +
1.41 + return resources
1.42 +
1.43 def parseEvents(text, event_page, fragment=None):
1.44
1.45 """
1.46 @@ -239,8 +268,10 @@
1.47
1.48 "A resource providing event information."
1.49
1.50 - def __init__(self, url):
1.51 + def __init__(self, url, metadata=None):
1.52 self.url = url
1.53 + self.metadata = metadata
1.54 + self.events = None
1.55
1.56 def getPageURL(self):
1.57
1.58 @@ -262,13 +293,13 @@
1.59 "last-comment" made about the last edit.
1.60 """
1.61
1.62 - return {}
1.63 + return self.metadata or {}
1.64
1.65 def getEvents(self):
1.66
1.67 "Return a list of events from this resource."
1.68
1.69 - return []
1.70 + return self.events or []
1.71
1.72 def linkToPage(self, request, text, query_string=None, anchor=None):
1.73
1.74 @@ -291,14 +322,30 @@
1.75
1.76 return fmt.text(text)
1.77
1.78 +class EventResourceCollection(EventResource):
1.79 +
1.80 + "A collection of resources."
1.81 +
1.82 + def __init__(self, url, metadata=None):
1.83 + self.url = url
1.84 + self.metadata = metadata
1.85 + self.resources = []
1.86 +
1.87 + def append(self, resource):
1.88 + self.resources.append(resource)
1.89 +
1.90 + def getEvents(self):
1.91 + events = []
1.92 + for resource in self.resources:
1.93 + events += resource.getEvents()
1.94 + return events
1.95 +
1.96 class EventCalendarResource(EventResource):
1.97
1.98 "A generic calendar resource."
1.99
1.100 def __init__(self, url, metadata):
1.101 - EventResource.__init__(self, url)
1.102 - self.metadata = metadata
1.103 - self.events = None
1.104 + EventResource.__init__(self, url, metadata)
1.105
1.106 if not self.metadata.has_key("created") and self.metadata.has_key("date"):
1.107 self.metadata["created"] = DateTime(parsedate(self.metadata["date"])[:7])
1.108 @@ -306,16 +353,6 @@
1.109 if self.metadata.has_key("last-modified") and not isinstance(self.metadata["last-modified"], DateTime):
1.110 self.metadata["last-modified"] = DateTime(parsedate(self.metadata["last-modified"])[:7])
1.111
1.112 - def getMetadata(self):
1.113 -
1.114 - """
1.115 - Return a dictionary containing items describing the page's "created"
1.116 - time, "last-modified" time, "sequence" (or revision number) and the
1.117 - "last-comment" made about the last edit.
1.118 - """
1.119 -
1.120 - return self.metadata
1.121 -
1.122 class EventCalendar(EventCalendarResource):
1.123
1.124 "An iCalendar resource."
1.125 @@ -324,16 +361,6 @@
1.126 EventCalendarResource.__init__(self, url, metadata)
1.127 self.calendar = calendar
1.128
1.129 - def getMetadata(self):
1.130 -
1.131 - """
1.132 - Return a dictionary containing items describing the page's "created"
1.133 - time, "last-modified" time, "sequence" (or revision number) and the
1.134 - "last-comment" made about the last edit.
1.135 - """
1.136 -
1.137 - return self.metadata
1.138 -
1.139 def getEvents(self):
1.140
1.141 "Return a list of events from this resource."
1.142 @@ -451,6 +478,8 @@
1.143
1.144 return self.events
1.145
1.146 + # Parsing methods.
1.147 +
1.148 def _getValue(self, values, type):
1.149 for element in values[0].xpath("xcal:%s" % type, namespaces=self.XCAL):
1.150 return element.textContent