コード例 #1
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
    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
コード例 #2
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
    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
コード例 #3
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
    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
コード例 #4
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
    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
コード例 #5
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
    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
        }
コード例 #6
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
    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
コード例 #7
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
    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
コード例 #8
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
    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
コード例 #9
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
    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
コード例 #10
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
    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
コード例 #11
0
ファイル: rest.py プロジェクト: rahulyhg/vv_objstore
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)