Changeset 47429

Show
Ignore:
Timestamp:
07/25/06 21:38:59 (2 years ago)
Author:
fguillaume
Message:

ELHGED-97:
Added code to render "empty" value in lists of complex objects.
An additional cell is available containing widgets with the "#" suffix.

For now no javascript code transforms it into a real numbered list item
so you only get an empty value that isn't taken into account.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • CPS4/products/CPSSchemas/trunk/BasicFields.py

    r47055 r47429  
    309309 
    310310    validation_error_msg = 'Not a string list: ' 
     311 
     312    def getDefaultItem(self): 
     313        return u'' 
    311314 
    312315    def verifyType(self, value): 
  • CPS4/products/CPSSchemas/trunk/BasicWidgets.py

    r47220 r47429  
    237237        """Prepare datastructure from datamodel.""" 
    238238        datamodel = datastructure.getDataModel() 
    239         datastructure[self.getWidgetId()] = datamodel[self.fields[0]] 
     239        try: 
     240            field_id = self.fields[0] 
     241        except IndexError: 
     242            field_id = 'missing' # dummy, usable for list of objects 
     243        datastructure[self.getWidgetId()] = datamodel[field_id] 
    240244 
    241245    def _extractValue(self, value): 
     
    265269        else: 
    266270            datamodel = datastructure.getDataModel() 
    267             datamodel[self.fields[0]] = v 
     271            try: 
     272                field_id = self.fields[0] 
     273            except IndexError: 
     274                field_id = 'missing' # dummy, usable for list of objects 
     275            datamodel[field_id] = v 
    268276 
    269277        return not err 
  • CPS4/products/CPSSchemas/trunk/CapsuleFields.py

    r47421 r47429  
    7878    def getDefault(self, datamodel=None): 
    7979        return [] 
     80 
     81    def getDefaultItem(self): 
     82        return self._field.getDefault() 
    8083 
    8184InitializeClass(CapsuleListField) 
  • CPS4/products/CPSSchemas/trunk/CapsuleWidgets.py

    r47421 r47429  
    190190        """ 
    191191        datamodel = datastructure.getDataModel() 
    192         values = datamodel[self.fields[0]] 
     192        field_id = self.fields[0] 
     193        values = datamodel[field_id] 
    193194        subdm = SubListItemDataModel(datamodel, values) 
    194195        prefix = self.getWidgetId()+'_' 
     
    204205                subds[sub_id+'_'+'__name__'] = value['__name__'] 
    205206            subwidget.prepare(subds, **kw) 
     207        # Also add a fake value for empty widgets in the datastructure 
     208        sub_id = prefix + '#' 
     209        subwidget = makeSubWidget(widget, sub_id) 
     210        field = datamodel._fields[field_id] 
     211        emptyvalue = [field.getDefaultItem()] 
     212        subdm = SubListItemDataModel(datamodel, emptyvalue) 
     213        subdm.setItemNumber(0) 
     214        subds = SubDataStructure(datastructure, subdm, '') 
     215        subwidget.prepare(subds, **kw) 
    206216 
    207217    def setWidgetInfo(self, infos, layout_mode, datastructure): 
     
    212222        # Now also set widget infos for sub widgets 
    213223        datamodel = datastructure.getDataModel() 
    214         values = datamodel[self.fields[0]] 
     224        field_id = self.fields[0] 
     225        values = datamodel[field_id] 
    215226        subdm = SubListItemDataModel(datamodel, values) 
    216227        prefix = self.getWidgetId()+'_' 
     
    223234            subwidget = makeSubWidget(widget, sub_id) 
    224235            subdm.setItemNumber(n) 
     236            subds = SubDataStructure(datastructure, subdm, '') 
     237            subwidget.setWidgetInfo(infos, layout_mode, subds) 
     238        if layout_mode == 'edit': 
     239            # We also make an empty widget for new entries 
     240            sub_id = prefix + '#' 
     241            subwidget = makeSubWidget(widget, sub_id) 
     242            field = datamodel._fields[field_id] 
     243            emptyvalue = [field.getDefaultItem()] 
     244            subdm = SubListItemDataModel(datamodel, emptyvalue) 
     245            subdm.setItemNumber(0) 
    225246            subds = SubDataStructure(datastructure, subdm, '') 
    226247            subwidget.setWidgetInfo(infos, layout_mode, subds) 
     
    281302            if not widget.hidden_empty or rendered: 
    282303                cells.append(cell) 
     304        if mode == 'edit': 
     305            # Add also a cell for the empty widget 
     306            sub_id = prefix + '#' 
     307            cell = {} 
     308            cell.update(widget_infos[sub_id]) 
     309            widget_mode = cell['widget_mode'] 
     310            subwidget = makeSubWidget(widget, sub_id) 
     311            rendered = subwidget.render(widget_mode, datastructure, **kw) 
     312            rendered = rendered.strip() 
     313            cell['widget_rendered'] = rendered 
     314            cell['empty_entry'] = True # Flag for the renderer 
     315            cells.append(cell) 
     316 
    283317        render = self._getRenderMethod() 
    284318        rendered = render(mode=mode, datastructure=datastructure, 
     
    418452            last_modified = '' 
    419453 
    420         # Find the URL for the file  XXX Refactor this! 
    421  
    422         # get the adapter 
    423         for adapter in dm._adapters: 
    424             if adapter.getSchema().has_key(field_id): 
    425                 break # Note: 'adapter' is still the right one 
    426         else: 
    427             raise ValueError('No schema for field %r' % field_id) 
    428  
    429         # get the content_url from the adapter 
     454        # Find the URL for the file 
    430455        content_url = None 
    431456        ob = dm.getProxy() 
  • CPS4/products/CPSSchemas/trunk/DataStructure.py

    r46990 r47429  
    4141_SESSION_DATASTRUCTURE_KEY = 'CPS_DATASTRUCTURE' 
    4242 
    43 _SUFFIX_RE = re.compile(r'(\d+)(_.*)?') 
     43_SUFFIX_RE = re.compile(r'(\d+|#)(_.*)?') 
    4444 
    4545class DataStructure(UserDict): 
     
    165165                if not key.startswith(prefix): 
    166166                    continue 
    167                 del self[key] 
    168167                suffix = key[len(prefix):] 
    169168                m = _SUFFIX_RE.match(suffix) 
     
    171170                    raise ValueError(key) 
    172171                nn, rest = m.groups() 
     172                if nn == '#': 
     173                    # Part of "empty" entry prepared in datastructure, kept 
     174                    continue 
     175                del self[key] 
    173176                n = int(nn) 
    174177                if n >= length: 
     
    293296        self._ds[self._prefix+key] = value 
    294297 
     298    def __repr__(self): 
     299        return '<SubDataStructure prefix %r for %r>' % ( 
     300            self._prefix, self._ds) 
  • CPS4/products/CPSSchemas/trunk/Field.py

    r47055 r47429  
    155155        return self.default_expr_c(expr_context) 
    156156 
     157    security.declarePrivate('getDefaultItem') 
     158    def getDefaultItem(self): 
     159       """Get a default value for a new item. 
     160 
     161        Used by Capsule List Widget rendering to prepare an "empty" item 
     162        widget for list-like fields. 
     163        """ 
     164       raise NotImplementedError 
     165 
    157166    def _createDefaultExpressionContext(self, datamodel): 
    158167        """Create an expression context for default value evaluation.""" 
  • CPS4/products/CPSSchemas/trunk/Layout.py

    r47083 r47429  
    307307        Cells in a row have additionnal keys: 
    308308         - widget 
     309         - widget_htmlid 
    309310         - widget_mode 
    310311         - widget_css_class 
  • CPS4/products/CPSSchemas/trunk/Widget.py

    r46611 r47429  
    369369        infos[self.getWidgetId()] = { 
    370370            'widget': self, 
     371            'widget_htmlid': self.getHtmlWidgetId(), 
    371372            'widget_mode': mode, 
    372373            'widget_css_class': css_class, 
  • CPS4/products/CPSSchemas/trunk/tests/testCapsule.py

    r47156 r47429  
    8181        return getGlobalSchemaManager() 
    8282 
     83class FakeMimeTypeRegistry(Acquisition.Implicit): 
     84    def lookupExtension(self, name): 
     85        return 'foo/bar' 
    8386 
    8487class IName(IObjectBase): 
     
    127130        ctool = FakeCapsuleTool() 
    128131        portal.portal_capsule = ctool 
    129         utool = FakeUrlTool(portal) 
    130         portal.portal_url = utool 
     132        portal.portal_url = FakeUrlTool(portal) 
     133        portal.mimetypes_registry = FakeMimeTypeRegistry() 
    131134        return portal 
    132135 
     
    233236        layout.addWidget('fname', 'Capsule Object Widget', fields=[], 
    234237                         layout_id='name') # for friends 
    235         layout.addWidget('city', 'String Widget', fields=['?']) 
     238        layout.addWidget('city', 'String Widget', fields=[]) 
    236239        layout.addWidget('cities', 'Capsule List Widget', fields=['cities'], 
    237240                         widget_id='city') 
     
    362365                                    'bin_filename', 
    363366                                  'name_first', 'name_last', 
    364                                   'cities_0', 'cities_1', 
    365                                   'places_0', 'places_1', 
    366                                   'havens_0', 'havens_1', 
     367                                  'cities_0', 'cities_1', 'cities_#', 
     368                                  'places_0', 'places_1', 'places_#', 
     369                                  'havens_0', 'havens_1', 'havens_#', 
    367370                                  'friends_0___name__', 
    368371                                    'friends_0_first', 'friends_0_last', 
     372                                  'friends_#_first', 'friends_#_last', 
    369373                                  'ref', 
    370374                                  ])) 
     
    435439                                  'name_first', 'name_last', 
    436440                                  'cities_0', 'cities_1', 'cities_2', 
    437                                   'places_0', 
     441                                    'cities_#', 
     442                                  'places_0', 'places_#', 
     443                                  'havens_#', 
    438444                                  'friends_0_first', 'friends_0_last', 
    439445                                  'friends_1___name__', 
    440446                                    'friends_1_first', 'friends_1_last', 
     447                                  'friends_#_first', 'friends_#_last', 
    441448                                  'ref', 
    442449                                  ])) 
     
    541548        self.assert_('"Tokyo"' in cities_rendered) 
    542549        self.assert_('"Paris"' in cities_rendered) 
     550        self.assert_('name="widget__cities_#:utf8:ustring"' in cities_rendered) 
    543551        self.assert_('name="widget__cities_.:utf8:ustring"' in cities_rendered) 
    544552 
     
    547555        self.assert_('name="widget__places_0:utf8:ustring"' in places_rendered) 
    548556        self.assert_('"Home"' in places_rendered) 
     557        self.assert_('name="widget__places_#:utf8:ustring"' in places_rendered) 
    549558        self.assert_('name="widget__places_.:utf8:ustring"' in places_rendered) 
    550559 
    551560        havens_rendered = rows[6][0]['widget_rendered'] 
    552561        self.assert_(havens_rendered.startswith('mode edit|')) 
     562        self.assert_('name="widget__havens_#:utf8:ustring"' in havens_rendered) 
    553563        self.assert_('name="widget__havens_.:utf8:ustring"' in havens_rendered) 
    554564 
     
    567577                     in friends_rendered) 
    568578        self.assert_('"Connor"' in friends_rendered) 
     579        self.assert_('name="widget__friends_#_first:utf8:ustring"' 
     580                     in friends_rendered) 
     581        self.assert_('name="widget__friends_#_last:utf8:ustring"' 
     582                     in friends_rendered) 
    569583        self.assert_('name="widget__friends_.:utf8:ustring"' 
    570584                     in friends_rendered)