tol-sdk 1.8.0__tar.gz → 1.8.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tol_sdk-1.8.0/src/tol_sdk.egg-info → tol_sdk-1.8.2}/PKG-INFO +1 -1
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/pyproject.toml +1 -1
- tol_sdk-1.8.0/src/tol/benchling/sql/extraction_extraction_type_dna.sql → tol_sdk-1.8.2/src/tol/benchling/sql/extraction_containers_dna.sql +54 -64
- tol_sdk-1.8.2/src/tol/benchling/sql/extraction_extraction_type_dna.sql +68 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/extraction_extraction_type_lres.sql +11 -3
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/excel/excel_datasource.py +4 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/pipeline_step/factory.py +14 -4
- tol_sdk-1.8.2/src/tol/validators/sts_fields.py +229 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/types.py +4 -1
- {tol_sdk-1.8.0 → tol_sdk-1.8.2/src/tol_sdk.egg-info}/PKG-INFO +1 -1
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol_sdk.egg-info/SOURCES.txt +1 -0
- tol_sdk-1.8.0/src/tol/validators/sts_fields.py +0 -95
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/LICENSE +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/MANIFEST.in +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/README.md +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/setup.cfg +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/certs/cacert.pem +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/actions/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/actions/action.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/actions/upsert_action.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/action.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/abc/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/abc/auth.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/abc/authorisation.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/asserts.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/blueprint.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/composite.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/config.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/auth/error.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/blueprint.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/controller.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/data_upload.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/aggregation_body.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/aggregation_parameters.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/auth_context.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/authenticate.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/data_body.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/filter_utils.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/list_get_parameters.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/relation_url.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/misc/stats_parameters.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/pipeline_steps.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_base/system.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/api_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/client.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/exception.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/filter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/parser.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/validate.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/api_client/view.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/barcodes/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/barcodes/main.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/benchling_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/benchling_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/benchling_warehouse_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/extraction_extraction_type_rna.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/pacbio_prep.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/pooled_pacbio_prep.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/results_extraction_dna.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/results_extraction_pooled.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/results_extraction_rna.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/results_pacbio_prep.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/results_pacbio_prep_pooled.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/sample.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_hic.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_pacbio.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_rnaseq.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/sequencing_request_sequencing_platform_wgs.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/benchling/sql/tissue_prep.sql +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/board/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/board/blueprint.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/bold_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/client.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/bold/parser.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/cli/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/cli/cli.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/converter/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/converter/yaml/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/converter/yaml/model.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/converter/yaml/yaml_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/client.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/copo_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/copo/parser.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/attribute_metadata.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/core_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/data_loader.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/data_object.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/data_object_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/data_source_attribute_metadata.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/data_source_dict.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/datasource_error.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/datasource_filter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/datasource_utils.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/http_client.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/_filterable.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/_writer.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/aggregator.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/counter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/cursor.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/declare.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/deleter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/detail_getter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/enricher.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/enum.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/group_statter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/inserter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/list_getter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/operator_config.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/page_getter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/relational.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/statter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/summariser.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/updater.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/operator/upserter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/relationship.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/requested_fields.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/session.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/core/validate.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/elastic/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/elastic/elastic_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/elastic/runtime_fields.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/auth.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/eln_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/entities.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/generators.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/eln/sanitise.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/client.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/ena_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/ena_methods.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/filter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/ena/parser.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/excel/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/excel/excel.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/excel/s3_factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_entity_to_benchling_worklist_item_converter_factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_extraction_to_elastic_extraction_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_extraction_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_sample_casm_to_sts_sample_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_sample_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_tissue_prep_to_elastic_tissue_prep_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/benchling_tissue_to_sts_sample_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bioscan_extra_pantheon_species_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bioscan_image_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bioscan_qc_specimen_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bioscan_qc_uksi_entry_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bold_bin_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/bold_sample_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_object_to_portaldb_object_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sample_to_benchling_tissue_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sample_to_bold_sample_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sample_to_elastic_sequencing_request_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sample_to_sts_sample_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sequencing_request_to_elastic_run_data_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_sequencing_request_to_sts_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_species_to_sts_species_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_tolid_to_elastic_curation_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_tolid_to_elastic_genome_note_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/elastic_tolid_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_analysis_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/gap_assembly_to_elastic_assembly_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/genome_notes_genome_note_to_elastic_genome_note_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/goat_taxon_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/grit_issue_to_elastic_curation_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/incoming_sample_to_ena_sample_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/incoming_sample_to_incoming_sample_with_lists_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/informatics_tolid_to_elastic_tolid_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/labwhere_location_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/labwhere_location_to_sts_tray_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/mlwh_extraction_to_elastic_extraction_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/mlwh_run_data_to_elastic_run_data_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/mlwh_sequencing_request_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/skip_null_fields_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_banked_sample_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_manifest_to_elastic_manifest_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_project_to_elastic_sample_update_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_sample_project_to_elastic_sample_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_sample_to_casm_benchling_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_sampleset_to_elastic_sampleset_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/sts_species_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/tolid_specimen_to_elastic_tolid_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/tolqc_data_to_elastic_run_data_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/tolqc_sample_to_elastic_sequencing_request_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/tolqc_species_to_elastic_species_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/treeofsex_species_to_treeofsexwh_species_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/converters/treeofsex_upload_to_treeofsex_attribute_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/logger.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/secrets.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/flows/sequencing_submissions.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/gap/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/gap/gap_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/client.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/filter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/goat_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/goat/parser.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/google_sheets/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/google_sheets/google_sheet_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/irods/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/irods/irods_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/client.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/filter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/jira_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/mapper.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/parser.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/jira/sort.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/json/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/json/json_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/json/s3_json_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/client.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/labwhere_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/labwhere/parser.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/markdown.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/mlwh/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/mlwh/mlwh_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/filter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/prefect_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/prefect/prefect_object.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/s3/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/s3/converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/s3/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/s3/parser.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/s3/s3_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/configuration.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/consumer.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/message_builder.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/messages.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/response_processors.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sciops/sequencing_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/services/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/services/s3_client.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/benchling.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/benchling_warehouse.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/bioscan.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/bioscan_extra.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/bioscan_image.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/bioscan_qc.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/bold.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/copo.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/defaults.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/elastic.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/ena.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/gap.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/genome_notes.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/goat.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/grit.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/informatics.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/labwhere.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/mlwh.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/portal.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/portal_attributes.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/portaldb.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/prefect.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/sciops.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/sts.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/sts_legacy.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/tolid.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/tolqc.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/tolqc_legacy.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/treeofsex.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/uksi_qc.py.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sources/workflows.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/action/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/action/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/auth/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/auth/blueprint.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/auth/models.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/cast.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/database.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/ds_session.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/exception.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/ext.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/filter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/model.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/pipeline_step/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/relationship.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/session.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/sort.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/sql_converter.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/sql_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/standard/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sql/standard/factory.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/status/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/status/status_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sts/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sts/sts.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sts/sts_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/sts/sts_requests.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/treeval/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/treeval/treeval_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/utils/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/utils/csv.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/utils/s3.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/allowed_keys.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/allowed_values.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/allowed_values_from_datasource.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/assert_on_condition.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/converter_and_validate.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/ena_checklist.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/ena_submittable.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/interfaces/__init__.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/interfaces/condition_evaluator.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/min_one_valid_value.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/mutually_exclusive.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/regex.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/regex_by_value.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/specimens_have_same_taxon.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/tolid.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/unique_values.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol/validators/unique_whole_organisms.py +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol_sdk.egg-info/dependency_links.txt +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol_sdk.egg-info/entry_points.txt +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol_sdk.egg-info/requires.txt +0 -0
- {tol_sdk-1.8.0 → tol_sdk-1.8.2}/src/tol_sdk.egg-info/top_level.txt +0 -0
|
@@ -1,48 +1,43 @@
|
|
|
1
1
|
/*
|
|
2
|
-
## SQL Query: DNA
|
|
2
|
+
## SQL Query: DNA Extraction Containers (Benchling Warehouse)
|
|
3
3
|
|
|
4
|
-
This SQL query retrieves
|
|
4
|
+
This SQL query retrieves detailed information about DNA extraction containers managed by the ToL Core Laboratory, including metadata, container details, and the latest QC measurements.
|
|
5
5
|
|
|
6
|
-
The table
|
|
6
|
+
The resulting table includes identifiers for tissues, tissue preps, extractions, containers, and locations, as well as the most recent QC results (Nanodrop, Qubit, Femto, Yield, and Decision Making).
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Output: Table with columns:
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
1) taxon_id: [character] Tissue metadata. Origin: STS
|
|
11
|
+
2) eln_tissue_id: [character] Benchling ID for the tissue the extraction is derived from.
|
|
12
|
+
3) eln_tissue_prep_id: [character] Benchling ID for the tissue prep the extraction is derived from.
|
|
13
|
+
4) extraction_id: [character] DNA extraction entity ID (Benchling).
|
|
14
|
+
5) programme_id: [character] ToLID. Origin: BWH.
|
|
15
|
+
6) specimen_id: [character] Specimen ID. Origin: STS.
|
|
16
|
+
7) creation_date: [date] Date the container was created.
|
|
17
|
+
8) fluidx_container_id: [character] Primary key for the FluidX container.
|
|
18
|
+
9) fluidx_id: [character] FluidX barcode.
|
|
19
|
+
10) tube_type: [character] Type of tube/container.
|
|
20
|
+
11) volume_ul: [numeric] Volume in microliters (0 if archived as 'Retired' or 'Expended').
|
|
21
|
+
12) location: [character] Storage location name.
|
|
22
|
+
13) rack: [character] Box/rack barcode.
|
|
23
|
+
14) archive_purpose: [character] Reason for archiving the DNA extraction.
|
|
24
|
+
15) nanodrop_concentration_ngul: [numeric] Latest Nanodrop concentration (ng/µL).
|
|
25
|
+
16) dna_260_280_ratio: [numeric] Latest Nanodrop 260/280 ratio.
|
|
26
|
+
17) dna_260_230_ratio: [numeric] Latest Nanodrop 260/230 ratio.
|
|
27
|
+
18) qubit_concentration_ngul: [numeric] Latest Qubit concentration (ng/µL).
|
|
28
|
+
19) yield_ng: [numeric] Latest yield (ng).
|
|
29
|
+
20) femto_date_code: [character] Latest Femto date code.
|
|
30
|
+
21) femto_description: [character] Latest Femto profile description.
|
|
31
|
+
22) gqn_index: [numeric] Latest GQN index from Femto.
|
|
32
|
+
23) next_step: [character] Latest decision making next step.
|
|
33
|
+
24) extraction_qc_result: [character] Latest extraction QC result.
|
|
11
34
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
7) programme_id: [character] ToLID. Origin: BWH
|
|
19
|
-
8) specimen_id: [character] Specimen ID. Origin: STS
|
|
20
|
-
9) completion_date: [date] Extraction date. This field coalesces created_at$ and created_on fields. Created_on is for bnt legacy data.
|
|
21
|
-
10) extraction_name: [character] Entity name.
|
|
22
|
-
11) fluidx_id: [character] Fluidx ID.
|
|
23
|
-
12) volume_ul: [double] volume of DNA available in the fluidx tube.
|
|
24
|
-
13) location: [character] Physical locationo of the DNA extraction. Freezer shelf.
|
|
25
|
-
14) rack: [character] Physical locationo of the DNA extraction. Rack barcode.
|
|
26
|
-
15) bnt_id: [character] Batches and Tracking legacy id.
|
|
27
|
-
16) manual_vs_automatic: [character].
|
|
28
|
-
17) extraction_protocol: [character] DNA extraction protocol as recorded at the time of extraction
|
|
29
|
-
18) tube_type: [character] Type of tube. Marked NULL or voucher.
|
|
30
|
-
19) extraction_type: [character] dna.
|
|
31
|
-
20) name: [character] Folder name.
|
|
32
|
-
21) archive_purpose: [character] Reason for archiving the DNA extraction.
|
|
33
|
-
22) nanodrop_concentration_ngul: [double] Concentration of DNA as measured by Nanodrop.
|
|
34
|
-
23) dna_260_280_ratio: [double] Ratio of absorbance at 260:280nm as measured by spectrophotometer.
|
|
35
|
-
24) dna_260_230_ratio: [double] Ratio of absorbance at 260:230nm as measured by spectrophotometer.
|
|
36
|
-
25) qubit_concentration_ngul: [double] Concentration of DNA as measured by Qubit.
|
|
37
|
-
26) yield_ng: [double] DNA yield after extraction.
|
|
38
|
-
27) femto_date_code: [character] Femto date code.
|
|
39
|
-
28) femto_description:[character] Categorical description of the femto pulse profile.
|
|
40
|
-
29) gqn_index: [character] Genomic Quality Number (GQN) index, calculated by the Femto software.
|
|
41
|
-
30) extraction_qc_result: [character] QC result: Yes = Extraction passed; No = Extraction failed.
|
|
42
|
-
|
|
43
|
-
NOTES:
|
|
44
|
-
1) Data types were casted explicitly to conserved the data type stored in BWH.
|
|
45
|
-
2) To add the Fluidx ID of the original DNA extract a few filters were applied to delete Vouchers, tubes archived because they were made in error, and invalid container names.
|
|
35
|
+
NOTES:
|
|
36
|
+
1) Only extractions from the 'ToL Core Lab' project and relevant folders are included.
|
|
37
|
+
2) Containers archived as 'Made in error' or with names matching '%Nuclei isolation and tagmentation%' are excluded.
|
|
38
|
+
3) Latest QC results are joined from their respective measurement tables.
|
|
39
|
+
4) Volume is set to 0 for archived/expended extractions.
|
|
40
|
+
5) Data types are preserved as in the Benchling Warehouse.
|
|
46
41
|
|
|
47
42
|
*/
|
|
48
43
|
|
|
@@ -112,30 +107,23 @@ latest_decision_making AS (
|
|
|
112
107
|
)
|
|
113
108
|
|
|
114
109
|
SELECT DISTINCT
|
|
115
|
-
t.sts_id,
|
|
116
110
|
t.taxon_id,
|
|
117
111
|
t.id AS eln_tissue_id,
|
|
118
112
|
tp.id AS eln_tissue_prep_id,
|
|
119
|
-
dna.file_registry_id$ AS eln_file_registry_id,
|
|
120
113
|
dna.id AS extraction_id,
|
|
121
114
|
t.programme_id,
|
|
122
115
|
t.specimen_id,
|
|
123
|
-
|
|
124
|
-
|
|
116
|
+
DATE(con.created_at) AS creation_date,
|
|
117
|
+
con.id AS fluidx_container_id, -- primary key
|
|
125
118
|
con.barcode AS fluidx_id,
|
|
126
|
-
|
|
119
|
+
tube.type AS tube_type,
|
|
127
120
|
CASE
|
|
128
121
|
WHEN con.archive_purpose$ IN ('Retired', 'Expended') THEN 0 -- Retired or expended DNA extractions have a weight of 0
|
|
129
122
|
ELSE con.volume_si * 1000000
|
|
130
123
|
END AS volume_ul,
|
|
131
124
|
loc.name AS location,
|
|
132
125
|
box.barcode AS rack,
|
|
133
|
-
|
|
134
|
-
dna.manual_vs_automatic AS manual_vs_automatic,
|
|
135
|
-
dna.extraction_protocol,
|
|
136
|
-
tube.type AS tube_type,
|
|
137
|
-
'dna'::varchar AS extraction_type,
|
|
138
|
-
f.name, dna.archive_purpose$,
|
|
126
|
+
con.archive_purpose$ AS archive_purpose,
|
|
139
127
|
latest_nanodrop_conc.nanodrop_concentration_ngul,
|
|
140
128
|
latest_nanodrop_conc.dna_260_280_ratio,
|
|
141
129
|
latest_nanodrop_conc.dna_260_230_ratio,
|
|
@@ -147,20 +135,20 @@ SELECT DISTINCT
|
|
|
147
135
|
latest_decision_making.next_step,
|
|
148
136
|
latest_decision_making.extraction_qc_result
|
|
149
137
|
FROM dna_extract$raw AS dna
|
|
150
|
-
|
|
138
|
+
INNER JOIN container_content$raw AS cc -- Start of container/tube join
|
|
151
139
|
ON cc.entity_id = dna.id
|
|
152
140
|
LEFT JOIN container$raw AS con
|
|
153
141
|
ON con.id = cc.container_id
|
|
142
|
+
LEFT JOIN tube$raw AS tube
|
|
143
|
+
ON cc.container_id = tube.id -- End of container/tube join
|
|
144
|
+
LEFT JOIN box$raw AS box -- Location chunk
|
|
145
|
+
ON con.box_id = box.id
|
|
146
|
+
LEFT JOIN location$raw AS loc
|
|
147
|
+
ON loc.id = box.location_id -- End of location chunk
|
|
154
148
|
LEFT JOIN tissue_prep$raw AS tp
|
|
155
149
|
ON tp.id = dna.tissue_prep
|
|
156
150
|
LEFT JOIN tissue$raw AS t
|
|
157
151
|
ON t.id = tp.tissue
|
|
158
|
-
LEFT JOIN tube$raw AS tube
|
|
159
|
-
ON cc.container_id = tube.id
|
|
160
|
-
LEFT JOIN folder$raw AS f
|
|
161
|
-
ON dna.folder_id$ = f.id
|
|
162
|
-
LEFT JOIN project$raw AS proj
|
|
163
|
-
ON dna.project_id$ = proj.id
|
|
164
152
|
LEFT JOIN latest_nanodrop_conc -- Results chunk
|
|
165
153
|
ON dna.id = latest_nanodrop_conc.sample_id
|
|
166
154
|
LEFT JOIN latest_qubit_conc
|
|
@@ -171,13 +159,15 @@ LEFT JOIN latest_femto
|
|
|
171
159
|
ON dna.id = latest_femto.sample_id
|
|
172
160
|
LEFT JOIN latest_decision_making
|
|
173
161
|
ON dna.id = latest_decision_making.sample_id -- End Results chunk
|
|
174
|
-
LEFT JOIN
|
|
175
|
-
|
|
176
|
-
LEFT JOIN
|
|
177
|
-
ON
|
|
162
|
+
LEFT JOIN folder$raw AS f
|
|
163
|
+
ON dna.folder_id$ = f.id
|
|
164
|
+
LEFT JOIN project$raw AS proj
|
|
165
|
+
ON dna.project_id$ = proj.id
|
|
166
|
+
LEFT JOIN registration_origin$raw AS reg
|
|
167
|
+
ON reg.entity_id = dna.id
|
|
168
|
+
LEFT JOIN entry$raw AS ent
|
|
169
|
+
ON reg.origin_entry_id = ent.id
|
|
178
170
|
WHERE proj.name = 'ToL Core Lab'
|
|
179
171
|
AND (f.name IN ('Routine Throughput', 'DNA', 'Core Lab Entities', 'Benchling MS Project Move') OR f.name IS NULL)
|
|
180
|
-
AND (dna.archive_purpose$ != ('Made in error') OR dna.archive_purpose$ IS NULL)
|
|
181
172
|
AND (con.archive_purpose$ != ('Made in error') OR con.archive_purpose$ IS NULL)
|
|
182
|
-
AND
|
|
183
|
-
ORDER BY completion_date DESC
|
|
173
|
+
AND ent.name NOT LIKE '%Nuclei isolation and tagmentation%'
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
## SQL Query: DNA extractions Benchling Warehouse (BWH)
|
|
3
|
+
|
|
4
|
+
This SQL query retrieves all the information of DNA extractions performed by the ToL Core Laboratory.
|
|
5
|
+
|
|
6
|
+
The table produced also contains the eln_dna_extract_id and eln_file_registry_id which uniquely idenfied each dna extract entity in Benchling Warehouse (BWH).
|
|
7
|
+
|
|
8
|
+
The eln_dna_extract_id should be used as the foreign key to the DNA extract entity the submission is derived from.
|
|
9
|
+
|
|
10
|
+
Output: Table with cols:
|
|
11
|
+
|
|
12
|
+
1) sts_id: [integer] Tissue metadata. Origin: STS
|
|
13
|
+
2) taxon_id: [character] Tissue metadata. Origin: STS
|
|
14
|
+
3) eln_tissue_id: [character] Benchling id for the tissue the extraction is derived from.
|
|
15
|
+
4) eln_tissue_prep_id: [character] Benchling id for the tissue prep the extraction is derived from.
|
|
16
|
+
5) eln_file_registry_id: [character] id in Benchling Registry.
|
|
17
|
+
6) extraction_id: [character] Primary key.
|
|
18
|
+
7) programme_id: [character] ToLID. Origin: BWH
|
|
19
|
+
8) specimen_id: [character] Specimen ID. Origin: STS
|
|
20
|
+
9) completion_date: [date] Extraction date. This field coalesces created_at$ and created_on fields. Created_on is for bnt legacy data.
|
|
21
|
+
10) extraction_name: [character] Entity name.
|
|
22
|
+
11) bnt_id: [character] Batches and Tracking legacy id.
|
|
23
|
+
12) manual_vs_automatic: [character] Extraction method indicator.
|
|
24
|
+
13) extraction_protocol: [character] DNA extraction protocol as recorded at the time of extraction.
|
|
25
|
+
14) extraction_type: [character] Type of extraction, set to 'dna'.
|
|
26
|
+
15) folder_name: [character] Folder name.
|
|
27
|
+
16) archive_purpose: [character] Reason for archiving the DNA extraction.
|
|
28
|
+
|
|
29
|
+
NOTES:
|
|
30
|
+
1) Data types were casted explicitly to conserved the data type stored in BWH.
|
|
31
|
+
2) To add the Fluidx ID of the original DNA extract a few filters were applied to delete Vouchers, tubes archived because they were made in error, and invalid container names.
|
|
32
|
+
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
SELECT DISTINCT
|
|
36
|
+
t.sts_id,
|
|
37
|
+
t.taxon_id,
|
|
38
|
+
t.id AS eln_tissue_id,
|
|
39
|
+
tp.id AS eln_tissue_prep_id,
|
|
40
|
+
dna.file_registry_id$ AS eln_file_registry_id,
|
|
41
|
+
dna.id AS extraction_id,
|
|
42
|
+
t.programme_id,
|
|
43
|
+
t.specimen_id,
|
|
44
|
+
COALESCE(DATE(dna.created_on), DATE(dna.created_at$)) AS completion_date, -- Homogenising BnT and Benchling dates
|
|
45
|
+
dna.name$ AS extraction_name,
|
|
46
|
+
dna.bt_id AS bnt_id,
|
|
47
|
+
dna.manual_vs_automatic AS manual_vs_automatic,
|
|
48
|
+
dna.extraction_protocol,
|
|
49
|
+
'dna'::varchar AS extraction_type,
|
|
50
|
+
f.name AS folder_name
|
|
51
|
+
FROM dna_extract$raw AS dna
|
|
52
|
+
LEFT JOIN tissue_prep$raw AS tp
|
|
53
|
+
ON tp.id = dna.tissue_prep
|
|
54
|
+
LEFT JOIN tissue$raw AS t
|
|
55
|
+
ON t.id = tp.tissue
|
|
56
|
+
LEFT JOIN folder$raw AS f
|
|
57
|
+
ON dna.folder_id$ = f.id
|
|
58
|
+
LEFT JOIN project$raw AS proj
|
|
59
|
+
ON dna.project_id$ = proj.id
|
|
60
|
+
LEFT JOIN registration_origin$raw AS reg
|
|
61
|
+
ON reg.entity_id = dna.id
|
|
62
|
+
LEFT JOIN entry$raw AS ent
|
|
63
|
+
ON reg.origin_entry_id = ent.id
|
|
64
|
+
WHERE proj.name = 'ToL Core Lab'
|
|
65
|
+
AND (f.name IN ('Routine Throughput', 'DNA', 'Core Lab Entities', 'Benchling MS Project Move') OR f.name IS NULL)
|
|
66
|
+
AND (dna.archive_purpose$ != ('Made in error') OR dna.archive_purpose$ IS NULL)
|
|
67
|
+
AND ent.name NOT LIKE '%Nuclei isolation and tagmentation%'
|
|
68
|
+
ORDER BY completion_date DESC
|
|
@@ -28,8 +28,8 @@ SELECT DISTINCT
|
|
|
28
28
|
tp.name$ AS eln_tissue_prep_name,
|
|
29
29
|
ssid.sanger_sample_id,
|
|
30
30
|
ssid.sanger_sample_id AS extraction_id,
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
sub_con.barcode AS fluidx_id,
|
|
32
|
+
sub_con.id AS fluidx_container_id,
|
|
33
33
|
DATE(tpsub.submitted_submission_date) AS completion_date,
|
|
34
34
|
'lres'::varchar AS extraction_type
|
|
35
35
|
FROM tissue_prep$raw AS tp
|
|
@@ -41,8 +41,16 @@ LEFT JOIN container$raw AS c
|
|
|
41
41
|
ON cc.container_id = c.id
|
|
42
42
|
LEFT JOIN tissue_prep_submission_workflow_output$raw AS tpsub
|
|
43
43
|
ON c.id = tpsub.sample_tube_id
|
|
44
|
+
LEFT JOIN container$raw AS sub_con
|
|
45
|
+
ON tpsub.sample_tube_id = sub_con.id
|
|
44
46
|
LEFT JOIN storage$raw AS stor
|
|
45
47
|
ON c.location_id = stor.id
|
|
46
48
|
LEFT JOIN sanger_sample_id$raw AS ssid
|
|
47
49
|
ON c.id = ssid.sample_tube
|
|
48
|
-
|
|
50
|
+
LEFT JOIN project$raw AS proj
|
|
51
|
+
ON tp.project_id$ = proj.id
|
|
52
|
+
LEFT JOIN folder$raw AS f
|
|
53
|
+
ON tp.folder_id$ = f.id
|
|
54
|
+
WHERE sub_con.id IS NOT NULL
|
|
55
|
+
AND proj.name = 'ToL Core Lab'
|
|
56
|
+
AND f.name = 'Sample Prep'
|
|
@@ -119,6 +119,10 @@ class ExcelDataSource(
|
|
|
119
119
|
if isinstance(__v, pd.Timestamp):
|
|
120
120
|
__v = datetime.fromtimestamp(__v.timestamp())
|
|
121
121
|
|
|
122
|
+
# If float and is whole number, convert to int
|
|
123
|
+
if isinstance(__v, float) and __v.is_integer():
|
|
124
|
+
__v = int(__v)
|
|
125
|
+
|
|
122
126
|
if __k not in self.__mappings:
|
|
123
127
|
return __v
|
|
124
128
|
|
|
@@ -64,7 +64,7 @@ def create_pipeline_step_models(
|
|
|
64
64
|
class Pipeline(base_model_class):
|
|
65
65
|
__tablename__ = 'pipeline'
|
|
66
66
|
|
|
67
|
-
id: Mapped[int] = mapped_column(
|
|
67
|
+
id: Mapped[int] = mapped_column( # noqa A003
|
|
68
68
|
primary_key=True,
|
|
69
69
|
autoincrement=True
|
|
70
70
|
)
|
|
@@ -100,7 +100,7 @@ def create_pipeline_step_models(
|
|
|
100
100
|
),
|
|
101
101
|
)
|
|
102
102
|
|
|
103
|
-
id: Mapped[int] = mapped_column(
|
|
103
|
+
id: Mapped[int] = mapped_column( # noqa A003
|
|
104
104
|
primary_key=True,
|
|
105
105
|
autoincrement=True
|
|
106
106
|
)
|
|
@@ -121,6 +121,11 @@ def create_pipeline_step_models(
|
|
|
121
121
|
nullable=False
|
|
122
122
|
)
|
|
123
123
|
|
|
124
|
+
is_visible: Mapped[bool] = mapped_column(
|
|
125
|
+
nullable=False,
|
|
126
|
+
default=True
|
|
127
|
+
)
|
|
128
|
+
|
|
124
129
|
config: Mapped[dict[str, Any]] = mapped_column(
|
|
125
130
|
JSONB,
|
|
126
131
|
nullable=False,
|
|
@@ -135,7 +140,7 @@ def create_pipeline_step_models(
|
|
|
135
140
|
class Upload(base_model_class):
|
|
136
141
|
__tablename__ = 'upload'
|
|
137
142
|
|
|
138
|
-
id: Mapped[int] = mapped_column(
|
|
143
|
+
id: Mapped[int] = mapped_column( # noqa A003
|
|
139
144
|
primary_key=True,
|
|
140
145
|
autoincrement=True
|
|
141
146
|
)
|
|
@@ -173,6 +178,11 @@ def create_pipeline_step_models(
|
|
|
173
178
|
default=False
|
|
174
179
|
)
|
|
175
180
|
|
|
181
|
+
is_ready: Mapped[bool] = mapped_column(
|
|
182
|
+
nullable=False,
|
|
183
|
+
default=False
|
|
184
|
+
)
|
|
185
|
+
|
|
176
186
|
failure_message: Mapped[str | None] = mapped_column(
|
|
177
187
|
nullable=True,
|
|
178
188
|
)
|
|
@@ -182,7 +192,7 @@ def create_pipeline_step_models(
|
|
|
182
192
|
foreign_keys=[pipeline_id]
|
|
183
193
|
)
|
|
184
194
|
|
|
185
|
-
user: Mapped['User'] = relationship(
|
|
195
|
+
user: Mapped['User'] = relationship( # noqa F821
|
|
186
196
|
back_populates='user_uploads',
|
|
187
197
|
foreign_keys=[user_id]
|
|
188
198
|
)
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2025 Genome Research Ltd.
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: MIT
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from datetime import datetime, timedelta
|
|
7
|
+
from typing import List
|
|
8
|
+
|
|
9
|
+
from tol.core import DataObject, DataSource
|
|
10
|
+
from tol.core.validate import Validator
|
|
11
|
+
from tol.sources.sts import sts
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class StsFieldsValidator(Validator):
|
|
15
|
+
"""
|
|
16
|
+
Validates that a stream of `DataObject` instances
|
|
17
|
+
contains fields that observe the validations in STS
|
|
18
|
+
"""
|
|
19
|
+
@dataclass(slots=True, frozen=True, kw_only=True)
|
|
20
|
+
class Config:
|
|
21
|
+
project_code: str
|
|
22
|
+
|
|
23
|
+
__slots__ = ['__config', '__datasource', '__fields']
|
|
24
|
+
__config: Config
|
|
25
|
+
__datasource: DataSource
|
|
26
|
+
__fields: List[str | int | float]
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
config: Config,
|
|
31
|
+
datasource: DataSource = sts(), # For testing
|
|
32
|
+
**kwargs
|
|
33
|
+
) -> None:
|
|
34
|
+
|
|
35
|
+
super().__init__()
|
|
36
|
+
|
|
37
|
+
self.__config = config
|
|
38
|
+
self.__datasource = datasource
|
|
39
|
+
self.__fields = self.__initialize_fields_from_datasource()
|
|
40
|
+
|
|
41
|
+
def __initialize_fields_from_datasource(self) -> List[str | int | float]:
|
|
42
|
+
return {
|
|
43
|
+
field.get('data_input_key'): field
|
|
44
|
+
for field in self.__datasource.get_one(
|
|
45
|
+
'project', self.__config.project_code
|
|
46
|
+
).template.get('data_fields', [])
|
|
47
|
+
if field.get('in_manifest')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
def _validate_data_object(
|
|
51
|
+
self,
|
|
52
|
+
obj: DataObject
|
|
53
|
+
) -> None:
|
|
54
|
+
for field in self.__fields.values():
|
|
55
|
+
# Ignore inactive fields
|
|
56
|
+
if field.get('status') == 'Inactive':
|
|
57
|
+
continue
|
|
58
|
+
# Get the value from the data object
|
|
59
|
+
field_value = obj.get_field_by_name(field.get('data_input_key'))
|
|
60
|
+
if isinstance(field_value, list):
|
|
61
|
+
field_value = ' | '.join(str(v) for v in field_value)
|
|
62
|
+
|
|
63
|
+
# mandatory_input fields must be present
|
|
64
|
+
if field.get('mandatory_input') and field.get('data_input_key') not in obj.attributes:
|
|
65
|
+
self.add_error(
|
|
66
|
+
object_id=obj.id,
|
|
67
|
+
detail=f'Field {field.get("data_input_key")} is required '
|
|
68
|
+
f'for project {self.__config.project_code}',
|
|
69
|
+
field=field.get('data_input_key'),
|
|
70
|
+
)
|
|
71
|
+
continue
|
|
72
|
+
|
|
73
|
+
# Skip further validations if validation is not mandatory
|
|
74
|
+
if not field.get('mandatory_validation'):
|
|
75
|
+
continue
|
|
76
|
+
|
|
77
|
+
# Mandatory validation fields must have a value
|
|
78
|
+
if field_value is None or field_value == '':
|
|
79
|
+
self.add_error(
|
|
80
|
+
object_id=obj.id,
|
|
81
|
+
detail=f'Field {field.get("data_input_key")} is required to have a value '
|
|
82
|
+
f'for project {self.__config.project_code}',
|
|
83
|
+
field=field.get('data_input_key'),
|
|
84
|
+
)
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
# Allowed values
|
|
88
|
+
if field.get('allowed_values'):
|
|
89
|
+
allowed_values = [
|
|
90
|
+
value.get('value') for value in field.get('allowed_values', [])
|
|
91
|
+
]
|
|
92
|
+
if field_value not in allowed_values:
|
|
93
|
+
self.add_error(
|
|
94
|
+
object_id=obj.id,
|
|
95
|
+
detail=f'Field {field.get("data_input_key")} value '
|
|
96
|
+
f'"{field_value}" not found in allowed values '
|
|
97
|
+
f'{allowed_values} for project '
|
|
98
|
+
f'{self.__config.project_code}',
|
|
99
|
+
field=field.get('data_input_key'),
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
if field.get('type') in ['String', 'TextArea']:
|
|
103
|
+
self.__validate_string(obj, field, field_value)
|
|
104
|
+
|
|
105
|
+
if field.get('type') in ['Integer', 'Decimal', 'Percentage']:
|
|
106
|
+
self.__validate_number(obj, field, field_value)
|
|
107
|
+
|
|
108
|
+
if field.get('type') in ['Boolean']:
|
|
109
|
+
self.__validate_boolean(obj, field, field_value)
|
|
110
|
+
|
|
111
|
+
if field.get('type') in ['Date']:
|
|
112
|
+
self.__validate_date(obj, field, field_value)
|
|
113
|
+
|
|
114
|
+
def __validate_string(
|
|
115
|
+
self,
|
|
116
|
+
obj: DataObject,
|
|
117
|
+
field: dict,
|
|
118
|
+
field_value: str | int | float | None
|
|
119
|
+
) -> None:
|
|
120
|
+
# Check type is a string
|
|
121
|
+
# if not isinstance(field_value, str):
|
|
122
|
+
# self.add_error(
|
|
123
|
+
# object_id=obj.id,
|
|
124
|
+
# detail=f'Field {field.get("data_input_key")} value '
|
|
125
|
+
# f'"{field_value}" is not a string for project '
|
|
126
|
+
# f'{self.__config.project_code}',
|
|
127
|
+
# field=field.get('data_input_key'),
|
|
128
|
+
# )
|
|
129
|
+
# return
|
|
130
|
+
|
|
131
|
+
# Min/Max validations for string
|
|
132
|
+
if field.get('min') and len(field_value) < field.get('min'):
|
|
133
|
+
self.add_error(
|
|
134
|
+
object_id=obj.id,
|
|
135
|
+
detail=f'Field {field.get("data_input_key")} value '
|
|
136
|
+
f'"{field_value}" is shorter than minimum length '
|
|
137
|
+
f'"{field.get("min")}" for project '
|
|
138
|
+
f'{self.__config.project_code}',
|
|
139
|
+
field=field.get('data_input_key'),
|
|
140
|
+
)
|
|
141
|
+
if field.get('max') and len(field_value) > field.get('max'):
|
|
142
|
+
self.add_error(
|
|
143
|
+
object_id=obj.id,
|
|
144
|
+
detail=f'Field {field.get("data_input_key")} value '
|
|
145
|
+
f'"{field_value}" is longer than maximum length '
|
|
146
|
+
f'"{field.get("max")}" for project '
|
|
147
|
+
f'{self.__config.project_code}',
|
|
148
|
+
field=field.get('data_input_key'),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
def __validate_number(
|
|
152
|
+
self,
|
|
153
|
+
obj: DataObject,
|
|
154
|
+
field: dict,
|
|
155
|
+
field_value: str | int | float | None
|
|
156
|
+
) -> None:
|
|
157
|
+
# Check type is a number
|
|
158
|
+
if not isinstance(field_value, (int, float)):
|
|
159
|
+
self.add_error(
|
|
160
|
+
object_id=obj.id,
|
|
161
|
+
detail=f'Field {field.get("data_input_key")} value '
|
|
162
|
+
f'"{field_value}" is not a number for project '
|
|
163
|
+
f'{self.__config.project_code}',
|
|
164
|
+
field=field.get('data_input_key'),
|
|
165
|
+
)
|
|
166
|
+
return
|
|
167
|
+
|
|
168
|
+
# Min/Max validations for number
|
|
169
|
+
if field.get('min') is not None and field_value < field.get('min'):
|
|
170
|
+
self.add_error(
|
|
171
|
+
object_id=obj.id,
|
|
172
|
+
detail=f'Field {field.get("data_input_key")} value '
|
|
173
|
+
f'"{field_value}" is less than minimum value '
|
|
174
|
+
f'"{field.get("min")}" for project '
|
|
175
|
+
f'{self.__config.project_code}',
|
|
176
|
+
field=field.get('data_input_key'),
|
|
177
|
+
)
|
|
178
|
+
if field.get('max') is not None and field_value > field.get('max'):
|
|
179
|
+
self.add_error(
|
|
180
|
+
object_id=obj.id,
|
|
181
|
+
detail=f'Field {field.get("data_input_key")} value '
|
|
182
|
+
f'"{field_value}" is greater than maximum value '
|
|
183
|
+
f'"{field.get("max")}" for project '
|
|
184
|
+
f'{self.__config.project_code}',
|
|
185
|
+
field=field.get('data_input_key'),
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
def __validate_boolean(
|
|
189
|
+
self,
|
|
190
|
+
obj: DataObject,
|
|
191
|
+
field: dict,
|
|
192
|
+
field_value: str | int | float | None
|
|
193
|
+
) -> None:
|
|
194
|
+
# Check type is a boolean
|
|
195
|
+
if field_value not in ['Y', 'N']:
|
|
196
|
+
self.add_error(
|
|
197
|
+
object_id=obj.id,
|
|
198
|
+
detail=f'Field {field.get("data_input_key")} value '
|
|
199
|
+
f'"{field_value}" is not a boolean (Y/N) for project '
|
|
200
|
+
f'{self.__config.project_code}',
|
|
201
|
+
field=field.get('data_input_key'),
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
def __validate_date(
|
|
205
|
+
self,
|
|
206
|
+
obj: DataObject,
|
|
207
|
+
field: dict,
|
|
208
|
+
field_value: str | int | float | None
|
|
209
|
+
) -> None:
|
|
210
|
+
if not isinstance(field_value, datetime):
|
|
211
|
+
self.add_error(
|
|
212
|
+
object_id=obj.id,
|
|
213
|
+
detail=f'Field {field.get("data_input_key")} value '
|
|
214
|
+
f'"{field_value}" is not a date string for project '
|
|
215
|
+
f'{self.__config.project_code}',
|
|
216
|
+
field=field.get('data_input_key'),
|
|
217
|
+
)
|
|
218
|
+
return
|
|
219
|
+
if field.get('range_limit'):
|
|
220
|
+
earliest_date = datetime.now() - timedelta(days=field.get('min'))
|
|
221
|
+
latest_date = datetime.now() + timedelta(days=field.get('max'))
|
|
222
|
+
if field_value < earliest_date or field_value > latest_date:
|
|
223
|
+
self.add_error(
|
|
224
|
+
object_id=obj.id,
|
|
225
|
+
detail=f'Field {field.get("data_input_key")} value '
|
|
226
|
+
f'"{field_value}" is not within the allowed date '
|
|
227
|
+
f'range for project {self.__config.project_code}',
|
|
228
|
+
field=field.get('data_input_key'),
|
|
229
|
+
)
|
|
@@ -58,6 +58,8 @@ class TypesValidator(Validator):
|
|
|
58
58
|
self.__add_result(
|
|
59
59
|
obj,
|
|
60
60
|
key,
|
|
61
|
+
detail=f'Field {key} value "{actual_value}" is not of type '
|
|
62
|
+
f'"{expected_type}"',
|
|
61
63
|
)
|
|
62
64
|
if type_class and isinstance(actual_value, type_class):
|
|
63
65
|
# Special case for bool since isinstance(True, int) is True
|
|
@@ -71,12 +73,13 @@ class TypesValidator(Validator):
|
|
|
71
73
|
self,
|
|
72
74
|
obj: DataObject,
|
|
73
75
|
key: str,
|
|
76
|
+
detail: str = None,
|
|
74
77
|
) -> None:
|
|
75
78
|
|
|
76
79
|
if self.__config.is_error:
|
|
77
80
|
self.add_error(
|
|
78
81
|
object_id=obj.id,
|
|
79
|
-
detail=self.__config.detail,
|
|
82
|
+
detail=detail or self.__config.detail,
|
|
80
83
|
field=key,
|
|
81
84
|
)
|
|
82
85
|
else:
|
|
@@ -52,6 +52,7 @@ src/tol/benchling/benchling_converter.py
|
|
|
52
52
|
src/tol/benchling/benchling_datasource.py
|
|
53
53
|
src/tol/benchling/benchling_warehouse_datasource.py
|
|
54
54
|
src/tol/benchling/sql/__init__.py
|
|
55
|
+
src/tol/benchling/sql/extraction_containers_dna.sql
|
|
55
56
|
src/tol/benchling/sql/extraction_extraction_type_dna.sql
|
|
56
57
|
src/tol/benchling/sql/extraction_extraction_type_lres.sql
|
|
57
58
|
src/tol/benchling/sql/extraction_extraction_type_pooled_dna.sql
|