Skip to content

Commit 4493a13

Browse files
authored
Check for number of images in ds update task (#2537)
1 parent d326e7a commit 4493a13

File tree

2 files changed

+73
-5
lines changed

2 files changed

+73
-5
lines changed

app/grandchallenge/reader_studies/tasks.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
from django.conf import settings
33
from django.db import transaction
44

5-
from grandchallenge.cases.models import Image
5+
from grandchallenge.algorithms.exceptions import ImageImportError
6+
from grandchallenge.cases.models import Image, RawImageUploadSession
67
from grandchallenge.components.models import (
78
ComponentInterface,
89
ComponentInterfaceValue,
@@ -49,12 +50,23 @@ def add_scores_for_display_set(*, instance_pk, ds_pk):
4950
add_score(instance, ground_truth.answer)
5051

5152

52-
@shared_task(**settings.CELERY_TASK_DECORATOR_KWARGS["acks-late-micro-short"])
53+
@shared_task(
54+
**settings.CELERY_TASK_DECORATOR_KWARGS["acks-late-micro-short"],
55+
throws=(ImageImportError,),
56+
)
5357
def add_image_to_display_set(
5458
*, upload_session_pk, display_set_pk, interface_pk
5559
):
5660
display_set = DisplaySet.objects.get(pk=display_set_pk)
57-
image = Image.objects.get(origin_id=upload_session_pk)
61+
upload_session = RawImageUploadSession.objects.get(pk=upload_session_pk)
62+
try:
63+
image = Image.objects.get(origin_id=upload_session_pk)
64+
except (Image.DoesNotExist, Image.MultipleObjectsReturned):
65+
error_message = "Image imports should result in a single image"
66+
upload_session.status = RawImageUploadSession.FAILURE
67+
upload_session.error_message = error_message
68+
upload_session.save()
69+
raise ImageImportError(error_message)
5870
interface = ComponentInterface.objects.get(pk=interface_pk)
5971
with transaction.atomic():
6072
display_set.values.remove(

app/tests/reader_studies_tests/test_tasks.py

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
import pytest
22

3-
from grandchallenge.components.models import ComponentInterface
3+
from grandchallenge.algorithms.exceptions import ImageImportError
4+
from grandchallenge.cases.models import RawImageUploadSession
5+
from grandchallenge.components.models import (
6+
ComponentInterface,
7+
ComponentInterfaceValue,
8+
)
49
from grandchallenge.reader_studies.tasks import (
10+
add_image_to_display_set,
511
create_display_sets_for_upload_session,
612
)
13+
from tests.cases_tests.factories import RawImageUploadSessionFactory
14+
from tests.components_tests.factories import ComponentInterfaceFactory
715
from tests.factories import ImageFactory
8-
from tests.reader_studies_tests.factories import ReaderStudyFactory
16+
from tests.reader_studies_tests.factories import (
17+
DisplaySetFactory,
18+
ReaderStudyFactory,
19+
)
920

1021

1122
@pytest.mark.django_db
@@ -33,3 +44,48 @@ def test_create_display_sets_for_upload_session():
3344

3445
assert rs.display_sets.count() == 1
3546
assert rs.display_sets.first().values.first().image == image
47+
48+
49+
@pytest.mark.django_db
50+
def test_add_image_to_display_set(settings):
51+
settings.task_eager_propagates = (True,)
52+
settings.task_always_eager = (True,)
53+
54+
ds = DisplaySetFactory()
55+
us = RawImageUploadSessionFactory()
56+
ci = ComponentInterfaceFactory()
57+
58+
error_message = "Image imports should result in a single image"
59+
60+
with pytest.raises(ImageImportError):
61+
add_image_to_display_set(
62+
upload_session_pk=us.pk,
63+
display_set_pk=ds.pk,
64+
interface_pk=ci.pk,
65+
)
66+
assert ComponentInterfaceValue.objects.filter(interface=ci).count() == 0
67+
us.refresh_from_db()
68+
assert us.status == RawImageUploadSession.FAILURE
69+
assert us.error_message == error_message
70+
71+
im1, im2 = ImageFactory.create_batch(2, origin=us)
72+
73+
with pytest.raises(ImageImportError):
74+
add_image_to_display_set(
75+
upload_session_pk=us.pk,
76+
display_set_pk=ds.pk,
77+
interface_pk=ci.pk,
78+
)
79+
assert ComponentInterfaceValue.objects.filter(interface=ci).count() == 0
80+
us.refresh_from_db()
81+
assert us.status == RawImageUploadSession.FAILURE
82+
assert us.error_message == error_message
83+
84+
im2.delete()
85+
86+
add_image_to_display_set(
87+
upload_session_pk=us.pk,
88+
display_set_pk=ds.pk,
89+
interface_pk=ci.pk,
90+
)
91+
assert ComponentInterfaceValue.objects.filter(interface=ci).count() == 1

0 commit comments

Comments
 (0)