def event(self, uid): """ Get one event from the calendar. Parameters: * uid: the event uid Returns: * Event() or None """ e = None data = cdav.CalendarData() prop = dav.Prop() + data match = cdav.TextMatch(uid) propf = cdav.PropFilter("UID") + match vevent = cdav.CompFilter("VEVENT") + propf vcal = cdav.CompFilter("VCALENDAR") + vevent filter = cdav.Filter() + vcal root = cdav.CalendarQuery() + [prop, filter] q = etree.tostring(root.xmlelement(), encoding="utf-8", xml_declaration=True) response = self.client.report(self.url.path, q, 1) r = response.tree.find(".//" + dav.Response.tag) if r is not None: href = urlparse.urlparse(r.find(".//" + dav.Href.tag).text) href = url.canonicalize(href, self) data = r.find(".//" + cdav.CalendarData.tag).text e = Event(self.client, url=href, data=data, parent=self) else: raise error.NotFoundError(response.raw) return e
def children(self, type=None): """ List children, using a propfind (resourcetype) on the parent object, at depth = 1. """ c = [] depth = 1 properties = {} props = [dav.ResourceType(), ] prop = dav.Prop() + props root = dav.Propfind() + prop body = etree.tostring(root.xmlelement(), encoding="utf-8", xml_declaration=True) response = self.client.propfind(self.url.path, body, depth) for r in response.tree.findall(dav.Response.tag): # We use canonicalized urls to index children href = urlparse.urlparse(r.find(dav.Href.tag).text) href = url.canonicalize(href, self) properties[href] = {} for p in props: t = r.find(".//" + p.tag) if len(list(t)) > 0: if type is not None: val = t.find(".//" + type) else: val = t.find(".//*") if val is not None: val = val.tag else: val = None else: val = t.text properties[href][p.tag] = val for path in properties.keys(): resource_type = properties[path][dav.ResourceType.tag] if resource_type == type or type is None: if path != self.canonical_url: c.append((path, resource_type)) return c
def date_search(self, start, end=None): """ Search events by date in the calendar. Recurring events are expanded if they have an occurence during the specified time frame. Parameters: * start = datetime.today(). * end = same as above. Returns: * [Event(), ...] """ matches = [] # build the request expand = cdav.Expand(start, end) data = cdav.CalendarData() + expand prop = dav.Prop() + data range = cdav.TimeRange(start, end) vevent = cdav.CompFilter("VEVENT") + range vcal = cdav.CompFilter("VCALENDAR") + vevent filter = cdav.Filter() + vcal root = cdav.CalendarQuery() + [prop, filter] q = etree.tostring(root.xmlelement(), encoding="utf-8", xml_declaration=True) response = self.client.report(self.url.path, q, 1) for r in response.tree.findall(".//" + dav.Response.tag): status = r.find(".//" + dav.Status.tag) if status.text.endswith("200 OK"): href = urlparse.urlparse(r.find(dav.Href.tag).text) href = url.canonicalize(href, self) data = r.find(".//" + cdav.CalendarData.tag).text e = Event(self.client, url=href, data=data, parent=self) matches.append(e) else: raise error.ReportError(response.raw) return matches
def tasks(self): """ Search tasks in the calendar Returns: * [Task(), ...] """ matches = [] # build the request getetag = dav.GetEtag() data = cdav.CalendarData() prop = dav.Prop() + [getetag, data] vevent = cdav.CompFilter("VTODO") vcal = cdav.CompFilter("VCALENDAR") + vevent filter = cdav.Filter() + vcal root = cdav.CalendarQuery() + [prop, filter] q = etree.tostring(root.xmlelement(), encoding="utf-8", xml_declaration=True) response = self.client.report(self.url.path, q, 1) for r in response.tree.findall(".//" + dav.Response.tag): status = r.find(".//" + dav.Status.tag) if status.text.endswith("200 OK"): href = urlparse.urlparse(r.find(dav.Href.tag).text) href = url.canonicalize(href, self) data = r.find(".//" + cdav.CalendarData.tag).text etag = r.find(".//" + dav.GetEtag.tag).text e = self.event_cls(self.client, url=href, data=data, parent=self, etag=etag) matches.append(e) else: raise error.ReportError(response.raw) return matches
def canonical_url(self): return url.canonicalize(self.url, self.parent)