diff --git a/itou/approvals/models.py b/itou/approvals/models.py index 6cbc3e29f14..bac1eb6d7ce 100644 --- a/itou/approvals/models.py +++ b/itou/approvals/models.py @@ -11,7 +11,7 @@ from django.core.exceptions import ValidationError from django.core.validators import MinLengthValidator from django.db import models, transaction -from django.db.models import Case, Count, F, OuterRef, Q, Subquery, When +from django.db.models import Case, Count, Exists, F, OuterRef, Q, Subquery, When from django.db.models.functions import Now, TruncDate from django.utils import timezone from django.utils.functional import cached_property @@ -230,8 +230,10 @@ def with_assigned_company(self): ) def is_assigned_to(self, company_id): + from itou.job_applications.models import JobApplication + return ( - self.filter(user__job_applications__to_company=company_id) + self.filter(Exists(JobApplication.objects.filter(approval=OuterRef("pk"), to_company=company_id))) .with_assigned_company() .filter(assigned_company=company_id) ) diff --git a/tests/approvals/test_admin.py b/tests/approvals/test_admin.py index 9902d667cb6..5c389c3b8eb 100644 --- a/tests/approvals/test_admin.py +++ b/tests/approvals/test_admin.py @@ -9,8 +9,10 @@ from itou.approvals.enums import ProlongationReason from itou.files.models import File +from itou.job_applications.enums import JobApplicationState from itou.utils.admin import get_admin_view_link from tests.approvals.factories import ApprovalFactory, CancelledApprovalFactory, ProlongationFactory, SuspensionFactory +from tests.companies.factories import CompanyFactory from tests.job_applications.factories import JobApplicationFactory from tests.users.factories import ItouStaffFactory, JobSeekerFactory from tests.utils.test import parse_response_to_soup @@ -82,6 +84,33 @@ def test_assigned_company(admin_client): assertContains(response, get_admin_view_link(siae, content=siae.display_name), count=2) +def test_filter_assigned_company(admin_client): + company = CompanyFactory() + job_seeker = JobSeekerFactory() + JobApplicationFactory(to_company=company, job_seeker=job_seeker) + approval = ApprovalFactory(user=job_seeker) + JobApplicationFactory( + approval=approval, + to_company=company, + job_seeker=job_seeker, + state=JobApplicationState.ACCEPTED, + ) + response = admin_client.get(reverse("admin:approvals_approval_changelist"), {"assigned_company": company.pk}) + assertContains(response, "1 PASS IAE") + assertContains( + response, + f""" + + + {approval.pk} + + + """, + html=True, + count=1, + ) + + def test_send_approvals_to_pe_stats(admin_client): ApprovalFactory(pe_notification_status="notification_error") CancelledApprovalFactory(pe_notification_status="notification_should_retry")