[CalendarServer-changes] [842] CalendarServer/trunk/twistedcaldav
source_changes at macosforge.org
source_changes at macosforge.org
Fri Dec 15 12:41:23 PST 2006
Revision: 842
http://trac.macosforge.org/projects/calendarserver/changeset/842
Author: wsanchez at 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()}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20061215/642fd1fe/attachment.html
More information about the calendarserver-changes
mailing list