From 56cd0b6d156f0270f78daf8150e8d79fee1a1b33 Mon Sep 17 00:00:00 2001 From: Rachid Mrad Date: Tue, 27 Feb 2024 18:43:59 -0500 Subject: [PATCH] Gather all existing reports on analytics page --- src/registrar/admin.py | 90 +++++++++---------- src/registrar/assets/sass/_theme/_admin.scss | 3 +- src/registrar/templates/admin/analytics.html | 63 +++++++++++-- src/registrar/templates/admin/index.html | 33 ------- .../django/admin/domain_change_list.html | 23 ----- 5 files changed, 99 insertions(+), 113 deletions(-) delete mode 100644 src/registrar/templates/admin/index.html delete mode 100644 src/registrar/templates/django/admin/domain_change_list.html diff --git a/src/registrar/admin.py b/src/registrar/admin.py index aa9795eac..94b8e3dfd 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -357,17 +357,58 @@ class MyUserAdmin(BaseUserAdmin): ordering = ["first_name", "last_name", "email"] def get_urls(self): + """Map a new page in admin for analytics.""" urlpatterns = super().get_urls() + # Used to extrapolate a path name, for instance + # name="{app_label}_{model_name}_export_data_type" + domain_path_meta = self.model._meta.app_label, models.Domain._meta.model_name + my_urls = [ path( "analytics/", self.admin_site.admin_view(self.user_analytics), name="user_analytics", ), + path( + "export_data_type/", + self.export_data_type, + name="%s_%s_export_data_type" % domain_path_meta, + ), + path( + "export_data_full/", + self.export_data_full, + name="%s_%s_export_data_full" % domain_path_meta, + ), + path( + "export_data_federal/", + self.export_data_federal, + name="%s_%s_export_data_federal" % domain_path_meta, + ), ] return my_urls + urlpatterns + + def export_data_type(self, request): + # match the CSV example with all the fields + response = HttpResponse(content_type="text/csv") + response["Content-Disposition"] = 'attachment; filename="domains-by-type.csv"' + csv_export.export_data_type_to_csv(response) + return response + + def export_data_full(self, request): + # Smaller export based on 1 + response = HttpResponse(content_type="text/csv") + response["Content-Disposition"] = 'attachment; filename="current-full.csv"' + csv_export.export_data_full_to_csv(response) + return response + + def export_data_federal(self, request): + # Federal only + response = HttpResponse(content_type="text/csv") + response["Content-Disposition"] = 'attachment; filename="current-federal.csv"' + csv_export.export_data_federal_to_csv(response) + return response def user_analytics(self, request): last_30_days_applications = models.DomainApplication.objects.filter( @@ -1103,60 +1144,11 @@ class DomainAdmin(ListHeaderAdmin): search_fields = ["name"] search_help_text = "Search by domain name." change_form_template = "django/admin/domain_change_form.html" - change_list_template = "django/admin/domain_change_list.html" readonly_fields = ["state", "expiration_date", "first_ready", "deleted"] # Table ordering ordering = ["name"] - def export_data_type(self, request): - # match the CSV example with all the fields - response = HttpResponse(content_type="text/csv") - response["Content-Disposition"] = 'attachment; filename="domains-by-type.csv"' - csv_export.export_data_type_to_csv(response) - return response - - def export_data_full(self, request): - # Smaller export based on 1 - response = HttpResponse(content_type="text/csv") - response["Content-Disposition"] = 'attachment; filename="current-full.csv"' - csv_export.export_data_full_to_csv(response) - return response - - def export_data_federal(self, request): - # Federal only - response = HttpResponse(content_type="text/csv") - response["Content-Disposition"] = 'attachment; filename="current-federal.csv"' - csv_export.export_data_federal_to_csv(response) - return response - - def get_urls(self): - urlpatterns = super().get_urls() - - # Used to extrapolate a path name, for instance - # name="{app_label}_{model_name}_export_data_type" - info = self.model._meta.app_label, self.model._meta.model_name - - my_url = [ - path( - "export_data_type/", - self.export_data_type, - name="%s_%s_export_data_type" % info, - ), - path( - "export_data_full/", - self.export_data_full, - name="%s_%s_export_data_full" % info, - ), - path( - "export_data_federal/", - self.export_data_federal, - name="%s_%s_export_data_federal" % info, - ), - ] - - return my_url + urlpatterns - def response_change(self, request, obj): # Create dictionary of action functions ACTION_FUNCTIONS = { diff --git a/src/registrar/assets/sass/_theme/_admin.scss b/src/registrar/assets/sass/_theme/_admin.scss index 760c4f13a..04dceef08 100644 --- a/src/registrar/assets/sass/_theme/_admin.scss +++ b/src/registrar/assets/sass/_theme/_admin.scss @@ -112,7 +112,8 @@ html[data-theme="light"] { .change-list .usa-table thead th, body.dashboard, body.change-list, - body.change-form { + body.change-form, + .analytics { color: var(--body-fg); } } diff --git a/src/registrar/templates/admin/analytics.html b/src/registrar/templates/admin/analytics.html index 2906af223..82081d629 100644 --- a/src/registrar/templates/admin/analytics.html +++ b/src/registrar/templates/admin/analytics.html @@ -1,12 +1,61 @@ {% extends "admin/base_site.html" %} -{% block content_title %}Registrar Analytics{% endblock %} + + +{% block content_title %}

Registrar Analytics

{% endblock %} {% block content %} - + + {% block object-tools %} + + {% endblock %} + +
+
+

At a glance

+
+
    +
  • User Count: {{ data.user_count }}
  • +
  • Domain Count: {{ data.domain_count }}
  • +
  • Domain applications (last 30 days): {{ data.applications_last_30_days }}
  • +
  • Average approval time for applications (last 30 days): {{ data.average_application_approval_time_last_30_days }}
  • +
+
+
+ +
+

Domain growth

+
+ {% comment %} + Inputs of type date suck for accessibility. + We'll need to replace those guys with a django form once we figure out how to hook one onto this page. + The challenge is in the path definition in urls. It does NOT like admin/export_data/ + + See the commit "Review for ticket #999" + {% endcomment %} +
+
+ + +
+
+ + +
+ +
+
+
+ +
{% endblock %} diff --git a/src/registrar/templates/admin/index.html b/src/registrar/templates/admin/index.html deleted file mode 100644 index 04601ef32..000000000 --- a/src/registrar/templates/admin/index.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "admin/index.html" %} - -{% block content %} -
- {% include "admin/app_list.html" with app_list=app_list show_changelinks=True %} -
-

Reports

-

Domain growth report

- - {% comment %} - Inputs of type date suck for accessibility. - We'll need to replace those guys with a django form once we figure out how to hook one onto this page. - The challenge is in the path definition in urls. Itdoes NOT like admin/export_data/ - - See the commit "Review for ticket #999" - {% endcomment %} - -
-
- - -
-
- - -
- - -
- -
-
-{% endblock %} \ No newline at end of file diff --git a/src/registrar/templates/django/admin/domain_change_list.html b/src/registrar/templates/django/admin/domain_change_list.html deleted file mode 100644 index 22df74685..000000000 --- a/src/registrar/templates/django/admin/domain_change_list.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "admin/change_list.html" %} - -{% block object-tools %} - - -{% endblock %} \ No newline at end of file