def create_data_link_params( params: Dict[str, Any]) -> Tuple[DataUnitID, SampleNodeAddress, bool]: ''' Given a dict, extract the parameters to create parameters for creating a data link. Expected keys: id - sample id version - sample version node - sample node upa - workspace object UPA dataid - ID of the data within the workspace object update - whether the link should be updated :param params: the parameters. :returns: a tuple consisting of: 1) The data unit ID that is the target of the link, 2) The sample node that is the target of the link, 3) A boolean that indicates whether the link should be updated if it already exists. :raises MissingParameterError: if any of the required arguments are missing. :raises IllegalParameterError: if any of the arguments are illegal. ''' _check_params(params) sna = SampleNodeAddress( _SampleAddress( _cast(UUID, get_id_from_object(params, ID, required=True)), _cast(int, get_version_from_object(params, required=True))), _cast(str, _check_string_int(params, 'node', True))) duid = get_data_unit_id_from_object(params) return (duid, sna, bool(params.get('update')))
def get_sample_via_data(self, ctx, params): """ Get a sample via a workspace object. Read permissions to a workspace object grants read permissions to all versions of any linked samples, whether the links are expired or not. This method allows for fetching samples when the user does not have explicit read access to the sample. :param params: instance of type "GetSampleViaDataParams" (get_sample_via_data parameters. upa - the workspace UPA of the target object. id - the target sample id. version - the target sample version.) -> structure: parameter "upa" of type "ws_upa" (A KBase Workspace service Unique Permanent Address (UPA). E.g. 5/6/7 where 5 is the workspace ID, 6 the object ID, and 7 the object version.), parameter "id" of type "sample_id" (A Sample ID. Must be globally unique. Always assigned by the Sample service.), parameter "version" of type "version" (The version of a sample. Always > 0.) :returns: instance of type "Sample" (A Sample, consisting of a tree of subsamples and replicates. id - the ID of the sample. user - the user that saved the sample. node_tree - the tree(s) of sample nodes in the sample. The the roots of all trees must be BioReplicate nodes. All the BioReplicate nodes must be at the start of the list, and all child nodes must occur after their parents in the list. name - the name of the sample. Must be less than 255 characters. save_date - the date the sample version was saved. version - the version of the sample.) -> structure: parameter "id" of type "sample_id" (A Sample ID. Must be globally unique. Always assigned by the Sample service.), parameter "user" of type "user" (A user's username.), parameter "node_tree" of list of type "SampleNode" (A node in a sample tree. id - the ID of the node. parent - the id of the parent node for the current node. BioReplicate nodes, and only BioReplicate nodes, do not have a parent. type - the type of the node. meta_controlled - metadata restricted by the sample controlled vocabulary and validators. meta_user - unrestricted metadata.) -> structure: parameter "id" of type "node_id" (A SampleNode ID. Must be unique within a Sample and be less than 255 characters.), parameter "parent" of type "node_id" (A SampleNode ID. Must be unique within a Sample and be less than 255 characters.), parameter "type" of type "samplenode_type" (The type of a sample node. One of: BioReplicate - a biological replicate. Always at the top of the sample tree. TechReplicate - a technical replicate. SubSample - a sub sample that is not a technical replicate.), parameter "meta_controlled" of type "metadata" (Metadata attached to a sample. The UnspecifiedObject map values MUST be a primitive type - either int, float, string, or equivalent typedefs.) -> mapping from type "metadata_key" (A key in a metadata key/value pair. Less than 1000 unicode characters.) to mapping from type "metadata_value_key" (A key for a value associated with a piece of metadata. Less than 1000 unicode characters. Examples: units, value, species) to unspecified object, parameter "meta_user" of type "metadata" (Metadata attached to a sample. The UnspecifiedObject map values MUST be a primitive type - either int, float, string, or equivalent typedefs.) -> mapping from type "metadata_key" (A key in a metadata key/value pair. Less than 1000 unicode characters.) to mapping from type "metadata_value_key" (A key for a value associated with a piece of metadata. Less than 1000 unicode characters. Examples: units, value, species) to unspecified object, parameter "name" of type "sample_name" (A sample name. Must be less than 255 characters.), parameter "save_date" of type "timestamp" (A timestamp in epoch milliseconds.), parameter "version" of type "version" (The version of a sample. Always > 0.) """ # ctx is the context object # return variables are: sample #BEGIN get_sample_via_data upa = _get_upa_from_object(params) sid, ver = _get_sample_address_from_object(params, version_required=True) sample = self._samples.get_sample_via_data( _UserID(ctx[_CTX_USER]), upa, _SampleAddress(sid, ver)) sample = _sample_to_dict(sample) #END get_sample_via_data # At some point might do deeper type checking... if not isinstance(sample, dict): raise ValueError('Method get_sample_via_data return value ' + 'sample is not type dict as required.') # return the results return [sample]
def get_data_links_from_sample(self, ctx, params): """ Get data links to Workspace objects originating from a sample. The user must have read permissions to the sample. Only Workspace objects the user can read are returned. :param params: instance of type "GetDataLinksFromSampleParams" (get_data_links_from_sample parameters. id - the sample ID. version - the sample version. effective_time - the effective time at which the query should be run - the default is the current time. Providing a time allows for reproducibility of previous results. as_admin - run the method as a service administrator. The user must have read administration permissions.) -> structure: parameter "id" of type "sample_id" (A Sample ID. Must be globally unique. Always assigned by the Sample service.), parameter "version" of type "version" (The version of a sample. Always > 0.), parameter "effective_time" of type "timestamp" (A timestamp in epoch milliseconds.), parameter "as_admin" of type "boolean" (A boolean value, 0 for false, 1 for true.) :returns: instance of type "GetDataLinksFromSampleResults" (get_data_links_from_sample results. links - the links. effective_time - the time at which the query was run. This timestamp, if saved, can be used when running the method again to ensure reproducible results. Note that changes to workspace permissions may cause results to change over time.) -> structure: parameter "links" of list of type "DataLink" (A data link from a KBase workspace object to a sample. upa - the workspace UPA of the linked object. dataid - the dataid of the linked data, if any, within the object. If omitted the entire object is linked to the sample. id - the sample id. version - the sample version. node - the sample node. createdby - the user that created the link. created - the time the link was created. expiredby - the user that expired the link, if any. expired - the time the link was expired, if at all.) -> structure: parameter "upa" of type "ws_upa" (A KBase Workspace service Unique Permanent Address (UPA). E.g. 5/6/7 where 5 is the workspace ID, 6 the object ID, and 7 the object version.), parameter "dataid" of type "data_id" (An id for a unit of data within a KBase Workspace object. A single object may contain many data units. A dataid is expected to be unique within a single object. Must be less than 255 characters.), parameter "id" of type "sample_id" (A Sample ID. Must be globally unique. Always assigned by the Sample service.), parameter "version" of type "version" (The version of a sample. Always > 0.), parameter "node" of type "node_id" (A SampleNode ID. Must be unique within a Sample and be less than 255 characters.), parameter "createdby" of type "user" (A user's username.), parameter "created" of type "timestamp" (A timestamp in epoch milliseconds.), parameter "expiredby" of type "user" (A user's username.), parameter "expired" of type "timestamp" (A timestamp in epoch milliseconds.), parameter "effective_time" of type "timestamp" (A timestamp in epoch milliseconds.) """ # ctx is the context object # return variables are: results #BEGIN get_data_links_from_sample sid, ver = _get_sample_address_from_object(params, version_required=True) dt = _get_datetime_from_epochmillseconds_in_object(params, 'effective_time') admin = _check_admin( self._user_lookup, ctx[_CTX_TOKEN], _AdminPermission.READ, # pretty annoying to test ctx.log_info is working, do it manually 'get_data_links_from_sample', ctx.log_info, skip_check=not params.get('as_admin')) links, ts = self._samples.get_links_from_sample( _UserID(ctx[_CTX_USER]), _SampleAddress(sid, ver), dt, as_admin=admin) results = {'links': _links_to_dicts(links), 'effective_time': _datetime_to_epochmilliseconds(ts) } #END get_data_links_from_sample # At some point might do deeper type checking... if not isinstance(results, dict): raise ValueError('Method get_data_links_from_sample return value ' + 'results is not type dict as required.') # return the results return [results]