Source code for magpie.api.management.resource.resource_formats

from magpie.definitions.pyramid_definitions import HTTPInternalServerError
from magpie.definitions.ziggurat_definitions import ResourceService
from magpie.models import resource_tree_service
from magpie.permissions import format_permissions
from magpie.services import SERVICE_TYPE_DICT
from magpie.api.exception import evaluate_call


[docs]def format_resource(resource, permissions=None, basic_info=False): """ Formats the ``resource`` information into JSON. """ def fmt_res(res, perms, info): result = { u"resource_name": str(res.resource_name), u"resource_display_name": str(res.resource_display_name or res.resource_name), u"resource_type": str(res.resource_type), u"resource_id": res.resource_id } if not info: result.update({ u"parent_id": res.parent_id, u"root_service_id": res.root_service_id, u"children": {}, u"permission_names": list() if perms is None else format_permissions(perms) }) return result return evaluate_call( lambda: fmt_res(resource, permissions, basic_info), httpError=HTTPInternalServerError, msgOnFail="Failed to format resource.", content={u"resource": repr(resource), u"permissions": repr(permissions), u"basic_info": str(basic_info)}
)
[docs]def format_resource_tree(children, db_session, resources_perms_dict=None, internal_svc_res_perm_dict=None): """ Generates the formatted service/resource tree with all its children resources by calling :function:`format_resource` recursively. Filters resource permissions with ``resources_perms_dict`` if provided. :param children: service or resource for which to generate the formatted resource tree :param db_session: connection to db :param resources_perms_dict: any pre-established user- or group-specific permissions. Only those are shown if given. :param internal_svc_res_perm_dict: *for this function's use only*, avoid re-fetch of already obtained permissions for corresponding resources :return: formatted resource tree """ internal_svc_res_perm_dict = dict() if internal_svc_res_perm_dict is None else internal_svc_res_perm_dict fmt_res_tree = {} for child_id, child_dict in children.items(): resource = child_dict[u'node'] new_children = child_dict[u'children'] perms = [] # case of pre-specified user/group-specific permissions if resources_perms_dict is not None: if resource.resource_id in resources_perms_dict.keys(): perms = resources_perms_dict[resource.resource_id] # case of full fetch (permitted resource permissions) else: # directly access the resource if it is a service if resource.root_service_id is None: service = resource service_id = resource.resource_id # add to dict only if not already added if service_id not in internal_svc_res_perm_dict: internal_svc_res_perm_dict[service_id] = SERVICE_TYPE_DICT[service.type].resource_types_permissions # obtain corresponding top-level service resource if not already available else: service_id = resource.root_service_id if service_id not in internal_svc_res_perm_dict: service = ResourceService.by_resource_id(service_id, db_session=db_session) internal_svc_res_perm_dict[service_id] = SERVICE_TYPE_DICT[service.type].resource_types_permissions perms = internal_svc_res_perm_dict[service_id][resource.resource_type] fmt_res_tree[child_id] = format_resource(resource, perms) fmt_res_tree[child_id][u'children'] = format_resource_tree(new_children, db_session, resources_perms_dict, internal_svc_res_perm_dict) return fmt_res_tree
[docs]def get_resource_children(resource, db_session): query = resource_tree_service.from_parent_deeper(resource.resource_id, db_session=db_session) tree_struct_dict = resource_tree_service.build_subtree_strut(query) return tree_struct_dict[u'children']
[docs]def format_resource_with_children(resource, db_session): resource_formatted = format_resource(resource) resource_formatted[u'children'] = format_resource_tree( get_resource_children(resource, db_session), db_session=db_session ) return resource_formatted