[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