[CalendarServer-changes] [7958] CalendarServer/branches/users/glyph/imip-and-admin-html/ calendarserver/webadmin/resource.py

source_changes at macosforge.org source_changes at macosforge.org
Thu Aug 11 21:50:58 PDT 2011


Revision: 7958
          http://trac.macosforge.org/projects/calendarserver/changeset/7958
Author:   glyph at apple.com
Date:     2011-08-11 21:50:58 -0700 (Thu, 11 Aug 2011)
Log Message:
-----------
implement proxy row filling

Modified Paths:
--------------
    CalendarServer/branches/users/glyph/imip-and-admin-html/calendarserver/webadmin/resource.py

Modified: CalendarServer/branches/users/glyph/imip-and-admin-html/calendarserver/webadmin/resource.py
===================================================================
--- CalendarServer/branches/users/glyph/imip-and-admin-html/calendarserver/webadmin/resource.py	2011-08-12 04:50:46 UTC (rev 7957)
+++ CalendarServer/branches/users/glyph/imip-and-admin-html/calendarserver/webadmin/resource.py	2011-08-12 04:50:58 UTC (rev 7958)
@@ -159,7 +159,8 @@
             principalResource = self.resource.getResourceById(
                 request, resourceId)
             return DetailsElement(
-                resourceId, principalResource, propertyName, tag
+                resourceId, principalResource, propertyName, tag,
+                self.resource
             )
         else:
             return ""
@@ -184,8 +185,10 @@
 
 class DetailsElement(Element):
 
-    def __init__(self, resourceId, principalResource, davPropertyName, tag):
+    def __init__(self, resourceId, principalResource, davPropertyName, tag,
+                 adminResource):
         self.principalResource = principalResource
+        self.adminResource = adminResource
         tag.fillSlots(resourceTitle=unicode(principalResource),
                       resourceId=resourceId,
                       davPropertyName=davPropertyName)
@@ -254,16 +257,94 @@
 
 
     @renderer
+    @inlineCallbacks
     def proxyRows(self, request, tag):
         """
         Renderer which does zipping logic to render read-only and read-write
         rows of existing proxies for the currently-viewed resource.
         """
-        # FIXME IMPLEMENT
-        return ''
+        result = []
+        (readSubPrincipal, writeSubPrincipal) = (
+            proxySubprincipal(self.principalResource, "read"),
+            proxySubprincipal(self.principalResource, "write")
+        )
+        if readSubPrincipal or writeSubPrincipal:
+            (readMembers, writeMembers) = (
+                (yield readSubPrincipal.readProperty(davxml.GroupMemberSet,
+                                                     None)),
+                (yield writeSubPrincipal.readProperty(davxml.GroupMemberSet,
+                                                      None))
+            )
+            if readMembers.children or writeMembers.children:
+                # FIXME: 'else' case needs to be handled by separate renderer
+                readProxies = []
+                writeProxies = []
+                def getres(ref):
+                    return self.adminResource.getResourceById(str(proxyHRef))
+                for proxyHRef in readMembers.children:
+                    readProxies.append((yield getres(proxyHRef)))
+                for proxyHRef in writeMembers.children:
+                    writeProxies.append((yield getres(proxyHRef)))
+                lendiff = len(readProxies) - len(writeProxies)
+                if lendiff > 0:
+                    writeProxies += [None] * lendiff
+                elif lendiff < 0:
+                    readProxies += [None] * lendiff
+                for idx, (readProxy, writeProxy) in enumerate(
+                        zip(readProxies, writeProxies)
+                    ):
+                    result.append(
+                        ProxyRow(tag.clone(), idx, readProxy, writeProxy)
+                    )
+        returnValue(result)
 
 
 
+class ProxyRow(Element):
+
+    def __init__(self, tag, index, readProxy, writeProxy):
+        tag.fillSlots(rowClass="even" if (index % 2 == 0) else "odd")
+        super(ProxyRow, self).__init__(loader=stan(tag))
+        self.readProxy = readProxy
+        self.writeProxy = writeProxy
+
+
+    def proxies(self, proxyResource, tag):
+        if proxyResource is None:
+            return ''
+        return tag.fillSlots(proxy=unicode(proxyResource.record),
+                             type=proxyResource.record.recordType,
+                             shortName=proxyResource.record.shortNames[0])
+
+
+    def noProxies(self, proxyResource, tag):
+        if proxyResource is None:
+            return tag
+        else:
+            return ""
+
+
+    @renderer
+    def readOnlyProxies(self, request, tag):
+        return self.proxies(self.readProxy, tag)
+
+
+    @renderer
+    def noReadOnlyProxies(self, request, tag):
+        return self.noProxies(self.readProxy, tag)
+
+
+    @renderer
+    def readWriteProxies(self, request, tag):
+        return self.proxies(self.writeProxy, tag)
+
+
+    @renderer
+    def noReadWriteProxies(self, request, tag):
+        return self.noProxies(self.writeProxy, tag)
+
+
+
 class WebAdminResource (ReadOnlyResourceMixIn, DAVFile):
     """
     Web administration HTTP resource.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110811/507cca92/attachment-0001.html>


More information about the calendarserver-changes mailing list