Add charts to dashboard

This commit is contained in:
Rachid Mrad 2024-02-29 18:46:45 -05:00
parent 0a174e5d29
commit da47cc6f7f
No known key found for this signature in database
3 changed files with 140 additions and 15 deletions

View file

@ -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]
# get number of ready domains, counts by org type and election office
# add to context
# 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)
# get number of submitted request counts by org type and election office
# add to context
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)
# 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)
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)

View file

@ -7,7 +7,10 @@
{% block content %}
<div id="content-main" class="analytics">
<div class="module">
<div class="grid-row grid-gap-2">
<div class="tablet:grid-col-6 margin-top-2">
<div class="module height-full">
<h2>At a glance</h2>
<div class="padding-2">
<ul>
@ -19,7 +22,10 @@
</div>
</div>
<div class="module">
</div>
<div class="tablet:grid-col-6 margin-top-2">
<div class="module height-full">
<h2>Current domains</h2>
<div class="padding-2">
<ul class="usa-button-group">
@ -48,6 +54,9 @@
</div>
</div>
</div></div>
<div class="grid-row grid-gap-2 margin-top-2">
<div class="grid-col">
<div class="module">
<h2>Growth reports</h2>
<div class="padding-2">
@ -119,6 +128,46 @@
</div>
</div>
<div class="grid-row grid-gap-2 margin-y-2">
<div class="grid-col">
<canvas id="myChart3" width="400" height="200"
data-list-one="{{data.deleted_domains_sliced_at_start_date}}"
data-list-two="{{data.deleted_domains_sliced_at_start_date}}"
data-list-three="{{data.ready_domains_sliced_at_end_date}}"
data-list-four="{{data.requests_sliced_at_start_date}}"
></canvas>
</div>
<div class="grid-col">
<canvas id="myChart4" width="400" height="200"
data-list-one="{{data.deleted_domains_sliced_at_start_date}}"
data-list-two="{{data.deleted_domains_sliced_at_start_date}}"
data-list-three="{{data.ready_domains_sliced_at_end_date}}"
data-list-four="{{data.deleted_domains_sliced_at_end_date}}"
></canvas>
</div>
</div>
<div class="grid-row grid-gap-2 margin-y-2">
<div class="grid-col">
<canvas id="myChart5" width="400" height="200"
data-list-one="{{data.requests_sliced_at_start_date}}"
data-list-two="{{data.submitted_requests_sliced_at_start_date}}"
data-list-three="{{data.requests_sliced_at_end_date}}"
data-list-four="{{data.submitted_requests_at_end_date}}"
></canvas>
</div>
<div class="grid-col">
<canvas id="myChart6" width="400" height="200"
data-list-one="{{data.requests_sliced_at_start_date}}"
data-list-two="{{data.submitted_requests_sliced_at_start_date}}"
data-list-three="{{data.requests_sliced_at_end_date}}"
data-list-four="{{data.submitted_requests_at_end_date}}"
></canvas>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -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)