web/views/forms.py
branchstable
changeset 3510 bf746bf4a394
parent 3354 663bd041f17d
child 3512 2ceaa4e40348
--- a/web/views/forms.py	Mon Sep 28 18:58:12 2009 +0200
+++ b/web/views/forms.py	Tue Sep 29 12:37:47 2009 +0200
@@ -174,6 +174,7 @@
         """render this form, using the renderer given in args or the default
         FormRenderer()
         """
+        self.build_context(values)
         renderer = values.pop('renderer', None)
         if renderer is None:
             renderer = self.form_default_renderer()
@@ -184,7 +185,7 @@
                                                 self.req, rset=self.rset,
                                                 row=self.row, col=self.col)
 
-    def form_build_context(self, rendervalues=None):
+    def build_context(self, rendervalues=None):
         """build form context values (the .context attribute which is a
         dictionary with field instance as key associated to a dictionary
         containing field 'name' (qualified), 'id', 'value' (for display, always
@@ -193,6 +194,8 @@
         rendervalues is an optional dictionary containing extra kwargs given to
         form_render()
         """
+        if self.context is not None:
+            return # already built
         self.context = context = {}
         # ensure rendervalues is a dict
         if rendervalues is None:
@@ -372,7 +375,7 @@
             self.form_renderer_id, self.req, rset=self.rset, row=self.row,
             col=self.col, entity=self.edited_entity)
 
-    def form_build_context(self, values=None):
+    def build_context(self, values=None):
         """overriden to add edit[s|o] hidden fields and to ensure schema fields
         have eidparam set to True
 
@@ -380,6 +383,8 @@
         associated field before the (potential) modification made when
         submitting the form.
         """
+        if self.context is not None:
+            return
         eschema = self.edited_entity.e_schema
         for field in self.fields[:]:
             for field in field.actual_fields(self):
@@ -389,7 +394,7 @@
                      eschema.has_object_relation(fieldname))):
                     field.eidparam = True
                     self.fields.append(HiddenInitialValueField(field))
-        return super(EntityFieldsForm, self).form_build_context(values)
+        return super(EntityFieldsForm, self).build_context(values)
 
     def form_field_value(self, field, load_bytes=False):
         """return field's *typed* value
@@ -539,13 +544,13 @@
         return False
 
 
-class CompositeForm(FieldsForm):
+class CompositeFormMixIn(object):
     """form composed of sub-forms"""
     id = 'composite'
     form_renderer_id = id
 
     def __init__(self, *args, **kwargs):
-        super(CompositeForm, self).__init__(*args, **kwargs)
+        super(CompositeFormMixIn, self).__init__(*args, **kwargs)
         self.forms = []
 
     def form_add_subform(self, subform):
@@ -553,17 +558,14 @@
         subform.is_subform = True
         self.forms.append(subform)
 
+    def build_context(self, rendervalues=None):
+        super(CompositeFormMixIn, self).build_context(rendervalues)
+        for form in self.forms:
+            form.build_context(rendervalues)
 
-class CompositeEntityForm(EntityFieldsForm):
-    """form composed of sub-forms"""
-    id = 'composite'
-    form_renderer_id = id
 
-    def __init__(self, *args, **kwargs):
-        super(CompositeEntityForm, self).__init__(*args, **kwargs)
-        self.forms = []
+class CompositeForm(CompositeFormMixIn, FieldsForm):
+    pass
 
-    def form_add_subform(self, subform):
-        """mark given form as a subform and append it"""
-        subform.is_subform = True
-        self.forms.append(subform)
+class CompositeEntityForm(CompositeFormMixIn, EntityFieldsForm):
+    pass # XXX why is this class necessary?