Changeset 47429
- Timestamp:
- 07/25/06 21:38:59 (2 years ago)
- Files:
-
- CPS4/products/CPSSchemas/trunk/BasicFields.py (modified) (1 diff)
- CPS4/products/CPSSchemas/trunk/BasicWidgets.py (modified) (2 diffs)
- CPS4/products/CPSSchemas/trunk/CapsuleFields.py (modified) (1 diff)
- CPS4/products/CPSSchemas/trunk/CapsuleWidgets.py (modified) (6 diffs)
- CPS4/products/CPSSchemas/trunk/DataStructure.py (modified) (4 diffs)
- CPS4/products/CPSSchemas/trunk/Field.py (modified) (1 diff)
- CPS4/products/CPSSchemas/trunk/Layout.py (modified) (1 diff)
- CPS4/products/CPSSchemas/trunk/Widget.py (modified) (1 diff)
- CPS4/products/CPSSchemas/trunk/skins/cps_schemas/widget_capsulelist_render.pt (added)
- CPS4/products/CPSSchemas/trunk/tests/testCapsule.py (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
CPS4/products/CPSSchemas/trunk/BasicFields.py
r47055 r47429 309 309 310 310 validation_error_msg = 'Not a string list: ' 311 312 def getDefaultItem(self): 313 return u'' 311 314 312 315 def verifyType(self, value): CPS4/products/CPSSchemas/trunk/BasicWidgets.py
r47220 r47429 237 237 """Prepare datastructure from datamodel.""" 238 238 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] 240 244 241 245 def _extractValue(self, value): … … 265 269 else: 266 270 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 268 276 269 277 return not err CPS4/products/CPSSchemas/trunk/CapsuleFields.py
r47421 r47429 78 78 def getDefault(self, datamodel=None): 79 79 return [] 80 81 def getDefaultItem(self): 82 return self._field.getDefault() 80 83 81 84 InitializeClass(CapsuleListField) CPS4/products/CPSSchemas/trunk/CapsuleWidgets.py
r47421 r47429 190 190 """ 191 191 datamodel = datastructure.getDataModel() 192 values = datamodel[self.fields[0]] 192 field_id = self.fields[0] 193 values = datamodel[field_id] 193 194 subdm = SubListItemDataModel(datamodel, values) 194 195 prefix = self.getWidgetId()+'_' … … 204 205 subds[sub_id+'_'+'__name__'] = value['__name__'] 205 206 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) 206 216 207 217 def setWidgetInfo(self, infos, layout_mode, datastructure): … … 212 222 # Now also set widget infos for sub widgets 213 223 datamodel = datastructure.getDataModel() 214 values = datamodel[self.fields[0]] 224 field_id = self.fields[0] 225 values = datamodel[field_id] 215 226 subdm = SubListItemDataModel(datamodel, values) 216 227 prefix = self.getWidgetId()+'_' … … 223 234 subwidget = makeSubWidget(widget, sub_id) 224 235 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) 225 246 subds = SubDataStructure(datastructure, subdm, '') 226 247 subwidget.setWidgetInfo(infos, layout_mode, subds) … … 281 302 if not widget.hidden_empty or rendered: 282 303 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 283 317 render = self._getRenderMethod() 284 318 rendered = render(mode=mode, datastructure=datastructure, … … 418 452 last_modified = '' 419 453 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 430 455 content_url = None 431 456 ob = dm.getProxy() CPS4/products/CPSSchemas/trunk/DataStructure.py
r46990 r47429 41 41 _SESSION_DATASTRUCTURE_KEY = 'CPS_DATASTRUCTURE' 42 42 43 _SUFFIX_RE = re.compile(r'(\d+ )(_.*)?')43 _SUFFIX_RE = re.compile(r'(\d+|#)(_.*)?') 44 44 45 45 class DataStructure(UserDict): … … 165 165 if not key.startswith(prefix): 166 166 continue 167 del self[key]168 167 suffix = key[len(prefix):] 169 168 m = _SUFFIX_RE.match(suffix) … … 171 170 raise ValueError(key) 172 171 nn, rest = m.groups() 172 if nn == '#': 173 # Part of "empty" entry prepared in datastructure, kept 174 continue 175 del self[key] 173 176 n = int(nn) 174 177 if n >= length: … … 293 296 self._ds[self._prefix+key] = value 294 297 298 def __repr__(self): 299 return '<SubDataStructure prefix %r for %r>' % ( 300 self._prefix, self._ds) CPS4/products/CPSSchemas/trunk/Field.py
r47055 r47429 155 155 return self.default_expr_c(expr_context) 156 156 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 157 166 def _createDefaultExpressionContext(self, datamodel): 158 167 """Create an expression context for default value evaluation.""" CPS4/products/CPSSchemas/trunk/Layout.py
r47083 r47429 307 307 Cells in a row have additionnal keys: 308 308 - widget 309 - widget_htmlid 309 310 - widget_mode 310 311 - widget_css_class CPS4/products/CPSSchemas/trunk/Widget.py
r46611 r47429 369 369 infos[self.getWidgetId()] = { 370 370 'widget': self, 371 'widget_htmlid': self.getHtmlWidgetId(), 371 372 'widget_mode': mode, 372 373 'widget_css_class': css_class, CPS4/products/CPSSchemas/trunk/tests/testCapsule.py
r47156 r47429 81 81 return getGlobalSchemaManager() 82 82 83 class FakeMimeTypeRegistry(Acquisition.Implicit): 84 def lookupExtension(self, name): 85 return 'foo/bar' 83 86 84 87 class IName(IObjectBase): … … 127 130 ctool = FakeCapsuleTool() 128 131 portal.portal_capsule = ctool 129 utool = FakeUrlTool(portal)130 portal. portal_url = utool132 portal.portal_url = FakeUrlTool(portal) 133 portal.mimetypes_registry = FakeMimeTypeRegistry() 131 134 return portal 132 135 … … 233 236 layout.addWidget('fname', 'Capsule Object Widget', fields=[], 234 237 layout_id='name') # for friends 235 layout.addWidget('city', 'String Widget', fields=[ '?'])238 layout.addWidget('city', 'String Widget', fields=[]) 236 239 layout.addWidget('cities', 'Capsule List Widget', fields=['cities'], 237 240 widget_id='city') … … 362 365 'bin_filename', 363 366 '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_#', 367 370 'friends_0___name__', 368 371 'friends_0_first', 'friends_0_last', 372 'friends_#_first', 'friends_#_last', 369 373 'ref', 370 374 ])) … … 435 439 'name_first', 'name_last', 436 440 'cities_0', 'cities_1', 'cities_2', 437 'places_0', 441 'cities_#', 442 'places_0', 'places_#', 443 'havens_#', 438 444 'friends_0_first', 'friends_0_last', 439 445 'friends_1___name__', 440 446 'friends_1_first', 'friends_1_last', 447 'friends_#_first', 'friends_#_last', 441 448 'ref', 442 449 ])) … … 541 548 self.assert_('"Tokyo"' in cities_rendered) 542 549 self.assert_('"Paris"' in cities_rendered) 550 self.assert_('name="widget__cities_#:utf8:ustring"' in cities_rendered) 543 551 self.assert_('name="widget__cities_.:utf8:ustring"' in cities_rendered) 544 552 … … 547 555 self.assert_('name="widget__places_0:utf8:ustring"' in places_rendered) 548 556 self.assert_('"Home"' in places_rendered) 557 self.assert_('name="widget__places_#:utf8:ustring"' in places_rendered) 549 558 self.assert_('name="widget__places_.:utf8:ustring"' in places_rendered) 550 559 551 560 havens_rendered = rows[6][0]['widget_rendered'] 552 561 self.assert_(havens_rendered.startswith('mode edit|')) 562 self.assert_('name="widget__havens_#:utf8:ustring"' in havens_rendered) 553 563 self.assert_('name="widget__havens_.:utf8:ustring"' in havens_rendered) 554 564 … … 567 577 in friends_rendered) 568 578 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) 569 583 self.assert_('name="widget__friends_.:utf8:ustring"' 570 584 in friends_rendered)
