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 ce68096511a3be25d2537246761f0526830e2f88..5821fb191eaccee44b5edce882b8d480f875bd9e 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 @@ -6,26 +6,25 @@ from Products.ERP5Type.Log import log, DEBUG, INFO, WARNING # XXX We should not use meta_type properly, # XXX We need to discuss this problem.(yusei) -def isListBox(field): - if field.meta_type=='ListBox': - return True - elif field.meta_type=='ProxyField': - template_field = field.getRecursiveTemplateField() - if template_field.meta_type=='ListBox': - return True - return False - -from Products.Formulator.Errors import FormValidationError +def isFieldType(field, type_name): + if field.meta_type == 'ProxyField': + field = field.getRecursiveTemplateField() + return field.meta_type == type_name + +from Products.Formulator.Errors import FormValidationError, ValidationError from ZTUtils import make_query request = REQUEST if REQUEST is None: request = container.REQUEST +# request.form holds POST data thus containing 'field_' + field.id items +# such as 'field_your_some_field' request_form = request.form error_message = '' +translate = context.Base_translateString -# Make this script work alike wether called from another script or by a request +# Make this script work alike no matter if called by a script or a request kw.update(request_form) # Exceptions for UI @@ -63,6 +62,7 @@ if dialog_method == 'Base_editRelation': listbox_uid=kw.get('listbox_uid', None), saved_form_data=kw['saved_form_data']) # Exception for create relation +# Not used in new UI - relation field implemented using JIO calls from JS if dialog_method == 'Base_createRelation': return context.Base_createRelation(form_id=kw['form_id'], selection_name=kw['list_selection_name'], @@ -119,30 +119,27 @@ 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. file_id_list = [] # For uploaded files. for field in form.get_fields(): - k = field.id - v = request.get(k, MARKER) - if v is not MARKER: - if isListBox(field): - listbox_id_list.append(k) - elif can_redirect and (v in (None, [], ()) or hasattr(v, 'read')) : # If we cannot redirect, useless to test it again - can_redirect = 0 - - # Cleanup my_ and your_ prefixes - splitted = k.split('_', 1) - if len(splitted) == 2 and splitted[0] in ('my', 'your'): - if hasattr(v, 'as_dict'): - # This is an encapsulated editor - # convert it - kw.update(v.as_dict()) + field_id = field.id + field_value = request.get(field_id, MARKER) + + if field_value is not MARKER: + if isFieldType(field, "ListBox"): + listbox_id_list.append(field_id) + + # Cleanup my_ and your_ prefixes if present + if field_id.startswith("my_") or field_id.startswith("your_"): + _, field_name = field_id.split('_', 1) + if hasattr(field_value, 'as_dict'): + # This is an encapsulated editor - convert it + kw.update(field_value.as_dict()) else: - kw[splitted[1]] = request_form[splitted[1]] = v + kw[field_name] = request_form[field_name] = field_value else: - kw[k] = request_form[k] = v + kw[field_id] = request_form[field_id] = field_value if len(listbox_id_list): - can_redirect = 0 # Warn if there are more than one listbox in form ... if len(listbox_id_list) > 1: log('Base_callDialogMethod', 'There are %s listboxes in form %s.' % (len(listbox_id_list), form.id)) @@ -183,11 +180,8 @@ if listbox_uid is not None and kw.has_key('list_selection_name'): selected_uids = context.portal_selections.updateSelectionCheckedUidList( kw['list_selection_name'], listbox_uid, uids) -# Remove unused parameter -clean_kw = {} -for k, v in kw.items() : - if v not in (None, [], ()) : - clean_kw[k] = kw[k] +# Remove empty values for make_query. +clean_kw = dict((k, v) for k, v in kw.items() if v not in (None, [], ())) # Handle deferred style, unless we are executing the update action if dialog_method != update_method and clean_kw.get('deferred_style', 0): @@ -205,14 +199,13 @@ if dialog_method != update_method and clean_kw.get('deferred_style', 0): request.set('deferred_style_dialog_method', dialog_method) dialog_method = 'Base_activateSimpleView' - url_params_string = make_query(clean_kw) -# XXX: We always redirect in report mode to make sure portal_skin -# parameter is taken into account by SkinTool. -# If url is too long, we do not redirect to avoid crash. -# XXX: 2000 is an arbitrary value resulted from trial and error. -if (not(can_redirect) or len(url_params_string) > 2000): +# Never redirect in JSON style - do as much as possible here. +# At this point the 'dialog_method' should point to a form (if we are in report) +# if we are not in Deferred mode - then it points to `Base_activateSimpleView` + +if True: if dialog_method != update_method: # When we are not executing the update action, we have to change the skin # manually,