def _check_singular_references_recursive(self, item, schema, coll_name, id): for key, val in schema.items(): if is_object(val): errs = self._check_singular_references_recursive(item[key], schema[key]['schema'], coll_name, id) if errs: return errs elif is_list_of_objects(val): for x in item[key]: errs = self._check_singular_references_recursive(x, schema[key]['schema']['schema'], coll_name, id) if errs: return errs elif val['type'] == 'reference' and 'required' in val and val['required']: if item[key]['_id'] == id: return True
def _prep_schema(self, schema, coll_name): schema.update({'_id':{'type':'integer'}}) for key, val in schema.items(): if is_object(val): self._prep_schema(schema[key]['schema'], coll_name) elif is_list_of_objects(val): self._prep_schema(schema[key]['schema']['schema'], coll_name) elif is_list_of_references(val): remote = val['schema']['collection'] self.references[remote] = self.references.get(remote, []) self.references[remote].append(coll_name) elif val['type'] == 'reference': remote = val['collection'] self.references[remote] = self.references.get(remote, []) self.references[remote].append(coll_name)
def _remove_references_recursive(self, item, schema, coll_name, id): result = False for key, val in schema.items(): if is_object(val): result = result or self._remove_references_recursive(item[key], schema[key]['schema'], coll_name, id) elif is_list_of_objects(val): for x in item[key]: result = result or self._remove_references_recursive(x, schema[key]['schema']['schema'], coll_name, id) elif is_list_of_references(val): if id in [x['_id'] for x in item[key]]: item[key] = [x for x in item[key] if x['_id'] != id] result = True elif val['type'] == 'reference' and item[key]['_id'] == id: item[key] = None result = True return result
def update_serial_recursive(schema, item, data): for key in data.keys(): if key not in schema: data.pop(key) elif is_object(schema[key]): update_serial_recursive(schema[key]['schema'], item[key], data[key]) elif is_list_of_objects(schema[key]): for subdata in data[key]: subitem = get_by_id(item[key], subdata['_id']) update_serial_recursive(schema[key]['schema']['schema'], subitem, subdata) elif is_list_of_references(schema[key]): data[key] = [_update_single_reference(x) for x in item[key]] elif schema[key]['type'] == 'datetime': data[key] = data[key] and data[key].isoformat() elif schema[key]['type'] == 'reference': data[key] = _update_single_reference(item[key]) for key in schema.keys(): if 'serialize' in schema[key]: data[key] = schema[key]['serialize'](item)
def expand_references(db, schema, data): for key in schema.keys(): if is_object(schema[key]): if key in data: expand_references(db, schema[key]['schema'], data[key]) else: data[key] = None elif is_list_of_objects(schema[key]): if key in data: [expand_references(db, schema[key]['schema']['schema'], x) for x in data[key]] else: data[key] = [] elif is_list_of_references(schema[key]): if key in data: data[key] = [_expand_single_reference(db, schema[key]['schema'], x) for x in data[key] if data[key]] else: data[key] = [] elif schema[key]['type'] == 'reference': if key in data: data[key] = data[key] and _expand_single_reference(db, schema[key], data[key]) else: data[key] = None