image findings will now save and reload stack index

This commit is contained in:
Ross
2024-09-23 14:05:09 +01:00
parent edc9b29233
commit 5a9868a56d
8 changed files with 169 additions and 49 deletions
+67 -33
View File
@@ -29,7 +29,6 @@ from loguru import logger
router = Router()
class SeriesSchema(ModelSchema):
case_id: List[int] = []
@@ -59,6 +58,7 @@ def upload_dicom(request, files: List[UploadedFile] = File(...)):
uploaded = []
duplicate = []
failed = []
duplicate_series = set()
for file in files:
# data = file.read()
try:
@@ -67,26 +67,41 @@ def upload_dicom(request, files: List[UploadedFile] = File(...)):
ud.save()
uploaded.append((file.name, ud.image_blake3_hash))
except DuplicateDicom:
except DuplicateDicom as e:
duplicate.append((file.name, ud.image_blake3_hash))
duplicate_series.add(e.duplicate.get_series().get_absolute_url())
print(duplicate_series)
pass
except InvalidDicomError:
failed.append(file.name)
return {"uploaded": uploaded, "duplicates": duplicate, "failed": failed}
return {
"uploaded": uploaded,
"duplicates": duplicate,
"failed": failed,
"duplicate_series": list(duplicate_series),
}
@router.post("/generate_image_hash", auth=django_auth)
def generate_image_hash(request, id:int):
def generate_image_hash(request, id: int):
s = SeriesImage.objects.get(pk=id)
s.generate_hashes()
return {"md5": s.image_md5_hash, "blake3": s.image_blake3_hash, "is_dicom": s.is_dicom}
return {
"md5": s.image_md5_hash,
"blake3": s.image_blake3_hash,
"is_dicom": s.is_dicom,
}
@router.post("/clear_dicoms", auth=django_auth)
def clear_dicoms(request):
if "selection" in request.POST:
dicoms = UncategorisedDicom.objects.filter(series_instance_uid__in=request.POST.getlist("selection"))
dicoms = UncategorisedDicom.objects.filter(
series_instance_uid__in=request.POST.getlist("selection")
)
else:
dicoms = UncategorisedDicom.objects.filter(user=request.user)
@@ -110,15 +125,17 @@ def uncategorised_dicoms(request):
return data
def import_dicoms_helper(request, case_id: int | None = None):
#dicoms = UncategorisedDicom.objects.filter(user=request.user)
# dicoms = UncategorisedDicom.objects.filter(user=request.user)
if "selection" in request.POST:
dicoms = UncategorisedDicom.objects.filter(series_instance_uid__in=request.POST.getlist("selection"))
dicoms = UncategorisedDicom.objects.filter(
series_instance_uid__in=request.POST.getlist("selection")
)
else:
dicoms = UncategorisedDicom.objects.filter(user=request.user)
if "order-series" in request.POST:
order = request.POST["order-series"]
else:
@@ -136,7 +153,9 @@ def import_dicoms_helper(request, case_id: int | None = None):
tags = data[series_uid][0][1]
# Check if series with the id already exists (in which case we just add to htat)
if Series.objects.filter(series_instance_uid=tags["SeriesInstanceUID"]).exists():
if Series.objects.filter(
series_instance_uid=tags["SeriesInstanceUID"]
).exists():
series = Series.objects.get(series_instance_uid=tags["SeriesInstanceUID"])
else:
series = Series(
@@ -146,16 +165,16 @@ def import_dicoms_helper(request, case_id: int | None = None):
)
if tags["StudyDescription"]:
examination, created = Examination.objects.get_or_create(examination=tags["StudyDescription"])
examination, created = Examination.objects.get_or_create(
examination=tags["StudyDescription"]
)
if created:
examination.modality = modality
examination.save()
series.examination = examination
series.save()
match order:
case "order-series-instance-number":
series.order_by_dicom("InstanceNumber")
@@ -188,12 +207,18 @@ def import_dicoms_helper(request, case_id: int | None = None):
return series_list
@router.post("/import_dicoms", auth=django_auth, response=List[Tuple[ SeriesSchema, str ]])
@router.post(
"/import_dicoms", auth=django_auth, response=List[Tuple[SeriesSchema, str]]
)
def import_dicoms(request):
return import_dicoms_helper(request)
@router.post("/import_dicoms/{case_id}", auth=django_auth, response=List[Tuple[ SeriesSchema, str ]])
@router.post(
"/import_dicoms/{case_id}",
auth=django_auth,
response=List[Tuple[SeriesSchema, str]],
)
def import_dicoms_case(request, case_id: int):
return import_dicoms_helper(request, case_id=case_id)
@@ -220,8 +245,9 @@ def series_remove_duplicate_images(request, series_id: int):
return len(dupes)
@router.get("/series_truncate/{series_id}/{start}/{end}/", auth=django_auth)
def series_truncate(request, series_id: int, start: int, end:int):
def series_truncate(request, series_id: int, start: int, end: int):
print(start, end)
series = get_object_or_404(Series, pk=series_id)
@@ -230,11 +256,11 @@ def series_truncate(request, series_id: int, start: int, end:int):
images_removed = []
for n, image in enumerate(series.get_images()):
if n >= start and n <=end:
if n >= start and n <= end:
continue
else:
print(n, image)
image.removed=True
image.removed = True
image.image = None
image.save()
images_removed.append(image.pk)
@@ -261,10 +287,11 @@ def check_image_hash(request, hash: str):
data = {"status": "success", "id": False}
return data
@router.post("/check_image_hashes/", auth=django_auth)
def check_images_hashes(request, hashes: List[str]):
"""Checks a list of image hashes and returns the series id / url if found
Return format
{ "hash_id": {"id": "series_id|false", "url": "series_url|false"}, ...}
"""
@@ -278,21 +305,28 @@ def check_images_hashes(request, hashes: List[str]):
data = {
"id": series_image.pk,
"url": series_image.series.get_absolute_url(),
"type": "series"
"type": "series",
}
except SeriesImage.DoesNotExist:
try:
uncategorised_dicom = UncategorisedDicom.objects.get(image_blake3_hash=hash)
data = { "id":uncategorised_dicom.pk, "url": reverse("atlas:user_uploads"), "type": "uncategorised"}
uncategorised_dicom = UncategorisedDicom.objects.get(
image_blake3_hash=hash
)
data = {
"id": uncategorised_dicom.pk,
"url": reverse("atlas:user_uploads"),
"type": "uncategorised",
}
except UncategorisedDicom.DoesNotExist:
data = { "id": False, "url": False}
data = {"id": False, "url": False}
hash_status[hash] = data
return hash_status
#@router.get("/generate_image_hash/{id}", auth=django_auth)
#def generate_image_hash(request, id: int):
# @router.get("/generate_image_hash/{id}", auth=django_auth)
# def generate_image_hash(request, id: int):
# series_image = SeriesImage.objects.get(pk=id)
#
# series_image.image_blake3_hash = ""
@@ -301,21 +335,22 @@ def check_images_hashes(request, hashes: List[str]):
#
# print(series_image)
@router.get("/view_dicom_tags/{hash}", auth=django_auth)
def view_dicom_tags(request, hash: str):
item = SeriesImage.objects.get(image_blake3_hash=hash)
return item.get_dicom_json()
@router.get("/series_split_by_dicom_tag/{series_id}/{dicom_tag}", auth=django_auth)
def series_split_by_tag(request, series_id: int, dicom_tag:str):
def series_split_by_tag(request, series_id: int, dicom_tag: str):
series = get_object_or_404(Series, pk=series_id)
if not series.check_user_can_edit(request.user):
return {"status": "permission denied"}
if dicom_tag.startswith("(") and dicom_tag.endswith(")"):
dicom_tag = tuple([hex(int(i.strip(),16)) for i in dicom_tag[1:-1].split(",")])
dicom_tag = tuple([hex(int(i.strip(), 16)) for i in dicom_tag[1:-1].split(",")])
image_map = defaultdict(list)
@@ -324,7 +359,7 @@ def series_split_by_tag(request, series_id: int, dicom_tag:str):
print(image)
ds = image.get_dicom_data()
#print("2a", ds[dicom_tag])
# print("2a", ds[dicom_tag])
if dicom_tag in ds:
val = ds[dicom_tag].value
@@ -339,7 +374,7 @@ def series_split_by_tag(request, series_id: int, dicom_tag:str):
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])
@@ -353,12 +388,11 @@ def series_split_by_tag(request, series_id: int, dicom_tag:str):
new_series.append(series.pk)
return new_series
@router.get("/split_order_by_dicom_tag/{series_id}/{dicom_tag}", auth=django_auth)
def series_order_by_tag(request, series_id: int, dicom_tag:str):
def series_order_by_tag(request, series_id: int, dicom_tag: str):
series = get_object_or_404(Series, pk=series_id)
series.order_by_dicom(dicom_tag)