diff --git a/splitjson/widgets.py b/splitjson/widgets.py index 7237c0e..d3ea61d 100644 --- a/splitjson/widgets.py +++ b/splitjson/widgets.py @@ -14,6 +14,24 @@ from django.forms.utils import flatatt +def merge_dicts(src_dict, dst_dict): + for k, v in src_dict.items(): + if k not in dst_dict: + dst_dict[k] = v + else: + if type(v) == type(dst_dict[k]): + if isinstance(v, dict): + merge_dicts(v, dst_dict[k]) + elif isinstance(v, list): + dst_dict[k].extend(v) + else: + dst_dict[k] = v + else: + dst_dict[k] = v + + return dst_dict + + class SplitJSONWidget(forms.Widget): def __init__(self, attrs=None, newline='
\n', sep='__', debug=False): @@ -72,9 +90,11 @@ def _prepare_as_ul(self, l): def _to_pack_up(self, root_node, raw_data): - copy_raw_data = copy.deepcopy(raw_data) result = [] + ordered_keys = sorted(raw_data.keys()) + copy_raw_data = copy.deepcopy(raw_data) + def _to_parse_key(k, v): if k.find(self.separator) != -1: apx, _, nk = k.rpartition(self.separator) @@ -84,8 +104,10 @@ def _to_parse_key(k, v): l = [] obj = {} index = None + l.append(v) if apx != root_node: - for key, val in copy_raw_data.items(): + for key in [ok for ok in ordered_keys if ok in copy_raw_data]: + val = copy_raw_data[key] head, _, t = key.rpartition(self.separator) _, _, index = head.rpartition(self.separator) if key is k: @@ -103,7 +125,6 @@ def _to_parse_key(k, v): if obj: for i in obj: l.append(obj[i]) - l.append(v) return _to_parse_key(apx, l) except ValueError: # parse dict @@ -128,7 +149,8 @@ def _to_parse_key(k, v): else: return v - for k, v in raw_data.iteritems(): + for k in ordered_keys: + v = raw_data[k] if k in copy_raw_data: # to transform value from list to string v = v[0] if isinstance(v, list) and len(v) is 1 else v @@ -140,7 +162,7 @@ def _to_parse_key(k, v): try: result.extend(d) except: - result.update(d) + merge_dicts(d, result) return result def value_from_datadict(self, data, files, name):