Revision: 842 http://trac.macosforge.org/projects/calendarserver/changeset/842 Author: wsanchez@apple.com Date: 2006-12-15 12:41:23 -0800 (Fri, 15 Dec 2006) Log Message: ----------- Add AutoProvisioningFileMixIn. Modified Paths: -------------- CalendarServer/trunk/twistedcaldav/directory/principal.py CalendarServer/trunk/twistedcaldav/static.py Modified: CalendarServer/trunk/twistedcaldav/directory/principal.py =================================================================== --- CalendarServer/trunk/twistedcaldav/directory/principal.py 2006-12-15 20:40:58 UTC (rev 841) +++ CalendarServer/trunk/twistedcaldav/directory/principal.py 2006-12-15 20:41:23 UTC (rev 842) @@ -39,9 +39,8 @@ from twistedcaldav.extensions import ReadOnlyResourceMixIn, DAVFile from twistedcaldav.resource import CalendarPrincipalCollectionResource, CalendarPrincipalResource -from twistedcaldav.static import provisionFile +from twistedcaldav.static import AutoProvisioningFileMixIn 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 @@ -56,7 +55,7 @@ return succeed(self.defaultAccessControlList()) class DirectoryPrincipalProvisioningResource ( - AutoProvisioningResourceMixIn, + AutoProvisioningFileMixIn, PermissionsMixIn, CalendarPrincipalCollectionResource, DAVFile, @@ -88,9 +87,6 @@ for recordType in self.directory.recordTypes(): self.putChild(recordType, DirectoryPrincipalTypeResource(self.fp.child(recordType).path, self, recordType)) - def provision(self): - provisionFile(self) - def principalForUser(self, user): return self.getChild("user").getChild(user) @@ -157,7 +153,7 @@ return (self,) class DirectoryPrincipalTypeResource ( - AutoProvisioningResourceMixIn, + AutoProvisioningFileMixIn, PermissionsMixIn, CalendarPrincipalCollectionResource, DAVFile, @@ -176,23 +172,20 @@ self.directory = parent.directory self.recordType = recordType - self._parent = parent + self.parent = parent # Provision in __init__() because principals are used prior to request # lookups. self.provision() - def provision(self): - provisionFile(self, self._parent) - def principalForUser(self, user): - return self._parent.principalForUser(user) + return self.parent.principalForUser(user) def principalForRecord(self, record): - return self._parent.principalForRecord(record) + return self.parent.principalForRecord(record) def principalForCalendarUserAddress(self, address): - return self._parent.principalForCalendarUserAddress(address) + return self.parent.principalForCalendarUserAddress(address) ## # Static @@ -224,9 +217,9 @@ ## def principalCollections(self): - return self._parent.principalCollections() + return self.parent.principalCollections() -class DirectoryPrincipalResource (PermissionsMixIn, CalendarPrincipalResource, DAVFile): +class DirectoryPrincipalResource (AutoProvisioningFileMixIn, PermissionsMixIn, CalendarPrincipalResource, DAVFile): """ Directory principal resource. """ @@ -239,16 +232,13 @@ super(DirectoryPrincipalResource, self).__init__(path, joinURL(parent.principalCollectionURL(), record.shortName)) self.record = record - self._parent = parent + 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): - provisionFile(self, self._parent, True) - ## # HTTP ## @@ -310,6 +300,9 @@ else: return self.record.shortName + def isCollection(self): + return False + ## # ACL ## @@ -335,9 +328,9 @@ for relative in getattr(record, method)(): if relative not in records: if relative.recordType == myRecordType: - relatives.add(self._parent.getChild(None, record=relative)) + relatives.add(self.parent.getChild(None, record=relative)) else: - relatives.add(self._parent._parent.getChild(relative.recordType).getChild(None, record=relative)) + relatives.add(self.parent.parent.getChild(relative.recordType).getChild(None, record=relative)) self._getRelatives(method, relative, relatives, records) return relatives @@ -349,7 +342,7 @@ return self._getRelatives("groups") def principalCollections(self): - return self._parent.principalCollections() + return self.parent.principalCollections() ## # CalDAV Modified: CalendarServer/trunk/twistedcaldav/static.py =================================================================== --- CalendarServer/trunk/twistedcaldav/static.py 2006-12-15 20:40:58 UTC (rev 841) +++ CalendarServer/trunk/twistedcaldav/static.py 2006-12-15 20:41:23 UTC (rev 842) @@ -361,7 +361,33 @@ _checkParents = deferredGenerator(_checkParents) -class CalendarHomeProvisioningFile (DirectoryCalendarHomeProvisioningResource, DAVFile): +class AutoProvisioningFileMixIn (AutoProvisioningResourceMixIn): + def provision(self): + if self.provisionFile(): + return super(AutoProvisioningFileMixIn, self).provision() + + def provisionFile(self): + fp = self.fp + + fp.restat(False) + if fp.exists(): + return False + + if hasattr(self, "parent"): + parent = self.parent + assert parent.exists() + assert parent.isCollection() + + if self.isCollection(): + fp.makedirs() + fp.restat(False) + else: + fp.open("w").close() + fp.restat(False) + + return True + +class CalendarHomeProvisioningFile (AutoProvisioningFileMixIn, DirectoryCalendarHomeProvisioningResource, DAVFile): """ Resource which provisions calendar home collections as needed. """ @@ -374,18 +400,13 @@ DAVFile.__init__(self, path) DirectoryCalendarHomeProvisioningResource.__init__(self, directory, url) - def provision(self): - provisionFile(self) - - super(CalendarHomeProvisioningFile, self).provision() - def provisionChild(self, recordType): return CalendarHomeTypeProvisioningFile(self.fp.child(recordType).path, self, recordType) def createSimilarFile(self, path): raise HTTPError(responsecode.NOT_FOUND) -class CalendarHomeTypeProvisioningFile (DirectoryCalendarHomeTypeProvisioningResource, DAVFile): +class CalendarHomeTypeProvisioningFile (AutoProvisioningFileMixIn, DirectoryCalendarHomeTypeProvisioningResource, DAVFile): """ Resource which provisions calendar home collections of a specific record type as needed. @@ -399,18 +420,13 @@ DAVFile.__init__(self, path) DirectoryCalendarHomeTypeProvisioningResource.__init__(self, parent, recordType) - def provision(self): - provisionFile(self, self._parent) - - return super(CalendarHomeTypeProvisioningFile, self).provision() - def provisionChild(self, record): return CalendarHomeFile(self.fp.child(record.shortName).path, self, record) def createSimilarFile(self, path): raise HTTPError(responsecode.NOT_FOUND) -class CalendarHomeFile (DirectoryCalendarHomeResource, CalDAVFile): +class CalendarHomeFile (AutoProvisioningFileMixIn, DirectoryCalendarHomeResource, CalDAVFile): """ Calendar home collection resource. """ @@ -421,12 +437,6 @@ CalDAVFile.__init__(self, path) DirectoryCalendarHomeResource.__init__(self, parent, record) - def provision(self): - if not provisionFile(self, self._parent): - return succeed(None) - - return super(CalendarHomeFile, self).provision() - def provisionChild(self, name): if config.DropBoxEnabled: DropBoxHomeFileClass = DropBoxHomeFile @@ -460,13 +470,13 @@ return super(CalendarHomeFile, self).getChild(name) -class ScheduleFile (AutoProvisioningResourceMixIn, CalDAVFile): +class ScheduleFile (AutoProvisioningFileMixIn, CalDAVFile): def __init__(self, path, parent): super(ScheduleFile, self).__init__(path, principalCollections=parent.principalCollections()) - self._parent = parent + self.parent = parent - def provision(self): - provisionFile(self, self._parent) + def isCollection(self): + return True def createSimilarFile(self, path): if path == self.fp.path: @@ -501,14 +511,16 @@ Calendar scheduling inbox collection resource. """ def provision(self): - if provisionFile(self, self._parent): + if self.provisionFile(): # FIXME: This should probably be a directory record option that # maps to the property value directly without the need to store one. - if self._parent.record.recordType == "resource": + if self.parent.record.recordType == "resource": # Resources should have autorespond turned on by default, # since they typically don't have someone responding for them. self.writeDeadProperty(customxml.TwistedScheduleAutoRespond()) + return super(ScheduleInboxFile, self).provision() + def __repr__(self): return "<%s (calendar inbox collection): %s>" % (self.__class__.__name__, self.fp.path) @@ -519,15 +531,12 @@ def __repr__(self): return "<%s (calendar outbox collection): %s>" % (self.__class__.__name__, self.fp.path) -class DropBoxHomeFile (AutoProvisioningResourceMixIn, DropBoxHomeResource, CalDAVFile): +class DropBoxHomeFile (AutoProvisioningFileMixIn, DropBoxHomeResource, CalDAVFile): def __init__(self, path, parent): DropBoxHomeResource.__init__(self) CalDAVFile.__init__(self, path, principalCollections=parent.principalCollections()) - self._parent = parent + self.parent = parent - def provision(self): - provisionFile(self, self._parent) - def createSimilarFile(self, path): if path == self.fp.path: return self @@ -572,26 +581,6 @@ # Utilities ## -def provisionFile(resource, parent=None, isFile=False): - fp = resource.fp - - fp.restat(False) - if fp.exists(): - return False - - if parent is not None: - assert parent.exists() - assert parent.isCollection() - - if isFile: - fp.open("w").close() - fp.restat(False) - else: - fp.makedirs() - fp.restat(False) - - return True - def locateExistingChild(resource, request, segments): """ This C{locateChild()} implementation fails to find children if C{getChild()}
participants (1)
-
source_changes@macosforge.org