Revision: 839 http://trac.macosforge.org/projects/calendarserver/changeset/839 Author: wsanchez@apple.com Date: 2006-12-15 11:37:11 -0800 (Fri, 15 Dec 2006) Log Message: ----------- Add AutoProvisioningResourceMixIn Modified Paths: -------------- CalendarServer/trunk/twistedcaldav/directory/calendar.py CalendarServer/trunk/twistedcaldav/directory/principal.py CalendarServer/trunk/twistedcaldav/static.py Modified: CalendarServer/trunk/twistedcaldav/directory/calendar.py =================================================================== --- CalendarServer/trunk/twistedcaldav/directory/calendar.py 2006-12-15 18:58:52 UTC (rev 838) +++ CalendarServer/trunk/twistedcaldav/directory/calendar.py 2006-12-15 19:37:11 UTC (rev 839) @@ -37,8 +37,9 @@ from twistedcaldav.resource import CalDAVResource from twistedcaldav.schedule import ScheduleInboxResource, ScheduleOutboxResource from twistedcaldav.directory.idirectory import IDirectoryService +from twistedcaldav.directory.resource import AutoProvisioningResourceMixIn -class DirectoryCalendarHomeProvisioningResource (ReadOnlyResourceMixIn, DAVResource): +class DirectoryCalendarHomeProvisioningResource (AutoProvisioningResourceMixIn, ReadOnlyResourceMixIn, DAVResource): """ Resource which provisions calendar home collections as needed. """ @@ -70,8 +71,6 @@ return self._url def getChild(self, name): - self.provision() - return self.putChildren.get(name, None) def listChildren(self): @@ -103,7 +102,7 @@ def defaultAccessControlList(self): return readOnlyACL -class DirectoryCalendarHomeTypeProvisioningResource (ReadOnlyResourceMixIn, DAVResource): +class DirectoryCalendarHomeTypeProvisioningResource (AutoProvisioningResourceMixIn, ReadOnlyResourceMixIn, DAVResource): """ Resource which provisions calendar home collections of a specific record type as needed. @@ -120,12 +119,6 @@ self.recordType = recordType self._parent = parent - def provision(self): - pass - - def provisionChild(self, record): - raise NotImplementedError("Subclass must implement provisionChild()") - def url(self): return joinURL(self._parent.url(), self.recordType) @@ -165,7 +158,7 @@ def principalCollections(self): return self._parent.principalCollections() -class DirectoryCalendarHomeResource (CalDAVResource): +class DirectoryCalendarHomeResource (AutoProvisioningResourceMixIn, CalDAVResource): """ Calendar home collection resource. """ @@ -240,11 +233,6 @@ def url(self): return joinURL(self._parent.url(), self.record.shortName) - def locateChild(self, path, segments): - d = self.provision() - d.addCallback(lambda _: super(DirectoryCalendarHomeResource, self).locateChild(path, segments)) - return d - ## # DAV ## Modified: CalendarServer/trunk/twistedcaldav/directory/principal.py =================================================================== --- CalendarServer/trunk/twistedcaldav/directory/principal.py 2006-12-15 18:58:52 UTC (rev 838) +++ CalendarServer/trunk/twistedcaldav/directory/principal.py 2006-12-15 19:37:11 UTC (rev 839) @@ -41,6 +41,7 @@ from twistedcaldav.resource import CalendarPrincipalCollectionResource, CalendarPrincipalResource from twistedcaldav.static import provisionFile from twistedcaldav.directory.idirectory import IDirectoryService +from twistedcaldav.directory.resource import AutoProvisioningResourceMixIn # FIXME: These should not be tied to DAVFile # The reason that they is that web2.dav only implements DAV methods on @@ -54,7 +55,12 @@ # Permissions here are fixed, and are not subject to inherritance rules, etc. return succeed(self.defaultAccessControlList()) -class DirectoryPrincipalProvisioningResource (PermissionsMixIn, CalendarPrincipalCollectionResource, DAVFile): +class DirectoryPrincipalProvisioningResource ( + AutoProvisioningResourceMixIn, + PermissionsMixIn, + CalendarPrincipalCollectionResource, + DAVFile, +): """ Collection resource which provisions directory principals as its children. """ @@ -74,6 +80,8 @@ # FIXME: Smells like a hack directory.principalCollection = self + # Provision in __init__() because principals are used prior to request + # lookups. self.provision() # Create children @@ -136,7 +144,6 @@ raise HTTPError(responsecode.NOT_FOUND) def getChild(self, name): - self.provision() return self.putChildren.get(name, None) def listChildren(self): @@ -149,7 +156,12 @@ def principalCollections(self): return (self,) -class DirectoryPrincipalTypeResource (PermissionsMixIn, CalendarPrincipalCollectionResource, DAVFile): +class DirectoryPrincipalTypeResource ( + AutoProvisioningResourceMixIn, + PermissionsMixIn, + CalendarPrincipalCollectionResource, + DAVFile, +): """ Collection resource which provisions directory principals of a specific type as its children. """ @@ -166,6 +178,8 @@ self.recordType = recordType self._parent = parent + # Provision in __init__() because principals are used prior to request + # lookups. self.provision() def provision(self): @@ -189,8 +203,6 @@ raise HTTPError(responsecode.NOT_FOUND) def getChild(self, name, record=None): - self.provision() - if name == "": return self @@ -230,6 +242,8 @@ self._parent = parent self._url = joinURL(parent.principalCollectionURL(), record.shortName) + # Provision in __init__() because principals are used prior to request + # lookups. self.provision() def provision(self): Modified: CalendarServer/trunk/twistedcaldav/static.py =================================================================== --- CalendarServer/trunk/twistedcaldav/static.py 2006-12-15 18:58:52 UTC (rev 838) +++ CalendarServer/trunk/twistedcaldav/static.py 2006-12-15 19:37:11 UTC (rev 839) @@ -59,6 +59,7 @@ from twistedcaldav.directory.calendar import DirectoryCalendarHomeProvisioningResource from twistedcaldav.directory.calendar import DirectoryCalendarHomeTypeProvisioningResource from twistedcaldav.directory.calendar import DirectoryCalendarHomeResource +from twistedcaldav.directory.resource import AutoProvisioningResourceMixIn class CalDAVFile (CalDAVResource, DAVFile): """ @@ -459,22 +460,14 @@ return super(CalendarHomeFile, self).getChild(name) -class AutoProvisionCalDAVFile(CalDAVFile): - """ - A class that makes a resource auto-provision itself when someone tries to locate it. - """ - def provision(self): - provisionFile(self, self._parent) - - def locateChild(self, path, segments): - self.provision() - return super(AutoProvisionCalDAVFile, self).locateChild(path, segments) - -class ScheduleFile (AutoProvisionCalDAVFile): +class ScheduleFile (AutoProvisioningResourceMixIn, CalDAVFile): def __init__(self, path, parent): super(ScheduleFile, self).__init__(path, principalCollections=parent.principalCollections()) self._parent = parent + def provision(self): + provisionFile(self, self._parent) + def createSimilarFile(self, path): if path == self.fp.path: return self @@ -526,10 +519,10 @@ def __repr__(self): return "<%s (calendar outbox collection): %s>" % (self.__class__.__name__, self.fp.path) -class DropBoxHomeFile (DropBoxHomeResource, AutoProvisionCalDAVFile): +class DropBoxHomeFile (AutoProvisioningResourceMixIn, DropBoxHomeResource, CalDAVFile): def __init__(self, path, parent): DropBoxHomeResource.__init__(self) - AutoProvisionCalDAVFile.__init__(self, path, principalCollections=parent.principalCollections()) + CalDAVFile.__init__(self, path, principalCollections=parent.principalCollections()) self._parent = parent def provision(self):