[CalendarServer-changes] [75]
CalendarServer/branches/users/cdaboo/acl-merge/twistedcaldav
source_changes at macosforge.org
source_changes at macosforge.org
Tue Aug 29 09:12:44 PDT 2006
Revision: 75
Author: cdaboo at apple.com
Date: 2006-08-29 09:12:42 -0700 (Tue, 29 Aug 2006)
Log Message:
-----------
iCalendar roll-up for a GET on a calendar collections has to be done as a deferred, but I don't
want to make the generic 'iCalendar' method a deferred because that would result in a lot of
changes. Instead a new API has been added for this one special case and that is deferred.
Modified Paths:
--------------
CalendarServer/branches/users/cdaboo/acl-merge/twistedcaldav/resource.py
CalendarServer/branches/users/cdaboo/acl-merge/twistedcaldav/static.py
Modified: CalendarServer/branches/users/cdaboo/acl-merge/twistedcaldav/resource.py
===================================================================
--- CalendarServer/branches/users/cdaboo/acl-merge/twistedcaldav/resource.py 2006-08-28 16:26:25 UTC (rev 74)
+++ CalendarServer/branches/users/cdaboo/acl-merge/twistedcaldav/resource.py 2006-08-29 16:12:42 UTC (rev 75)
@@ -83,11 +83,15 @@
# Redirect to include trailing '/' in URI
return RedirectResponse(request.unparseURL(path=request.path+'/'))
- response = Response()
- response.stream = MemoryStream(str(self.iCalendar(request=request)))
- response.headers.setHeader("content-type", MimeType.fromString("text/calendar"))
+ def _defer(data):
+ response = Response()
+ response.stream = MemoryStream(str(data))
+ response.headers.setHeader("content-type", MimeType.fromString("text/calendar"))
+ return response
- return response
+ d = self.iCalendarRolledup(request)
+ d.addCallback(_defer)
+ return d
else:
return super(CalDAVResource, self).render(request)
@@ -252,6 +256,15 @@
except ValueError:
return None
+ def iCalendarRolledup(self, request):
+ """
+ See L{ICalDAVResource.iCalendarRolledup}.
+
+ This implementation raises L{NotImplementedError}; a subclass must
+ override it.
+ """
+ unimplemented(self)
+
def iCalendarText(self, name=None):
"""
See L{ICalDAVResource.iCalendarText}.
Modified: CalendarServer/branches/users/cdaboo/acl-merge/twistedcaldav/static.py
===================================================================
--- CalendarServer/branches/users/cdaboo/acl-merge/twistedcaldav/static.py 2006-08-28 16:26:25 UTC (rev 74)
+++ CalendarServer/branches/users/cdaboo/acl-merge/twistedcaldav/static.py 2006-08-29 16:12:42 UTC (rev 75)
@@ -190,39 +190,47 @@
d.addErrback(_deferErr)
return d
- def iCalendar(self, name=None, request=None):
+ def iCalendarRolledup(self, request):
if self.isPseudoCalendarCollection():
- if name is None:
- # Generate a monolithic calendar
- calendar = iComponent("VCALENDAR")
- calendar.addProperty(iProperty("VERSION", "2.0"))
+ # Generate a monolithic calendar
+ calendar = iComponent("VCALENDAR")
+ calendar.addProperty(iProperty("VERSION", "2.0"))
- # Must verify ACLs which means we need a request object at this point
- if request is not None:
- # Do some optimisation of access control calculation by determining any inherited ACLs outside of
- # the child resource loop and supply those to the checkAccess on each child.
- filteredaces = self.inheritedACEsforChildren(request)
+ # Do some optimisation of access control calculation by determining any inherited ACLs outside of
+ # the child resource loop and supply those to the checkAccess on each child.
+ filteredaces = waitForDeferred(self.inheritedACEsforChildren(request))
+ yield filteredaces
+ filteredaces = filteredaces.getResult()
- for name, uid, type in self.index().search(None): #@UnusedVariable
- try:
- child = IDAVResource(self.getChild(name))
- except TypeError:
- child = None
-
- if child is not None:
- # Check privileges of child - skip if access denied
- if child.checkAccess(request, (davxml.Read(),), inheritedaces=filteredaces):
- continue
- subcalendar = self.iCalendar(name)
- assert subcalendar.name() == "VCALENDAR"
-
- for component in subcalendar.subcomponents():
- calendar.addComponent(component)
+ # Must verify ACLs which means we need a request object at this point
+ for name, uid, type in self.index().search(None): #@UnusedVariable
+ try:
+ child = IDAVResource(self.getChild(name))
+ request.rememberURLForResource(joinURL(request.uri, str(name)), child)
+ except TypeError:
+ child = None
+
+ if child is not None:
+ # Check privileges of child - skip if access denied
+ try:
+ d = waitForDeferred(child.checkAccess(request, (davxml.Read(),), inheritedaces=filteredaces))
+ yield d
+ d.getResult()
+ except:
+ continue
+ subcalendar = self.iCalendar(name)
+ assert subcalendar.name() == "VCALENDAR"
- return calendar
+ for component in subcalendar.subcomponents():
+ calendar.addComponent(component)
+
+ yield calendar
+ return
- return super(CalDAVFile, self).iCalendar(name)
+ yield fail(HTTPError((ErrorResponse(responsecode.BAD_REQUEST))))
+ iCalendarRolledup = deferredGenerator(iCalendarRolledup)
+
def iCalendarText(self, name=None):
if self.isPseudoCalendarCollection():
if name is None:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20060829/f68d93a2/attachment.html
More information about the calendarserver-changes
mailing list