def get(self, resource_id): if not current_token.user_id: return error_response(message='request should be on behalf of a user', code=400) args = parse_json_args(self.get_parser.parse_args(), self.get_payload_json_parse_directives) actions = args['actions'] resource_json = g.objstore_colln.find_one( objstore_helper.resource_selector_doc(resource_id), projection=None ) if not resource_json: return error_response(message='resource not found', code=404) referred_objects_graph = PermissionResolver.get_referred_objects_graph( g.objstore_colln, resource_json, {resource_json['_id']: resource_json}) resolved_permissions = dict( ( action, PermissionResolver.resolve_permission_on_obj_with_referred_graph( resource_json, referred_objects_graph, action, current_token.user_id, current_token.group_ids) ) for action in actions ) return resolved_permissions
def post(self, resource_id): current_org_name = get_current_org() args = parse_json_args(self.post_delete_parser.parse_args(), self.post_delete_payload_json_parse_directives) actions = args['actions'] user_ids = args['user_ids'] group_ids = args['group_ids'] def get_user_fn(user_id, projection=None): return get_user(current_org_name, user_id, projection=projection) # TODO! def get_group_fn(group_id, projection=None): return get_group(current_org_name, group_id, projection=projection) try: objstore_helper.add_to_permissions_agent_set( g.objstore_colln, resource_id, current_token.user_id, current_token.group_ids, actions, args['agents_set_name'], get_user_fn, get_group_fn, user_ids=user_ids, group_ids=group_ids) except ObjModelException as e: return error_response(message=e.message, code=e.http_response_code) resource_json = g.objstore_colln.find_one( objstore_helper.resource_selector_doc(resource_id), projection={"permissions": 1}) resource_permissions = resource_json['permissions'] return resource_permissions
def post(self): args = self.post_parser.parse_args() args = parse_json_args(args, self.post_json_parse_directives) resource_jsons = args['resource_jsons'] return_projection = args['return_projection'] created_resource_jsons = [] for n, rj in enumerate(resource_jsons): try: if 'jsonClass' not in rj: raise ObjModelException('jsonClass attribute should exist for update/creation', 403) created_resource_id = objstore_helper.create_or_update( g.objstore_colln, rj, current_token.user_id, current_token.group_ids, initial_agents=g.initial_agents) if created_resource_id is None: created_resource_jsons.append(None) continue created_resource_json = g.objstore_colln.get( created_resource_id, projection=projection_helper.modified_projection(return_projection, ["_id", "jsonClass"])) created_resource_jsons.append(created_resource_json) except ObjModelException as e: return error_response( message='action not allowed at resource {}'.format(n), code=e.http_response_code, details={"error": e.message}) except (ValidationError, TypeError) as e: return error_response( message='schema validation error at resource {}'.format(n), code=400, details={"error": str(e)}) return created_resource_jsons
def get(self): args = parse_json_args( self.get_parser.parse_args(), self.get_payload_json_parse_directives) start_nodes_selector = args['start_nodes_selector'] start_nodes_sort_doc = args['start_nodes_sort_doc'] start_find_ops = OrderedDict() if start_nodes_sort_doc is not None: start_find_ops['sort'] = [start_nodes_sort_doc] if args.get('start_nodes_offset', None) is not None: start_find_ops['skip'] = [args['start_nodes_offset']] if args.get('start_nodes_count', None) is not None: start_find_ops['limit'] = [args['start_nodes_count']] edge_filters_list = args['edge_filters_list'] for ef in edge_filters_list: if not isinstance(ef, dict): return error_response(message='invalid edge_filters_list', code=400) json_class_projection_map = args['json_class_projection_map'] include_ool_data_graph = args['include_ool_data_graph'] from_link_field = args.get('from_link_field') to_link_field = args.get('to_link_field') max_hops = args.get('max_hops', 0) network, start_nodes_ids = objstore_graph_helper.get_network( g.objstore_colln, start_nodes_selector, start_find_ops, {"nodes": {}, "edges": {}}, edge_filters_list, from_link_field, to_link_field, max_hops, current_token.user_id, current_token.group_ids) objstore_graph_helper.project_graph_nodes(network['nodes'], json_class_projection_map, in_place=True) objstore_graph_helper.project_graph_nodes(network['edges'], json_class_projection_map, in_place=True) response = {"network": network, "start_nodes_ids": start_nodes_ids} if include_ool_data_graph: nodes_ool_data_graph = objstore_graph_helper.get_ool_data_graph( g.objstore_colln, network['nodes'], current_token.user_id, current_token.group_ids ) edges_ool_data_graph = objstore_graph_helper.get_ool_data_graph( g.objstore_colln, network['edges'], current_token.user_id, current_token.group_ids ) ool_data_graph = nodes_ool_data_graph ool_data_graph.update(edges_ool_data_graph) objstore_graph_helper.project_graph_nodes(ool_data_graph, json_class_projection_map, in_place=True) response['ool_data_graph'] = ool_data_graph return response, 200
def delete(self, resource_id): args = self.get_parser.parse_args() args = parse_json_args(args, self.delete_payload_json_parse_directives) filter_doc = args['filter_doc'] selector_doc = objstore_helper.annotations_selector_doc(resource_id, custom_filter_doc=filter_doc) deleted_all, deleted_res_ids = objstore_helper.delete_selection( g.objstore_colln, g.data_dir_path, selector_doc, current_token.user_id, current_token.group_ids) return { "deleted_all": deleted_all, "deleted_res_ids": deleted_res_ids }
def post(self): args = parse_json_args( self.post_parser.parse_args(), self.post_payload_json_parse_directives) graph = args['graph'] ool_data_graph = args['ool_data_graph'] should_return_resources = args['should_return_resources'] should_return_oold_resources = args['should_return_oold_resources'] upsert_if_primary_keys_matched = args['upsert_if_primary_keys_matched'] response_projection_map = args['response_projection_map'] for json_class in response_projection_map.keys(): _validate_projection(response_projection_map[json_class]) files = request.files.getlist("files") files_map = dict((f.filename, f) for f in files) try: graph_ids_to_uids_map, ool_data_graph_ids_to_uids_map = objstore_graph_helper.post_graph_with_ool_data( g.objstore_colln, g.data_dir_path, current_token.user_id, current_token.group_ids, graph, ool_data_graph, files_map, initial_agents=g.initial_agents, upsert_if_primary_keys_matched=upsert_if_primary_keys_matched ) except objstore_graph_helper.GraphValidationError as e: return error_response( message=str(e), code=e.http_status_code, error=str(e.error) ) response = {} if should_return_resources: response['graph'] = objstore_graph_helper.get_projected_graph_from_ids_map( g.objstore_colln, graph_ids_to_uids_map, response_projection_map ) else: response['graph'] = graph_ids_to_uids_map if should_return_oold_resources: response['ool_data_graph'] = objstore_graph_helper.get_projected_graph_from_ids_map( g.objstore_colln, ool_data_graph_ids_to_uids_map, response_projection_map ) else: response['ool_data_graph'] = ool_data_graph_ids_to_uids_map return response, 200
def get(self, resource_id): args = self.get_parser.parse_args() args = parse_json_args(args, self.get_payload_json_parse_directives) projection = args['projection'] resource_json = g.objstore_colln.find_one( objstore_helper.resource_selector_doc(resource_id), projection=None ) if not resource_json: return error_response(message='resource not found', code=404) if not PermissionResolver.resolve_permission( resource_json, ObjectPermissions.READ, current_token.user_id, current_token.group_ids, g.objstore_colln): return error_response(message='permission denied', code=403) projection_helper.project_doc(resource_json, projection, in_place=True) return resource_json
def get(self): args = parse_json_args( self.get_parser.parse_args(), self.get_payload_json_parse_directives) start_nodes_selector = args['start_nodes_selector'] start_nodes_sort_doc = args['start_nodes_sort_doc'] start_find_ops = OrderedDict() if start_nodes_sort_doc is not None: start_find_ops['sort'] = [start_nodes_sort_doc] if args.get('start_nodes_offset', None) is not None: start_find_ops['skip'] = [args['start_nodes_offset']] if args.get('start_nodes_count', None) is not None: start_find_ops['limit'] = [args['start_nodes_count']] traverse_key_filter_maps_list = args['traverse_key_filter_maps_list'] for kf_map in traverse_key_filter_maps_list: if not isinstance(kf_map, dict): return error_response(message='invalid traverse_key_filter_maps_list', code=400) json_class_projection_map = args['json_class_projection_map'] include_ool_data_graph = args['include_ool_data_graph'] direction = args.get('direction') max_hops = args.get('max_hops', 0) graph, start_nodes_ids = objstore_graph_helper.get_graph( g.objstore_colln, start_nodes_selector, start_find_ops, {}, traverse_key_filter_maps_list, direction, max_hops, current_token.user_id, current_token.group_ids) objstore_graph_helper.project_graph_nodes(graph, json_class_projection_map, in_place=True) response = {"graph": graph, "start_nodes_ids": start_nodes_ids} if include_ool_data_graph: ool_data_graph = objstore_graph_helper.get_ool_data_graph( g.objstore_colln, graph, current_token.user_id, current_token.group_ids) objstore_graph_helper.project_graph_nodes(ool_data_graph, json_class_projection_map, in_place=True) response['ool_data_graph'] = ool_data_graph return response, 200
def delete(self, resource_id): args = parse_json_args(self.post_delete_parser.parse_args(), self.post_delete_payload_json_parse_directives) actions = args['actions'] user_ids = args['user_ids'] group_ids = args['group_ids'] try: objstore_helper.remove_from_permissions_agent_set( g.objstore_colln, resource_id, current_token.user_id, current_token.group_ids, actions, args['agents_set_name'], user_ids=user_ids, group_ids=group_ids) except ObjModelException as e: return error_response(message=e.message, code=e.http_response_code) resource_json = g.objstore_colln.find_one( objstore_helper.resource_selector_doc(resource_id), projection={"permissions": 1}) resource_permissions = resource_json['permissions'] return resource_permissions
def delete(self): args = self.delete_parser.parse_args() args = parse_json_args(args, self.delete_json_parse_directives) resource_ids = args['resource_ids'] ids_validity = False not in [isinstance(_id, str) for _id in resource_ids] if not ids_validity: return error_response(message='ids should be strings', code=404) delete_report = [] for resource_id in resource_ids: deleted, deleted_res_ids = objstore_helper.delete_tree( g.objstore_colln, g.data_dir_path, resource_id, current_token.user_id, current_token.group_ids) delete_report.append({ "deleted": deleted, "deleted_resource_ids": deleted_res_ids }) return delete_report
def get_requested_resource_jsons(args): json_parse_directives = { "selector_doc": { "allowed_types": (dict, ), "default": {} }, "projection": { "allowed_types": (dict, ), "allow_none": True, "custom_validator": _validate_projection }, "sort_doc": { "allowed_types": (dict, list), "allow_none": True } } args = parse_json_args(args, json_parse_directives) selector_doc = args['selector_doc'] projection = args['projection'] sort_doc = args['sort_doc'] ops = OrderedDict() if sort_doc is not None: ops['sort'] = [sort_doc] if args.get('start', None) is not None and args.get('count', 100) is not None: ops['skip'] = [args['start']] ops['limit'] = [args['count']] try: resource_repr_jsons = objstore_helper.get_read_permitted_resource_jsons( g.objstore_colln, current_token.user_id, current_token.group_ids, selector_doc, projection=projection, ops=ops ) return resource_repr_jsons, 200 except (TypeError, ValueError): error = error_response(message='arguments to operations seems invalid', code=400) abort_with_error_response(error) except Exception as e: error = error_response(message='invalid arguments', code=400) abort_with_error_response(error)