summaryrefslogtreecommitdiff
path: root/ishtar_common/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/utils.py')
-rw-r--r--ishtar_common/utils.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index e60fc0913..4f968af31 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -145,6 +145,77 @@ def check_model_access_control(request, model, available_perms=None):
return allowed, own
+def update_data(data_1, data_2):
+ """
+ Update a data directory taking account of key detail
+ """
+ res = {}
+ if not isinstance(data_1, dict) or not isinstance(data_2, dict):
+ return data_1
+ for k in data_1:
+ if k not in data_2:
+ res[k] = data_1[k]
+ else:
+ res[k] = update_data(data_1[k], data_2[k])
+ for k in data_2:
+ if k not in data_1:
+ res[k] = data_2[k]
+ return res
+
+
+def move_dict_data(data, key1, key2):
+ """
+ Move key1 value to key2 value in a data dict
+ :param data: data dict (with subdicts)
+ :param key1: key to move (with __ notation for hierarchy - begining with
+ "data__")
+ :param key2: target key (with __ notation for hierarchy - begining with
+ "data__")
+ :return: result data
+ """
+ keys1 = key1.split('__')
+ keys2 = key2.split('__')
+ value = data
+ for idx, key in enumerate(keys1):
+ if not idx:
+ if key != 'data':
+ return data
+ continue
+ if key not in value:
+ return data
+ if idx == (len(keys1) - 1): # last
+ value = value.pop(key) # remove from data
+ else:
+ value = value[key]
+
+ new_value = data
+ for idx, key in enumerate(keys2):
+ if not idx:
+ if key != 'data':
+ return data
+ continue
+ if idx == (len(keys2) - 1): # last
+ new_value[key] = value
+ else:
+ if key not in new_value:
+ new_value[key] = {}
+ new_value = new_value[key]
+ return data
+
+
+def clean_empty_data(data):
+ """
+ Clean empty branches of a data dict
+ """
+ for key in data.keys():
+ if data[key] in [{}, None, u""]:
+ data.pop(key)
+ continue
+ if isinstance(data[key], dict):
+ data[key] = clean_empty_data(data[key])
+ return data
+
+
class MultiValueDict(BaseMultiValueDict):
def get(self, *args, **kwargs):
v = super(MultiValueDict, self).getlist(*args, **kwargs)