Fix calendar detail showing all workers when filtering by one

When filtering by a single worker, log.workers.all() still returned
every worker on the WorkLog. Now the detail panel and cost calculation
only show the filtered worker, not the entire group.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Konrad du Plessis 2026-02-22 22:38:09 +02:00
parent 19e565a088
commit 94c061fc19

View File

@ -496,13 +496,27 @@ def work_history(request):
# the JS reads this JSON to populate the detail panel below the calendar. # the JS reads this JSON to populate the detail panel below the calendar.
# NOTE: Pass raw Python dict, not json.dumps() — the template's # NOTE: Pass raw Python dict, not json.dumps() — the template's
# |json_script filter handles serialization. # |json_script filter handles serialization.
#
# IMPORTANT: When a worker filter is active, log.workers.all() would
# still return ALL workers on that WorkLog (not just the filtered one).
# We need to narrow the displayed workers to match the filter.
calendar_detail = {} calendar_detail = {}
for date_key, day_logs in logs_by_date.items(): for date_key, day_logs in logs_by_date.items():
calendar_detail[date_key] = [] calendar_detail[date_key] = []
for log in day_logs: for log in day_logs:
# Get the workers to show — if filtering by worker,
# only show that worker (not everyone else on the log)
if worker_filter:
display_workers = [
w for w in log.workers.all()
if str(w.id) == worker_filter
]
else:
display_workers = list(log.workers.all())
entry = { entry = {
'project': log.project.name, 'project': log.project.name,
'workers': [w.name for w in log.workers.all()], 'workers': [w.name for w in display_workers],
'supervisor': ( 'supervisor': (
log.supervisor.get_full_name() or log.supervisor.username log.supervisor.get_full_name() or log.supervisor.username
) if log.supervisor else '-', ) if log.supervisor else '-',
@ -510,10 +524,10 @@ def work_history(request):
'is_paid': log.payroll_records.exists(), 'is_paid': log.payroll_records.exists(),
'overtime': log.get_overtime_amount_display() if log.overtime_amount > 0 else '', 'overtime': log.get_overtime_amount_display() if log.overtime_amount > 0 else '',
} }
# Only show cost data to admins # Only show cost data to admins — use filtered workers for amount
if is_admin(user): if is_admin(user):
entry['amount'] = float( entry['amount'] = float(
sum(w.daily_rate for w in log.workers.all()) sum(w.daily_rate for w in display_workers)
) )
calendar_detail[date_key].append(entry) calendar_detail[date_key].append(entry)