diff --git a/clinvar_api/models/sub_payload.py b/clinvar_api/models/sub_payload.py index 158a44e..ded7f71 100644 --- a/clinvar_api/models/sub_payload.py +++ b/clinvar_api/models/sub_payload.py @@ -261,11 +261,16 @@ def to_msg(self) -> msg.SubmissionCitation: @attrs.define(frozen=True) class SubmissionAssertionCriteria: - citation: SubmissionCitation - method: str + db: typing.Optional[CitationDb] = None + id: typing.Optional[str] = None + url: typing.Optional[str] = None def to_msg(self) -> msg.SubmissionAssertionCriteria: - return msg.SubmissionAssertionCriteria(citation=self.citation.to_msg(), method=self.method) + return msg.SubmissionAssertionCriteria( + db=self.db, + id=self.id, + url=self.url, + ) @attrs.define(frozen=True) @@ -376,8 +381,6 @@ class SubmissionClinvarSubmission: condition_set: SubmissionConditionSet observed_in: typing.List[SubmissionObservedIn] record_status: RecordStatus - release_status: ReleaseStatus - assertion_criteria: typing.Optional[SubmissionAssertionCriteria] = None clinvar_accession: typing.Optional[str] = None compound_heterozygote_set: typing.Optional[SubmissionCompoundHeterozygoteSet] = None diplotype_set: typing.Optional[SubmissionDiplotypeSet] = None @@ -392,9 +395,6 @@ class SubmissionClinvarSubmission: variant_set: typing.Optional[SubmissionVariantSet] = None def to_msg(self) -> msg.SubmissionClinvarSubmission: - assertion_criteria = None - if self.assertion_criteria: - assertion_criteria = self.assertion_criteria.to_msg() compound_heterozygote_set = None if self.compound_heterozygote_set: compound_heterozygote_set = self.compound_heterozygote_set.to_msg() @@ -421,8 +421,6 @@ def to_msg(self) -> msg.SubmissionClinvarSubmission: conditionSet=self.condition_set.to_msg(), observedIn=[msg_observed_in.to_msg() for msg_observed_in in self.observed_in], recordStatus=self.record_status, - releaseStatus=self.release_status, - assertionCriteria=assertion_criteria, clinvarAccession=self.clinvar_accession, compoundHeterozygoteSet=compound_heterozygote_set, diplotypeSet=diplotype_set, @@ -438,12 +436,17 @@ def to_msg(self) -> msg.SubmissionClinvarSubmission: @attrs.define(frozen=True) class SubmissionContainer: + assertion_criteria: typing.Optional[SubmissionAssertionCriteria] = None behalf_org_id: typing.Optional[int] = None clinvar_deletion: typing.Optional[SubmissionClinvarDeletion] = None clinvar_submission: typing.Optional[typing.List[SubmissionClinvarSubmission]] = None + clinvar_submission_release_status: typing.Optional[ReleaseStatus] = None submission_name: typing.Optional[str] = None def to_msg(self) -> msg.SubmissionContainer: + assertion_criteria = None + if self.assertion_criteria: + assertion_criteria = self.assertion_criteria.to_msg() clinvar_deletion = None if self.clinvar_deletion: clinvar_deletion = self.clinvar_deletion.to_msg() @@ -453,8 +456,10 @@ def to_msg(self) -> msg.SubmissionContainer: msg_submission.to_msg() for msg_submission in self.clinvar_submission ] return msg.SubmissionContainer( + assertionCriteria=assertion_criteria, behalfOrgID=self.behalf_org_id, clinvarDeletion=clinvar_deletion, clinvarSubmission=clinvar_submission, + clinvarSubmissionReleaseStatus=self.clinvar_submission_release_status, submissionName=self.submission_name, ) diff --git a/clinvar_api/msg/sub_payload.py b/clinvar_api/msg/sub_payload.py index 1821a15..74297a7 100644 --- a/clinvar_api/msg/sub_payload.py +++ b/clinvar_api/msg/sub_payload.py @@ -302,8 +302,9 @@ class SubmissionCitation: @attrs.define(frozen=True) class SubmissionAssertionCriteria: - citation: SubmissionCitation - method: str + db: typing.Optional[CitationDb] = None + id: typing.Optional[str] = None + url: typing.Optional[str] = None @attrs.define(frozen=True) @@ -357,8 +358,6 @@ class SubmissionClinvarSubmission: conditionSet: SubmissionConditionSet observedIn: typing.List[SubmissionObservedIn] recordStatus: RecordStatus - releaseStatus: ReleaseStatus - assertionCriteria: typing.Optional[SubmissionAssertionCriteria] = None clinvarAccession: typing.Optional[str] = None compoundHeterozygoteSet: typing.Optional[SubmissionCompoundHeterozygoteSet] = None diplotypeSet: typing.Optional[SubmissionDiplotypeSet] = None @@ -377,7 +376,9 @@ class SubmissionClinvarSubmission: class SubmissionContainer: """Representation of the container for a submission.""" + assertionCriteria: typing.Optional[SubmissionAssertionCriteria] = None behalfOrgID: typing.Optional[int] = None clinvarDeletion: typing.Optional[SubmissionClinvarDeletion] = None clinvarSubmission: typing.Optional[typing.List[SubmissionClinvarSubmission]] = None + clinvarSubmissionReleaseStatus: typing.Optional[ReleaseStatus] = None submissionName: typing.Optional[str] = None diff --git a/clinvar_api/schemas/submission_schema.json b/clinvar_api/schemas/submission_schema.json index 180f2c2..60fce6b 100644 --- a/clinvar_api/schemas/submission_schema.json +++ b/clinvar_api/schemas/submission_schema.json @@ -2,6 +2,49 @@ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { + "assertionCriteria": { + "type": "object", + "description": "\"Assertion criteria\" refers to documentation of the criteria that your organization uses to classify variants. It can be provided as a database identifier, like a PubMed ID, or a file that is submitted to ClinVar, but not both. Only one document may be provided for assertion criteria. These fields are equivalent to the \"Assertion method citation\" column in the spreadsheet. Note that only one single assertion criteria (a citation or an electronic document) may be provided for a submission. This assertion criteria will be applied to all interpretations in the submission. For assertion criteria submitted as a database identifier, an assertion criteria name will be calculated based on the citation details. For assertion criteria submitted as a file, you may provide an assertion criteria name during file upload on your Organization page in Submission Portal.", + "properties": { + "db": { + "type": "string", + "enum": [ + "PubMed", + "DOI", + "pmc" + ] + }, + "id": { + "type": "string", + "errors": { + "pattern": "The identifier value is considered an invalid citation. Please provide only one identifier as the citation for your assertion criteria." + }, + "pattern": "^[^;]+$" + }, + "url": { + "type": "string", + "description": " The URL for a file that you have already submitted to ClinVar as assertion criteria. If you need to find this URL or if you need to submit new assertion criteria, please go to the \"View/add assertion criteria files\" tab on your Organization page in Submission Portal.", + "errors": { + "pattern": "The URL for assertion criteria must be the URL provided by ClinVar. If you need to find this URL or if you need to submit new assertion criteria, Please go to the \"View/add assertion criteria files\" tab on your Organization page in Submission Portal." + }, + "pattern": "^https://[qd]?submit.ncbi.nlm.nih.gov/(api/2.0/files|ft/byid)/.*" + } + }, + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "url" + ] + }, + { + "required": [ + "db", + "id" + ] + } + ] + }, "behalfOrgID": { "type": "integer", "description": "Optional. When submitting on behalf of another organization, this specifies the other organization's ID", @@ -53,66 +96,11 @@ "description": "Submissions to ClinVar are considered 'variant-level' (not case-level or patient-specific), because they are focused on the variant or set of variants that was interpreted. One of variantSet, haplotypeSet, haplotypeSingleVariantSet, phaseUnknownSet, distinctChromosomesSet, diplotypeSet, compoundHeterozygoteSet is required to define the variant or set of variants that was interpreted.", "required": [ "recordStatus", - "releaseStatus", "clinicalSignificance", "observedIn", "conditionSet" ], "properties": { - "assertionCriteria": { - "type": "object", - "required": [ - "method", - "citation" - ], - "properties": { - "citation": { - "type": "object", - "description": "\"Assertion criteria\" refers to documentation of the criteria that your organization uses to classify variants. It can be provided as a database identifier, like a PubMed ID, or a file that is submitted to ClinVar, but not both. Only one document may be provided for assertion criteria. These fields are equivalent to the \"Assertion method citation\" column in the spreadsheet.", - "properties": { - "db": { - "type": "string", - "enum": [ - "PubMed", - "BookShelf", - "DOI", - "pmc" - ] - }, - "id": { - "type": "string" - }, - "url": { - "type": "string", - "description": "The URL for a file that you have already submitted to ClinVar as assertion criteria.", - "errors": { - "pattern": "The URL for assertion criteria must be the URL provided by ClinVar. Contact clinvar@ncbi.nlm.nih.gov if you need to find this URL or if you need to submit new assertion criteria." - }, - "pattern": "^https://[qd]?submit.ncbi.nlm.nih.gov/ft/byid/.*" - } - }, - "additionalProperties": false, - "oneOf": [ - { - "required": [ - "url" - ] - }, - { - "required": [ - "db", - "id" - ] - } - ] - }, - "method": { - "type": "string", - "description": "A name for your assertion criteria is required. We'll use the file name if a file is cited so the submitter does not need to provide a separate name. The submitter must provide a name if a database identifier is cited. This field is equivalent to the \"Assertion method\" column in the spreadsheet." - } - }, - "additionalProperties": false - }, "clinicalSignificance": { "type": "object", "description": "Clinical significance", @@ -424,14 +412,6 @@ "update" ] }, - "releaseStatus": { - "type": "string", - "description": "\"hold until published\" allows a temporary hold on data being presented publicly. If no value is provided, the default is public.", - "enum": [ - "public", - "hold until published" - ] - }, "variantSet": { "$ref": "#/definitions/variantSetType" } @@ -511,6 +491,14 @@ } } }, + "clinvarSubmissionReleaseStatus": { + "type": "string", + "description": "\"hold until published\" allows a temporary hold on submission data being presented publicly. If no value is provided, the default is public.", + "enum": [ + "public", + "hold until published" + ] + }, "submissionName": { "type": "string", "description": "Optional. The name for this submission. If not provided, it will be the submission id." diff --git a/clinvar_this/batches.py b/clinvar_this/batches.py index 4a38ce8..d493e82 100644 --- a/clinvar_this/batches.py +++ b/clinvar_this/batches.py @@ -192,7 +192,7 @@ def submit(config: config.Config, name: str, *, use_testing: bool = False, dry_r ) logger.info( ( - "The next step is to run ``clinvar-this submission retrieve %s`` and wait until you get a " + "The next step is to run ``clinvar-this batch retrieve %s`` and wait until you get a " "final success or error response" ), name, diff --git a/clinvar_this/io/tsv.py b/clinvar_this/io/tsv.py index 3807e10..ae2b3d4 100644 --- a/clinvar_this/io/tsv.py +++ b/clinvar_this/io/tsv.py @@ -22,7 +22,6 @@ ReleaseStatus, SubmissionAssertionCriteria, SubmissionChromosomeCoordinates, - SubmissionCitation, SubmissionClinicalSignificance, SubmissionClinvarSubmission, SubmissionCondition, @@ -260,6 +259,14 @@ def record_condition(record: TsvRecord): release_status = batch_metadata.release_status or BATCH_METADATA_DEFAULTS["release_status"] return SubmissionContainer( + assertion_criteria=SubmissionAssertionCriteria( + # The following should come from the profile, cf. + # + # https://github.com/bihealth/clinvar-this/issues/36 + db=CitationDb.PUBMED, + id="25741868", + ), + clinvar_submission_release_status=release_status, clinvar_submission=[ SubmissionClinvarSubmission( local_id=str(_uuid4_if_falsy()), @@ -277,17 +284,6 @@ def record_condition(record: TsvRecord): mode_of_inheritance=record.inheritance, ), record_status=RecordStatus.NOVEL, - release_status=release_status, - assertion_criteria=SubmissionAssertionCriteria( - # The following should come from the profile, cf. - # - # https://github.com/bihealth/clinvar-this/issues/36 - citation=SubmissionCitation( - db=CitationDb.PUBMED, - id="25741868", - ), - method="ACMG Assertion Criteria", - ), variant_set=SubmissionVariantSet( variant=[ SubmissionVariant( @@ -304,7 +300,7 @@ def record_condition(record: TsvRecord): ), ) for record in tsv_records - ] + ], ) diff --git a/tests/clinvar_api/conftest.py b/tests/clinvar_api/conftest.py index f93e401..61bc9c7 100644 --- a/tests/clinvar_api/conftest.py +++ b/tests/clinvar_api/conftest.py @@ -481,6 +481,7 @@ def data_summary_response_error_all(): @pytest.fixture def data_submission_snv(): return { + "clinvarSubmissionReleaseStatus": "hold until published", "clinvarSubmission": [ { "assertionCriteria": { @@ -546,7 +547,6 @@ def data_submission_snv(): } ], "recordStatus": "novel", - "releaseStatus": "hold until published", "variantSet": { "variant": [ { @@ -562,5 +562,5 @@ def data_submission_snv(): ] }, } - ] + ], } diff --git a/tests/clinvar_api/test_models_unit.py b/tests/clinvar_api/test_models_unit.py index cd92062..e77c083 100644 --- a/tests/clinvar_api/test_models_unit.py +++ b/tests/clinvar_api/test_models_unit.py @@ -895,15 +895,22 @@ def test_submission_citation_to_msg(): def test_submission_assertion_criteria_construction(): models.SubmissionAssertionCriteria( - citation=models.SubmissionCitation(), - method="some-method", - ) + db=models.CitationDb.PMC, + id="PMC123", + url="https://example.com", + ).to_msg() + models.SubmissionAssertionCriteria( + db=None, + id=None, + url=None, + ).to_msg() def test_submission_assertion_criteria_to_msg(): models.SubmissionAssertionCriteria( - citation=models.SubmissionCitation(), - method="some-method", + db=models.CitationDb.PMC, + id="PMC123", + url="https://example.com", ).to_msg() @@ -1081,11 +1088,6 @@ def test_submission_clinvar_submission_construction(): ) ], record_status="record-status", - release_status="release-status", - assertion_criteria=models.SubmissionAssertionCriteria( - citation=models.SubmissionCitation(), - method="some-method", - ), clinvar_accession="some-accession", compound_heterozygote_set=models.SubmissionCompoundHeterozygoteSet( hgvs="hgvs", @@ -1136,7 +1138,6 @@ def test_submission_clinvar_submission_construction(): ) ], record_status="record-status", - release_status="release-status", ) @@ -1154,11 +1155,6 @@ def test_submission_clinvar_submission_to_msg(): ) ], record_status="record-status", - release_status="release-status", - assertion_criteria=models.SubmissionAssertionCriteria( - citation=models.SubmissionCitation(), - method="some-method", - ), clinvar_accession="some-accession", compound_heterozygote_set=models.SubmissionCompoundHeterozygoteSet( hgvs="hgvs", @@ -1209,7 +1205,6 @@ def test_submission_clinvar_submission_to_msg(): ) ], record_status="record-status", - release_status="release-status", ).to_msg() @@ -1225,6 +1220,7 @@ def test_submission_container_construction(): ] ), clinvar_submission=None, + clinvar_submission_release_status="release-status", submission_name="some-name", ) models.SubmissionContainer( @@ -1244,9 +1240,9 @@ def test_submission_container_construction(): ) ], record_status="record-status", - release_status="release-status", ) ], + clinvar_submission_release_status="release-status", submission_name="some-name", ) @@ -1263,6 +1259,7 @@ def test_submission_container_to_msg(): ] ), clinvar_submission=None, + clinvar_submission_release_status="release-status", submission_name="some-name", ).to_msg() models.SubmissionContainer( @@ -1282,8 +1279,8 @@ def test_submission_container_to_msg(): ) ], record_status="record-status", - release_status="release-status", ) ], + clinvar_submission_release_status="release-status", submission_name="some-name", ).to_msg() diff --git a/tests/clinvar_api/test_msg_unit.py b/tests/clinvar_api/test_msg_unit.py index 91e6eaa..e7e0e8d 100644 --- a/tests/clinvar_api/test_msg_unit.py +++ b/tests/clinvar_api/test_msg_unit.py @@ -219,7 +219,6 @@ def test_summary_response_submission_construction(): msg.SummaryResponseError(input=[], output=msg.SummaryResponseErrorOutput(errors=[])) ], releaseDate="2022-01-01", - releaseStatus="released", ) msg.SummaryResponseSubmission( identifiers=msg.SummaryResponseSubmissionIdentifiers(clinvarLocalKey="local-key"), @@ -227,7 +226,6 @@ def test_summary_response_submission_construction(): clinvarAccessionVersion=None, errors=None, releaseDate=None, - releaseStatus=None, ) @@ -471,8 +469,9 @@ def test_submission_citation_construction(): def test_submission_assertion_criteria_construction(): msg.SubmissionAssertionCriteria( - citation=msg.SubmissionCitation(), - method="some-method", + db=msg.CitationDb.PMC, + id="PMC123", + url="https://example.com", ) @@ -570,11 +569,6 @@ def test_submission_clinvar_submission_construction(): ) ], recordStatus="record-status", - releaseStatus="release-status", - assertionCriteria=msg.SubmissionAssertionCriteria( - citation=msg.SubmissionCitation(), - method="some-method", - ), clinvarAccession="some-accession", compoundHeterozygoteSet=msg.SubmissionCompoundHeterozygoteSet( hgvs="hgvs", @@ -625,7 +619,6 @@ def test_submission_clinvar_submission_construction(): ) ], recordStatus="record-status", - releaseStatus="release-status", ) @@ -640,12 +633,18 @@ def test_submission_container_construction(): ) ] ), - clinvarSubmission=None, + clinvarSubmissionReleaseStatus=None, submissionName="some-name", ) msg.SubmissionContainer( + assertionCriteria=msg.SubmissionAssertionCriteria( + db=msg.CitationDb.PMC, + id="PMC123", + url="https://example.com", + ), behalfOrgID=123, clinvarDeletion=None, + clinvarSubmissionReleaseStatus="release-status", clinvarSubmission=[ msg.SubmissionClinvarSubmission( clinicalSignificance=msg.SubmissionClinicalSignificance( @@ -660,7 +659,6 @@ def test_submission_container_construction(): ) ], recordStatus="record-status", - releaseStatus="release-status", ) ], submissionName="some-name",