def remove_nulls(data): """Remove None-valued keys from a dictionary, recursively.""" if isinstance(data, dict): for k, v in data.items(): if v is None: data.pop(k) data[k] = remove_nulls(v) elif is_list(data): data = [remove_nulls(d) for d in data if d is not None] return data
def merge_docs(old, new): """Exend the values of the new doc with extra values from the old.""" old = remove_nulls(old) new = dict(remove_nulls(new)) for k, v in old.items(): if k in new: if is_list(v): v = new[k] + v new[k] = unique_list(v) elif isinstance(v, dict): new[k] = merge_docs(v, new[k]) else: new[k] = v return new