Simplify home view stats

This commit is contained in:
jeremystretch 2021-07-12 10:32:13 -04:00
parent 5406acf329
commit 5d98c3337a
3 changed files with 46 additions and 57 deletions

View File

@ -55,42 +55,41 @@ class HomeView(View):
def build_stats():
perms = request.user.get_all_permissions()
stats = []
org = (
("dcim.view_site", "Sites", "Geographic locations", Site.objects.restrict(request.user, 'view').count),
("tenancy.view_tenant", "Tenants", "Customers or departments", Tenant.objects.restrict(request.user, 'view').count),
("dcim.view_site", "Sites", Site.objects.restrict(request.user, 'view').count),
("tenancy.view_tenant", "Tenants", Tenant.objects.restrict(request.user, 'view').count),
)
dcim = (
("dcim.view_rack", "Racks", "Equipment racks, optionally organized by group", Rack.objects.restrict(request.user, 'view').count),
("dcim.view_devicetype", "Device Types", "Physical hardware models by manufacturer", DeviceType.objects.restrict(request.user, 'view').count),
("dcim.view_device", "Devices", "Rack-mounted infrastructure", Device.objects.restrict(request.user, 'view').count),
("dcim.view_rack", "Racks", Rack.objects.restrict(request.user, 'view').count),
("dcim.view_devicetype", "Device Types", DeviceType.objects.restrict(request.user, 'view').count),
("dcim.view_device", "Devices", Device.objects.restrict(request.user, 'view').count),
)
ipam = (
("ipam.view_vrf", "VRFs", "Virtual routing & forwarding tables", VRF.objects.restrict(request.user, 'view').count),
("ipam.view_aggregate", "Aggregates", "Top-level IP allocations", Aggregate.objects.restrict(request.user, 'view').count),
("ipam.view_prefix", "Prefixes", "IPv4 & IPv6 network assignments", Prefix.objects.restrict(request.user, 'view').count),
("ipam.view_ipaddress", "IP Addresses", "Individual IPv4 & IPv6 addresses", IPAddress.objects.restrict(request.user, 'view').count),
("ipam.view_vlan", "VLANs", "Layer 2 domains, by VLAN ID", VLAN.objects.restrict(request.user, 'view').count)
("ipam.view_vrf", "VRFs", VRF.objects.restrict(request.user, 'view').count),
("ipam.view_aggregate", "Aggregates", Aggregate.objects.restrict(request.user, 'view').count),
("ipam.view_prefix", "Prefixes", Prefix.objects.restrict(request.user, 'view').count),
("ipam.view_ipaddress", "IP Addresses", IPAddress.objects.restrict(request.user, 'view').count),
("ipam.view_vlan", "VLANs", VLAN.objects.restrict(request.user, 'view').count)
)
circuits = (
("circuits.view_provider", "Providers", "Organizations that provide circuits", Provider.objects.restrict(request.user, 'view').count),
("circuits.view_circuit", "Circuits", "Communication links for transit, transport, & other services", Circuit.objects.restrict(request.user, 'view').count),
("circuits.view_provider", "Providers", Provider.objects.restrict(request.user, 'view').count),
("circuits.view_circuit", "Circuits", Circuit.objects.restrict(request.user, 'view').count),
)
virtualization = (
("virtualization.view_cluster", "Clusters", "Clusters of physical virtual machine hosts", Cluster.objects.restrict(request.user, 'view').count),
("virtualization.view_virtualmachine", "Virtual Machines", "Virtual compute instances running inside clusters", VirtualMachine.objects.restrict(request.user, 'view').count),
("virtualization.view_cluster", "Clusters", Cluster.objects.restrict(request.user, 'view').count),
("virtualization.view_virtualmachine", "Virtual Machines", VirtualMachine.objects.restrict(request.user, 'view').count),
)
connections = (
("dcim.view_cable", "Cables", None, Cable.objects.restrict(request.user, 'view').count),
("dcim.view_consoleport", "Console", None, connected_consoleports.count),
("dcim.view_interface", "Interfaces", None, connected_interfaces.count),
("dcim.view_powerport", "Power Connections", None, connected_powerports.count),
("dcim.view_cable", "Cables", Cable.objects.restrict(request.user, 'view').count),
("dcim.view_consoleport", "Console", connected_consoleports.count),
("dcim.view_interface", "Interfaces", connected_interfaces.count),
("dcim.view_powerport", "Power Connections", connected_powerports.count),
)
power = (
("dcim.view_powerpanel", "Power Panels", "Electrical panels receiving utility power", PowerPanel.objects.restrict(request.user, 'view').count),
("dcim.view_powerfeed", "Power Feeds", "Electrical circuits delivering power from panels", PowerFeed.objects.restrict(request.user, 'view').count),
("dcim.view_powerpanel", "Power Panels", PowerPanel.objects.restrict(request.user, 'view').count),
("dcim.view_powerfeed", "Power Feeds", PowerFeed.objects.restrict(request.user, 'view').count),
)
sections = (
("Organization", org),
@ -101,17 +100,25 @@ class HomeView(View):
("Circuits", circuits),
("Power", power),
)
stats = []
for section_label, section_items in sections:
stat = {"label": section_label, "items": []}
for perm, item_label, description, get_count in section_items:
items = []
for perm, item_label, get_count in section_items:
app, scope = perm.split(".")
url = ":".join((app, scope.replace("view_", "") + "_list"))
item = {"label": item_label, "description": description, "count": None, "url": url, "disabled": True}
item = {
"label": item_label,
"count": None,
"url": url,
"disabled": True
}
if perm in perms:
item["count"] = get_count()
item["disabled"] = False
stat["items"].append(item)
stats.append(stat)
items.append(item)
stats.append((section_label, items))
return stats
changelog = ObjectChange.objects.restrict(request.user, 'view').prefetch_related('user', 'changed_object_type')

View File

@ -523,10 +523,6 @@ div.content-container {
}
}
.stats-container {
min-height: 50vh;
}
span.color-label {
width: 5rem;
height: 1rem;

View File

@ -8,43 +8,29 @@
{% block content %}
{# General stats #}
<div class="stats-container">
<div class="row masonry">
{% for section in stats %}
{% for section, items in stats %}
<div class="col col-sm-12 col-lg-6 col-xl-4 my-2 masonry-item">
<div class="card">
<h5 class="card-header text-primary">{{ section.label }}</h5>
<h6 class="card-header text-primary text-center">{{ section }}</h6>
<div class="card-body">
<div class="list-group list-group-flush">
{% for item in section.items %}
{% for item in items %}
{% if item.count %}
<a href="{% url item.url %}" class="list-group-item list-group-item-action{% if item.disabled %} disabled{% endif %}">
<div class="d-flex w-100 justify-content-between align-items-center">
<div class="d-flex flex-column align-items-start">
<h6 class="mb-1">{{ item.label }}</h6>
{% if item.description %}
<small class="mb-1 text-muted">{{ item.description }}</small>
{% endif %}
</div>
<span class="badge stat-badge rounded-pill">
{% if item.count == None %}
<i class="mdi mdi-lock"></i>
{% else %}
{{ item.count }}
{% endif %}
</span>
{{ item.label }}
<h4 class="mb-1">{{ item.count }}</h4>
</div>
</a>
{% endif %}
{% endfor %}
</div>
<div class="display-4 font-weight-normal text-primary">
{{ item.count }}
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{# Changelog #}
<div class="row my-4 flex-grow-1 changelog-container">