164 return field |
164 return field |
165 |
165 |
166 def add_media(self): |
166 def add_media(self): |
167 """adds media (CSS & JS) required by this widget""" |
167 """adds media (CSS & JS) required by this widget""" |
168 if self.needs_js: |
168 if self.needs_js: |
169 self.req.add_js(self.needs_js) |
169 self._cw.add_js(self.needs_js) |
170 if self.needs_css: |
170 if self.needs_css: |
171 self.req.add_css(self.needs_css) |
171 self._cw.add_css(self.needs_css) |
172 |
172 |
173 def form_render(self, **values): |
173 def form_render(self, **values): |
174 """render this form, using the renderer given in args or the default |
174 """render this form, using the renderer given in args or the default |
175 FormRenderer() |
175 FormRenderer() |
176 """ |
176 """ |
178 if renderer is None: |
178 if renderer is None: |
179 renderer = self.form_default_renderer() |
179 renderer = self.form_default_renderer() |
180 return renderer.render(self, values) |
180 return renderer.render(self, values) |
181 |
181 |
182 def form_default_renderer(self): |
182 def form_default_renderer(self): |
183 return self.vreg['formrenderers'].select(self.form_renderer_id, |
183 return self._cw.vreg['formrenderers'].select(self.form_renderer_id, |
184 self.req, rset=self.rset, |
184 self._cw, rset=self.cw_rset, |
185 row=self.row, col=self.col) |
185 row=self.cw_row, col=self.cw_col) |
186 |
186 |
187 def form_build_context(self, rendervalues=None): |
187 def form_build_context(self, rendervalues=None): |
188 """build form context values (the .context attribute which is a |
188 """build form context values (the .context attribute which is a |
189 dictionary with field instance as key associated to a dictionary |
189 dictionary with field instance as key associated to a dictionary |
190 containing field 'name' (qualified), 'id', 'value' (for display, always |
190 containing field 'name' (qualified), 'id', 'value' (for display, always |
227 else: |
227 else: |
228 value = self.form_field_value(field, load_bytes) |
228 value = self.form_field_value(field, load_bytes) |
229 if callable(value): |
229 if callable(value): |
230 value = value(self) |
230 value = value(self) |
231 if value != INTERNAL_FIELD_VALUE: |
231 if value != INTERNAL_FIELD_VALUE: |
232 value = field.format_value(self.req, value) |
232 value = field.format_value(self._cw, value) |
233 return value |
233 return value |
234 |
234 |
235 def _req_display_value(self, field): |
235 def _req_display_value(self, field): |
236 qname = self.form_field_name(field) |
236 qname = self.form_field_name(field) |
237 if qname in self.form_previous_values: |
237 if qname in self.form_previous_values: |
238 return self.form_previous_values[qname] |
238 return self.form_previous_values[qname] |
239 if qname in self.req.form: |
239 if qname in self._cw.form: |
240 return self.req.form[qname] |
240 return self._cw.form[qname] |
241 if field.name in self.req.form: |
241 if field.name in self._cw.form: |
242 return self.req.form[field.name] |
242 return self._cw.form[field.name] |
243 return None |
243 return None |
244 |
244 |
245 def form_field_value(self, field, load_bytes=False): |
245 def form_field_value(self, field, load_bytes=False): |
246 """return field's *typed* value""" |
246 """return field's *typed* value""" |
247 myattr = '%s_%s_default' % (field.role, field.name) |
247 myattr = '%s_%s_default' % (field.role, field.name) |
259 return u'<span class="error">%s</span>' % self.form_valerror.errors[field.name] |
259 return u'<span class="error">%s</span>' % self.form_valerror.errors[field.name] |
260 return u'' |
260 return u'' |
261 |
261 |
262 def form_field_format(self, field): |
262 def form_field_format(self, field): |
263 """return MIME type used for the given (text or bytes) field""" |
263 """return MIME type used for the given (text or bytes) field""" |
264 return self.req.property_value('ui.default-text-format') |
264 return self._cw.property_value('ui.default-text-format') |
265 |
265 |
266 def form_field_encoding(self, field): |
266 def form_field_encoding(self, field): |
267 """return encoding used for the given (text) field""" |
267 """return encoding used for the given (text) field""" |
268 return self.req.encoding |
268 return self._cw.encoding |
269 |
269 |
270 def form_field_name(self, field): |
270 def form_field_name(self, field): |
271 """return qualified name for the given field""" |
271 """return qualified name for the given field""" |
272 return field.name |
272 return field.name |
273 |
273 |
301 def __init__(self, *args, **kwargs): |
301 def __init__(self, *args, **kwargs): |
302 self.edited_entity = kwargs.pop('entity', None) |
302 self.edited_entity = kwargs.pop('entity', None) |
303 msg = kwargs.pop('submitmsg', None) |
303 msg = kwargs.pop('submitmsg', None) |
304 super(EntityFieldsForm, self).__init__(*args, **kwargs) |
304 super(EntityFieldsForm, self).__init__(*args, **kwargs) |
305 if self.edited_entity is None: |
305 if self.edited_entity is None: |
306 self.edited_entity = self.complete_entity(self.row or 0, self.col or 0) |
306 self.edited_entity = self.complete_entity(self.cw_row or 0, self.cw_col or 0) |
307 self.form_add_hidden('__type', eidparam=True) |
307 self.form_add_hidden('__type', eidparam=True) |
308 self.form_add_hidden('eid') |
308 self.form_add_hidden('eid') |
309 if kwargs.get('mainform', True): # mainform default to true in parent |
309 if kwargs.get('mainform', True): # mainform default to true in parent |
310 self.form_add_hidden(u'__maineid', self.edited_entity.eid) |
310 self.form_add_hidden(u'__maineid', self.edited_entity.eid) |
311 # If we need to directly attach the new object to another one |
311 # If we need to directly attach the new object to another one |
312 if self.req.list_form_param('__linkto'): |
312 if self._cw.list_form_param('__linkto'): |
313 for linkto in self.req.list_form_param('__linkto'): |
313 for linkto in self._cw.list_form_param('__linkto'): |
314 self.form_add_hidden('__linkto', linkto) |
314 self.form_add_hidden('__linkto', linkto) |
315 if msg: |
315 if msg: |
316 msg = '%s %s' % (msg, self.req._('and linked')) |
316 msg = '%s %s' % (msg, self._cw._('and linked')) |
317 else: |
317 else: |
318 msg = self.req._('entity linked') |
318 msg = self._cw._('entity linked') |
319 if msg: |
319 if msg: |
320 self.form_add_hidden('__message', msg) |
320 self.form_add_hidden('__message', msg) |
321 |
321 |
322 def _field_has_error(self, field): |
322 def _field_has_error(self, field): |
323 """return true if the field has some error in given validation exception |
323 """return true if the field has some error in given validation exception |
359 def _form_field_default_value(self, field, load_bytes): |
359 def _form_field_default_value(self, field, load_bytes): |
360 defaultattr = 'default_%s' % field.name |
360 defaultattr = 'default_%s' % field.name |
361 if hasattr(self.edited_entity, defaultattr): |
361 if hasattr(self.edited_entity, defaultattr): |
362 # XXX bw compat, default_<field name> on the entity |
362 # XXX bw compat, default_<field name> on the entity |
363 warn('found %s on %s, should be set on a specific form' |
363 warn('found %s on %s, should be set on a specific form' |
364 % (defaultattr, self.edited_entity.id), DeprecationWarning) |
364 % (defaultattr, self.edited_entity.__regid__), DeprecationWarning) |
365 value = getattr(self.edited_entity, defaultattr) |
365 value = getattr(self.edited_entity, defaultattr) |
366 if callable(value): |
366 if callable(value): |
367 value = value() |
367 value = value() |
368 else: |
368 else: |
369 value = super(EntityFieldsForm, self).form_field_value(field, |
369 value = super(EntityFieldsForm, self).form_field_value(field, |
370 load_bytes) |
370 load_bytes) |
371 return value |
371 return value |
372 |
372 |
373 def form_default_renderer(self): |
373 def form_default_renderer(self): |
374 return self.vreg['formrenderers'].select( |
374 return self._cw.vreg['formrenderers'].select( |
375 self.form_renderer_id, self.req, rset=self.rset, row=self.row, |
375 self.form_renderer_id, self._cw, rset=self.cw_rset, row=self.cw_row, |
376 col=self.col, entity=self.edited_entity) |
376 col=self.cw_col, entity=self.edited_entity) |
377 |
377 |
378 ## def form_build_context(self, values=None): |
378 ## def form_build_context(self, values=None): |
379 ## """overriden to add edit[s|o] hidden fields and to ensure schema fields |
379 ## """overriden to add edit[s|o] hidden fields and to ensure schema fields |
380 ## have eidparam set to True |
380 ## have eidparam set to True |
381 ## """ |
381 ## """ |
402 if attr == 'eid': |
402 if attr == 'eid': |
403 return entity.eid |
403 return entity.eid |
404 if not field.eidparam: |
404 if not field.eidparam: |
405 return super(EntityFieldsForm, self).form_field_value(field, load_bytes) |
405 return super(EntityFieldsForm, self).form_field_value(field, load_bytes) |
406 if attr == '__type': |
406 if attr == '__type': |
407 return entity.id |
407 return entity.__regid__ |
408 if self.schema.rschema(attr).is_final(): |
408 if self._cw.schema.rschema(attr).is_final(): |
409 attrtype = entity.e_schema.destination(attr) |
409 attrtype = entity.e_schema.destination(attr) |
410 if attrtype == 'Password': |
410 if attrtype == 'Password': |
411 return entity.has_eid() and INTERNAL_FIELD_VALUE or '' |
411 return entity.has_eid() and INTERNAL_FIELD_VALUE or '' |
412 if attrtype == 'Bytes': |
412 if attrtype == 'Bytes': |
413 if entity.has_eid(): |
413 if entity.has_eid(): |
432 """return MIME type used for the given (text or bytes) field""" |
432 """return MIME type used for the given (text or bytes) field""" |
433 entity = self.edited_entity |
433 entity = self.edited_entity |
434 if field.eidparam and entity.e_schema.has_metadata(field.name, 'format') and ( |
434 if field.eidparam and entity.e_schema.has_metadata(field.name, 'format') and ( |
435 entity.has_eid() or '%s_format' % field.name in entity): |
435 entity.has_eid() or '%s_format' % field.name in entity): |
436 return self.edited_entity.attr_metadata(field.name, 'format') |
436 return self.edited_entity.attr_metadata(field.name, 'format') |
437 return self.req.property_value('ui.default-text-format') |
437 return self._cw.property_value('ui.default-text-format') |
438 |
438 |
439 def form_field_encoding(self, field): |
439 def form_field_encoding(self, field): |
440 """return encoding used for the given (text) field""" |
440 """return encoding used for the given (text) field""" |
441 entity = self.edited_entity |
441 entity = self.edited_entity |
442 if field.eidparam and entity.e_schema.has_metadata(field.name, 'encoding') and ( |
442 if field.eidparam and entity.e_schema.has_metadata(field.name, 'encoding') and ( |
468 vocabfunc = getattr(self.edited_entity, method) |
468 vocabfunc = getattr(self.edited_entity, method) |
469 except AttributeError: |
469 except AttributeError: |
470 vocabfunc = getattr(self, '%s_relation_vocabulary' % role) |
470 vocabfunc = getattr(self, '%s_relation_vocabulary' % role) |
471 else: |
471 else: |
472 warn('found %s on %s, should be set on a specific form' |
472 warn('found %s on %s, should be set on a specific form' |
473 % (method, self.edited_entity.id), DeprecationWarning) |
473 % (method, self.edited_entity.__regid__), DeprecationWarning) |
474 # NOTE: it is the responsibility of `vocabfunc` to sort the result |
474 # NOTE: it is the responsibility of `vocabfunc` to sort the result |
475 # (direclty through RQL or via a python sort). This is also |
475 # (direclty through RQL or via a python sort). This is also |
476 # important because `vocabfunc` might return a list with |
476 # important because `vocabfunc` might return a list with |
477 # couples (label, None) which act as separators. In these |
477 # couples (label, None) which act as separators. In these |
478 # cases, it doesn't make sense to sort results afterwards. |
478 # cases, it doesn't make sense to sort results afterwards. |
508 """defaut vocabulary method for the given relation, looking for |
508 """defaut vocabulary method for the given relation, looking for |
509 relation's object entities (i.e. self is the subject) |
509 relation's object entities (i.e. self is the subject) |
510 """ |
510 """ |
511 entity = self.edited_entity |
511 entity = self.edited_entity |
512 if isinstance(rtype, basestring): |
512 if isinstance(rtype, basestring): |
513 rtype = entity.schema.rschema(rtype) |
513 rtype = self._cw.vreg.schema.rschema(rtype) |
514 done = None |
514 done = None |
515 assert not rtype.is_final(), rtype |
515 assert not rtype.is_final(), rtype |
516 if entity.has_eid(): |
516 if entity.has_eid(): |
517 done = set(e.eid for e in getattr(entity, str(rtype))) |
517 done = set(e.eid for e in getattr(entity, str(rtype))) |
518 result = [] |
518 result = [] |
530 """defaut vocabulary method for the given relation, looking for |
530 """defaut vocabulary method for the given relation, looking for |
531 relation's subject entities (i.e. self is the object) |
531 relation's subject entities (i.e. self is the object) |
532 """ |
532 """ |
533 entity = self.edited_entity |
533 entity = self.edited_entity |
534 if isinstance(rtype, basestring): |
534 if isinstance(rtype, basestring): |
535 rtype = entity.schema.rschema(rtype) |
535 rtype = self._cw.vreg.schema.rschema(rtype) |
536 done = None |
536 done = None |
537 if entity.has_eid(): |
537 if entity.has_eid(): |
538 done = set(e.eid for e in getattr(entity, 'reverse_%s' % rtype)) |
538 done = set(e.eid for e in getattr(entity, 'reverse_%s' % rtype)) |
539 result = [] |
539 result = [] |
540 rsetsize = None |
540 rsetsize = None |