Skip to content

Commit

Permalink
Re-validate version metadata during unembargo
Browse files Browse the repository at this point in the history
  • Loading branch information
jjnesbitt committed Jul 29, 2024
1 parent 418e39f commit b47a06c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
7 changes: 7 additions & 0 deletions dandiapi/api/services/embargo/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from dandiapi.api.models import AssetBlob, Dandiset, Version
from dandiapi.api.services.asset.exceptions import DandisetOwnerRequiredError
from dandiapi.api.services.exceptions import DandiError
from dandiapi.api.services.metadata import validate_version_metadata
from dandiapi.api.storage import get_boto_client
from dandiapi.api.tasks import unembargo_dandiset_task

Expand Down Expand Up @@ -93,9 +94,15 @@ def unembargo_dandiset(ds: Dandiset):
# Fetch version to ensure changed embargo_status is included
# Save version to update metadata through populate_metadata
v = Version.objects.select_for_update().get(dandiset=ds, version='draft')
v.status = Version.Status.PENDING
v.save()
logger.info('Version metadata updated')

# Pre-emptively validate version metadata, so that old validation
# errors don't show up once un-embargo is finished
validate_version_metadata(version=v)
logger.info('Version metadata validated')

# Notify owners of completed unembargo
send_dandiset_unembargoed_message(ds)
logger.info('Dandiset owners notified.')
Expand Down
25 changes: 24 additions & 1 deletion dandiapi/api/tests/test_unembargo.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import pytest

from dandiapi.api.models.dandiset import Dandiset
from dandiapi.api.models.version import Version
from dandiapi.api.services.embargo import (
AssetBlobEmbargoedError,
_remove_dandiset_asset_blob_embargo_tags,
Expand All @@ -22,7 +23,6 @@

if TYPE_CHECKING:
from dandiapi.api.models.asset import AssetBlob
from dandiapi.api.models.version import Version


@pytest.mark.django_db()
Expand Down Expand Up @@ -217,6 +217,29 @@ def test_unembargo_dandiset(
assert owner_email_set == mailoutbox_to_email_set


@pytest.mark.django_db()
def test_unembargo_dandiset_validate_version_metadata(draft_version_factory, asset_factory, mocker):
from dandiapi.api.services import embargo as embargo_service

draft_version: Version = draft_version_factory(
dandiset__embargo_status=Dandiset.EmbargoStatus.UNEMBARGOING
)
ds: Dandiset = draft_version.dandiset
draft_version.validation_errors = ['error ajhh']
draft_version.status = Version.Status.INVALID
draft_version.save()
draft_version.assets.add(asset_factory())

# Spy on the imported function in the embargo service
validate_version_spy = mocker.spy(embargo_service, 'validate_version_metadata')

unembargo_dandiset(ds)

assert validate_version_spy.call_count == 1
draft_version.refresh_from_db()
assert not draft_version.validation_errors


@pytest.mark.django_db()
def test_unembargo_dandiset_task_failure(draft_version_factory, mailoutbox):
# Intentionally set the status to embargoed so the task will fail
Expand Down

0 comments on commit b47a06c

Please sign in to comment.