# HG changeset patch # User Thierry Florac # Date 1488101834 -3600 # Node ID d88cb7dfabfc7f856a71676839c7a6ec16870b44 # Parent 95e1e28acb1974d0e9259c7b1ee937b4778da90b Handle multiple errors snippets (used by ObjectWidget) diff -r 95e1e28acb19 -r d88cb7dfabfc src/pyams_form/form.py --- a/src/pyams_form/form.py Sun Feb 26 10:36:27 2017 +0100 +++ b/src/pyams_form/form.py Sun Feb 26 10:37:14 2017 +0100 @@ -28,7 +28,7 @@ from pyams_template.interfaces import IContentTemplate, ILayoutTemplate from pyams_utils.interfaces import FORBIDDEN_PERMISSION from pyramid_chameleon.interfaces import IChameleonTranslate -from z3c.form.interfaces import DISPLAY_MODE, IErrorViewSnippet +from z3c.form.interfaces import DISPLAY_MODE, IErrorViewSnippet, IMultipleErrors from zope.publisher.interfaces.browser import IBrowserRequest # import packages @@ -255,22 +255,39 @@ if isinstance(error, Exception): error = registry.getMultiAdapter((error, self.request, None, None, self, self.request), IErrorViewSnippet) - error.update() - if hasattr(error, 'widget'): - widget = error.widget - if widget is not None: - errors.setdefault('widgets', []).append({'name': widget.name, - 'label': translate(widget.label), - 'message': translate(error.message)}) + if IMultipleErrors.providedBy(error.error): + for inner_error in error.error.errors: + if hasattr(inner_error, 'widget'): + widget = inner_error.widget + if widget is not None: + errors.setdefault('widgets', []).append({ 'name': widget.name, + 'label': translate(widget.label), + 'message': translate(inner_error.message) }) + else: + errors.setdefault('messages', []).append({ 'message': translate(inner_error.message) }) + else: + errors.setdefault('messages', []).append(translate(inner_error.message)) + else: + if hasattr(error, 'widget'): + widget = error.widget + if widget is not None: + errors.setdefault('widgets', []).append({'name': widget.name, + 'label': translate(widget.label), + 'message': translate(error.message)}) + else: + errors.setdefault('messages', []).append({'message': translate(error.message)}) else: - errors.setdefault('messages', []).append({'message': translate(error.message)}) - else: - errors.setdefault('messages', []).append(translate(error.message)) + errors.setdefault('messages', []).append(translate(error.message)) return errors def get_ajax_output(self, changes): """Extract AJAX POST output""" + for form in self.subforms + self.tabforms: + try: + return form.get_ajax_output(changes) + except NotImplementedError: + pass raise NotImplementedError @@ -334,6 +351,13 @@ return self.get_ajax_output(result) def get_ajax_output(self, changes): + for form in self.subforms + self.tabforms: + try: + output = form.get_ajax_output(changes) + if output is not None: + return output + except NotImplementedError: + pass return {'status': 'reload', 'location': self.nextURL()} @@ -415,6 +439,13 @@ return self.get_ajax_output(changes) def get_ajax_output(self, changes): + for form in self.subforms + self.tabforms: + try: + output = form.get_ajax_output(changes) + if output is not None: + return output + except NotImplementedError: + pass if changes: status = 'success' message = self.successMessage