.
This commit is contained in:
@@ -20,6 +20,8 @@ urlpatterns = [
|
||||
path("leave/request/", views.request_leave, name="request_leave"),
|
||||
path("leave/request/token/<uuid:token>/", views.request_leave, name="request_leave_token"),
|
||||
path("worker/settings/token/<uuid:token>/", views.worker_settings_token, name="worker_settings_token"),
|
||||
path("leaves/all/", views.leaves_global, name="leaves_global"),
|
||||
path("leaves/all.json", views.leaves_global_json, name="leaves_global_json"),
|
||||
path("leave/<int:leave_id>/delete/", views.leave_delete, name="leave_delete"),
|
||||
path("worker/<int:worker_id>/leaves/delete_all/", views.leave_delete_all, name="leave_delete_all"),
|
||||
path("worker/<int:worker_id>/regenerate_token/", views.regenerate_worker_token, name="regenerate_worker_token"),
|
||||
|
||||
@@ -1039,6 +1039,52 @@ def leaves_json(request, worker_id):
|
||||
return JsonResponse({'leaves': data})
|
||||
|
||||
|
||||
def leaves_global_json(request):
|
||||
"""Return JSON list of all leave ranges across all workers."""
|
||||
from .models import Leave
|
||||
# Optionally filter by rota_id (provided as query param) so the global
|
||||
# calendar can be scoped to a particular rota's workers.
|
||||
rota_id = request.GET.get('rota_id')
|
||||
qs = Leave.objects.select_related('worker')
|
||||
if rota_id:
|
||||
try:
|
||||
rota_id_i = int(rota_id)
|
||||
qs = qs.filter(worker__rotas=rota_id_i)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Build a worker->color map for workers present in the query so the
|
||||
# client can color-code leaves by worker.
|
||||
worker_colors = {}
|
||||
def color_for_worker(pk):
|
||||
# deterministic hue based on id
|
||||
h = (int(pk) * 37) % 360
|
||||
return f'hsl({h} 65% 85%)'
|
||||
|
||||
data = []
|
||||
for leave in qs.all().order_by('start_date'):
|
||||
worker = getattr(leave, 'worker', None)
|
||||
wid = getattr(worker, 'id', None)
|
||||
wname = getattr(worker, 'name', '') if worker else ''
|
||||
if wid not in worker_colors and wid is not None:
|
||||
worker_colors[wid] = color_for_worker(wid)
|
||||
data.append({
|
||||
'start': leave.start_date.isoformat(),
|
||||
'end': leave.end_date.isoformat(),
|
||||
'reason': wname or (leave.reason or ''),
|
||||
'worker_id': wid,
|
||||
'color': worker_colors.get(wid),
|
||||
})
|
||||
return JsonResponse({'leaves': data})
|
||||
|
||||
|
||||
def leaves_global(request):
|
||||
"""Page showing a global calendar with all leave requests."""
|
||||
# Provide an empty JSON payload initially; the calendar will fetch the authoritative list
|
||||
leaves_json = '[]'
|
||||
return render(request, 'rota/leaves_global.html', {'leaves_json': leaves_json})
|
||||
|
||||
|
||||
@require_POST
|
||||
def leave_delete(request, leave_id):
|
||||
"""Delete a Leave record. Allowed if the requester is staff, or if a valid token matches the worker, or the authenticated user's email matches the worker email."""
|
||||
|
||||
Reference in New Issue
Block a user