[Checkins] SVN: z3c.multiform/Sandbox/src/z3c/multiform/ build up tests of container view

Stefan Martin s.martin at iwm-kmrc.de
Thu Jan 18 11:10:57 EST 2007


Log message for revision 72093:
  build up tests of container view

Changed:
  U   z3c.multiform/Sandbox/src/z3c/multiform/container/container.txt
  U   z3c.multiform/Sandbox/src/z3c/multiform/container/grid.pt
  U   z3c.multiform/Sandbox/src/z3c/multiform/container/views.py
  U   z3c.multiform/Sandbox/src/z3c/multiform/gridform.txt
  U   z3c.multiform/Sandbox/src/z3c/multiform/multiform.py

-=-
Modified: z3c.multiform/Sandbox/src/z3c/multiform/container/container.txt
===================================================================
--- z3c.multiform/Sandbox/src/z3c/multiform/container/container.txt	2007-01-18 14:00:27 UTC (rev 72092)
+++ z3c.multiform/Sandbox/src/z3c/multiform/container/container.txt	2007-01-18 16:10:56 UTC (rev 72093)
@@ -12,7 +12,7 @@
     >>> from zope import interface
     >>> from zope.publisher.browser import TestRequest
     >>> from zope.app.container.sample import SampleContainer
-    >>> from zope.app.annotation.interfaces import IAttributeAnnotatable
+    >>> from zope.annotation.interfaces import IAttributeAnnotatable
     >>> from zope.dublincore.interfaces import IZopeDublinCore
     >>> from zope.dublincore.interfaces import IDCDescriptiveProperties
     >>> from z3c.multiform.container.views import ContainerGridForm

Modified: z3c.multiform/Sandbox/src/z3c/multiform/container/grid.pt
===================================================================
--- z3c.multiform/Sandbox/src/z3c/multiform/container/grid.pt	2007-01-18 14:00:27 UTC (rev 72092)
+++ z3c.multiform/Sandbox/src/z3c/multiform/container/grid.pt	2007-01-18 16:10:56 UTC (rev 72093)
@@ -144,7 +144,7 @@
      </tr>
    </thead>
    <tbody id="subforms-tbody">
-    <tr tal:repeat="subForm view/getForms"
+    <tr tal:repeat="subForm view/iterSubForms"
         tal:attributes="class
                         python:repeat['subForm'].even() and 'even' or 'odd';
                         id subForm/prefix;"

Modified: z3c.multiform/Sandbox/src/z3c/multiform/container/views.py
===================================================================
--- z3c.multiform/Sandbox/src/z3c/multiform/container/views.py	2007-01-18 14:00:27 UTC (rev 72092)
+++ z3c.multiform/Sandbox/src/z3c/multiform/container/views.py	2007-01-18 16:10:56 UTC (rev 72093)
@@ -186,8 +186,8 @@
         # been selected; if not movable, provide an error message
         # explaining that the object can't be moved.
         items = []
-        for form in self.getForms():
-            ob = form.context
+        for key in self.forms:
+            ob = self.subForms[key].context
             name = ob.__name__
             selection = ISelection(ob)
             if not selection.selected:
@@ -226,8 +226,8 @@
         # explaining that the object can't be copied.
 
         items = []
-        for form in self.getForms():
-            ob = form.context
+        for key in self.forms:
+            ob = self.subForms[key].context
             name = ob.__name__
             selection = ISelection(ob)
             if not selection.selected:
@@ -257,15 +257,17 @@
 
     def handle_delete_action(self, action, data):
         """Delete objects specified in a list of object ids"""
-        container = self.context
         toDelete = []
-        for form in self.getForms():
-            if not ISelection(form.context).selected:
+        for key in self.forms:
+            ob = self.subForms[key].context
+            if not ISelection(ob).selected:
                 continue
-            toDelete.append(form.context.__name__)
+            toDelete.append(ob)
         if toDelete:
-            for name in toDelete:
-                del(container[name])
+            for ob in toDelete:
+                container = ob.__parent__
+                if container is not None:
+                    del container[ob.__name__]
             self.form_reset = True
         else:
             self.errors = (_("You didn't specify any ids to delete."),)            
@@ -286,7 +288,6 @@
             self.newInputMode = True
 
     def handle_save_action(self, action, data):
-
         if not isSelected(self,action):
             return
         if form.applyChanges(self.context, self.form_fields,

Modified: z3c.multiform/Sandbox/src/z3c/multiform/gridform.txt
===================================================================
--- z3c.multiform/Sandbox/src/z3c/multiform/gridform.txt	2007-01-18 14:00:27 UTC (rev 72092)
+++ z3c.multiform/Sandbox/src/z3c/multiform/gridform.txt	2007-01-18 16:10:56 UTC (rev 72093)
@@ -263,7 +263,7 @@
     ...     itemFormFactory=OrderForm
     ...     def template(self):
     ...         res = u''
-    ...         for form in self.getForms():
+    ...         for form in self.iterSubForms():
     ...             res += '<div>%s</div>\n' % form.render()
     ...         return res
     ...         
@@ -281,9 +281,13 @@
     >>> request.form['form.handle.sort_on']=u'name'
     >>> gf = Orders2Form(orderMapping2,request)
     >>> gf.update()
-    >>> [(form.context.identifier,
-    ...   form.context.name) for form in gf.getForms()]
-    [(4, 'n0'), (3, 'n1'), (2, 'n2'), (1, 'n3')]
+    >>> for key in gf.forms:
+    ...    form = gf.subForms[key]
+    ...    print (form.context.identifier, form.context.name)
+    (4, 'n0')
+    (3, 'n1')
+    (2, 'n2')
+    (1, 'n3')
 
 and reserve.
 
@@ -292,9 +296,13 @@
     >>> request.form['form.handle.sort_reverse']=u'on'
     >>> gf = Orders2Form(orderMapping2,request)
     >>> gf.update()
-    >>> [(form.context.identifier,
-    ...   form.context.name) for form in gf.getForms()]
-    [(1, 'n3'), (2, 'n2'), (3, 'n1'), (4, 'n0')]
+    >>> for key in gf.forms:
+    ...    form = gf.subForms[key]
+    ...    print (form.context.identifier, form.context.name)
+    (1, 'n3')
+    (2, 'n2')
+    (3, 'n1')
+    (4, 'n0')
 
 We can have default values for sort field and sort direction. Here we just set
 the attributes default_sort_on or default_sort_reverse by hand.
@@ -303,9 +311,13 @@
     >>> gf = Orders2Form(orderMapping2,request)
     >>> gf.default_sort_on = u'name'
     >>> gf.update()
-    >>> [(form.context.identifier,
-    ...   form.context.name) for form in gf.getForms()]
-    [(4, 'n0'), (3, 'n1'), (2, 'n2'), (1, 'n3')]
+    >>> for key in gf.forms:
+    ...    form = gf.subForms[key]
+    ...    print (form.context.identifier, form.context.name)
+    (4, 'n0')
+    (3, 'n1')
+    (2, 'n2')
+    (1, 'n3')
 
 TODO:  
 -----

Modified: z3c.multiform/Sandbox/src/z3c/multiform/multiform.py
===================================================================
--- z3c.multiform/Sandbox/src/z3c/multiform/multiform.py	2007-01-18 14:00:27 UTC (rev 72092)
+++ z3c.multiform/Sandbox/src/z3c/multiform/multiform.py	2007-01-18 16:10:56 UTC (rev 72093)
@@ -1,34 +1,35 @@
 
 import copy
-
-from zope import interface, component
 import zope.i18n
-from zope.app import zapi
-from zope.app.form.interfaces import IInputWidget, IDisplayWidget
-from zope.app.form.browser.interfaces import IWidgetInputErrorView
+
+from zope import interface
+from zope import component
 from zope import formlib
 from zope.formlib import namedtemplate
 from zope.formlib.interfaces import IBoundAction
+from zope.app import zapi
+from zope.app.form.interfaces import IInputWidget, IDisplayWidget
+from zope.app.form.browser.interfaces import IWidgetInputErrorView
 from zope.app.i18n import ZopeMessageFactory as _
 
 import interfaces
 from interfaces import IFormLocation, ISelection
 
 
-def isFormDisplayMode(f,action):
+def isFormDisplayMode(f, action):
     return not f.inputMode
     
-def isFormInputMode(f,action):
+def isFormInputMode(f, action):
     return f.inputMode
 
-def anySubFormInputMode(f,action):
+def anySubFormInputMode(f, action):
     if not interfaces.IMultiForm.providedBy(f):
         f = f.parentForm
     for sf in f.subForms.values():
         if sf.inputMode:
             return True
 
-def allSubFormsDisplayMode(f,action):
+def allSubFormsDisplayMode(f, action):
     if not interfaces.IMultiForm.providedBy(f):
         f = f.parentForm
     for sf in f.subForms.values():
@@ -38,24 +39,30 @@
 
 
 class ItemAction(formlib.form.Action):
-    """an action that is rendered in the itemform object and can
-    handle the toggle between input and display."""
+    """
+    An action that is rendered in the itemform object and can
+    handle the toggle between input and display.
+    """
     
     interface.implements(interfaces.IItemAction)
 
     def __init__(self, label, **options):
-        self.inputMode = options.pop('inputMode',None)
-        super(ItemAction,self).__init__(label,**options)
+        self.inputMode = options.pop('inputMode', None)
+        super(ItemAction,self).__init__(label, **options)
 
+
 class ParentAction(formlib.form.Action):
-    """an action that is rendered in the parent multiform object and
-    is applied to all subForms"""
+    """
+    An action that is rendered in the parent multiform object and
+    is applied to all subForms. It can handle the toggle between
+    input and display.
+    """
     
     interface.implements(interfaces.IParentAction)
 
     def __init__(self, label, **options):
-        self.inputMode = options.pop('inputMode',None)
-        super(ParentAction,self).__init__(label,**options)
+        self.inputMode = options.pop('inputMode', None)
+        super(ParentAction,self).__init__(label, **options)
           
     def __get__(self, form, class_=None):
         if form is None:
@@ -225,24 +232,6 @@
         self.context = component.getMultiAdapter((context, self), IFormLocation)
         self.parentForm = parentForm
 
-    def update(self):
-        self.form_reset = False
-
-        data = {}
-        errors, action = formlib.form.handleSubmit(self.actions, data, self.validate)
-        self.errors = errors
-
-        if errors:
-            self.status = _('There were errors')
-            result = action.failure(data, errors)
-        elif errors is not None:
-            self.form_reset = True
-            result = action.success(data)
-        else:
-            result = None
-
-        self.form_result = result
-
     def setUpWidgets(self, ignore_request=False):
         self.adapters = {}
         self.widgets = setUpWidgets(
@@ -269,60 +258,28 @@
                    if interfaces.IParentAction.providedBy(action)]
         return formlib.form.availableActions(self, actions)
 
+    def __call__(self):
+        return self.render()
 
-# copy from formlib with get
-def availableActions(form, actions):
-    result = []
-    for action in actions:
-        condition = action.condition
-        if (condition is None) or condition(form, action):
-            result.append(action)
-    return result
 
-
 class MultiFormBase(formlib.form.FormBase):
 
     interface.implements(interfaces.IMultiForm)
 
-    itemFormFactory = ItemFormBase
-    subForms={}
     form_fields = []
     actions = []
+
+    itemFormFactory = ItemFormBase
+
+    forms = []
+    subForms= {}
     subActionNames = []
     subFormInputMode = {}
-    selection = []
-    actions = []
-    forms = []
 
     def __init__(self, context, request):
         super(MultiFormBase,self).__init__(context, request)
         self.filter = self.context
 
-    def update(self):
-        self.forms = list(self.filter.keys())
-        self.checkInputMode()
-        self.updateSelection()
-        super(MultiFormBase,self).update()
-        preForms = list(self.getForms())
-        for form in preForms:
-            form.update()
-        self.forms = list(self.filter.keys())            
-        postForms = list(self.getForms())
-        refresh = postForms != preForms
-        for form in postForms:
-            if form.form_reset is True:
-                refresh = True
-            if form.newInputMode is not None:
-                newInputMode = form.newInputMode
-                context = self.filter[form.context.__name__]
-                name = context.__name__
-                self.setUpForm(name, context, newInputMode,
-                               ignore_request=True)
-                self.subFormInputMode[name] = newInputMode
-                refresh = True
-        if refresh:
-            self.refreshSubActionNames()
-
     def setUpWidgets(self, *args, **kw):
         super(MultiFormBase,self).setUpWidgets(*args,**kw)
         self.setUpForms(*args, **kw)
@@ -337,39 +294,28 @@
                     field.for_display=True
         subForm.inputMode = inputMode
         subForm.setPrefix(prefix)
-        subForm.setUpWidgets(*args, **kw)
         self.subForms[name] = subForm
 
     def setUpForms(self, *args, **kw):
-        self.forms = list(self.filter.keys())
+        self.forms = []
         self.subForms = {}
-        for key in self.forms:
-            item = self.filter[key]
+        for key, item in self.filter.items():
+            self.forms.append(key)
             inputMode = self.subFormInputMode.get(key, self.itemFormFactory.inputMode)
             self.setUpForm(key, item, inputMode)
         self.refreshSubActionNames()
 
-    def getForms(self):
-        # we have to use the keys here to support all actions that
-        # modifies the keys of our mapping, e.g. rename, delete
-        keys = self.forms
-        deleted = filter(lambda x: x not in keys, self.subForms.keys())
-        for k in deleted:
-            del(self.subForms[k])
-            try:
-                del(self.subFormInputMode[k])
-            except KeyError:
-                pass
+    def resetForm(self):
         for key in self.forms:
-            if not self.subForms.has_key(key):
-                self.setUpForm(key, self.filter[key],
-                               self.itemFormFactory.inputMode,
-                               ignore_request=True)
-            yield self.subForms[key]
-
+            form = self.subForms[key]
+            inputMode = form.newInputMode
+            if inputMode is not None:
+                self.subFormInputMode[key] = inputMode
+        self.setUpWidgets(ignore_request=True)
+   
     def refreshSubActionNames(self):
         availableActions = set()
-        for subForm in self.getForms():
+        for subForm in self.subForms.values():
             availableActions.update([action.__name__ for action in \
                                      subForm.availableParentActions()])
         self.subActionNames = []
@@ -390,7 +336,17 @@
             if name in self.request.form:
                return action.inputMode
         return None
-   
+
+    def checkInputModeFields(self, key, tmpForm):
+        """Returns true if any of the fields except fields in forceInput
+        has input."""
+        for field in tmpForm.form_fields:
+            if field.__name__ not in tmpForm.forceInput:
+                name = self.prefix + '.sf.' + key + '.' + field.__name__
+                if name in self.request.form:
+                    return True
+        return False
+
     def checkInputMode(self):
         self.subFormInputMode = {}
         # check if any action with inputMode Flag in request
@@ -403,7 +359,7 @@
                     if inputMode is not None:
                         break
         # check form actions
-        if hasattr(self, 'actions'):
+        if inputMode is None and hasattr(self, 'actions'):
             for action in self.actions:
                 if getattr(action, 'inputMode', None) is not None:
                     inputMode = self.checkInputModeAction(action)
@@ -416,24 +372,14 @@
         if len(self.forms) > 0:
             # get any inputfield
             tmpForm = self.newSubForm(self.filter[self.forms[0]])
-            inputField = None
-            for field in tmpForm.form_fields:
-                if not field.for_display and field.__name__ not in tmpForm.forceInput:
-                    inputField = field
-                    break
-            if inputField is None:
-                # should not be happen
-                return
             for key in self.forms:
-                name = self.prefix + '.sf.' + key + '.' + inputField.__name__
-                self.subFormInputMode[key] = (name in self.request.form)
+                self.subFormInputMode[key] = self.checkInputModeFields(key, tmpForm)
 
     def updateSelection(self):
         for field in self.itemFormFactory.form_fields:
             if issubclass(field.field.interface,interfaces.ISelection):
                 form_fields = formlib.form.Fields(field)
-                for key in self.forms:
-                    item = self.filter[key]
+                for key, item in self.filter.items():
                     sForm = SelectionForm(item, self.request, form_fields)
                     name = self.prefix + '.sf.' + key
                     sForm.setPrefix(name)
@@ -448,9 +394,8 @@
                 return
 
     def newSubForm(self, item):
-        """creates a new instance from the itemFormFactory for
-        temporary usage"""
-        return self.itemFormFactory(item,self.request,self)
+        """creates a new instance from the itemFormFactory for item."""
+        return self.itemFormFactory(item, self.request, self)
 
     def availableSubActions(self):
         if self.subActionNames:
@@ -466,7 +411,27 @@
                 action.form = self
                 yield action
 
+    def update(self):
+        self.forms = list(self.filter.keys())
+        self.checkInputMode()
+        self.updateSelection()
+        super(MultiFormBase,self).update()
+        # either (form update or errors) or (subforms update)
+        if not (self.form_reset or self.errors):
+            for key in self.forms:
+                form = self.subForms[key]
+                form.update()
+                if form.errors:
+                    self.form_reset = False
+                    break
+                else:
+                    self.form_reset = self.form_reset or form.form_reset
 
+    def iterSubForms(self):
+        for key in self.forms:
+            yield self.subForms[key]
+
+
 class SelectionForm(formlib.form.FormBase):
     
     def __init__(self, context, request, form_fields):



More information about the Checkins mailing list