r13716 - in Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField: . examples skins/DataGridWidget tests

"Gauthier Bastien" <[email protected]> Mon, 11 Jul 2011 11:30:50 +0000
Newsgroups gmane.comp.web.zope.plone.archetypes.cvs
Message-ID <[email protected]>
Author: gbastien
Date: Mon Jul 11 11:30:49 2011
New Revision: 13716

Added:
   Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/skins/DataGridWidget/datagrid_multi_select_cell.pt
Modified:
   Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/DataGridField.py
   Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/DataGridWidget.py
   Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/SelectColumn.py
   Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/examples/DataGridDemoType.py
   Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/skins/DataGridWidget/datagrid_help_cell.pt
   Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/tests/test_columns.py
   Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/tests/test_data_manipulation.py
Log:
Added multi SelectColumn behaviour inspired by claytron-multi-select-column.  Adapted demo example type and considered the new specification in the tests


Modified: Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/DataGridField.py
==============================================================================
--- Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/DataGridField.py	(original)
+++ Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/DataGridField.py	Mon Jul 11 11:30:49 2011
@@ -12,6 +12,7 @@
 
 import StringIO
 import logging
+from types import ListType
 from AccessControl import ClassSecurityInfo
 from Products.Archetypes.atapi import DisplayList
 from Products.Archetypes.Field import ObjectField

Modified: Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/DataGridWidget.py
==============================================================================
--- Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/DataGridWidget.py	(original)
+++ Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/DataGridWidget.py	Mon Jul 11 11:30:49 2011
@@ -8,6 +8,7 @@
 __author__  = 'Mikko Ohtamaa <[email protected]>'
 __docformat__ = 'epytext'
 
+from types import ListType
 from AccessControl import ClassSecurityInfo
 from Products.Archetypes.Widget import TypesWidget
 from Products.Archetypes.Registry import registerWidget
@@ -124,6 +125,17 @@
             return ""
         return vocab.getValue(item)
 
+    def getUserFriendlyMultiSelectionItems(self, context, items, vocab): 
+ 	"""Look up the given items in the vocab and return the values, translated 
+ 	   if necessary and joined to strings separated by ', '. Return an empty string 
+ 	   if item is empty, None or not ListType. 
+ 	""" 
+ 	if items == None or items == '' or type(items) != ListType: 
+            return "" 
+ 	result = [] 
+ 	for item in items:
+            result.append(context.translate(vocab._i18n_msgids.get(item, vocab.getValue(item)))) 
+ 	return ', '.join(result)
 
     security.declarePublic('isAutoInsertEnabled')
     def isAutoInsertEnabled(self):

Modified: Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/SelectColumn.py
==============================================================================
--- Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/SelectColumn.py	(original)
+++ Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/SelectColumn.py	Mon Jul 11 11:30:49 2011
@@ -23,15 +23,16 @@
 
     security = ClassSecurityInfo()
 
-    def __init__(self, title, vocabulary, default=None):
+    def __init__(self, title, vocabulary, default=None, size=1):
         """ Create a SelectColumn
-
         @param vocabulary Vocabulary method name. This method is called
                from Archetypes instance to get values for dropdown list.
+        @param size SelectionWidget size. If size > 1 the SelectionColumn
+               turns itself to MultiSelectionColumn 
         """
         Column.__init__(self, title, default=default)
         self.vocabulary = vocabulary
-
+        self.size = size
 
     security.declarePublic('getVocabulary')
     def getVocabulary(self, instance):
@@ -43,15 +44,20 @@
             func = getattr(instance, self.vocabulary)
         except AttributeError:
             raise AttributeError, "Class %s is missing vocabulary function %s" % (str(instance), self.vocabulary)
-
         return func()
 
-
     security.declarePublic('getMacro')
     def getMacro(self):
         """ Return macro used to render this column in view/edit """
+        if self.size > 1:
+            return 'datagrid_multi_select_cell'
         return "datagrid_select_cell"
 
+    security.declarePublic('getWidgetSize') 
+    def getWidgetSize(self): 
+        """ Return size of MultiSelectionWidget in view/edit macro """
+        return self.size
+
 
 # Initializes class security
 InitializeClass(SelectColumn)

Modified: Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/examples/DataGridDemoType.py
==============================================================================
--- Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/examples/DataGridDemoType.py	(original)
+++ Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/examples/DataGridDemoType.py	Mon Jul 11 11:30:49 2011
@@ -78,7 +78,7 @@
 
         DataGridField('DemoField2',
                 searchable=True, # One unit tests checks whether text search works
-                columns=("column1", "column2", "select_sample"),
+                columns=("column1", "column2", "select_sample", "multiselect_sample"),
                 widget = DataGridWidget(
                     description="Set default values for created rows. Choose SelectColumn value from the default dictionary",
                     description_msgid='DataGridDemoType_help_DemoField2',
@@ -86,7 +86,8 @@
                     columns={
                         'column1' : Column(_(u"Toholampi city rox")),
                         'column2' : Column(_(u"My friendly name"), default=_(u"Some default text")),
-                        'select_sample' : SelectColumn(_(u"Friendly name"), vocabulary="getSampleVocabulary", default="sample2")
+                        'select_sample' : SelectColumn(_(u"Friendly name"), vocabulary="getSampleVocabulary", default="sample2"),
+                        'multiselect_sample' : SelectColumn(_(u"Friendly Multiselect name"), vocabulary="getSampleVocabulary", default=("sample",), size=5)
                     },
                  ),
          ),

Modified: Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/skins/DataGridWidget/datagrid_help_cell.pt
==============================================================================
--- Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/skins/DataGridWidget/datagrid_help_cell.pt	(original)
+++ Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/skins/DataGridWidget/datagrid_help_cell.pt	Mon Jul 11 11:30:49 2011
@@ -22,7 +22,6 @@
 	                    onkeypress="handleKeyPress(event);"
 	                    tal:attributes="name string:${fieldName}.${column}:records;
 	                    				value cell_value;
-	                    				tabindex tabindex/next;
 	                    				"
 	                    type="text" />
     </metal:edit_cell_macro>
@@ -33,7 +32,6 @@
 	                    onkeypress="handleKeyPress(event);"
 	                    tal:attributes="
 	                    	name string:${fieldName}.${column}:records;
-	                    	tabindex tabindex/next;
 	                    	"
 	                    type="text" />
 

Added: Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/skins/DataGridWidget/datagrid_multi_select_cell.pt
==============================================================================
--- (empty file)
+++ Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/skins/DataGridWidget/datagrid_multi_select_cell.pt	Mon Jul 11 11:30:49 2011
@@ -0,0 +1,57 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+           xmlns:tal="http://xml.zope.org/namespaces/tal"
+           xmlns:metal="http://xml.zope.org/namespaces/metal"
+           xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+           i18n:domain="plone">
+           
+           
+<!-- View/edit drop down select menu cells -->
+
+<body>
+       <!-- VIEW -->
+       <metal:view_cell_macro define-macro="view_cell"
+           tal:define="vocab python: column_definition.getVocabulary(context)">                
+           <div tal:content="python:widget.getUserFriendlyMultiSelectionItems(here, cell_value, vocab)" />
+       </metal:view_cell_macro>
+
+       <!-- EDIT -->
+       <metal:edit_cell_macro define-macro="edit_cell">
+               <select class="datagridwidget-select" name="myfield.name:list:records"
+                       multiple="multiple" size="#"
+                       tal:define="vocab python: column_definition.getVocabulary(context);
+                                   cell_value python: cell_value or [];"
+                       tal:attributes="name string:${fieldName}.${column}:list:records;
+                                                       value python:rows.get(column);
+                                                       id string:${column}_${fieldId};
+                                                       size string:${column_definition/getWidgetSize};
+                                                       ">
+                               <option tal:repeat="item vocab"
+                                   tal:attributes="value item;
+                                                   selected python:item in cell_value and 'selected' or None;"
+                                           tal:content="python:widget.getUserFriendlySelectionItem(here, item, vocab)"/>
+           </select>
+       </metal:edit_cell_macro>
+
+
+       <!-- EMPTY EDIT -->
+       <metal:edit_empty_cell_macro define-macro="edit_empty_cell">
+           <select class="datagridwidget-select" name="myfield.name:list:records"
+                       tal:define="vocab python: column_definition.getVocabulary(context);
+                                   cell_value cell_value|python:[]"
+                               multiple="multiple" size="#"
+                               tal:attributes="name string:${fieldName}.${column}:list:records;
+                                                               id string:${column}_${fieldId};
+                                                               size string:${column_definition/getWidgetSize};
+                                                               ">
+                               
+                               <option tal:repeat="item vocab"
+                                   tal:attributes="value item;
+                                                   selected python:item in column_definition.getDefault(context) and 'selected' or None;"
+                                           tal:content="python:widget.getUserFriendlySelectionItem(here, item, vocab)"/>
+
+           </select>
+       </metal:edit_empty_cell_macro>
+</body>
+
+</html>
+

Modified: Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/tests/test_columns.py
==============================================================================
--- Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/tests/test_columns.py	(original)
+++ Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/tests/test_columns.py	Mon Jul 11 11:30:49 2011
@@ -64,7 +64,7 @@
         field = self.demo2.getField("DemoField2")
         col = field.widget.getColumnDefinition(field, "select_sample")
 
-        # backward compatibility: no explict column defnition given
+        # backward compatibility: no explict column definition given
         # so it should have been constructed automatically
         field = self.demo2.getField("DemoField2")
         col = field.widget.getColumnDefinition(field, "column1")
@@ -75,7 +75,7 @@
         names = field.widget.getColumnLabels(field, self)
         self.assertEqual(
             names,
-            ["Toholampi city rox", "My friendly name", "Friendly name"])
+            ["Toholampi city rox", "My friendly name", "Friendly name", "Friendly Multiselect name"])
 
 
 def test_suite():

Modified: Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/tests/test_data_manipulation.py
==============================================================================
--- Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/tests/test_data_manipulation.py	(original)
+++ Products.DataGridField/branches/cp-multiselectcolumn/Products/DataGridField/tests/test_data_manipulation.py	Mon Jul 11 11:30:49 2011
@@ -161,14 +161,18 @@
         self.folder.invokeFactory('DataGridDemoType2', 'searchme')
         self.folder.searchme.setDemoField2([
                 {'column1': 'randomSearchableWord', 'column2': 'b',
-                 'select_sample': 'sample'},
-                {'column1': 'd', 'column2': 'e', 'select_sample': 'sample'}])
+                 'select_sample': 'sample', 'multiselect_sample': 'sample'},
+                {'column1': 'd', 'column2': 'e', 'select_sample': 'sample', 'multiselect_sample': 'sample2'}])
         self.folder.searchme.reindexObject()
         self.failUnless(
             'randomSearchableWord' in self.folder.searchme.SearchableText())
-        brains = catalog_tool(SearchableText='randomSearchableWord')
-        self.failUnless(len(brains) > 0)
-
+        #search in 'column1'
+        self.failUnless(len(catalog_tool(SearchableText='randomSearchableWord')) > 0)
+        #search in 'select_sample'
+        self.failUnless(len(catalog_tool(SearchableText='sample')) > 0)
+        #search in 'multiselect_sample'
+        self.failUnless(len(catalog_tool(SearchableText='sample2')) > 0)
+        
 
 class TestSpecialRowsBehavior(DataGridTestCase):
     """ Test fixed rows property, deletion locking, etc. """

------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security 
threats, fraudulent activity, and more. Splunk takes this data and makes 
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2