optimise some dicom manipulations
This commit is contained in:
+23
-21
@@ -357,36 +357,38 @@ def series_split_by_tag(request, series_id: int, dicom_tag: str):
|
||||
|
||||
image_map = defaultdict(list)
|
||||
|
||||
# Split teh associated images
|
||||
for image in series.images.all():
|
||||
# Use iterator to avoid loading all images into memory
|
||||
for image in series.images.iterator():
|
||||
ds = image.get_dicom_data()
|
||||
|
||||
if dicom_tag in ds:
|
||||
val = ds[dicom_tag].value
|
||||
|
||||
if type(val) == pydicom.multival.MultiValue:
|
||||
image_map[",".join((val))].append(image)
|
||||
if isinstance(val, pydicom.multival.MultiValue):
|
||||
key = ",".join(map(str, val))
|
||||
else:
|
||||
image_map[val].append(image)
|
||||
key = str(val)
|
||||
image_map[key].append(image)
|
||||
else:
|
||||
return [f"{dicom_tag} not found {image}"]
|
||||
|
||||
case = list(series.case.all())
|
||||
authors = list(series.author.all())
|
||||
new_series = []
|
||||
case = series.case.all()
|
||||
authors = series.author.all()
|
||||
|
||||
for n, option in enumerate(image_map):
|
||||
if n == 0:
|
||||
series.images.set(image_map[option])
|
||||
|
||||
else:
|
||||
series.pk = None
|
||||
series.save()
|
||||
series.case.set(case)
|
||||
series.author.set(authors)
|
||||
series.images.set(image_map[option])
|
||||
|
||||
new_series.append(series.pk)
|
||||
# Use a transaction for all DB changes
|
||||
with transaction.atomic():
|
||||
for n, (option, images) in enumerate(image_map.items()):
|
||||
if n == 0:
|
||||
# Update the original series
|
||||
series.images.set(images)
|
||||
new_series.append(series.pk)
|
||||
else:
|
||||
# Clone the series
|
||||
series.pk = None
|
||||
series.save()
|
||||
series.case.set(case)
|
||||
series.author.set(authors)
|
||||
series.images.set(images)
|
||||
new_series.append(series.pk)
|
||||
|
||||
return new_series
|
||||
|
||||
|
||||
Reference in New Issue
Block a user