def include_group_relationships(document, groups): user_ids = set() for group in groups: user_ids.add(group['owner_id']) user_ids.update(group['members']) user_ids.update(group['admins']) json_api_include(document, UserSchema(), local.model.get_users(user_ids))
def fetch_worksheet(uuid): worksheet = get_worksheet_info( uuid, fetch_items=True, fetch_permission=True, ) # Build response document document = WorksheetSchema().dump(worksheet).data # Include items json_api_include(document, WorksheetItemSchema(), worksheet['items']) # Include bundles bundle_uuids = { item['bundle_uuid'] for item in worksheet['items'] if item['type'] == worksheet_util.TYPE_BUNDLE and item['bundle_uuid'] is not None } bundle_infos = get_bundle_infos(bundle_uuids).values() json_api_include(document, BundleSchema(), bundle_infos) # Include users user_ids = {b['owner_id'] for b in bundle_infos} user_ids.add(worksheet['owner_id']) if user_ids: json_api_include(document, UserSchema(), local.model.get_users(user_ids)) # Include subworksheets subworksheet_uuids = { item['subworksheet_uuid'] for item in worksheet['items'] if item['type'] == worksheet_util.TYPE_WORKSHEET and item['subworksheet_uuid'] is not None } json_api_include( document, WorksheetSchema(), local.model.batch_get_worksheets(fetch_items=False, uuid=subworksheet_uuids)) # FIXME: tokenizing directive args # value_obj = formatting.string_to_tokens(value) if type == worksheet_util.TYPE_DIRECTIVE else value # Include permissions json_api_include(document, WorksheetPermissionSchema(), worksheet['group_permissions']) return document
def build_bundles_document(bundle_uuids): include_set = query_get_json_api_include_set(supported={ 'owner', 'group_permissions', 'children', 'host_worksheets' }) bundles_dict = get_bundle_infos( bundle_uuids, get_children='children' in include_set, get_permissions='group_permissions' in include_set, get_host_worksheets='host_worksheets' in include_set, ignore_not_found=False, ) # Create list of bundles in original order bundles = [bundles_dict[uuid] for uuid in bundle_uuids] # Build response document document = BundleSchema(many=True).dump(bundles).data # Shim in display metadata used by the front-end application if query_get_bool('include_display_metadata', default=False): for bundle, data in zip(bundles, document['data']): bundle_class = get_bundle_subclass(bundle['bundle_type']) json_api_meta( data, { 'editable_metadata_keys': worksheet_util.get_editable_metadata_fields(bundle_class), 'metadata_type': worksheet_util.get_metadata_types(bundle_class), }, ) if 'owner' in include_set: owner_ids = set(b['owner_id'] for b in bundles if b['owner_id'] is not None) json_api_include( document, UserSchema(), local.model.get_users(user_ids=owner_ids, limit=len(owner_ids))['results'], ) if 'group_permissions' in include_set: for bundle in bundles: json_api_include(document, BundlePermissionSchema(), bundle.get('group_permissions', [])) if 'children' in include_set: for bundle in bundles: json_api_include(document, BundleSchema(), bundle.get('children', [])) if 'host_worksheets' in include_set: for bundle in bundles: json_api_include(document, WorksheetSchema(), bundle.get('host_worksheets', [])) return document
def fetch_worksheets(): """ Fetch worksheets by worksheet specs (names) OR search keywords. Query parameters: - `include`: comma-separated list of related resources to include, such as "owner" """ keywords = query_get_list('keywords') specs = query_get_list('specs') base_worksheet_uuid = request.query.get('base') include_set = query_get_json_api_include_set( supported={'owner', 'group_permissions'}) if specs: uuids = [ get_worksheet_uuid_or_create(base_worksheet_uuid, spec) for spec in specs ] worksheets = [ w.to_dict() for w in local.model.batch_get_worksheets(fetch_items=False, uuid=uuids) ] else: keywords = resolve_owner_in_keywords(keywords) worksheets = local.model.search_worksheets(request.user.user_id, keywords) # Build response document document = WorksheetSchema(many=True).dump(worksheets).data # Include users if 'owner' in include_set: owner_ids = {w['owner_id'] for w in worksheets} if owner_ids: json_api_include( document, UserSchema(), local.model.get_users(user_ids=owner_ids)['results']) # Include permissions if 'group_permissions' in include_set: for w in worksheets: if 'group_permissions' in w: json_api_include(document, WorksheetPermissionSchema(), w['group_permissions']) return document
def fetch_worksheets(): """ Fetch bundles by bundle specs OR search keywords. """ keywords = query_get_list('keywords') specs = query_get_list('specs') base_worksheet_uuid = request.query.get('base') if specs: uuids = [ get_worksheet_uuid_or_create(base_worksheet_uuid, spec) for spec in specs ] worksheets = [ w.to_dict() for w in local.model.batch_get_worksheets(fetch_items=False, uuid=uuids) ] else: keywords = resolve_owner_in_keywords(keywords) worksheets = local.model.search_worksheets(request.user.user_id, keywords) # Build response document document = WorksheetSchema(many=True).dump(worksheets).data # Include users owner_ids = {w['owner_id'] for w in worksheets} if owner_ids: json_api_include(document, UserSchema(), local.model.get_users(owner_ids)) # Include permissions for w in worksheets: if 'group_permissions' in w: json_api_include(document, WorksheetPermissionSchema(), w['group_permissions']) return document
def fetch_worksheets(): """ Fetch worksheets by worksheet specs (names) OR search keywords. Query parameters: - `include`: comma-separated list of related resources to include, such as "owner" """ keywords = query_get_list('keywords') specs = query_get_list('specs') base_worksheet_uuid = request.query.get('base') include_set = query_get_json_api_include_set(supported={'owner', 'group_permissions'}) if specs: uuids = [get_worksheet_uuid_or_create(base_worksheet_uuid, spec) for spec in specs] worksheets = [ w.to_dict() for w in local.model.batch_get_worksheets(fetch_items=False, uuid=uuids) ] else: keywords = resolve_owner_in_keywords(keywords) worksheets = local.model.search_worksheets(request.user.user_id, keywords) # Build response document document = WorksheetSchema(many=True).dump(worksheets).data # Include users if 'owner' in include_set: owner_ids = {w['owner_id'] for w in worksheets} if owner_ids: json_api_include(document, UserSchema(), local.model.get_users(owner_ids)) # Include permissions if 'group_permissions' in include_set: for w in worksheets: if 'group_permissions' in w: json_api_include(document, WorksheetPermissionSchema(), w['group_permissions']) return document
def build_bundles_document(bundle_uuids): bundles_dict = get_bundle_infos( bundle_uuids, get_children=True, get_permissions=True, get_host_worksheets=True, ) # Create list of bundles in original order try: bundles = [bundles_dict[uuid] for uuid in bundle_uuids] except KeyError as e: abort(httplib.NOT_FOUND, "Bundle %s not found" % e.args[0]) # Build response document document = BundleSchema(many=True).dump(bundles).data # Shim in editable metadata keys # Used by the front-end application for bundle, data in izip(bundles, document['data']): json_api_meta( data, { 'editable_metadata_keys': worksheet_util.get_editable_metadata_fields( get_bundle_subclass(bundle['bundle_type'])) }) # Include users owner_ids = set(b['owner_id'] for b in bundles) json_api_include(document, UserSchema(), local.model.get_users(owner_ids)) # Include permissions for bundle in bundles: json_api_include(document, BundlePermissionSchema(), bundle['group_permissions']) # Include child bundles children_uuids = set(c['uuid'] for bundle in bundles for c in bundle['children']) json_api_include(document, BundleSchema(), get_bundle_infos(children_uuids).values()) return document
def fetch_worksheet(uuid): """ Fetch a single worksheet by UUID. Query parameters: - `include`: comma-separated list of related resources to include, such as "owner" """ include_set = query_get_json_api_include_set( supported={ 'owner', 'group_permissions', 'items', 'items.bundle', 'items.bundle.owner', 'items.subworksheet', } ) worksheet = get_worksheet_info( uuid, fetch_items='items' in include_set, fetch_permissions='group_permissions' in include_set, ) # Build response document document = WorksheetSchema().dump(worksheet).data # Include items if 'items' in include_set: json_api_include(document, WorksheetItemSchema(), worksheet['items']) user_ids = set() # Include bundles if 'items.bundle' in include_set: bundle_uuids = { item['bundle_uuid'] for item in worksheet['items'] if item['type'] == worksheet_util.TYPE_BUNDLE and item['bundle_uuid'] is not None } bundle_infos = get_bundle_infos(bundle_uuids).values() json_api_include(document, BundleSchema(), bundle_infos) if 'items.bundle.owner' in include_set: user_ids.update({b['owner_id'] for b in bundle_infos}) # Include users if 'owner' in include_set: user_ids.add(worksheet['owner_id']) if user_ids: json_api_include(document, UserSchema(), local.model.get_users(user_ids)) # Include subworksheets if 'items.subworksheets' in include_set: subworksheet_uuids = { item['subworksheet_uuid'] for item in worksheet['items'] if item['type'] == worksheet_util.TYPE_WORKSHEET and item['subworksheet_uuid'] is not None } json_api_include( document, WorksheetSchema(), local.model.batch_get_worksheets(fetch_items=False, uuid=subworksheet_uuids), ) # Include permissions if 'group_permissions' in include_set: json_api_include(document, WorksheetPermissionSchema(), worksheet['group_permissions']) return document
def fetch_worksheet(uuid): """ Fetch a single worksheet by UUID. Query parameters: - `include`: comma-separated list of related resources to include, such as "owner" """ include_set = query_get_json_api_include_set( supported={ 'owner', 'group_permissions', 'items', 'items.bundle', 'items.bundle.owner', 'items.subworksheet', }) worksheet = get_worksheet_info( uuid, fetch_items='items' in include_set, fetch_permissions='group_permissions' in include_set, ) # Build response document document = WorksheetSchema().dump(worksheet).data # Include items if 'items' in include_set: json_api_include(document, WorksheetItemSchema(), worksheet['items']) user_ids = set() # Include bundles if 'items.bundle' in include_set: bundle_uuids = { item['bundle_uuid'] for item in worksheet['items'] if item['type'] == worksheet_util.TYPE_BUNDLE and item['bundle_uuid'] is not None } bundle_infos = list(get_bundle_infos(bundle_uuids).values()) json_api_include(document, BundleSchema(), bundle_infos) if 'items.bundle.owner' in include_set: user_ids.update({b['owner_id'] for b in bundle_infos}) # Include users if 'owner' in include_set: user_ids.add(worksheet['owner_id']) if user_ids: json_api_include(document, UserSchema(), local.model.get_users(user_ids=user_ids)['results']) # Include subworksheets if 'items.subworksheets' in include_set: subworksheet_uuids = { item['subworksheet_uuid'] for item in worksheet['items'] if item['type'] == worksheet_util.TYPE_WORKSHEET and item['subworksheet_uuid'] is not None } json_api_include( document, WorksheetSchema(), local.model.batch_get_worksheets(fetch_items=False, uuid=subworksheet_uuids), ) # Include permissions if 'group_permissions' in include_set: json_api_include(document, WorksheetPermissionSchema(), worksheet['group_permissions']) return document