fix: include past planned interventions in calendar view by updating schedule visibility logic

This commit is contained in:
kdeterme 2026-09-09 11:16:35 +02:00
parent d9f1970ca6
commit d5f4d8a765
2 changed files with 42 additions and 5 deletions

View file

@ -223,6 +223,45 @@ class CalendarEventsTests(TestCase):
itv_ids_in_team_b = [i['id'] for i in member_in_team_b['interventions']] itv_ids_in_team_b = [i['id'] for i in member_in_team_b['interventions']]
self.assertNotIn(itv.id, itv_ids_in_team_b) self.assertNotIn(itv.id, itv_ids_in_team_b)
def test_calendar_events_view_mode_members_past_planned_time_visible(self):
# Create an intervention planned earlier today (e.g. 2 hours ago) assigned to team only
itv_team = Intervention.objects.create(
title='Team A Task Earlier Today',
status='to_be_processed',
assigned_team=self.team_a,
planned_begin_time=timezone.now() - timedelta(hours=2),
planned_end_time=timezone.now() + timedelta(hours=1),
)
# Create another intervention planned earlier today assigned to a member
itv_member = Intervention.objects.create(
title='Member Task Earlier Today',
status='to_be_processed',
assigned_member=self.member,
assigned_team=self.team_a,
planned_begin_time=timezone.now() - timedelta(hours=3),
planned_end_time=timezone.now() - timedelta(hours=1),
)
url = reverse('interventions:interventions_events') + '?view_mode=members'
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
data = response.json()
teams = data.get('teams', [])
team_a_data = next((t for t in teams if t['id'] == self.team_a.id), None)
self.assertIsNotNone(team_a_data)
# Team-only intervention must be present in team_interventions
team_itv_ids = [i['id'] for i in team_a_data.get('team_interventions', [])]
self.assertIn(itv_team.id, team_itv_ids)
# Member intervention must be present in member interventions
member_in_team_a = next((m for m in team_a_data['members'] if m['id'] == self.member.id), None)
self.assertIsNotNone(member_in_team_a)
member_itv_ids = [i['id'] for i in member_in_team_a['interventions']]
self.assertIn(itv_member.id, member_itv_ids)
def test_schedule_update_coerces_ids(self): def test_schedule_update_coerces_ids(self):
itv = Intervention.objects.create( itv = Intervention.objects.create(
title='Test Coercion', title='Test Coercion',

View file

@ -652,11 +652,9 @@ def _interventions_events_by_members(
team_filter = None if allowed_team_ids is None else set(allowed_team_ids) team_filter = None if allowed_team_ids is None else set(allowed_team_ids)
def has_schedule(itv) -> bool: def has_schedule(itv) -> bool:
"""Return True when intervention already started or has a future planned begin.""" """Return True when intervention has a scheduled or actual start time."""
if getattr(itv, 'begin_time', None): return bool(getattr(itv, 'begin_time', None) or getattr(itv, 'planned_begin_time', None))
return True
planned_begin = getattr(itv, 'planned_begin_time', None)
return bool(planned_begin and planned_begin > timezone.now())
backlog_allowed_statuses = {'in_preparation', 'to_be_approved', 'to_be_planned', 'to_be_processed', 'assigned'} backlog_allowed_statuses = {'in_preparation', 'to_be_approved', 'to_be_planned', 'to_be_processed', 'assigned'}
PRE_PROCESSING_STATUSES = {'in_preparation', 'to_be_approved', 'to_be_planned'} PRE_PROCESSING_STATUSES = {'in_preparation', 'to_be_approved', 'to_be_planned'}