[Checkins] SVN: z3c.table/branches/darrylcousins/src/z3c/table/ Added multi-adapter header implementation, included test in README. Problem with this as current is that the header adapter is looked up in renderHeader method of Column and this method may also be overridden using column.addTable method

Darryl Cousins darryl at darrylcousins.net.nz
Wed Mar 12 22:26:49 EDT 2008


Log message for revision 84628:
  Added multi-adapter header implementation, included test in README. Problem with this as current is that the header adapter is looked up in renderHeader method of Column and this method may also be overridden using column.addTable method

Changed:
  U   z3c.table/branches/darrylcousins/src/z3c/table/README.txt
  U   z3c.table/branches/darrylcousins/src/z3c/table/column.py
  U   z3c.table/branches/darrylcousins/src/z3c/table/interfaces.py
  U   z3c.table/branches/darrylcousins/src/z3c/table/tests.py

-=-
Modified: z3c.table/branches/darrylcousins/src/z3c/table/README.txt
===================================================================
--- z3c.table/branches/darrylcousins/src/z3c/table/README.txt	2008-03-12 21:36:18 UTC (rev 84627)
+++ z3c.table/branches/darrylcousins/src/z3c/table/README.txt	2008-03-13 02:26:46 UTC (rev 84628)
@@ -97,10 +97,8 @@
   >>> class TitleColumn(column.Column):
   ... 
   ...     weight = 10
+  ...     header = u'Title'
   ... 
-  ...     def renderHeadCell(self):
-  ...         return u'Title'
-  ... 
   ...     def renderCell(self, item):
   ...         return u'Title: %s' % item.title
 
@@ -245,7 +243,6 @@
     </tbody>
   </table>
 
-
 Setup columns
 -------------
 
@@ -722,7 +719,7 @@
   1
 
   >>> titleColumn.header
-  u''
+  u'Title'
 
   >>> titleColumn.cssClasses
   {}
@@ -1591,7 +1588,56 @@
     </tbody>
   </table>
 
+Headers
+-------
 
+We can change the rendering of the header of, e.g, the Title column by
+registering a IHeaderColumn adapter. This may be useful for adding links to
+column headers for an existing table implementation.
+
+  >>> class TitleColumnHeader(column.ColumnHeader):
+  ... 
+  ...     def update(self):
+  ...         pass
+  ... 
+  ...     def render(self):
+  ...         return u'<span>'+self.column.header+'</span>'
+
+  >>> zope.component.provideAdapter(TitleColumnHeader,
+  ...     (None, None, NumberColumn), provides=interfaces.IColumnHeader)
+
+  >>> print sequenceTable.render()
+  <table>
+    <thead>
+      <tr>
+        <th>My items</th>
+        <th><span>Number</span></th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>Twentieth item</td>
+        <td>number: 20</td>
+      </tr>
+      <tr>
+        <td>Nineteenth item</td>
+        <td>number: 19</td>
+      </tr>
+      <tr>
+        <td>Eighteenth item</td>
+        <td>number: 18</td>
+      </tr>
+      <tr>
+        <td>Seventeenth item</td>
+        <td>number: 17</td>
+      </tr>
+      <tr>
+        <td>Sixteenth item</td>
+        <td>number: 16</td>
+      </tr>
+    </tbody>
+  </table>
+
 Miscellaneous
 -------------
 

Modified: z3c.table/branches/darrylcousins/src/z3c/table/column.py
===================================================================
--- z3c.table/branches/darrylcousins/src/z3c/table/column.py	2008-03-12 21:36:18 UTC (rev 84627)
+++ z3c.table/branches/darrylcousins/src/z3c/table/column.py	2008-03-13 02:26:46 UTC (rev 84628)
@@ -61,6 +61,26 @@
         return default
 
 
+class ColumnHeader(object):
+    """ColumnHeader renderer provider"""
+
+    zope.interface.implements(interfaces.IColumnHeader)
+
+    def __init__(self, context, request, column):
+        self.__parent__ = context
+        self.context = context
+        self.request = request
+        self.column = column
+
+    def update(self):
+        """Override this method in subclasses if required"""
+        pass
+
+    def render(self):
+        """Override this method in subclasses"""
+        return self.column.header
+
+
 class Column(zope.location.Location):
     """Column provider."""
 
@@ -94,6 +114,11 @@
 
     def renderHeadCell(self):
         """Header cell content."""
+        header = zope.component.queryMultiAdapter((self.context,
+                    self.request, self), interfaces.IColumnHeader)
+        if header:
+            header.update()
+            return header.render()
         return self.header
 
     def renderCell(self, item):

Modified: z3c.table/branches/darrylcousins/src/z3c/table/interfaces.py
===================================================================
--- z3c.table/branches/darrylcousins/src/z3c/table/interfaces.py	2008-03-12 21:36:18 UTC (rev 84627)
+++ z3c.table/branches/darrylcousins/src/z3c/table/interfaces.py	2008-03-13 02:26:46 UTC (rev 84628)
@@ -236,3 +236,12 @@
 
     def render():
         """Plain render method without keyword arguments."""
+
+class IColumnHeader(zope.interface.Interface):
+    """Multi-adapter for header rendering."""
+
+    def update():
+        """Override this method in subclasses if required"""
+
+    def render():
+        """Override this method in subclasses"""

Modified: z3c.table/branches/darrylcousins/src/z3c/table/tests.py
===================================================================
--- z3c.table/branches/darrylcousins/src/z3c/table/tests.py	2008-03-12 21:36:18 UTC (rev 84627)
+++ z3c.table/branches/darrylcousins/src/z3c/table/tests.py	2008-03-13 02:26:46 UTC (rev 84628)
@@ -56,6 +56,20 @@
         return ({}, TestRequest(), t)
 
 
+# header
+class TestColumnHeader(z3c.testing.InterfaceBaseTest):
+
+    def getTestInterface(self):
+        return interfaces.IColumnHeader
+
+    def getTestClass(self):
+        return column.ColumnHeader
+
+    def getTestPos(self):
+        t = table.Table(None, TestRequest())
+        return ({}, TestRequest(), t)
+
+
 class TestNoneCell(z3c.testing.InterfaceBaseTest):
 
     def getTestInterface(self):
@@ -135,6 +149,7 @@
             ),
         unittest.makeSuite(TestTable),
         unittest.makeSuite(TestColumn),
+        unittest.makeSuite(TestColumnHeader),
         unittest.makeSuite(TestNoneCell),
         unittest.makeSuite(TestNameColumn),
         unittest.makeSuite(TestRadioColumn),



More information about the Checkins mailing list