Skip to content

Commit

Permalink
organizations: fix member_required behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
xavfernandez committed Dec 13, 2024
1 parent 2d7ba63 commit 38e9f7b
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 2 deletions.
13 changes: 11 additions & 2 deletions itou/common_apps/organizations/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from django.conf import settings
from django.db import models
from django.db.models import Prefetch, Q
from django.db.models import Exists, OuterRef, Prefetch, Q
from django.forms import ValidationError
from django.utils import timezone

Expand All @@ -16,7 +16,16 @@ class OrganizationQuerySet(models.QuerySet):
"""

def member_required(self, user):
return self.filter(members=user, members__is_active=True)
membership_model = self.model.members.through
# through_fields contains a tuple like ("company", "user")
membership_through_field = self.model.members.rel.through_fields[0]
return self.filter(
Exists(
membership_model.objects.filter(
user=user, is_active=True, user__is_active=True, **{membership_through_field: OuterRef("pk")}
)
)
)

def prefetch_active_memberships(self):
membership_model = self.model.members.through
Expand Down
14 changes: 14 additions & 0 deletions tests/companies/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,20 @@ def test_add_or_activate_member(self):


class TestCompanyQuerySet:
def test_member_required(self):
company = CompanyFactory()
user = EmployerFactory()
assert Company.objects.member_required(user).count() == 0

company.add_or_activate_member(user)
assert Company.objects.member_required(user).get() == company

membership = company.memberships.get()
membership.is_active = False
membership.save(update_fields=("is_active",))

assert Company.objects.member_required(user).count() == 0

def test_with_count_recent_received_job_applications(self):
company = CompanyFactory()
model = JobApplicationFactory._meta.model
Expand Down
16 changes: 16 additions & 0 deletions tests/institutions/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,22 @@ def test_add_or_activate_member(self):
institution.add_or_activate_member(wrong_kind_user)


class TestInstitutionQuerySet:
def test_member_required(self):
institution = InstitutionFactory()
user = LaborInspectorFactory()
assert Institution.objects.member_required(user).count() == 0

institution.add_or_activate_member(user)
assert Institution.objects.member_required(user).get() == institution

membership = institution.memberships.get()
membership.is_active = False
membership.save(update_fields=("is_active",))

assert Institution.objects.member_required(user).count() == 0


def test_deactivate_last_admin(admin_client, mailoutbox):
institution = InstitutionWithMembershipFactory(department="")
membership = institution.memberships.first()
Expand Down
16 changes: 16 additions & 0 deletions tests/prescribers/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,22 @@ def test_update_prescriber_with_api_entreprise(self, settings):
assert organization.is_head_office is True


class TestPrescriberOrganizationQuerySet:
def test_member_required(self):
organization = PrescriberOrganizationFactory()
user = PrescriberFactory()
assert PrescriberOrganization.objects.member_required(user).count() == 0

organization.add_or_activate_member(user)
assert PrescriberOrganization.objects.member_required(user).get() == organization

membership = organization.memberships.get()
membership.is_active = False
membership.save(update_fields=("is_active",))

assert PrescriberOrganization.objects.member_required(user).count() == 0


class TestPrescriberOrganizationAdmin:
ACCEPT_BUTTON_LABEL = "Valider l'habilitation"
REFUSE_BUTTON_LABEL = "Refuser l'habilitation"
Expand Down

0 comments on commit 38e9f7b

Please sign in to comment.