feat: add calendar view for interventions with user preference persistence
This commit is contained in:
parent
d131fcb0d6
commit
74679289a4
2 changed files with 46 additions and 1 deletions
|
|
@ -387,6 +387,47 @@ class CalendarEventsTests(TestCase):
|
||||||
|
|
||||||
self.assertEqual(ids, [itv_urgent_new.id, itv_urgent_old.id, itv_low_old.id])
|
self.assertEqual(ids, [itv_urgent_new.id, itv_urgent_old.id, itv_low_old.id])
|
||||||
|
|
||||||
|
def test_calendar_backlog_includes_overdue_interventions_older_than_three_months(self):
|
||||||
|
old_date = timezone.now() - timedelta(days=150)
|
||||||
|
itv_old_unprocessed = Intervention.objects.create(
|
||||||
|
title='Old To Be Processed Intervention',
|
||||||
|
status='to_be_processed',
|
||||||
|
maintain_type='corrective',
|
||||||
|
expected_begin_time=old_date,
|
||||||
|
planned_begin_time=old_date,
|
||||||
|
)
|
||||||
|
Intervention.objects.filter(id=itv_old_unprocessed.id).update(creation_time=old_date)
|
||||||
|
|
||||||
|
itv_old_finished = Intervention.objects.create(
|
||||||
|
title='Old Finished Intervention',
|
||||||
|
status='finished',
|
||||||
|
maintain_type='corrective',
|
||||||
|
end_time=old_date,
|
||||||
|
)
|
||||||
|
Intervention.objects.filter(id=itv_old_finished.id).update(creation_time=old_date)
|
||||||
|
|
||||||
|
# Test in teams_daily view mode
|
||||||
|
url_daily = reverse('interventions:interventions_events') + '?view_mode=teams_daily'
|
||||||
|
response_daily = self.client.get(url_daily)
|
||||||
|
self.assertEqual(response_daily.status_code, 200)
|
||||||
|
data_daily = response_daily.json()
|
||||||
|
backlog_daily = data_daily.get('backlog_groups', {}).get('corrective', [])
|
||||||
|
backlog_daily_ids = [item['id'] for item in backlog_daily]
|
||||||
|
|
||||||
|
self.assertIn(itv_old_unprocessed.id, backlog_daily_ids)
|
||||||
|
self.assertNotIn(itv_old_finished.id, backlog_daily_ids)
|
||||||
|
|
||||||
|
# Test in members view mode
|
||||||
|
url_members = reverse('interventions:interventions_events') + '?view_mode=members'
|
||||||
|
response_members = self.client.get(url_members)
|
||||||
|
self.assertEqual(response_members.status_code, 200)
|
||||||
|
data_members = response_members.json()
|
||||||
|
backlog_members = data_members.get('backlog_groups', {}).get('corrective', [])
|
||||||
|
backlog_members_ids = [item['id'] for item in backlog_members]
|
||||||
|
|
||||||
|
self.assertIn(itv_old_unprocessed.id, backlog_members_ids)
|
||||||
|
self.assertNotIn(itv_old_finished.id, backlog_members_ids)
|
||||||
|
|
||||||
def test_member_history_ajax_permissions_and_data(self):
|
def test_member_history_ajax_permissions_and_data(self):
|
||||||
from contracts.models import CompanyMember, CompanyMemberHistory
|
from contracts.models import CompanyMember, CompanyMemberHistory
|
||||||
from interventions.models import Intervention
|
from interventions.models import Intervention
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,7 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
from interventions.views.helpers import *
|
from interventions.views.helpers import *
|
||||||
|
|
||||||
|
FINISHED_STATUSES = {'finished', 'processed', 'corrected', 'validated', 'invoiced', 'closed', 'canceled'}
|
||||||
|
|
||||||
|
|
||||||
def interventions_calendar(request):
|
def interventions_calendar(request):
|
||||||
|
|
@ -372,9 +373,12 @@ def interventions_events(request):
|
||||||
end_window_filter = Q(effective_end__gte=start) | Q(effective_end__isnull=True)
|
end_window_filter = Q(effective_end__gte=start) | Q(effective_end__isnull=True)
|
||||||
|
|
||||||
if view_mode in ('members', 'teams_daily'):
|
if view_mode in ('members', 'teams_daily'):
|
||||||
|
# Dans les vues par membres et par équipes journalières, le panneau latéral présente le backlog à assigner.
|
||||||
|
# Les interventions non terminées doivent rester visibles dans ce backlog même si leur date dépasse 3 mois.
|
||||||
|
backlog_window_filter = end_window_filter | ~Q(status__in=FINISHED_STATUSES)
|
||||||
interventions = (
|
interventions = (
|
||||||
interventions
|
interventions
|
||||||
.filter(end_window_filter)
|
.filter(backlog_window_filter)
|
||||||
.filter(Q(effective_begin__lte=end) | Q(effective_begin__isnull=True))
|
.filter(Q(effective_begin__lte=end) | Q(effective_begin__isnull=True))
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue