Fix merge conflict + enum

This commit is contained in:
zandercymatics 2024-11-26 10:41:53 -07:00
parent e91526e602
commit 62f0205b4c
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
4 changed files with 76 additions and 71 deletions

View file

@ -1,4 +1,4 @@
from enum import Enum from registrar.utility import StrEnum
from django.db import models from django.db import models
@ -43,20 +43,20 @@ class UserPortfolioPermissionChoices(models.TextChoices):
return {key: value.value for key, value in cls.__members__.items()} return {key: value.value for key, value in cls.__members__.items()}
class DomainRequestPermissionDisplay(Enum): class DomainRequestPermissionDisplay(StrEnum):
"""Stores display values for domain request permission combinations. """Stores display values for domain request permission combinations.
Overview of values: Overview of values:
- VIEWER_REQUESTER: "Viewer Requester" - VIEWER_REQUESTER: "Viewer Requester"
- VIEWER: "VIEWER" - VIEWER: "Viewer"
- NONE: "None" - NONE: "None"
""" """
VIEWER_REQUESTER = "Viewer Requester" VIEWER_REQUESTER = "Viewer Requester"
VIEWER = "VIEWER" VIEWER = "Viewer"
NONE = "None" NONE = "None"
class MemberPermissionDisplay(Enum): class MemberPermissionDisplay(StrEnum):
"""Stores display values for member permission combinations. """Stores display values for member permission combinations.
Overview of values: Overview of values:

View file

@ -862,7 +862,7 @@ class MemberExportTest(MockDbForIndividualTests, MockEppLib):
# Create a request and add the user to the request # Create a request and add the user to the request
request = self.factory.get("/") request = self.factory.get("/")
request.user = self.user request.user = self.user
self.maxDiff = None
# Add portfolio to session # Add portfolio to session
request = GenericTestHelper._mock_user_request_for_factory(request) request = GenericTestHelper._mock_user_request_for_factory(request)
request.session["portfolio"] = self.portfolio_1 request.session["portfolio"] = self.portfolio_1

View file

@ -158,14 +158,14 @@ class BaseExport(ABC):
Get a list of fields from related tables. Get a list of fields from related tables.
""" """
return [] return []
@classmethod @classmethod
def update_queryset(cls, queryset, **kwargs): def update_queryset(cls, queryset, **kwargs):
""" """
Returns an updated queryset. Override in subclass to update queryset. Returns an updated queryset. Override in subclass to update queryset.
""" """
return queryset return queryset
@classmethod @classmethod
def write_csv_before(cls, csv_writer, **kwargs): def write_csv_before(cls, csv_writer, **kwargs):
""" """
@ -335,7 +335,7 @@ class MemberExport(BaseExport):
def get_model_annotation_dict(cls, request=None, **kwargs): def get_model_annotation_dict(cls, request=None, **kwargs):
"""Combines the permissions and invitation model annotations for """Combines the permissions and invitation model annotations for
the final returned csv export which combines both of these contexts. the final returned csv export which combines both of these contexts.
Returns a dictionary of a union between: Returns a dictionary of a union between:
- UserPortfolioPermissionModelAnnotation.get_annotated_queryset(portfolio, csv_report=True) - UserPortfolioPermissionModelAnnotation.get_annotated_queryset(portfolio, csv_report=True)
- PortfolioInvitationModelAnnotation.get_annotated_queryset(portfolio, csv_report=True) - PortfolioInvitationModelAnnotation.get_annotated_queryset(portfolio, csv_report=True)
""" """
@ -361,71 +361,77 @@ class MemberExport(BaseExport):
] ]
# Permissions # Permissions
permissions = UserPortfolioPermission.objects.filter(portfolio=portfolio).select_related("user").annotate( permissions = (
first_name=F("user__first_name"), UserPortfolioPermission.objects.filter(portfolio=portfolio)
last_name=F("user__last_name"), .select_related("user")
email_display=F("user__email"), .annotate(
last_active=Coalesce( first_name=F("user__first_name"),
Func( last_name=F("user__last_name"),
F("user__last_login"), Value("YYYY-MM-DD"), function="to_char", output_field=TextField() email_display=F("user__email"),
last_active=Coalesce(
Func(F("user__last_login"), Value("YYYY-MM-DD"), function="to_char", output_field=TextField()),
Value("Invalid date"),
output_field=CharField(),
), ),
Value("Invalid date"), additional_permissions_display=F("additional_permissions"),
output_field=CharField(), member_display=Case(
), # If email is present and not blank, use email
additional_permissions_display=F("additional_permissions"), When(Q(user__email__isnull=False) & ~Q(user__email=""), then=F("user__email")),
member_display=Case( # If first name or last name is present, use concatenation of first_name + " " + last_name
# If email is present and not blank, use email When(
When(Q(user__email__isnull=False) & ~Q(user__email=""), then=F("user__email")), Q(user__first_name__isnull=False) | Q(user__last_name__isnull=False),
# If first name or last name is present, use concatenation of first_name + " " + last_name then=Concat(
When( Coalesce(F("user__first_name"), Value("")),
Q(user__first_name__isnull=False) | Q(user__last_name__isnull=False), Value(" "),
then=Concat( Coalesce(F("user__last_name"), Value("")),
Coalesce(F("user__first_name"), Value("")), ),
Value(" "),
Coalesce(F("user__last_name"), Value("")),
), ),
# If neither, use an empty string
default=Value(""),
output_field=CharField(),
), ),
# If neither, use an empty string domain_info=ArrayAgg(
default=Value(""), F("user__permissions__domain__name"),
output_field=CharField(), distinct=True,
), # only include domains in portfolio
domain_info=ArrayAgg( filter=Q(user__permissions__domain__isnull=False)
F("user__permissions__domain__name"), & Q(user__permissions__domain__domain_info__portfolio=portfolio),
distinct=True, ),
# only include domains in portfolio type=Value("member", output_field=CharField()),
filter=Q(user__permissions__domain__isnull=False) joined_date=Func(F("created_at"), Value("YYYY-MM-DD"), function="to_char", output_field=CharField()),
& Q(user__permissions__domain__domain_info__portfolio=portfolio), invited_by=cls.get_invited_by_query(object_id_query=cls.get_portfolio_invitation_id_query()),
), )
type=Value("member", output_field=CharField()), .values(*shared_columns)
joined_date=Func(F("created_at"), Value("YYYY-MM-DD"), function="to_char", output_field=CharField()), )
invited_by=cls.get_invited_by_query(
object_id_query=cls.get_portfolio_invitation_id_query()
),
).values(*shared_columns)
# Invitations # Invitations
domain_invitations = DomainInvitation.objects.filter( domain_invitations = DomainInvitation.objects.filter(
email=OuterRef("email"), # Check if email matches the OuterRef("email") email=OuterRef("email"), # Check if email matches the OuterRef("email")
domain__domain_info__portfolio=portfolio, # Check if the domain's portfolio matches the given portfolio domain__domain_info__portfolio=portfolio, # Check if the domain's portfolio matches the given portfolio
).annotate(domain_info=Concat(F("domain__id"), Value(":"), F("domain__name"), output_field=CharField())) ).annotate(domain_info=F("domain__name"))
invitations = PortfolioInvitation.objects.filter(portfolio=portfolio).annotate( invitations = (
first_name=Value(None, output_field=CharField()), PortfolioInvitation.objects.exclude(status=PortfolioInvitation.PortfolioInvitationStatus.RETRIEVED)
last_name=Value(None, output_field=CharField()), .filter(portfolio=portfolio)
email_display=F("email"), .annotate(
last_active=Value("Invited", output_field=CharField()), first_name=Value(None, output_field=CharField()),
additional_permissions_display=F("additional_permissions"), last_name=Value(None, output_field=CharField()),
member_display=F("email"), email_display=F("email"),
# Use ArrayRemove to return an empty list when no domain invitations are found last_active=Value("Invited", output_field=CharField()),
domain_info=ArrayRemoveNull( additional_permissions_display=F("additional_permissions"),
ArrayAgg( member_display=F("email"),
Subquery(domain_invitations.values("domain_info")), # Use ArrayRemove to return an empty list when no domain invitations are found
distinct=True, domain_info=ArrayRemoveNull(
) ArrayAgg(
), Subquery(domain_invitations.values("domain_info")),
type=Value("invitedmember", output_field=CharField()), distinct=True,
joined_date=Value(DefaultUserValues.UNRETRIEVED, output_field=CharField()), )
invited_by=cls.get_invited_by_query(object_id_query=Cast(OuterRef("id"), output_field=CharField())), ),
).values(*shared_columns) type=Value("invitedmember", output_field=CharField()),
joined_date=Value("Unretrieved", output_field=CharField()),
invited_by=cls.get_invited_by_query(object_id_query=Cast(OuterRef("id"), output_field=CharField())),
)
.values(*shared_columns)
)
return convert_queryset_to_dict(permissions.union(invitations), is_model=False) return convert_queryset_to_dict(permissions.union(invitations), is_model=False)
@ -450,7 +456,7 @@ class MemberExport(BaseExport):
user=OuterRef("user"), user=OuterRef("user"),
) )
), ),
then=Value(DefaultEmail.HELP_EMAIL), then=Value(DefaultEmail.HELP_EMAIL.value),
), ),
default=F("user__email"), default=F("user__email"),
output_field=CharField(), output_field=CharField(),
@ -459,7 +465,7 @@ class MemberExport(BaseExport):
.order_by("action_time") .order_by("action_time")
.values("display_email")[:1] .values("display_email")[:1]
), ),
Value(DefaultUserValues.SYSTEM), Value(DefaultUserValues.SYSTEM.value),
output_field=CharField(), output_field=CharField(),
) )

View file

@ -29,7 +29,7 @@ class LogCode(Enum):
DEFAULT = 5 DEFAULT = 5
class DefaultEmail(Enum): class DefaultEmail(StrEnum):
"""Stores the string values of default emails """Stores the string values of default emails
Overview of emails: Overview of emails:
@ -43,7 +43,7 @@ class DefaultEmail(Enum):
HELP_EMAIL = "help@get.gov" HELP_EMAIL = "help@get.gov"
class DefaultUserValues(Enum): class DefaultUserValues(StrEnum):
"""Stores default values for a default user. """Stores default values for a default user.
Overview of defaults: Overview of defaults:
@ -55,7 +55,6 @@ class DefaultUserValues(Enum):
UNRETRIEVED = "Unretrieved" UNRETRIEVED = "Unretrieved"
class Step(StrEnum): class Step(StrEnum):
""" """
Names for each page of the domain request wizard. Names for each page of the domain request wizard.