From aaee3577ad01f79ed58c0f3ffa37788acdd64e39 Mon Sep 17 00:00:00 2001 From: Ross Date: Fri, 12 Jun 2026 22:55:50 +0100 Subject: [PATCH] Imrpvoe the case links --- atlas/templates/atlas/case_display_block.html | 55 ++++++-- .../atlas/linked_cases_overview.html | 127 ++++++++++++++++++ atlas/tests/test_priors_futures.py | 55 ++++++++ atlas/views.py | 36 +++++ 4 files changed, 260 insertions(+), 13 deletions(-) diff --git a/atlas/templates/atlas/case_display_block.html b/atlas/templates/atlas/case_display_block.html index e147946a..3bf1b25e 100755 --- a/atlas/templates/atlas/case_display_block.html +++ b/atlas/templates/atlas/case_display_block.html @@ -426,21 +426,40 @@ {% if case.previous_case or case.next_case %} - +{% endblock %} + +{% block css %} + +{% endblock %} + +{% block js %} + {% endblock %} \ No newline at end of file diff --git a/atlas/tests/test_priors_futures.py b/atlas/tests/test_priors_futures.py index 60cd4d0d..225995c9 100644 --- a/atlas/tests/test_priors_futures.py +++ b/atlas/tests/test_priors_futures.py @@ -131,3 +131,58 @@ def test_case_prior_and_future_relation_post(client, make_case): ) assert response_remove.status_code == 200 assert not CasePrior.objects.filter(casedetail=casedetail, prior_case=case3).exists() + + +@pytest.mark.django_db +def test_linked_cases_reordering(client, make_case): + # Setup user + user = get_user_model().objects.create_user( + username="author_user_reorder", password="password", email="author_reorder@test.com" + ) + + case1 = make_case(title="Case A") + case2 = make_case(title="Case B") + case3 = make_case(title="Case C") + + # Author permissions + case1.author.add(user) + case2.author.add(user) + case3.author.add(user) + + # Initial order: case1 -> case2 -> case3 + case2.previous_case = case1 + case2.save(update_fields=["previous_case"]) + case3.previous_case = case2 + case3.save(update_fields=["previous_case"]) + + client.force_login(user) + url = reverse("atlas:linked_cases_overview", kwargs={"case_id": case2.pk}) + + # Verify GET works and shows reorder editor when requested + response_get = client.get(url + "?show_reorder=1") + assert response_get.status_code == 200 + assert "Reorder Cases" in response_get.content.decode("utf-8") + + # Post new order: case3 -> case1 -> case2 + response_post = client.post( + url, + data={ + "form_action": "reorder_cases", + "case_order_0": case3.pk, + "case_order_1": case1.pk, + "case_order_2": case2.pk, + }, + follow=True, + ) + assert response_post.status_code == 200 + + # Refresh cases from database + case1.refresh_from_db() + case2.refresh_from_db() + case3.refresh_from_db() + + # Verify new order in DB: case3 -> case1 -> case2 + assert case3.previous_case is None + assert case1.previous_case == case3 + assert case2.previous_case == case1 + diff --git a/atlas/views.py b/atlas/views.py index 9a17fec7..c769aed7 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -9873,6 +9873,7 @@ def linked_cases_overview(request, case_id): case_editor_prefix = "case_series_editor" show_study_dates_editor = request.GET.get("show_dates") == "1" show_case_editor = request.GET.get("show_editor") == "1" + show_reorder_editor = request.GET.get("show_reorder") == "1" case_editor_selected_field = "" case_editor_selected_source = "" @@ -9976,6 +9977,40 @@ def linked_cases_overview(request, case_id): messages.error(request, "Please correct the errors in the linked case editor form.") + elif form_action == "reorder_cases": + if not case.check_user_can_edit(request.user): + raise PermissionDenied("You do not have permission to edit this case chain.") + + # Get new order from POST + order = [] + for key in sorted([k for k in request.POST if k.startswith("case_order_")]): + try: + order.append(int(request.POST[key])) + except ValueError: + pass + + if set(order) == set(chain_case_ids): + from django.db import transaction + with transaction.atomic(): + cases = list(Case.objects.filter(pk__in=chain_case_ids)) + for c in cases: + c.previous_case = None + c.save(update_fields=["previous_case"]) + + cases_by_id = {c.pk: c for c in cases} + for i, pk in enumerate(order): + if i > 0: + current_c = cases_by_id[pk] + prev_c = cases_by_id[order[i-1]] + current_c.previous_case = prev_c + current_c.save(update_fields=["previous_case"]) + + messages.success(request, "Saved case chain order.") + return redirect(f"{reverse('atlas:linked_cases_overview', kwargs={'case_id': case.pk})}?show_reorder=1") + else: + messages.error(request, "Invalid case ordering submitted.") + return redirect(f"{reverse('atlas:linked_cases_overview', kwargs={'case_id': case.pk})}?show_reorder=1") + else: if not case.check_user_can_edit(request.user): raise PermissionDenied("You do not have permission to edit this case chain.") @@ -10061,6 +10096,7 @@ def linked_cases_overview(request, case_id): "direct_next": direct_next, "show_study_dates_editor": show_study_dates_editor, "show_case_editor": show_case_editor, + "show_reorder_editor": show_reorder_editor, "case_editor_formset": case_editor_formset, "case_editor_rows": case_editor_rows, "case_editor_apply_field_choices": case_editor_apply_field_choices,