Change org type

This commit is contained in:
zandercymatics 2024-04-10 08:39:37 -06:00
parent fc4ccd72ae
commit 31958d3cb5
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7

View file

@ -573,13 +573,10 @@ def get_sliced_requests(filter_condition):
"""Get filtered requests counts sliced by org type and election office.""" """Get filtered requests counts sliced by org type and election office."""
return get_org_type_counts(DomainRequest, filter_condition) return get_org_type_counts(DomainRequest, filter_condition)
def _org_type_count_query_builder(generic_org_type):
return Count(Case(When(generic_org_type=generic_org_type, then=1)))
def get_org_type_counts(model_class, filter_condition): def get_org_type_counts(model_class, filter_condition):
"""Returns a list of counts for each org type""" """Returns a list of counts for each org type"""
# Count all org types, such as federal
dynamic_count_dict = {} dynamic_count_dict = {}
for choice in DomainRequest.OrganizationChoices: for choice in DomainRequest.OrganizationChoices:
choice_name = f"{choice}_count" choice_name = f"{choice}_count"
@ -589,30 +586,55 @@ def get_org_type_counts(model_class, filter_condition):
static_count_dict = { static_count_dict = {
# Count all distinct records # Count all distinct records
"total_count": Count('id'), "total_count": Count('id'),
# Count all election boards
"election_board_count": Count(Case(When(is_election_board=True, then=1))), "election_board_count": Count(Case(When(is_election_board=True, then=1))),
} }
# Merge static aggregates with dynamic organization type counts # Merge static counts with dynamic organization type counts
merged_count_dict = {**static_count_dict, **dynamic_count_dict} merged_count_dict = {**static_count_dict, **dynamic_count_dict}
# Perform a single query with conditional aggregation # Perform a single query with conditional aggregation
model_queryset = model_class.objects.filter(**filter_condition).distinct() model_queryset = model_class.objects.filter(**filter_condition).distinct()
aggregates = model_queryset.aggregate(**merged_count_dict) aggregates = model_queryset.aggregate(**merged_count_dict)
# TODO - automate this # This can be automated but for the sake of readability, this is fixed for now.
# To automate this would also mean the added benefit of
# auto-updating (automatically adds new org types) charts,
# but that requires an upstream refactor.
return [ return [
aggregates['total_count'], # total count # Total number of records
aggregates['federal_count'], # federal count aggregates['total_count'],
aggregates['interstate_count'], # interstate count # Number of records with org type FEDERAL
aggregates['state_or_territory_count'], # state or territory count aggregates['federal_count'],
aggregates['tribal_count'], # tribal count # Number of records with org type INTERSTATE
aggregates['county_count'], # county count aggregates['interstate_count'],
aggregates['city_count'], # city count # Number of records with org type STATE_OR_TERRITORY
aggregates['special_district_count'], # special district count aggregates['state_or_territory_count'],
aggregates['school_district_count'], # school district count # Number of records for TRIBAL
aggregates['election_board_count'], # election board count aggregates['tribal_count'],
# Number of records for COUNTY
aggregates['county_count'],
# Number of records for CITY
aggregates['city_count'],
# Number of records for SPECIAL_DISTRICT
aggregates['special_district_count'],
# Number of records for SCHOOL_DISTRICT
aggregates['school_district_count'],
# Number of records for ELECTION_BOARD
aggregates['election_board_count'],
] ]
def _org_type_count_query_builder(generic_org_type):
"""
Returns an expression that counts the number of a given generic_org_type.
On the backend (the DB), this returns an array of "1" which is then counted by the expression.
Used within an .aggregate call, but this essentially performs the same as queryset.count()
We use this as opposed to queryset.count() because when this operation is repeated multiple times,
it is more efficient to do these once in the DB rather than multiple times (as each count consitutes a call)
"""
return Count(Case(When(generic_org_type=generic_org_type, then=1)))
def export_data_managed_domains_to_csv(csv_file, start_date, end_date): def export_data_managed_domains_to_csv(csv_file, start_date, end_date):
"""Get counts for domains that have domain managers for two different dates, """Get counts for domains that have domain managers for two different dates,
get list of managed domains at end_date.""" get list of managed domains at end_date."""