From 91b6fdd733e7190973650721b2096ac8a8943912 Mon Sep 17 00:00:00 2001 From: Ross Date: Tue, 9 Dec 2025 11:35:52 +0000 Subject: [PATCH] . --- djangorota/rota/urls.py | 2 + djangorota/rota/views.py | 96 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 91 insertions(+), 7 deletions(-) diff --git a/djangorota/rota/urls.py b/djangorota/rota/urls.py index 1f21b12..705d615 100644 --- a/djangorota/rota/urls.py +++ b/djangorota/rota/urls.py @@ -12,6 +12,8 @@ urlpatterns = [ path("rota//shift//edit/", views.shift_edit, name="shift_edit"), path("rota//shift//delete/", views.shift_delete, name="shift_delete"), path("worker/add/", views.worker_create, name="worker_add"), + path("worker///edit/", views.worker_edit, name="worker_edit"), + path("worker///delete/", views.worker_delete, name="worker_delete"), path("worker//", views.worker_detail, name="worker_detail"), path("run//", views.rota_run_detail, name="rota_run_detail"), ] diff --git a/djangorota/rota/views.py b/djangorota/rota/views.py index b674b57..bbb71f7 100644 --- a/djangorota/rota/views.py +++ b/djangorota/rota/views.py @@ -64,6 +64,79 @@ def worker_detail(request, worker_id): return render(request, "rota/worker_detail.html", {"worker": worker, "form": form}) +@require_http_methods(["GET", "POST"]) +def worker_edit(request, rota_id, worker_id): + rota = get_object_or_404(RotaSchedule, pk=rota_id) + worker = get_object_or_404(Worker, pk=worker_id) + + if request.method == "POST": + form = WorkerForm(request.POST, instance=worker) + if form.is_valid(): + form.save() + # Return updated worker list OOB and close modal + worker_list_html = render_to_string("rota/partials/worker_list.html", {"rota": rota}, request=request) + resp = ( + f'
{worker_list_html}
' + + '' + ) + response = HttpResponse(resp) + response["HX-Trigger"] = "closeModal" + return response + + # invalid: return form modal with errors + modal_html = render_to_string( + "rota/partials/worker_form_modal.html", + {"form": form, "form_action": request.path, "rota": rota}, + request=request, + ) + return HttpResponse(modal_html) + + # GET: populate form and return modal + form = WorkerForm(instance=worker) + modal_html = render_to_string( + "rota/partials/worker_form_modal.html", + {"form": form, "form_action": request.path, "rota": rota}, + request=request, + ) + return HttpResponse(modal_html) + + +@require_http_methods(["GET", "POST"]) +def worker_delete(request, rota_id, worker_id): + rota = get_object_or_404(RotaSchedule, pk=rota_id) + worker = get_object_or_404(Worker, pk=worker_id) + + if request.method == "POST": + # remove assignment between worker and rota + try: + from .models import Assignment + + Assignment.objects.filter(worker=worker, rota=rota).delete() + except Exception: + try: + rota.workers.remove(worker) + except Exception: + return HttpResponseBadRequest("Unable to remove worker from rota") + + rota = get_object_or_404(RotaSchedule, pk=rota_id) + worker_list_html = render_to_string("rota/partials/worker_list.html", {"rota": rota}, request=request) + resp = ( + f'
{worker_list_html}
' + + '' + ) + response = HttpResponse(resp) + response["HX-Trigger"] = "closeModal" + return response + + # GET: confirmation modal + modal_html = render_to_string( + "rota/partials/worker_confirm_delete.html", + {"rota": rota, "worker": worker}, + request=request, + ) + return HttpResponse(modal_html) + + def rota_run_detail(request, run_id): from .models import RotaRun @@ -96,12 +169,15 @@ def shift_add(request, rota_id): # Return out-of-band swap: update shift-list and clear modal shift_list_html = render_to_string("rota/partials/shift_list.html", {"rota": rota}, request=request) - # wrap shift list for OOB swap + # wrap shift list for OOB swap and clear form/modal containers resp = ( f'
{shift_list_html}
' + + '
' + '' - ) - return HttpResponse(resp) + ) + response = HttpResponse(resp) + response["HX-Trigger"] = "closeModal" + return response # invalid: return modal with form and errors modal_html = render_to_string("rota/partials/shift_form_modal.html", {"form": form, "rota": rota, "form_action": request.path}, request=request) @@ -141,9 +217,12 @@ def shift_edit(request, rota_id, idx): shift_list_html = render_to_string("rota/partials/shift_list.html", {"rota": rota}, request=request) resp = ( f'
{shift_list_html}
' + + '
' + '' - ) - return HttpResponse(resp) + ) + response = HttpResponse(resp) + response["HX-Trigger"] = "closeModal" + return response modal_html = render_to_string("rota/partials/shift_form_modal.html", {"form": form, "rota": rota, "form_action": request.path}, request=request) return HttpResponse(modal_html) @@ -181,9 +260,12 @@ def shift_delete(request, rota_id, idx): shift_list_html = render_to_string("rota/partials/shift_list.html", {"rota": rota}, request=request) resp = ( f'
{shift_list_html}
' + + '
' + '' - ) - return HttpResponse(resp) + ) + response = HttpResponse(resp) + response["HX-Trigger"] = "closeModal" + return response # GET: confirmation modal modal_html = render_to_string("rota/partials/shift_confirm_delete.html", {"rota": rota, "idx": idx, "shift": shift}, request=request)