diff --git a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_callDialogMethod.py b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_callDialogMethod.py index 816061adc13a84340c5867a14513fb84fd52860c..deaa317afec9c065c30ce0677a0726a61020d883 100644 --- a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_callDialogMethod.py +++ b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_callDialogMethod.py @@ -3,6 +3,7 @@ Generic method called when submitting a form in dialog mode. Responsible for validating form data and redirecting to the form action. """ from Products.ERP5Type.Log import log, DEBUG, INFO, WARNING +import json # XXX We should not use meta_type properly, # XXX We need to discuss this problem.(yusei) @@ -14,10 +15,17 @@ def isFieldType(field, type_name): from Products.Formulator.Errors import FormValidationError, ValidationError from ZTUtils import make_query +def failWithMessage(message, request=None): + response = request.RESPONSE if request is not None else context.REQUEST.RESPONSE + response.setStatus(500) + response.setHeader("Content-type", "application/json; charset=utf-8") + return json.dumps({"portal_status_message": str(message)}) + # Kato: I do not understand why we throw away REQUEST from parameters (hidden in **kw) -# and use container.REQUEST just to introduce yet another global state -# because REUQEST from arguments is a different instance than container.REQUEST! -request = container.REQUEST +# and use container.REQUEST just to introduce yet another global state. Maybe because +# container.REQUEST is used in other places. +# Well, REQUEST from arguments is a different instance than container.REQUEST so it will create problems... +request = kw.get('REQUEST', None) or container.REQUEST # request.form holds POST data thus containing 'field_' + field.id items # such as 'field_your_some_field' @@ -81,25 +89,6 @@ if dialog_method == 'Folder_delete': selection_name=kw['selection_name'], md5_object_uid_list=kw['md5_object_uid_list']) - -def handleFormError(form, validation_errors): - """Return correctly rendered form with all errors assigned to its fields.""" - field_errors = form.ErrorFields(validation_errors) - # Pack errors into the request - request.set('field_errors', field_errors) - # Make sure editors are pushed back as values into the REQUEST object - for f in form.get_fields(): - field_id = f.id - if request.has_key(field_id): - value = request.get(field_id) - if callable(value): - value(request) - if silent_mode: - return context.ERP5Document_getHateoas(form=form, REQUEST=request, mode='form'), 'form' - request.RESPONSE.setStatus(400) - return context.ERP5Document_getHateoas(form=form, REQUEST=request, mode='form') - - form = getattr(context, dialog_id) # form can be a python script that returns the form @@ -124,19 +113,25 @@ try: # Form is OK, it's just this field - style so we return back form-wide error # for which we don't have support out-of-the-box thus we manually craft it # XXX TODO: Form-wide validation errors - return handleFormError( - form, - FormValidationError([ - ValidationError( - error_key=None, - field=form.get_field('your_portal_skin'), - error_text=translate( - 'Only ODT, ODS, Hal and HalRestricted skins are allowed for reports '\ - 'in Preferences - User Interface - Report Style')) - ], {})) + return failWithMessage( + translate('Only ODT, ODS, Hal and HalRestricted skins are allowed for reports '\ + 'in Preferences - User Interface - Report Style')) except FormValidationError as validation_errors: - return handleFormError(form, validation_errors) + # Pack errors into the request + field_errors = form.ErrorFields(validation_errors) + request.set('field_errors', field_errors) + # Make sure editors are pushed back as values into the REQUEST object + for f in form.get_fields(): + field_id = f.id + if request.has_key(field_id): + value = request.get(field_id) + if callable(value): + value(request) + if kw.get('silent_mode', False): return context.ERP5Document_getHateoas(form=form, REQUEST=request, mode='form'), 'form' + request.RESPONSE.setStatus(400) + return context.ERP5Document_getHateoas(form=form, REQUEST=request, mode='form') + MARKER = [] # A recognisable default value. Use with 'is', not '=='. listbox_id_list = [] # There should not be more than one listbox - but this give us a way to check. @@ -218,16 +213,9 @@ if dialog_method != update_method and clean_kw.get('deferred_style', 0): # Limit Reports in Deferred style to known working styles if request_form.get('your_portal_skin', None) not in ("ODT", "ODS"): # RJS own validation - deferred option works here only with ODS/ODT skins - return handleFormError( - form, - FormValidationError([ - ValidationError( - error_key=None, - field=form.get_field('your_deferred_style'), - error_text=translate( - 'Deferred reports are possible only with preference '\ - '"Report Style" set to "ODT" or "ODS"')) - ], {})) + return failWithMessage( + translate('Deferred reports are possible only with preference '\ + '"Report Style" set to "ODT" or "ODS"')) # If the action form has report_view as it's method, it if page_template != 'report_view': diff --git a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py index 8f0940d5a8198fdbce059f5ccd0ea0607f85534a..3da1c9208a3a70f6d919fd0bb34565e9feba847c 100644 --- a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py +++ b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py @@ -86,7 +86,7 @@ def ensureSerializable(obj): obj[key] = ensureSerializable(obj[key]) # throw away date's type information and later reconstruct as Zope's DateTime if isinstance(obj, DateTime): - return obj.ISO() + return obj.ISO() + ' ' + obj.timezone() # ISO with timezone if isinstance(obj, (datetime.datetime, datetime.date, datetime.time)): return obj.isoformat() # let us believe that iterables don't contain other unserializable objects diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_pt_form_dialog_js.js b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_pt_form_dialog_js.js index f850b0ef26fcc16858c7b05573708a0793ae8b19..afb20dbe1fdadf5e577b77d593cd3157d7796275 100644 --- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_pt_form_dialog_js.js +++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_pt_form_dialog_js.js @@ -341,17 +341,29 @@ .push(undefined, function (error) { if (error.target !== undefined) { var error_text = 'Encountered an unknown error. Try to resubmit', - promise; - // if we know what the error was, try to precise it for the user + promise_queue = new RSVP.Queue(); + // if we know what the error was, try to precise it for the user if (error.target.status === 400) { error_text = 'Input data has errors'; } else if (error.target.status === 403) { error_text = 'You do not have the permissions to edit the object'; } else if (error.target.status === 0) { error_text = 'Document was not saved! Resubmit when you are online or the document accessible'; + } else if (error.target.status === 500 && error.target.response.type === "application/json") { + promise_queue + .push(function () { + return jIO.util.readBlobAsText(error.target.response); + }) + .push(function (response_text) { + var response = JSON.parse(response_text.target.result); + error_text = response.portal_status_message; + }); } // display translated error_text to user - promise = form_gadget.notifySubmitted() + promise_queue + .push(function () { + return form_gadget.notifySubmitted(); + }) .push(function () { return form_gadget.translate(error_text); }) @@ -364,7 +376,7 @@ // if server validation of form data failed (indicated by response code 400) // we parse out field errors and display them to the user if (error.target.status === 400) { - promise + promise_queue .push(function () { // when the server-side validation returns the error description if (error.target.responseType === "blob") { @@ -377,7 +389,7 @@ return form_gadget.displayFormulatorValidationError(JSON.parse(event.target.result)); }); } - return promise; + return promise_queue; } throw error; }); diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_pt_form_dialog_js.xml b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_pt_form_dialog_js.xml index 3296867b0a2cb8b034ff5c49117ef2c935879ec0..c95807d1571c7a15d53e8cca6b26b1aa3319e92f 100644 --- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_pt_form_dialog_js.xml +++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_erp5_pt_form_dialog_js.xml @@ -230,7 +230,7 @@ </item> <item> <key> <string>serial</string> </key> - <value> <string>963.65326.20561.44834</string> </value> + <value> <string>965.3172.8117.46779</string> </value> </item> <item> <key> <string>state</string> </key> @@ -248,7 +248,7 @@ </tuple> <state> <tuple> - <float>1512740130.49</float> + <float>1516875722.83</float> <string>UTC</string> </tuple> </state>