diff --git a/membershipworks/models.py b/membershipworks/models.py index e721a10..ed307b6 100644 --- a/membershipworks/models.py +++ b/membershipworks/models.py @@ -15,8 +15,33 @@ class Flag(models.Model): db_table = "flag" +class MemberQuerySet(models.QuerySet): + @staticmethod + def has_flag(flag_type: str, flag_name: str): + return Count( + "uid", + filter=Q(flags__name=flag_name, flags__type=flag_type), + output_field=BooleanField(), + ) + + def with_is_active(self): + return self.annotate( + is_active=( + self.has_flag("folder", "Members") + | self.has_flag("folder", "CMS Staff") + ) + & ~( + self.has_flag("label", "Account On Hold") + | self.has_flag("level", "CMS Membership on hold") + | self.has_flag("folder", "Former Members") + ) + ) + + # TODO: is this still a temporal table? class Member(models.Model): + objects = MemberQuerySet.as_manager() + uid = models.CharField(max_length=24, primary_key=True) year_of_birth = models.TextField(db_column="Year of Birth", null=True) account_name = models.TextField(db_column="Account Name", null=True) @@ -135,24 +160,6 @@ class Member(models.Model): db_table = "members" ordering = ("first_name", "last_name") - @classmethod - def with_is_active(cls): - def has_flag(flag_type: str, flag_name: str): - return Count( - "uid", - filter=Q(flags__name=flag_name, flags__type=flag_type), - output_field=BooleanField(), - ) - - return cls.objects.annotate( - is_active=(has_flag("folder", "Members") | has_flag("folder", "CMS Staff")) - & ~( - has_flag("label", "Account On Hold") - | has_flag("level", "CMS Membership on hold") - | has_flag("folder", "Former Members") - ) - ) - class MemberFlag(models.Model): member = models.ForeignKey(Member, on_delete=models.PROTECT, db_column="uid") diff --git a/paperwork/api.py b/paperwork/api.py index e216bb4..5a5e353 100644 --- a/paperwork/api.py +++ b/paperwork/api.py @@ -27,7 +27,7 @@ class CertificationDefinitionViewSet(viewsets.ModelViewSet): for definition in self.queryset.exclude(mailing_list="").prefetch_related( Prefetch( "certificationversion_set__certification_set__member", - queryset=Member.with_is_active(), + queryset=Member.objects.with_is_active(), ), ): if definition.mailing_list not in lists: