[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