From 76158a3be092c7dd7c4875b5f43521dd589e8047 Mon Sep 17 00:00:00 2001 From: Karl Determe Date: Thu, 20 Aug 2026 13:36:42 +0200 Subject: [PATCH] feat: implement calendar functionality and add localization support for intervention models --- .../locale/en/LC_MESSAGES/django.mo | Bin 113779 -> 113799 bytes .../locale/en/LC_MESSAGES/django.po | 14 +-- .../locale/fr/LC_MESSAGES/django.mo | Bin 128917 -> 128937 bytes .../locale/fr/LC_MESSAGES/django.po | 8 +- .../locale/nl/LC_MESSAGES/django.mo | Bin 118902 -> 118965 bytes .../locale/nl/LC_MESSAGES/django.po | 14 +-- loko/interventions/models.py | 4 + loko/interventions/tests/test_calendar.py | 50 +++++++++- loko/interventions/views/calendar.py | 87 ++++++++++++++++-- 9 files changed, 151 insertions(+), 26 deletions(-) diff --git a/loko/interventions/locale/en/LC_MESSAGES/django.mo b/loko/interventions/locale/en/LC_MESSAGES/django.mo index 0ca6d191c7aa68089e30b24828825e9a77034bb9..07332dfb514cf9e1d1c2b111db85abc162b6095e 100644 GIT binary patch delta 8975 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 delta 8945 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 diff --git a/loko/interventions/locale/en/LC_MESSAGES/django.po b/loko/interventions/locale/en/LC_MESSAGES/django.po index 6c11a24..3525d7a 100644 --- a/loko/interventions/locale/en/LC_MESSAGES/django.po +++ b/loko/interventions/locale/en/LC_MESSAGES/django.po @@ -5444,31 +5444,31 @@ msgstr "View intervention" #: interventions/templates/interventions/interventions_calendar.html:660 msgid "Historique du membre" -msgstr "Sending history" +msgstr "Member history" #: interventions/templates/interventions/interventions_calendar.html:675 msgid "Technicien / Membre" -msgstr "Technician" +msgstr "Technician / Member" #: interventions/templates/interventions/interventions_calendar.html:681 msgid "Entreprise" -msgstr "Maintenance" +msgstr "Company / Organization" #: interventions/templates/interventions/interventions_calendar.html:694 msgid "Historique des équipes" -msgstr "Sending history" +msgstr "Team history" #: interventions/templates/interventions/interventions_calendar.html:702 msgid "Entrée" -msgstr "Maintenance" +msgstr "Joined" #: interventions/templates/interventions/interventions_calendar.html:703 msgid "Sortie" -msgstr "Sortie" +msgstr "Left" #: interventions/templates/interventions/interventions_calendar.html:718 msgid "Dernières interventions réalisées / assignées" -msgstr "Export selected interventions" +msgstr "Recent realized / assigned interventions" #: interventions/templates/interventions/interventions_index.html:420 msgid "Choisir le type d’intervention" diff --git a/loko/interventions/locale/fr/LC_MESSAGES/django.mo b/loko/interventions/locale/fr/LC_MESSAGES/django.mo index beb2ff2a89ca7b905e2d92823bba7517c10773b8..3e1929789069794a24677d1d35f633f3ca617a98 100644 GIT binary patch delta 9127 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 bH864edCxq)>Z0dc4NsI_HgtI6@?rl6N3{AQ delta 9124 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 PrTkZF75{Iu;+X#fQV{wZ diff --git a/loko/interventions/locale/fr/LC_MESSAGES/django.po b/loko/interventions/locale/fr/LC_MESSAGES/django.po index 45b1a94..665fdca 100644 --- a/loko/interventions/locale/fr/LC_MESSAGES/django.po +++ b/loko/interventions/locale/fr/LC_MESSAGES/django.po @@ -5502,15 +5502,15 @@ msgstr "Technicien" #: interventions/templates/interventions/interventions_calendar.html:681 msgid "Entreprise" -msgstr "Entretien" +msgstr "Entreprise / Organisme" #: interventions/templates/interventions/interventions_calendar.html:694 msgid "Historique des équipes" -msgstr "Historique des envois" +msgstr "Historique des équipes" #: interventions/templates/interventions/interventions_calendar.html:702 msgid "Entrée" -msgstr "Entretien" +msgstr "Entrée" #: interventions/templates/interventions/interventions_calendar.html:703 msgid "Sortie" @@ -5518,7 +5518,7 @@ msgstr "Sortie" #: interventions/templates/interventions/interventions_calendar.html:718 msgid "Dernières interventions réalisées / assignées" -msgstr "Exporter les interventions sélectionnées" +msgstr "Dernières interventions réalisées / assignées" #: interventions/templates/interventions/interventions_index.html:420 msgid "Choisir le type d’intervention" diff --git a/loko/interventions/locale/nl/LC_MESSAGES/django.mo b/loko/interventions/locale/nl/LC_MESSAGES/django.mo index a7b7663e28d0ccb1bf85da41844c80d6cb8affe1..d732deb71fa976d2e994d3df198a4be809a1dcbd 100644 GIT binary patch delta 26889 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 delta 26810 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 diff --git a/loko/interventions/locale/nl/LC_MESSAGES/django.po b/loko/interventions/locale/nl/LC_MESSAGES/django.po index c341457..1ded47e 100644 --- a/loko/interventions/locale/nl/LC_MESSAGES/django.po +++ b/loko/interventions/locale/nl/LC_MESSAGES/django.po @@ -5458,31 +5458,31 @@ msgstr "Interventie bekijken" #: interventions/templates/interventions/interventions_calendar.html:660 msgid "Historique du membre" -msgstr "Verzendgeschiedenis" +msgstr "Geschiedenis van het lid" #: interventions/templates/interventions/interventions_calendar.html:675 msgid "Technicien / Membre" -msgstr "Technicus" +msgstr "Technicus / Lid" #: interventions/templates/interventions/interventions_calendar.html:681 msgid "Entreprise" -msgstr "Onderhoud" +msgstr "Bedrijf / Organisatie" #: interventions/templates/interventions/interventions_calendar.html:694 msgid "Historique des équipes" -msgstr "Verzendgeschiedenis" +msgstr "Ploegengeschiedenis" #: interventions/templates/interventions/interventions_calendar.html:702 msgid "Entrée" -msgstr "Onderhoud" +msgstr "Instroom" #: interventions/templates/interventions/interventions_calendar.html:703 msgid "Sortie" -msgstr "" +msgstr "Uitstroom" #: interventions/templates/interventions/interventions_calendar.html:718 msgid "Dernières interventions réalisées / assignées" -msgstr "Geselecteerde interventies exporteren" +msgstr "Laatste uitgevoerde / toegewezen interventies" #: interventions/templates/interventions/interventions_index.html:420 msgid "Choisir le type d’intervention" diff --git a/loko/interventions/models.py b/loko/interventions/models.py index 2b776ec..c039b67 100644 --- a/loko/interventions/models.py +++ b/loko/interventions/models.py @@ -639,6 +639,10 @@ class Intervention(models.Model): while curr <= end_date: active_dates.add(curr) curr += timedelta(days=1) + if self.begin_time: + active_dates.add(self.begin_time.date()) + if self.end_time: + active_dates.add(self.end_time.date()) today = timezone.now().date() diff --git a/loko/interventions/tests/test_calendar.py b/loko/interventions/tests/test_calendar.py index 2fcdaeb..172c58f 100644 --- a/loko/interventions/tests/test_calendar.py +++ b/loko/interventions/tests/test_calendar.py @@ -272,13 +272,45 @@ class CalendarEventsTests(TestCase): def test_member_history_ajax_permissions_and_data(self): from contracts.models import CompanyMember, CompanyMemberHistory + from interventions.models import Intervention member = CompanyMember.objects.create(name="Jean Dupont", user=self.user) member.teams.add(self.team_a) + + ten_days_ago = timezone.now().date() - timedelta(days=10) + two_days_ago = timezone.now().date() - timedelta(days=2) + CompanyMemberHistory.objects.create( member=member, team=self.team_a, - join_date=timezone.now().date() - timedelta(days=10) + join_date=ten_days_ago, + leave_date=two_days_ago, ) + + # 1. Intervention assigned to team_a 5 days ago (during membership), finished by someone else + itv1 = Intervention.objects.create( + title='Team Task Finished by Manager', + status='finished', + maintain_type='corrective', + assigned_provider=self.company, + assigned_team=self.team_a, + begin_time=timezone.now() - timedelta(days=5), + end_time=timezone.now() - timedelta(days=5), + ) + + # 2. Intervention directly processed today + itv2 = Intervention.objects.create( + title='Directly Processed Task', + status='processed', + maintain_type='corrective', + assigned_provider=self.company, + assigned_member=member, + begin_time=timezone.now(), + end_time=timezone.now(), + ) + + # Clear active teams to simulate removed member + member.teams.clear() + url = reverse('interventions:member_history_ajax', args=[member.id]) response = self.client.get(url) self.assertEqual(response.status_code, 200) @@ -286,10 +318,26 @@ class CalendarEventsTests(TestCase): self.assertIn('member', data) self.assertEqual(data['member']['name'], "Jean Dupont") + # Company name should still be resolved from history + self.assertEqual(data['member']['company'], self.company.name) + self.assertIn('team_history', data) self.assertTrue(len(data['team_history']) >= 1) self.assertEqual(data['team_history'][0]['team_name'], self.team_a.name) + # Interventions list should include both team task and directly processed task + self.assertIn('interventions', data) + itv_ids = [itv['id'] for itv in data['interventions']] + self.assertIn(itv1.id, itv_ids) + self.assertIn(itv2.id, itv_ids) + + # Check status display and codes + itv1_entry = next(item for item in data['interventions'] if item['id'] == itv1.id) + self.assertEqual(itv1_entry['status_code'], 'finished') + + itv2_entry = next(item for item in data['interventions'] if item['id'] == itv2.id) + self.assertEqual(itv2_entry['status_code'], 'processed') + def test_unassign_sans_equipe_reverts_status_to_backlog(self): itv = Intervention.objects.create( title='Unassigned Test', diff --git a/loko/interventions/views/calendar.py b/loko/interventions/views/calendar.py index 38a765f..4750146 100644 --- a/loko/interventions/views/calendar.py +++ b/loko/interventions/views/calendar.py @@ -1371,13 +1371,11 @@ def member_history_ajax(request, member_id): return JsonResponse({'error': _("Permission refusée.")}, status=403) member = get_object_or_404(CompanyMember.objects.prefetch_related('teams__company'), id=member_id) - company_names = set(t.company.name for t in member.teams.all() if getattr(t, 'company', None)) - company_str = ", ".join(sorted(company_names)) if company_names else '' team_history_qs = ( CompanyMemberHistory.objects .filter(member=member) - .select_related('team') + .select_related('team__company') .order_by('-join_date') ) team_history = [ @@ -1390,12 +1388,51 @@ def member_history_ajax(request, member_id): for h in team_history_qs ] + company_names = set(t.company.name for t in member.teams.all() if getattr(t, 'company', None)) + if not company_names: + company_names = set(h.team.company.name for h in team_history_qs if h.team and getattr(h.team, 'company', None)) + if not company_names and member.user_id: + company_names = set( + uca.contract.company.name for uca in UserContractAccess.objects.filter(user_config__user=member.user) + if uca.contract and getattr(uca.contract, 'company', None) + ) + company_str = ", ".join(sorted(company_names)) if company_names else '—' + + # Filter assignments: + # 1. Directly assigned to this member in InterventionAssignment + assignment_q = Q(member=member) + + # 2. Directly assigned / acted upon by member user on Intervention + if member.user_id: + assignment_q |= ( + Q(intervention__assigned_member=member) | + Q(intervention__realized_events__event_user=member.user) | + Q(intervention__occupations__member=member) + ) + + # 3. Interventions assigned to teams during the periods member was in that team + team_periods_q = Q() + for h in team_history_qs: + if h.team_id and h.join_date: + tq = Q(team_id=h.team_id, date__gte=h.join_date) + if h.leave_date: + tq &= Q(date__lte=h.leave_date) + team_periods_q |= tq + + for t in member.teams.all(): + if not team_history_qs.filter(team=t).exists(): + team_periods_q |= Q(team=t) + + if team_periods_q: + assignment_q |= team_periods_q + assignments_qs = ( InterventionAssignment.objects - .filter(member=member) + .filter(assignment_q) .select_related('intervention', 'team') .order_by('-date', '-intervention__code', '-intervention__id')[:100] ) + interventions_list = [ { 'id': a.intervention.id, @@ -1403,14 +1440,50 @@ def member_history_ajax(request, member_id): 'title': a.intervention.title, 'date': a.date.strftime('%d/%m/%Y') if a.date else '', 'raw_date': a.date.isoformat() if a.date else '', - 'team_name': a.team.name if a.team else '—', - 'status_code': a.status or a.intervention.status, - 'status_display': dict(STATUS_CHOICES).get(a.status or a.intervention.status, a.status or a.intervention.status), + 'team_name': a.team.name if a.team else (a.intervention.assigned_team.name if a.intervention.assigned_team else '—'), + 'status_code': a.intervention.status, + 'status_display': a.intervention.get_status_display(), 'detail_url': reverse('interventions:intervention_detail', args=[a.intervention.id]), } for a in assignments_qs ] + + # Include any extra interventions directly assigned/realized by member without an InterventionAssignment + assigned_itv_ids = set(a.intervention.id for a in assignments_qs) + direct_itvs_q = Q(assigned_member=member) + if member.user_id: + direct_itvs_q |= Q(realized_events__event_user=member.user) | Q(occupations__member=member) + + extra_itvs = ( + Intervention.objects + .filter(direct_itvs_q) + .exclude(id__in=assigned_itv_ids) + .select_related('assigned_team')[:50] + ) + for itv in extra_itvs: + itv_date = (itv.end_time or itv.begin_time or itv.planned_begin_time or itv.creation_time) + if itv_date: + itv_date_local = timezone.localtime(itv_date) if timezone.is_aware(itv_date) else itv_date + date_str = itv_date_local.strftime('%d/%m/%Y') + raw_date_str = itv_date_local.date().isoformat() + else: + date_str = '' + raw_date_str = '' + + interventions_list.append({ + 'id': itv.id, + 'code': itv.code, + 'title': itv.title, + 'date': date_str, + 'raw_date': raw_date_str, + 'team_name': itv.assigned_team.name if itv.assigned_team else '—', + 'status_code': itv.status, + 'status_display': itv.get_status_display(), + 'detail_url': reverse('interventions:intervention_detail', args=[itv.id]), + }) + interventions_list.sort(key=lambda x: (x['raw_date'], x['code'] or '', x['id']), reverse=True) + interventions_list = interventions_list[:100] return JsonResponse({ 'member': {