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