From da47cc6f7f661abba3a9dee51dc798ada775b22a Mon Sep 17 00:00:00 2001 From: Rachid Mrad Date: Thu, 29 Feb 2024 18:46:45 -0500 Subject: [PATCH] Add charts to dashboard --- src/registrar/admin.py | 75 ++++++++++++++++---- src/registrar/templates/admin/analytics.html | 53 +++++++++++++- src/registrar/utility/csv_export.py | 27 ++++++- 3 files changed, 140 insertions(+), 15 deletions(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 9bc77b029..ca6b9bc87 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -384,39 +384,78 @@ def user_analytics(request): start_date_formatted = csv_export.format_start_date(start_date) end_date_formatted = csv_export.format_end_date(end_date) + # Managed vs Unmanaged filter_managed_domains_start_date = { "domain__permissions__isnull": False, - "domain__created_at__lte": start_date_formatted, + "domain__first_ready__lte": start_date_formatted, } managed_domains_sliced_at_start_date = csv_export.get_sliced_domains(filter_managed_domains_start_date) - managed_domains_sliced_at_start_date = [10, 20, 50, 0, 0, 12, 6, 5] - - logger.info(f"managed_domains_sliced_at_start_date {managed_domains_sliced_at_start_date}") - + filter_unmanaged_domains_start_date = { "domain__permissions__isnull": True, "domain__first_ready__lte": start_date_formatted, } unmanaged_domains_sliced_at_start_date = csv_export.get_sliced_domains(filter_unmanaged_domains_start_date) - unmanaged_domains_sliced_at_start_date = [15, 13, 60, 0, 2, 11, 6, 5] filter_managed_domains_end_date = { "domain__permissions__isnull": False, "domain__first_ready__lte": end_date_formatted, } managed_domains_sliced_at_end_date = csv_export.get_sliced_domains(filter_managed_domains_end_date) - managed_domains_sliced_at_end_date = [12, 20, 60, 0, 0, 12, 6, 4] filter_unmanaged_domains_end_date = { "domain__permissions__isnull": True, "domain__first_ready__lte": end_date_formatted, } unmanaged_domains_sliced_at_end_date = csv_export.get_sliced_domains(filter_unmanaged_domains_end_date) - unmanaged_domains_sliced_at_end_date = [5, 40, 55, 0, 0, 12, 6, 5] + + # Ready and Deleted domains + filter_ready_domains_start_date = { + "domain__state__in": [Domain.State.READY], + "domain__first_ready__lte": start_date_formatted, + } + ready_domains_sliced_at_start_date = csv_export.get_sliced_domains(filter_ready_domains_start_date) + + filter_deleted_domains_start_date = { + "domain__state__in": [Domain.State.DELETED], + "domain__first_ready__lte": start_date_formatted, + } + deleted_domains_sliced_at_start_date = csv_export.get_sliced_domains(filter_deleted_domains_start_date) + + filter_ready_domains_end_date = { + "domain__state__in": [Domain.State.READY], + "domain__first_ready__lte": end_date_formatted, + } + ready_domains_sliced_at_end_date = csv_export.get_sliced_domains(filter_ready_domains_end_date) + + filter_deleted_domains_end_date = { + "domain__state__in": [Domain.State.DELETED], + "domain__first_ready__lte": end_date_formatted, + } + deleted_domains_sliced_at_end_date = csv_export.get_sliced_domains(filter_deleted_domains_end_date) + + - # get number of ready domains, counts by org type and election office - # add to context + # Created and Submitted requests + filter_requests_start_date = { + "submission_date__lte": start_date_formatted, + } + requests_sliced_at_start_date = csv_export.get_sliced_requests(filter_requests_start_date) + + filter_submitted_requests_start_date = { + "status": DomainApplication.ApplicationStatus.SUBMITTED, + "submission_date__lte": start_date_formatted, + } + submitted_requests_sliced_at_start_date = csv_export.get_sliced_requests(filter_submitted_requests_start_date) - # get number of submitted request counts by org type and election office - # add to context + filter_requests_end_date = { + "submission_date__lte": end_date_formatted, + } + requests_sliced_at_end_date = csv_export.get_sliced_requests(filter_requests_end_date) + + filter_submitted_requests_end_date = { + "status": DomainApplication.ApplicationStatus.SUBMITTED, + "submission_date__lte": end_date_formatted, + } + submitted_requests_at_end_date = csv_export.get_sliced_requests(filter_submitted_requests_end_date) context = dict( **admin.site.each_context(request), @@ -425,10 +464,22 @@ def user_analytics(request): domain_count=models.Domain.objects.all().count(), applications_last_30_days=last_30_days_applications.count(), average_application_approval_time_last_30_days=avg_approval_time, + managed_domains_sliced_at_start_date=managed_domains_sliced_at_start_date, unmanaged_domains_sliced_at_start_date=unmanaged_domains_sliced_at_start_date, managed_domains_sliced_at_end_date=managed_domains_sliced_at_end_date, unmanaged_domains_sliced_at_end_date=unmanaged_domains_sliced_at_end_date, + + ready_domains_sliced_at_start_date=ready_domains_sliced_at_start_date, + deleted_domains_sliced_at_start_date=deleted_domains_sliced_at_start_date, + ready_domains_sliced_at_end_date=ready_domains_sliced_at_end_date, + deleted_domains_sliced_at_end_date=deleted_domains_sliced_at_end_date, + + requests_sliced_at_start_date=requests_sliced_at_start_date, + submitted_requests_sliced_at_start_date=submitted_requests_sliced_at_start_date, + requests_sliced_at_end_date=requests_sliced_at_end_date, + submitted_requests_at_end_date=submitted_requests_at_end_date, + ), ) return render(request, "admin/analytics.html", context) diff --git a/src/registrar/templates/admin/analytics.html b/src/registrar/templates/admin/analytics.html index f65aa77cf..735386d38 100644 --- a/src/registrar/templates/admin/analytics.html +++ b/src/registrar/templates/admin/analytics.html @@ -7,7 +7,10 @@ {% block content %}
-
+ +
+
+

At a glance

    @@ -19,7 +22,10 @@
-
+
+
+ +

Current domains

    @@ -48,6 +54,9 @@
+
+
+

Growth reports

@@ -119,8 +128,48 @@
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
{% endblock %} diff --git a/src/registrar/utility/csv_export.py b/src/registrar/utility/csv_export.py index 1764536b5..ce19182b2 100644 --- a/src/registrar/utility/csv_export.py +++ b/src/registrar/utility/csv_export.py @@ -450,6 +450,31 @@ def get_sliced_domains(filter_condition): school_district, election_board] +def get_sliced_requests(filter_condition): + """ + """ + + domain_requests = DomainApplication.objects.all().filter(**filter_condition) + federal = domain_requests.filter(organization_type=DomainApplication.OrganizationChoices.FEDERAL).count() + interstate = domain_requests.filter(organization_type=DomainApplication.OrganizationChoices.INTERSTATE).count() + state_or_territory = domain_requests.filter(organization_type=DomainApplication.OrganizationChoices.STATE_OR_TERRITORY).count() + tribal = domain_requests.filter(organization_type=DomainApplication.OrganizationChoices.TRIBAL).count() + county = domain_requests.filter(organization_type=DomainApplication.OrganizationChoices.COUNTY).count() + city = domain_requests.filter(organization_type=DomainApplication.OrganizationChoices.CITY).count() + special_district = domain_requests.filter(organization_type=DomainApplication.OrganizationChoices.SPECIAL_DISTRICT).count() + school_district = domain_requests.filter(organization_type=DomainApplication.OrganizationChoices.SCHOOL_DISTRICT).count() + election_board = domain_requests.filter(is_election_board=True).count() + + return [federal, + interstate, + state_or_territory, + tribal, + county, + city, + special_district, + school_district, + election_board] + def export_data_managed_vs_unamanaged_domains(csv_file, start_date, end_date): """ """ @@ -470,7 +495,7 @@ def export_data_managed_vs_unamanaged_domains(csv_file, start_date, end_date): filter_managed_domains_start_date = { "domain__permissions__isnull": False, - "domain__created_at__lte": start_date_formatted, + "domain__first_ready__lte": start_date_formatted, } managed_domains_sliced_at_start_date = get_sliced_domains(filter_managed_domains_start_date)