[CalendarServer-changes] [5864] CalendarServer/branches/new-store/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Fri Jul 9 11:36:46 PDT 2010


Revision: 5864
          http://trac.macosforge.org/projects/calendarserver/changeset/5864
Author:   glyph at apple.com
Date:     2010-07-09 11:36:45 -0700 (Fri, 09 Jul 2010)
Log Message:
-----------
Move collection-inspection code up to twistedcaldav.extensions.DAVResource, to help with diagnosis and debugging.

Modified Paths:
--------------
    CalendarServer/branches/new-store/twistedcaldav/extensions.py
    CalendarServer/branches/new-store/twistedcaldav/sharing.py

Modified: CalendarServer/branches/new-store/twistedcaldav/extensions.py
===================================================================
--- CalendarServer/branches/new-store/twistedcaldav/extensions.py	2010-07-09 18:05:37 UTC (rev 5863)
+++ CalendarServer/branches/new-store/twistedcaldav/extensions.py	2010-07-09 18:36:45 UTC (rev 5864)
@@ -449,146 +449,11 @@
     """
     http_REPORT = http_REPORT
 
-
-class DAVPrincipalResource (DirectoryPrincipalPropertySearchMixIn, SuperDAVPrincipalResource, LoggingMixIn):
-    """
-    Extended L{twext.web2.dav.static.DAVFile} implementation.
-    """
-
-    def liveProperties(self):
-        return super(DAVPrincipalResource, self).liveProperties() + (
-            (calendarserver_namespace, "expanded-group-member-set"),
-            (calendarserver_namespace, "expanded-group-membership"),
-            (calendarserver_namespace, "record-type"),
-        )
-
-    http_REPORT = http_REPORT
-
-    @inlineCallbacks
-    def readProperty(self, property, request):
-        if type(property) is tuple:
-            qname = property
-        else:
-            qname = property.qname()
-
-        namespace, name = qname
-
-        if namespace == dav_namespace:
-            if name == "resourcetype":
-                rtype = (yield self.resourceType(request))
-                returnValue(rtype)
-
-        elif namespace == calendarserver_namespace:
-            if name == "expanded-group-member-set":
-                principals = (yield self.expandedGroupMembers())
-                returnValue(customxml.ExpandedGroupMemberSet(
-                    *[davxml.HRef(p.principalURL()) for p in principals]
-                ))
-
-            elif name == "expanded-group-membership":
-                principals = (yield self.expandedGroupMemberships())
-                returnValue(customxml.ExpandedGroupMembership(
-                    *[davxml.HRef(p.principalURL()) for p in principals]
-                ))
-
-            elif name == "record-type":
-                if hasattr(self, "record"):
-                    returnValue(customxml.RecordType(self.record.recordType))
-                else:
-                    raise HTTPError(StatusResponse(
-                        responsecode.NOT_FOUND,
-                        "Property %s does not exist." % (qname,)
-                    ))
-
-
-
-        result = (yield super(DAVPrincipalResource, self).readProperty(property, request))
-        returnValue(result)
-
-    def groupMembers(self):
-        return succeed(())
-
-    def expandedGroupMembers(self):
-        return succeed(())
-
-    def groupMemberships(self):
-        return succeed(())
-
-    def expandedGroupMemberships(self):
-        return succeed(())
-
-    def resourceType(self, request):
-        # Allow live property to be overridden by dead property
-        if self.deadProperties().contains((dav_namespace, "resourcetype")):
-            return succeed(self.deadProperties().get((dav_namespace, "resourcetype")))
+    def render(self, request):
         if self.isCollection():
-            return succeed(davxml.ResourceType(davxml.Principal(), davxml.Collection()))
-        else:
-            return succeed(davxml.ResourceType(davxml.Principal()))
+            return self.renderDirectory(request)
+        return super(DAVResource, self).render(request)
 
-
-class DAVFile (SudoersMixin, SuperDAVFile, LoggingMixIn):
-    """
-    Extended L{twext.web2.dav.static.DAVFile} implementation.
-    """
-    def readProperty(self, property, request):
-        if type(property) is tuple:
-            qname = property
-        else:
-            qname = property.qname()
-
-        if qname == (dav_namespace, "resourcetype"):
-            return self.resourceType(request)
-
-        return super(DAVFile, self).readProperty(property, request)
-
-    def resourceType(self, request):
-        # Allow live property to be overridden by dead property
-        if self.deadProperties().contains((dav_namespace, "resourcetype")):
-            return succeed(self.deadProperties().get((dav_namespace, "resourcetype")))
-        if self.isCollection():
-            return succeed(davxml.ResourceType.collection)
-        return succeed(davxml.ResourceType.empty)
-
-    def render(self, request):
-        if not self.fp.exists():
-            return responsecode.NOT_FOUND
-
-        if self.fp.isdir():
-            if request.path[-1] != "/":
-                # Redirect to include trailing '/' in URI
-                return RedirectResponse(request.unparseURL(path=urllib.quote(urllib.unquote(request.path), safe=':/')+'/'))
-            else:
-                ifp = self.fp.childSearchPreauth(*self.indexNames)
-                if ifp:
-                    # Render from the index file
-                    return self.createSimilarFile(ifp.path).render(request)
-
-                return self.renderDirectory(request)
-
-        try:
-            f = self.fp.open()
-        except IOError, e:
-            import errno
-            if e[0] == errno.EACCES:
-                return responsecode.FORBIDDEN
-            elif e[0] == errno.ENOENT:
-                return responsecode.NOT_FOUND
-            else:
-                raise
-
-        response = Response()
-        response.stream = FileStream(f, 0, self.fp.getsize())
-
-        for (header, value) in (
-            ("content-type", self.contentType()),
-            ("content-encoding", self.contentEncoding()),
-        ):
-            if value is not None:
-                response.headers.setHeader(header, value)
-
-        return response
-
     def directoryStyleSheet(self):
         return (
             "th, .even td, .odd td { padding-right: 0.5em; font-family: monospace}"
@@ -796,7 +661,11 @@
                 contentType = rtypes
             else:
                 mimeType = child.contentType()
-                contentType = "%s/%s" % (mimeType.mediaType, mimeType.mediaSubtype)
+                if mimeType is None:
+                    print 'BAD contentType() IMPLEMENTATION', child
+                    contentType = 'application/octet-stream'
+                else:
+                    contentType = "%s/%s" % (mimeType.mediaType, mimeType.mediaSubtype)
                 if rtypes:
                     contentType += " %s" % (rtypes,)
         else:
@@ -818,7 +687,149 @@
 
 
 
+class DAVPrincipalResource (DirectoryPrincipalPropertySearchMixIn, SuperDAVPrincipalResource, LoggingMixIn):
+    """
+    Extended L{twext.web2.dav.static.DAVFile} implementation.
+    """
 
+    def liveProperties(self):
+        return super(DAVPrincipalResource, self).liveProperties() + (
+            (calendarserver_namespace, "expanded-group-member-set"),
+            (calendarserver_namespace, "expanded-group-membership"),
+            (calendarserver_namespace, "record-type"),
+        )
+
+    http_REPORT = http_REPORT
+
+    @inlineCallbacks
+    def readProperty(self, property, request):
+        if type(property) is tuple:
+            qname = property
+        else:
+            qname = property.qname()
+
+        namespace, name = qname
+
+        if namespace == dav_namespace:
+            if name == "resourcetype":
+                rtype = (yield self.resourceType(request))
+                returnValue(rtype)
+
+        elif namespace == calendarserver_namespace:
+            if name == "expanded-group-member-set":
+                principals = (yield self.expandedGroupMembers())
+                returnValue(customxml.ExpandedGroupMemberSet(
+                    *[davxml.HRef(p.principalURL()) for p in principals]
+                ))
+
+            elif name == "expanded-group-membership":
+                principals = (yield self.expandedGroupMemberships())
+                returnValue(customxml.ExpandedGroupMembership(
+                    *[davxml.HRef(p.principalURL()) for p in principals]
+                ))
+
+            elif name == "record-type":
+                if hasattr(self, "record"):
+                    returnValue(customxml.RecordType(self.record.recordType))
+                else:
+                    raise HTTPError(StatusResponse(
+                        responsecode.NOT_FOUND,
+                        "Property %s does not exist." % (qname,)
+                    ))
+
+
+
+        result = (yield super(DAVPrincipalResource, self).readProperty(property, request))
+        returnValue(result)
+
+    def groupMembers(self):
+        return succeed(())
+
+    def expandedGroupMembers(self):
+        return succeed(())
+
+    def groupMemberships(self):
+        return succeed(())
+
+    def expandedGroupMemberships(self):
+        return succeed(())
+
+    def resourceType(self, request):
+        # Allow live property to be overridden by dead property
+        if self.deadProperties().contains((dav_namespace, "resourcetype")):
+            return succeed(self.deadProperties().get((dav_namespace, "resourcetype")))
+        if self.isCollection():
+            return succeed(davxml.ResourceType(davxml.Principal(), davxml.Collection()))
+        else:
+            return succeed(davxml.ResourceType(davxml.Principal()))
+
+
+class DAVFile (SudoersMixin, SuperDAVFile, LoggingMixIn):
+    """
+    Extended L{twext.web2.dav.static.DAVFile} implementation.
+    """
+    def readProperty(self, property, request):
+        if type(property) is tuple:
+            qname = property
+        else:
+            qname = property.qname()
+
+        if qname == (dav_namespace, "resourcetype"):
+            return self.resourceType(request)
+
+        return super(DAVFile, self).readProperty(property, request)
+
+    def resourceType(self, request):
+        # Allow live property to be overridden by dead property
+        if self.deadProperties().contains((dav_namespace, "resourcetype")):
+            return succeed(self.deadProperties().get((dav_namespace, "resourcetype")))
+        if self.isCollection():
+            return succeed(davxml.ResourceType.collection)
+        return succeed(davxml.ResourceType.empty)
+
+    def render(self, request):
+        if not self.fp.exists():
+            return responsecode.NOT_FOUND
+
+        if self.fp.isdir():
+            if request.path[-1] != "/":
+                # Redirect to include trailing '/' in URI
+                return RedirectResponse(request.unparseURL(path=urllib.quote(urllib.unquote(request.path), safe=':/')+'/'))
+            else:
+                ifp = self.fp.childSearchPreauth(*self.indexNames)
+                if ifp:
+                    # Render from the index file
+                    return self.createSimilarFile(ifp.path).render(request)
+
+                return self.renderDirectory(request)
+
+        try:
+            f = self.fp.open()
+        except IOError, e:
+            import errno
+            if e[0] == errno.EACCES:
+                return responsecode.FORBIDDEN
+            elif e[0] == errno.ENOENT:
+                return responsecode.NOT_FOUND
+            else:
+                raise
+
+        response = Response()
+        response.stream = FileStream(f, 0, self.fp.getsize())
+
+        for (header, value) in (
+            ("content-type", self.contentType()),
+            ("content-encoding", self.contentEncoding()),
+        ):
+            if value is not None:
+                response.headers.setHeader(header, value)
+
+        return response
+
+
+
+
+
 class ReadOnlyWritePropertiesResourceMixIn (object):
     """
     Read only that will allow writing of properties resource.

Modified: CalendarServer/branches/new-store/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/branches/new-store/twistedcaldav/sharing.py	2010-07-09 18:05:37 UTC (rev 5863)
+++ CalendarServer/branches/new-store/twistedcaldav/sharing.py	2010-07-09 18:36:45 UTC (rev 5864)
@@ -228,8 +228,14 @@
 
     @inlineCallbacks
     def resourceType(self, request):
-        
-        rtype = (yield super(SharedCollectionMixin, self).resourceType(request))
+        superObject = super(SharedCollectionMixin, self)
+        try:
+            superMethod = superObject.resourceType
+        except AttributeError:
+            rtype = davxml.ResourceType()
+        else:
+            rtype = (yield superMethod(request))
+
         isVirt = (yield self.isVirtualShare(request))
         if isVirt:
             rtype = davxml.ResourceType(
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100709/d3bee36c/attachment-0001.html>


More information about the calendarserver-changes mailing list