Skip to content

Commit

Permalink
Admin: Prevent duplicates in Approvals assigned_to
Browse files Browse the repository at this point in the history
  • Loading branch information
francoisfreitag committed May 7, 2024
1 parent 4c880e8 commit 8102851
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
6 changes: 4 additions & 2 deletions itou/approvals/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
)
Expand Down
29 changes: 29 additions & 0 deletions tests/approvals/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"""
<th class="field-pk">
<a href="/admin/approvals/approval/{approval.pk}/change/?_changelist_filters=assigned_company%3D{company.pk}">
{approval.pk}
</a>
</th>
""",
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")
Expand Down

0 comments on commit 8102851

Please sign in to comment.