[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