예제 #1
0
파일: database.py 프로젝트: tro3/schemongo
 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
예제 #2
0
파일: database.py 프로젝트: tro3/schemongo
 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)
예제 #3
0
파일: database.py 프로젝트: tro3/schemongo
 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
예제 #4
0
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)
예제 #5
0
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)
예제 #6
0
파일: database.py 프로젝트: tro3/schemongo
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