.
This commit is contained in:
@@ -16,6 +16,7 @@ urlpatterns = [
|
||||
path("worker/<int:rota_id>/<int:worker_id>/edit/", views.worker_edit, name="worker_edit"),
|
||||
path("worker/<int:rota_id>/<int:worker_id>/delete/", views.worker_delete, name="worker_delete"),
|
||||
path("worker/<int:worker_id>/", views.worker_detail, name="worker_detail"),
|
||||
path("leave/request/", views.request_leave, name="request_leave"),
|
||||
path("run/<int:run_id>/", views.rota_run_detail, name="rota_run_detail"),
|
||||
path("run/<int:run_id>/export/html/", views.rota_run_export_html, name="rota_run_export_html"),
|
||||
path("run/<int:run_id>/export/download/", views.rota_run_export_download, name="rota_run_export_download"),
|
||||
|
||||
@@ -420,6 +420,68 @@ def rota_options_update(request, rota_id):
|
||||
return redirect("rota:rota_detail", rota_id=rota.id)
|
||||
|
||||
|
||||
@require_http_methods(["GET", "POST"])
|
||||
def request_leave(request):
|
||||
"""Allow a worker to request leave for themselves.
|
||||
|
||||
Resolution strategy:
|
||||
- If the user is authenticated, try to find a `Worker` with matching
|
||||
email (first match). If found, use that worker.
|
||||
- Otherwise, fall back to `worker_id` provided via GET/POST.
|
||||
|
||||
Supports HTMX modal flow when `HX-Request` header is present.
|
||||
"""
|
||||
is_hx = request.headers.get("HX-Request", "false").lower() == "true"
|
||||
|
||||
worker = None
|
||||
# try authenticated user -> worker by email
|
||||
try:
|
||||
if request.user and request.user.is_authenticated and getattr(request.user, "email", None):
|
||||
worker = Worker.objects.filter(email=request.user.email).first()
|
||||
except Exception:
|
||||
worker = None
|
||||
|
||||
# fallback to explicit worker_id
|
||||
if worker is None:
|
||||
worker_id = request.GET.get("worker_id") or request.POST.get("worker_id")
|
||||
if worker_id:
|
||||
try:
|
||||
worker = get_object_or_404(Worker, pk=int(worker_id))
|
||||
except Exception:
|
||||
worker = None
|
||||
|
||||
if request.method == "POST":
|
||||
form = LeaveForm(request.POST)
|
||||
if form.is_valid():
|
||||
leave = form.save(commit=False)
|
||||
if worker is None:
|
||||
return HttpResponseBadRequest("Worker not specified or not found")
|
||||
leave.worker = worker
|
||||
leave.save()
|
||||
# On HTMX modal post, return an OOB swap to close modal and optionally
|
||||
# update worker detail partial if present.
|
||||
if is_hx:
|
||||
resp = '<div id="modal" hx-swap-oob="true"></div>'
|
||||
# optionally include trigger
|
||||
response = HttpResponse(resp)
|
||||
response["HX-Trigger"] = "closeModal"
|
||||
return response
|
||||
return redirect("rota:worker_detail", worker_id=worker.id)
|
||||
else:
|
||||
form = LeaveForm()
|
||||
|
||||
# Render modal or full page
|
||||
if is_hx:
|
||||
modal_html = render_to_string(
|
||||
"rota/partials/leave_request_modal.html",
|
||||
{"form": form, "form_action": request.get_full_path(), "worker": worker},
|
||||
request=request,
|
||||
)
|
||||
return HttpResponse(modal_html)
|
||||
|
||||
return render(request, "rota/leave_request.html", {"form": form, "worker": worker})
|
||||
|
||||
|
||||
def rota_options(request, rota_id):
|
||||
"""HTMX-aware modal edit for rota.options JSON.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user