Revision: 2086 http://trac.macosforge.org/projects/calendarserver/changeset/2086 Author: cdaboo@apple.com Date: 2008-01-02 13:40:42 -0800 (Wed, 02 Jan 2008) Log Message: ----------- Add DAV:owner property on calendar homes and resources within those. Modified Paths: -------------- CalendarServer/branches/users/cdaboo/private_events-2081/lib-patches/Twisted/twisted.web2.dav.test.test_prop.patch CalendarServer/branches/users/cdaboo/private_events-2081/twistedcaldav/directory/calendar.py CalendarServer/branches/users/cdaboo/private_events-2081/twistedcaldav/resource.py Modified: CalendarServer/branches/users/cdaboo/private_events-2081/lib-patches/Twisted/twisted.web2.dav.test.test_prop.patch =================================================================== --- CalendarServer/branches/users/cdaboo/private_events-2081/lib-patches/Twisted/twisted.web2.dav.test.test_prop.patch 2008-01-02 17:22:57 UTC (rev 2085) +++ CalendarServer/branches/users/cdaboo/private_events-2081/lib-patches/Twisted/twisted.web2.dav.test.test_prop.patch 2008-01-02 21:40:42 UTC (rev 2086) @@ -11,7 +11,7 @@ import random -@@ -37,8 +39,14 @@ +@@ -37,8 +39,13 @@ from twisted.web2.dav.test.util import serialize import twisted.web2.dav.test.util @@ -22,8 +22,48 @@ + (dav_namespace, "quota-used-bytes" ), +) -+live_properties = [lookupElement(qname)() for qname in DAVResource.liveProperties if (qname[0] == dav_namespace) and qname not in dynamicLiveProperties] + # # See whether dead properties are available # +@@ -49,6 +56,10 @@ + """ + PROPFIND, PROPPATCH requests + """ ++ ++ def liveProperties(self): ++ return [lookupElement(qname)() for qname in self.resource_class.liveProperties if (qname[0] == dav_namespace) and qname not in dynamicLiveProperties] ++ + def test_PROPFIND_basic(self): + """ + PROPFIND request +@@ -85,7 +96,7 @@ + self.fail("PROPFIND failed (status %s) to locate live properties: %s" + % (status.code, properties)) + +- properties_to_find = [p.qname() for p in live_properties] ++ properties_to_find = [p.qname() for p in self.liveProperties()] + + for property in properties: + qname = property.qname() +@@ -102,7 +113,7 @@ + else: + self.fail("No response for URI /") + +- query = davxml.PropertyFind(davxml.PropertyContainer(*live_properties)) ++ query = davxml.PropertyFind(davxml.PropertyContainer(*self.liveProperties())) + + request = SimpleRequest(self.site, "PROPFIND", "/") + +@@ -146,9 +157,9 @@ + % (status.code, properties)) + + if which.name == "allprop": +- properties_to_find = [p.qname() for p in live_properties if not p.hidden] ++ properties_to_find = [p.qname() for p in self.liveProperties() if not p.hidden] + else: +- properties_to_find = [p.qname() for p in live_properties] ++ properties_to_find = [p.qname() for p in self.liveProperties()] + + for property in properties: + qname = property.qname() Modified: CalendarServer/branches/users/cdaboo/private_events-2081/twistedcaldav/directory/calendar.py =================================================================== --- CalendarServer/branches/users/cdaboo/private_events-2081/twistedcaldav/directory/calendar.py 2008-01-02 17:22:57 UTC (rev 2085) +++ CalendarServer/branches/users/cdaboo/private_events-2081/twistedcaldav/directory/calendar.py 2008-01-02 21:40:42 UTC (rev 2086) @@ -24,6 +24,7 @@ "DirectoryCalendarHomeResource", ] +from twisted.internet.defer import succeed from twisted.web2.dav import davxml from twisted.web2.dav.util import joinURL from twisted.web2.dav.resource import TwistedACLInheritable, TwistedQuotaRootProperty @@ -255,6 +256,9 @@ # ACL ## + def owner(self, request): + return succeed(davxml.HRef(self.principalForRecord().principalURL())) + def defaultAccessControlList(self): # FIXME: directory.principalCollection smells like a hack # See DirectoryPrincipalProvisioningResource.__init__() Modified: CalendarServer/branches/users/cdaboo/private_events-2081/twistedcaldav/resource.py =================================================================== --- CalendarServer/branches/users/cdaboo/private_events-2081/twistedcaldav/resource.py 2008-01-02 17:22:57 UTC (rev 2085) +++ CalendarServer/branches/users/cdaboo/private_events-2081/twistedcaldav/resource.py 2008-01-02 21:40:42 UTC (rev 2086) @@ -31,6 +31,8 @@ from twisted.internet import reactor from twisted.internet.defer import Deferred, maybeDeferred, succeed +from twisted.internet.defer import waitForDeferred +from twisted.internet.defer import deferredGenerator from twisted.web2 import responsecode from twisted.web2.dav import davxml from twisted.web2.dav.idav import IDAVPrincipalCollectionResource @@ -133,6 +135,7 @@ return tuple(super(CalDAVResource, self).davComplianceClasses()) + self.caldavComplianceClasses() liveProperties = DAVResource.liveProperties + ( + (dav_namespace, "owner"), # Private Events needs this but it is also OK to return empty (caldav_namespace, "supported-calendar-component-set"), (caldav_namespace, "supported-calendar-data" ), ) @@ -149,7 +152,13 @@ namespace, name = qname - if namespace == caldav_namespace: + if namespace == dav_namespace: + if name == "owner": + d = self.owner(request) + d.addCallback(lambda x: davxml.Owner(x)) + return d + + elif namespace == caldav_namespace: if name == "supported-calendar-component-set": # CalDAV-access-09, section 5.2.3 if self.hasDeadProperty(qname): @@ -235,6 +244,21 @@ return super(CalDAVResource, self).accessControlList(*args, **kwargs) + @deferredGenerator + def owner(self, request): + """ + Return the DAV:owner property value (MUST be a DAV:href or None). + """ + d = waitForDeferred(self.locateParent(request, request.urlForResource(self))) + yield d + parent = d.getResult() + if parent and isinstance(parent, CalDAVResource): + d = waitForDeferred(parent.owner(request)) + yield d + yield d.getResult() + else: + yield None + ## # CalDAV ##
participants (1)
-
source_changes@macosforge.org