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