# HG changeset patch
# User Sylvain Thénault <sylvain.thenault@logilab.fr>
# Date 1265806691 -3600
# Node ID f8ac61376b2b5b3e2b2ec8a2cfb77edbb2abcd0a
# Parent  9b7b3303c515d3c7d501d92ceda4ce0ec5cc3978
provides a fallback_on_none_attribute field attribute, allowing to specify default value for attributes of *existing* entities

diff -r 9b7b3303c515 -r f8ac61376b2b web/facet.py
--- a/web/facet.py	Wed Feb 10 13:57:29 2010 +0100
+++ b/web/facet.py	Wed Feb 10 13:58:11 2010 +0100
@@ -519,8 +519,7 @@
         return FacetRangeWidget
 
     def get_widget(self):
-        """return the widget instance to use to display this facet
-        """
+        """return the widget instance to use to display this facet"""
         values = set(value for _, value in self.vocabulary() if value is not None)
         return self.wdgclass(self, min(values), max(values))
 
diff -r 9b7b3303c515 -r f8ac61376b2b web/formfields.py
--- a/web/formfields.py	Wed Feb 10 13:57:29 2010 +0100
+++ b/web/formfields.py	Wed Feb 10 13:58:11 2010 +0100
@@ -112,6 +112,7 @@
     fieldset = None
     order = None
     value = _MARKER
+    fallback_on_none_attribute = False
 
     def __init__(self, name=None, label=_MARKER, widget=None, **kwargs):
         for key, val in kwargs.items():
@@ -218,9 +219,13 @@
             entity = form.edited_entity
             if form._cw.vreg.schema.rschema(self.name).final:
                 if entity.has_eid() or self.name in entity:
-                    return getattr(entity, self.name)
+                    value = getattr(entity, self.name)
+                    if value is not None or not self.fallback_on_none_attribute:
+                        return value
             elif entity.has_eid() or entity.relation_cached(self.name, self.role):
-                return [r[0] for r in entity.related(self.name, self.role)]
+                value = [r[0] for r in entity.related(self.name, self.role)]
+                if value or not self.fallback_on_none_attribute:
+                    return value
         return self.initial_typed_value(form, load_bytes)
 
     def initial_typed_value(self, form, load_bytes):