From 9efa831a85d0a8896b34942925e9e14f594daf93 Mon Sep 17 00:00:00 2001 From: Dan LaManna Date: Wed, 27 Sep 2023 10:35:25 -0400 Subject: [PATCH] Add method for removing metadata from an accession --- isic/ingest/models/accession.py | 26 ++++++++++++++++++++++++++ isic/ingest/tests/test_metadata.py | 21 +++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/isic/ingest/models/accession.py b/isic/ingest/models/accession.py index 0a9be4e0..42855c15 100644 --- a/isic/ingest/models/accession.py +++ b/isic/ingest/models/accession.py @@ -377,6 +377,32 @@ def update_metadata( return modified + def remove_metadata( + self, user: User, metadata_fields: list[str], *, ignore_image_check=False, reset_review=True + ): + """Remove metadata from an accession.""" + if self.pk and not ignore_image_check: + self._require_unpublished() + + modified = False + with transaction.atomic(): + for field in metadata_fields: + if self.metadata.pop(field, None) is not None: + modified = True + + if reset_review: + from isic.ingest.services.accession.review import accession_review_delete + + accession_review_delete(accession=self) + + if modified: + self.metadata_versions.create( + creator=user, + metadata=self.metadata, + unstructured_metadata=self.unstructured_metadata, + ) + self.save() + def remove_unstructured_metadata( self, user: User, unstructured_metadata_fields: list[str] ) -> bool: diff --git a/isic/ingest/tests/test_metadata.py b/isic/ingest/tests/test_metadata.py index 35c4d402..52767d8a 100644 --- a/isic/ingest/tests/test_metadata.py +++ b/isic/ingest/tests/test_metadata.py @@ -243,6 +243,27 @@ def test_accession_remove_unstructured_metadata(user, imageless_accession): assert imageless_accession.metadata_versions.count() == 2 +@pytest.mark.django_db +def test_accession_remove_metadata(user, imageless_accession): + imageless_accession.update_metadata( + user, {"diagnosis": "melanoma", "benign_malignant": "malignant"} + ) + imageless_accession.remove_metadata(user, ["diagnosis"]) + assert imageless_accession.metadata == {"benign_malignant": "malignant"} + assert imageless_accession.metadata_versions.count() == 2 + + +@pytest.mark.django_db +def test_accession_remove_metadata_idempotent(user, imageless_accession): + imageless_accession.update_metadata( + user, {"diagnosis": "melanoma", "benign_malignant": "malignant"} + ) + imageless_accession.remove_metadata(user, ["diagnosis"]) + imageless_accession.remove_metadata(user, ["diagnosis"]) + assert imageless_accession.metadata == {"benign_malignant": "malignant"} + assert imageless_accession.metadata_versions.count() == 2 + + @pytest.mark.django_db def test_accession_remove_unstructured_metadata_idempotent(user, imageless_accession): imageless_accession.update_metadata(user, {"foo": "bar", "baz": "qux"})