diff --git a/src/registrar/utility/csv_export.py b/src/registrar/utility/csv_export.py index 2798e8df3..537d61538 100644 --- a/src/registrar/utility/csv_export.py +++ b/src/registrar/utility/csv_export.py @@ -70,7 +70,7 @@ def format_end_date(end_date): class BaseExport(BaseModelAnnotation): """ A generic class for exporting data which returns a csv file for the given model. - Base class in an inheritance tree of 3. + 3rd class in an inheritance tree of 4. """ @classmethod @@ -157,6 +157,8 @@ class MemberExport(BaseExport): @classmethod def get_model_annotation_dict(cls, request=None, **kwargs): + """Combines the permissions and invitation model annotations for + the final returned csv export which combines both of these contexts""" portfolio = request.session.get("portfolio") if not portfolio: return {} @@ -230,21 +232,9 @@ class MemberExport(BaseExport): "Member management": member_perm_display, "Domain management": len(user_managed_domains) > 0, "Number of domains": len(user_managed_domains), - # TODO - this doesn't quote enclose with one record "Domains": managed_domains_as_csv, } - # "id", - # "first_name", - # "last_name", - # "email_display", - # "last_active", - # "roles", - # "additional_permissions_display", - # "member_display", - # "domain_info", - # "source", - row = [FIELDS.get(column, "") for column in columns] return row diff --git a/src/registrar/utility/model_annotations.py b/src/registrar/utility/model_annotations.py index 5ef393589..077da9553 100644 --- a/src/registrar/utility/model_annotations.py +++ b/src/registrar/utility/model_annotations.py @@ -1,16 +1,12 @@ """ -Model annotation classes. Intended to return django querysets with computed fields for api endpoints and our csv reports. - -Created to manage the complexity of the MembersTable and Members CSV report, as they require complex but common annotations. - -These classes provide consistent, reusable query transformations that: -1. Add computed fields via annotations -2. Handle related model data -3. Format fields for display -4. Standardize field names across different contexts +Model annotation classes. +Intended to return django querysets with computed fields for api endpoints and our csv reports. Used by both API endpoints (e.g. portfolio members JSON) and data exports (e.g. CSV reports). +Initially created to manage the complexity of the MembersTable and Members CSV report, +as they require complex but common annotations. + Example: # For a JSON table endpoint permissions = UserPortfolioPermissionAnnotation.get_annotated_queryset(portfolio) @@ -59,6 +55,8 @@ class BaseModelAnnotation(ABC): Subclasses define model-specific annotations, filters, and field formatting while inheriting common queryset building logic. Intended ensure consistent data presentation across both table UI components and CSV exports. + + Base class in an inheritance tree of 4. """ @classmethod @@ -253,7 +251,7 @@ class UserPortfolioPermissionModelAnnotation(BaseModelAnnotation): PortfolioInvitation.objects.filter( status=PortfolioInvitation.PortfolioInvitationStatus.RETRIEVED, # Double outer ref because we first go into the LogEntry query, - # then into the + # then into the parent UserPortfolioPermission. email=OuterRef(OuterRef("user__email")), portfolio=OuterRef(OuterRef("portfolio")), ).values("id")[:1]