4 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
4 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
6 """ |
6 """ |
7 __docformat__ = "restructuredtext en" |
7 __docformat__ = "restructuredtext en" |
8 |
8 |
|
9 from warnings import warn |
9 from simplejson import dumps |
10 from simplejson import dumps |
10 |
11 |
11 from logilab.common.compat import any |
12 from logilab.common.compat import any |
12 from logilab.mtconverter import html_escape |
13 from logilab.mtconverter import html_escape |
13 |
14 |
437 'name': self.form_field_name(field, values), |
440 'name': self.form_field_name(field, values), |
438 'id': self.form_field_id(field, values), |
441 'id': self.form_field_id(field, values), |
439 } |
442 } |
440 |
443 |
441 def form_field_value(self, field, values): |
444 def form_field_value(self, field, values): |
442 value = values.get(field.name, field.initial) |
445 """looks for field's value in |
|
446 1. kw args given to render_form |
|
447 2. req.form |
|
448 3. field's initial value |
|
449 """ |
|
450 if field.name in values: |
|
451 value = values[field.name] |
|
452 elif field.name in self.req.form: |
|
453 value = self.req.form[field.name] |
|
454 else: |
|
455 value = field.initial |
443 return field.format_value(self.req, value) |
456 return field.format_value(self.req, value) |
444 |
457 |
445 def form_field_name(self, field, values): |
458 def form_field_name(self, field, values): |
446 return field.name |
459 return field.name |
447 |
460 |
486 def form_render(self, entity, **values): |
499 def form_render(self, entity, **values): |
487 self.entity = entity |
500 self.entity = entity |
488 return super(EntityFieldsForm, self).form_render(**values) |
501 return super(EntityFieldsForm, self).form_render(**values) |
489 |
502 |
490 def form_field_value(self, field, values): |
503 def form_field_value(self, field, values): |
491 try: |
504 """look for field's value with the following rules: |
|
505 1. handle special __type and eid fields |
|
506 2. looks in kw args given to render_form |
|
507 3. looks in req.form |
|
508 4. if entity has an eid: |
|
509 1. looks for an associated attribute / method |
|
510 2. use field's initial value |
|
511 else: |
|
512 1. looks for a default_<fieldname> attribute / method on the form |
|
513 2. use field's initial value |
|
514 |
|
515 values found in step 4 may be a callable which'll then be called. |
|
516 """ |
|
517 if field.name == '__type': |
|
518 value = self.entity.id |
|
519 elif field.name == 'eid': |
|
520 value = self.entity.eid |
|
521 elif field.name in values: |
492 value = values[field.name] |
522 value = values[field.name] |
493 except KeyError: |
523 elif field.name in self.req.form: |
494 value = getattr(self.entity, field.name, field.initial) |
524 value = self.req.form[field.name] |
|
525 else: |
|
526 if self.entity.has_eid(): |
|
527 # use value found on the entity or field's initial value if it's |
|
528 # not an attribute of the entity (XXX may conflicts and get |
|
529 # undesired value) |
|
530 value = getattr(self.entity, field.name, field.initial) |
|
531 else: |
|
532 defaultattr = 'default_%s' % field.name |
|
533 if hasattr(self.entity, defaultattr): |
|
534 # XXX bw compat, default_<field name> on the entity |
|
535 warn('found %s on %s, should be set on a specific form' |
|
536 % (defaultattr, self.entity.id), DeprecationWarning) |
|
537 value = getattr(self.entity, defaultattr) |
|
538 elif hasattr(self, defaultattr): |
|
539 # search for default_<field name> on the form instance |
|
540 value = getattr(self, defaultattr) |
|
541 else: |
|
542 # use field's initial value |
|
543 value = field.initial |
|
544 if callable(value): |
|
545 values = value() |
495 return field.format_value(self.req, value) |
546 return field.format_value(self.req, value) |
496 |
547 |
497 def form_field_name(self, field, values): |
548 def form_field_name(self, field, values): |
498 if field.eidparam: |
549 if field.eidparam: |
499 return eid_param(field.name, self.entity.eid) |
550 return eid_param(field.name, self.entity.eid) |