[CalendarServer-changes] [860] CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Tue Dec 19 11:22:56 PST 2006


Revision: 860
          http://trac.macosforge.org/projects/calendarserver/changeset/860
Author:   cdaboo at apple.com
Date:     2006-12-19 11:22:56 -0800 (Tue, 19 Dec 2006)

Log Message:
-----------
Principal resources are now collections. Reworked directory listing code into modular api so that the directory table
can be embedded in other HTML rendered elsewehere.

Modified Paths:
--------------
    CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/directory/principal.py
    CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/extensions.py
    CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/resource.py

Modified: CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/directory/principal.py	2006-12-19 16:46:17 UTC (rev 859)
+++ CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/directory/principal.py	2006-12-19 19:22:56 UTC (rev 860)
@@ -234,6 +234,8 @@
         self.record = record
         self.parent = parent
         self._url = joinURL(parent.principalCollectionURL(), record.shortName)
+        if self.isCollection():
+            self._url += "/"
 
         # Provision in __init__() because principals are used prior to request
         # lookups.
@@ -258,7 +260,23 @@
                     yield "  ** %s **: %s\n" % (e.__class__.__name__, e)
             return "".join(genlist())
 
-        output = ("".join((
+        output = [
+            """<html>"""
+            """<head>"""
+            """<title>%(title)s</title>"""
+            """<style>%(style)s</style>"""
+            """</head>"""
+            """<body>"""
+            """<div class="directory-listing">"""
+            """<h1>Principal Details</h1>"""
+            """<pre><blockquote>"""
+            % {
+                "title": unquote(request.uri),
+                "style": self.directoryStyleSheet(),
+            }
+        ]
+
+        output.append("".join((
             "Directory Information\n"
             "---------------------\n"
             "Directory GUID: %s\n"         % (self.record.service.guid,),
@@ -279,6 +297,15 @@
             "\nCalendar user addresses:\n" , format_list(self.calendarUserAddresses),
         )))
 
+        output.append(
+            """</pre></blockquote></div>"""
+        )
+
+        output.append(self.getDirectoryTable("Collection Listing"))
+
+        output.append("</body></html>")
+
+        output = "".join(output)
         if type(output) == unicode:
             output = output.encode("utf-8")
             mime_params = {"charset": "utf-8"}
@@ -286,7 +313,7 @@
             mime_params = {}
 
         response = Response(code=responsecode.OK, stream=output)
-        response.headers.setHeader("content-type", MimeType("text", "plain", mime_params))
+        response.headers.setHeader("content-type", MimeType("text", "html", mime_params))
 
         return response
 
@@ -300,9 +327,6 @@
         else:
             return self.record.shortName
 
-    def isCollection(self):
-        return False
-
     ##
     # ACL
     ##

Modified: CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/extensions.py
===================================================================
--- CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/extensions.py	2006-12-19 16:46:17 UTC (rev 859)
+++ CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/extensions.py	2006-12-19 19:22:56 UTC (rev 860)
@@ -131,7 +131,7 @@
         """
         Render a directory listing.
         """
-        title = "Directory listing for %s" % urllib.unquote(request.path)
+        pagetitle = "Directory listing for %s" % urllib.unquote(request.path)
     
         output = [
             """<html>"""
@@ -140,51 +140,41 @@
             """<style>%(style)s</style>"""
             """</head>"""
             """<body>"""
+            % {
+                "title": pagetitle,
+                "style": self.directoryStyleSheet(),
+            }
+        ]
+
+        output.append(self.getDirectoryTable(urllib.unquote(request.uri)))
+
+        output.append("</body></html>")
+
+        response = Response(200, {}, "".join(output))
+        response.headers.setHeader("content-type", MimeType("text", "html"))
+        return response
+
+    def getDirectoryTable(self, title):
+        """
+        Generate a directory listing table in HTML.
+        """
+    
+        output = [
             """<div class="directory-listing">"""
             """<h1>%(title)s</h1>"""
             """<table>"""
             """<tr><th>Name</th> <th>Size</th> <th>Last Modified</th> <th>MIME Type</th></tr>"""
             % {
-                "title": urllib.unquote(request.uri),
-                "style": self.directoryStyleSheet(),
+                "title": title,
             }
         ]
 
-        def orNone(value, default="?", f=None):
-            if value is None:
-                return default
-            elif f is not None:
-                return f(value)
-            else:
-                return value
-
         even = False
         for name in sorted(self.listChildren()):
             child = self.getChild(name)
 
-            url = urllib.quote(name, '/')
-            if isinstance(child, SuperDAVFile) and child.isCollection():
-                url += "/"
-                name += "/"
+            url, name, size, lastModified, contentType = self.getChildDirectoryEntry(child, name)
 
-            if isinstance(child, MetaDataMixin):
-                size = child.contentLength()
-                lastModified = child.lastModified()
-                contentType = child.contentType()
-            else:
-                size = None
-                lastModified = None
-                contentType = None
-
-            if self.fp.isdir():
-                contentType = "(collection)"
-            else:
-                contentType = orNone(
-                    contentType,
-                    default="-",
-                    f=lambda m: "%s/%s %s" % (m.mediaType, m.mediaSubtype, m.params)
-                )
-
             # FIXME: gray out resources that are not readable
             output.append(
                 """<tr class="%(even)s">"""
@@ -197,22 +187,61 @@
                     "even": even and "even" or "odd",
                     "url": url,
                     "name": name,
-                    "size": orNone(size),
-                    "lastModified": orNone(
-                        lastModified,
-                        default="",
-                        f=lambda t: time.strftime("%Y-%b-%d %H:%M", time.localtime(t))
-                    ),
+                    "size": size,
+                    "lastModified": lastModified,
                     "type": contentType,
                 }
             )
             even = not even
-        output.append("</table></div></body></html>")
+        output.append("</table></div>")
 
-        response = Response(200, {}, "".join(output))
-        response.headers.setHeader("content-type", MimeType("text", "html"))
-        return response
+        return "".join(output)
 
+    def getChildDirectoryEntry(self, child, name):
+
+        def orNone(value, default="?", f=None):
+            if value is None:
+                return default
+            elif f is not None:
+                return f(value)
+            else:
+                return value
+            
+        url = urllib.quote(name, '/')
+        if isinstance(child, SuperDAVFile) and child.isCollection():
+            url += "/"
+            name += "/"
+
+        if isinstance(child, MetaDataMixin):
+            size = child.contentLength()
+            lastModified = child.lastModified()
+            contentType = child.contentType()
+        else:
+            size = None
+            lastModified = None
+            contentType = None
+
+        if self.fp.isdir():
+            contentType = "(collection)"
+        else:
+            contentType = self._orNone(
+                contentType,
+                default="-",
+                f=lambda m: "%s/%s %s" % (m.mediaType, m.mediaSubtype, m.params)
+            )
+
+        return (
+            url,
+            name,
+            orNone(size),
+            orNone(
+                lastModified,
+                default="",
+                f=lambda t: time.strftime("%Y-%b-%d %H:%M", time.localtime(t))
+             ),
+             contentType,
+         )
+
 class ReadOnlyResourceMixIn (object):
     """
     Read only resource.

Modified: CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/resource.py
===================================================================
--- CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/resource.py	2006-12-19 16:46:17 UTC (rev 859)
+++ CalendarServer/branches/users/cdaboo/cuproxy-857/twistedcaldav/resource.py	2006-12-19 19:22:56 UTC (rev 860)
@@ -551,14 +551,15 @@
         (calendarserver_namespace, "notifications-URL"),
     )
 
+    def isCollection(self):
+        return True
+
     def readProperty(self, property, request):
         def defer():
             if type(property) is tuple:
                 qname = property
-                sname = "{%s}%s" % property
             else:
                 qname = property.qname()
-                sname = property.sname()
 
             namespace, name = qname
 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20061219/a65f9111/attachment.html


More information about the calendarserver-changes mailing list