Skip to content

Commit c97b785

Browse files
authored
Clean upload session object created in task (#4363)
Also change `error_message` text field to allow blank but not null.
1 parent c1569b2 commit c97b785

7 files changed

Lines changed: 75 additions & 12 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 4.2.25 on 2025-10-21 10:14
2+
3+
from django.db import migrations
4+
5+
6+
def replace_error_message_none_values(apps, _schema_editor):
7+
RawImageUploadSession = apps.get_model( # noqa: N806
8+
"cases", "RawImageUploadSession"
9+
)
10+
11+
RawImageUploadSession.objects.filter(error_message__isnull=True).update(
12+
error_message=""
13+
)
14+
15+
16+
class Migration(migrations.Migration):
17+
18+
dependencies = [
19+
("cases", "0021_dicomimagesetupload_task_on_success"),
20+
]
21+
22+
operations = [
23+
migrations.RunPython(replace_error_message_none_values, elidable=True),
24+
]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 4.2.25 on 2025-10-17 17:24
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("cases", "0022_auto_20251021_1014"),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name="rawimageuploadsession",
15+
name="error_message",
16+
field=models.TextField(blank=True, default=""),
17+
preserve_default=False,
18+
),
19+
]

app/grandchallenge/cases/models.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,13 @@ class RawImageUploadSession(UUIDModel):
131131
blank=True, null=True, default=None, editable=False
132132
)
133133

134-
error_message = models.TextField(blank=False, null=True, default=None)
134+
error_message = models.TextField(blank=True)
135135

136136
def __str__(self):
137137
return (
138138
f"Upload Session <{str(self.pk).split('-')[0]}>, "
139139
f"({self.get_status_display()}) "
140-
f"{self.error_message or ''}"
140+
f"{self.error_message}"
141141
)
142142

143143
def save(self, *args, **kwargs):
@@ -170,6 +170,8 @@ def default_error_message(self):
170170
return (
171171
f"{n_errors} file{pluralize(n_errors)} could not be imported"
172172
)
173+
else:
174+
return ""
173175

174176
def get_error_handler(self, *, linked_object=None):
175177
return RawImageUploadSessionErrorHandler(
@@ -201,7 +203,7 @@ def update_status(
201203
self.error_message = notification_description
202204
self.save()
203205

204-
if self.error_message and self.creator:
206+
if notification_description and self.creator:
205207
Notification.send(
206208
kind=NotificationTypeChoices.IMAGE_IMPORT_STATUS,
207209
description=notification_description,

app/grandchallenge/components/models.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2560,9 +2560,18 @@ def _create_civ_for_image( # noqa: C901
25602560
f"You need to provide a user along with the user upload "
25612561
f"queryset for interface {ci}"
25622562
)
2563-
upload_session = RawImageUploadSession.objects.create(
2564-
creator=user
2565-
)
2563+
upload_session = RawImageUploadSession(creator=user)
2564+
try:
2565+
upload_session.full_clean()
2566+
except ValidationError as e:
2567+
error_handler = self.get_error_handler()
2568+
error_handler.handle_error(
2569+
interface=ci,
2570+
error_message=format_validation_error_message(error=e),
2571+
user=user,
2572+
)
2573+
return
2574+
upload_session.save()
25662575
upload_session.user_uploads.set(user_upload_queryset)
25672576

25682577
upload_session.process_images(
@@ -2606,7 +2615,16 @@ def _create_civ_for_image( # noqa: C901
26062615
},
26072616
immutable=True,
26082617
)
2609-
upload.full_clean()
2618+
try:
2619+
upload.full_clean()
2620+
except ValidationError as e:
2621+
error_handler = self.get_error_handler()
2622+
error_handler.handle_error(
2623+
interface=ci,
2624+
error_message=format_validation_error_message(error=e),
2625+
user=user,
2626+
)
2627+
return
26102628
upload.save()
26112629
upload.user_uploads.set(dicom_upload_with_name.user_uploads)
26122630

app/tests/cases_tests/test_background_tasks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def test_staged_mhd_upload_with_additional_headers(
9191

9292
session.refresh_from_db()
9393
assert session.status == session.SUCCESS
94-
assert session.error_message is None
94+
assert not session.error_message
9595

9696
images = Image.objects.filter(origin=session).all()
9797
assert len(images) == 1
@@ -189,7 +189,7 @@ def test_mhd_file_annotation_creation(
189189

190190
session.refresh_from_db()
191191
assert session.status == session.SUCCESS
192-
assert session.error_message is None
192+
assert not session.error_message
193193

194194
images = Image.objects.filter(origin=session).all()
195195
assert len(images) == 1

app/tests/components_tests/test_models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1595,7 +1595,7 @@ def test_displacement_field_validation(
15951595
session.refresh_from_db()
15961596

15971597
assert session.status == session.SUCCESS
1598-
assert session.error_message is None
1598+
assert not session.error_message
15991599

16001600
image = Image.objects.filter(origin=session).get()
16011601

app/tests/reader_studies_tests/test_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,7 +1270,7 @@ def test_ground_truth(client):
12701270
@pytest.mark.parametrize(
12711271
"overlay_segments,error",
12721272
(
1273-
([], None),
1273+
([], ""),
12741274
(
12751275
[{"name": "s1", "visible": True, "voxel_value": 0}],
12761276
(
@@ -1283,7 +1283,7 @@ def test_ground_truth(client):
12831283
{"name": "s1", "visible": True, "voxel_value": 0},
12841284
{"name": "s2", "visible": True, "voxel_value": 1},
12851285
],
1286-
None,
1286+
"",
12871287
),
12881288
),
12891289
)

0 commit comments

Comments
 (0)