[CalendarServer-changes] [9112] CalendarServer/trunk/calendarserver/tools/shell/vfs.py

source_changes at macosforge.org source_changes at macosforge.org
Fri Apr 13 18:05:25 PDT 2012


Revision: 9112
          http://trac.macosforge.org/projects/calendarserver/changeset/9112
Author:   wsanchez at apple.com
Date:     2012-04-13 18:05:23 -0700 (Fri, 13 Apr 2012)
Log Message:
-----------
ListEntries needs the object that created it (that defines .list()) so it can get fieldNames from the correct place.

Add directory-based list() implementation for RecordFolder.

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/tools/shell/vfs.py

Modified: CalendarServer/trunk/calendarserver/tools/shell/vfs.py
===================================================================
--- CalendarServer/trunk/calendarserver/tools/shell/vfs.py	2012-04-13 23:40:51 UTC (rev 9111)
+++ CalendarServer/trunk/calendarserver/tools/shell/vfs.py	2012-04-14 01:05:23 UTC (rev 9112)
@@ -55,7 +55,8 @@
     """
     Information about a C{File} as returned by C{File.list()}.
     """
-    def __init__(self, Class, Name, **fields):
+    def __init__(self, parent, Class, Name, **fields):
+        self.parent    = parent # The class implementing list()
         self.fileClass = Class
         self.fileName  = Name
         self.fields    = fields
@@ -77,18 +78,24 @@
     @property
     def fieldNames(self):
         if not hasattr(self, "_fieldNames"):
-            if hasattr(self.fileClass.list, "fieldNames"):
-                if "Name" in self.fileClass.list.fieldNames:
-                    self._fieldNames = tuple(self.fileClass.list.fieldNames)
+            if hasattr(self.parent.list, "fieldNames"):
+                if "Name" in self.parent.list.fieldNames:
+                    self._fieldNames = tuple(self.parent.list.fieldNames)
                 else:
-                    self._fieldNames = ("Name",) + tuple(self.fileClass.list.fieldNames)
+                    self._fieldNames = ("Name",) + tuple(self.parent.list.fieldNames)
             else:
                 self._fieldNames = ["Name"] + sorted(n for n in self.fields if n != "Name")
 
         return self._fieldNames
 
     def toFields(self):
-        return tuple(self.fields[fieldName] for fieldName in self.fieldNames)
+        try:
+            return tuple(self.fields[fieldName] for fieldName in self.fieldNames)
+        except KeyError, e:
+            raise AssertionError(
+                "Field %s is not in %r, defined by %s"
+                % (e, self.fields.keys(), self.parent.__name__)
+            )
 
 
 class File(object):
@@ -118,7 +125,7 @@
 
     def list(self):
         return succeed((
-            ListEntry(self.__class__, self.path[-1]),
+            ListEntry(self, self.__class__, self.path[-1]),
         ))
 
 
@@ -182,9 +189,9 @@
     def list(self):
         result = set()
         for name in self._children:
-            result.add(ListEntry(self._children[name].__class__, name))
+            result.add(ListEntry(self, self._children[name].__class__, name))
         for name in self._childClasses:
-            result.add(ListEntry(self._childClasses[name], name))
+            result.add(ListEntry(self, self._childClasses[name], name))
         return succeed(result)
 
 
@@ -238,7 +245,7 @@
         # FIXME: Add directory info (eg. name) to listing
 
         for txn, home in (yield self.service.store.eachCalendarHome()):
-            result.add(ListEntry(PrincipalHomeFolder, home.uid()))
+            result.add(ListEntry(self, PrincipalHomeFolder, home.uid()))
 
         returnValue(result)
 
@@ -263,14 +270,25 @@
             record=record
         )
 
-    @inlineCallbacks
     def list(self):
-        result = set()
+        names = set()
 
-        # FIXME ...?
-        yield 1
+        for record in self.service.directory.listRecords(self.recordType):
+            for shortName in record.shortNames:
+                if shortName in names:
+                    continue
+                names.add(shortName)
+                yield ListEntry(
+                    self,
+                    PrincipalHomeFolder,
+                    shortName,
+                    **{
+                        "UID": record.uid,
+                        "Full Name": record.fullName,
+                    }
+                )
 
-        returnValue(result)
+    list.fieldNames = ("UID", "Full Name")
 
 
 class UsersFolder(RecordFolder):
@@ -426,7 +444,7 @@
     @inlineCallbacks
     def list(self):
         calendars = (yield self.home.calendars())
-        returnValue((ListEntry(CalendarFolder, c.name()) for c in calendars))
+        returnValue((ListEntry(self, CalendarFolder, c.name()) for c in calendars))
 
     @inlineCallbacks
     def describe(self):
@@ -567,7 +585,7 @@
     @inlineCallbacks
     def list(self):
         (yield self.lookup())
-        returnValue((ListEntry(CalendarObject, self.uid, {
+        returnValue((ListEntry(self, CalendarObject, self.uid, {
             "Component Type": self.componentType,
             "Summary": self.summary.replace("\n", " "),
         }),))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120413/b9c60bf4/attachment.html>


More information about the calendarserver-changes mailing list