[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