Skip to content

Commit 3276bce

Browse files
Enhance pipeline dashboard: Worker stats, pagination, and UI improvements
Signed-off-by: Dipankar Chettri <dipankarchettri12345@gmail.com>
1 parent b3928f1 commit 3276bce

File tree

2 files changed

+117
-67
lines changed

2 files changed

+117
-67
lines changed

vulnerabilities/templates/pipeline_dashboard.html

Lines changed: 101 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -6,71 +6,100 @@
66

77
{% block extrahead %}
88
<style>
9-
thead th {
10-
border-bottom: none !important;
11-
}
9+
thead th {
10+
border-bottom: none !important;
11+
}
1212

13-
tbody tr:hover {
14-
background-color: #e0e0e0 !important;
15-
cursor: pointer;
16-
}
13+
tbody tr:hover {
14+
background-color: #e0e0e0 !important;
15+
cursor: pointer;
16+
}
1717

18-
tbody tr:nth-child(even):hover {
19-
background-color: #d3d3d3 !important;
20-
}
18+
tbody tr:nth-child(even):hover {
19+
background-color: #d3d3d3 !important;
20+
}
2121

22-
.column {
23-
word-break: break-word;
24-
}
22+
.column {
23+
word-break: break-word;
24+
}
2525
</style>
26-
{% endblock %}
26+
{% endblock %} {% block content %}
27+
<div class="columns">
28+
<div class="column"></div>
2729

30+
<div class="column is-four-fifths">
31+
<div class="content is-normal">
32+
<h1>Pipeline Dashboard</h1>
33+
<hr />
34+
</div>
35+
<form method="get" class="box px-6 mx-0" action="">
36+
<div class="field has-addons">
37+
<div class="control is-expanded">{{ form.search }}</div>
38+
<div class="control">
39+
<button type="submit" class="button is-info">
40+
<i class="fa fa-search mx-1"></i>
41+
</button>
42+
</div>
43+
</div>
44+
</form>
2845

29-
{% block content %}
30-
<div class="columns">
31-
<div class="column">
46+
<div class="box has-background-light">
47+
<nav class="level">
48+
<div class="level-item has-text-centered">
49+
<div>
50+
<p class="heading">Total Workers</p>
51+
<p class="title">{{ total_workers }}</p>
52+
</div>
53+
</div>
54+
<div class="level-item has-text-centered">
55+
<div>
56+
<p class="heading">Busy</p>
57+
<p class="title has-text-success">{{ busy_workers }}</p>
58+
</div>
59+
</div>
60+
<div class="level-item has-text-centered">
61+
<div>
62+
<p class="heading">Idle</p>
63+
<p class="title has-text-warning">{{ idle_workers }}</p>
64+
</div>
65+
</div>
66+
<div class="level-item has-text-centered">
67+
<div>
68+
<p class="heading">Queued Jobs</p>
69+
<p class="title">{{ queue_count }}</p>
70+
</div>
71+
</div>
72+
</nav>
3273
</div>
3374

34-
<div class="column is-four-fifths">
35-
<div class="content is-normal">
36-
<h1>Pipeline Dashboard</h1>
37-
<hr />
75+
<div class="box">
76+
<div class="column is-flex is-justify-content-end">
77+
<div class="tags has-addons mb-0 mr-3">
78+
<span class="tag is-dark">Active Pipelines</span>
79+
<span class="tag is-success">{{ active_pipeline_count|default:0 }}</span>
3880
</div>
39-
<form method="get" class="box px-6 mx-0" action="">
40-
<div class="field has-addons">
41-
<div class="control is-expanded">
42-
{{ form.search }}
43-
</div>
44-
<div class="control">
45-
<button type="submit" class="button is-info"><i class="fa fa-search mx-1"></i></button>
81+
<div class="tags has-addons mb-0">
82+
<span class="tag is-dark">Disabled Pipelines</span>
83+
<span class="tag is-light">{{ disabled_pipeline_count|default:0 }}</span>
84+
</div>
85+
</div>
86+
<table class="table is-striped is-hoverable is-fullwidth">
87+
<thead>
88+
<tr>
89+
<th colspan="6">
90+
<div class="box is-small">
91+
<div class="columns is-mobile is-vcentered">
92+
<div class="column is-one-quarter">Pipeline ID</div>
93+
<div class="column is-one-eighth">Active</div>
94+
<div class="column is-one-eighth">Interval</div>
95+
<div class="column is-one-eighth">Status</div>
96+
<div class="column is-one-fifth">Last Run End Time</div>
97+
<div class="column is-one-fifth">Next Run Start</div>
4698
</div>
47-
</div>
48-
</form>
49-
50-
<div class="box">
51-
<div class="column has-text-right">
52-
<p class="has-text-weight-semibold">
53-
{{ active_pipeline_count|default:0 }} active pipeline{{ active_pipeline_count|default:0|pluralize }},
54-
{{ disabled_pipeline_count|default:0 }} disabled pipeline{{ disabled_pipeline_count|default:0|pluralize }}
55-
</p>
56-
</div>
57-
<table class="table is-striped is-hoverable is-fullwidth">
58-
<thead>
59-
<tr>
60-
<th colspan="6">
61-
<div class="box is-small">
62-
<div class="columns is-mobile is-vcentered">
63-
<div class="column is-one-quarter">Pipeline ID</div>
64-
<div class="column is-one-eighth">Active</div>
65-
<div class="column is-one-eighth">Interval</div>
66-
<div class="column is-one-eighth">Status</div>
67-
<div class="column is-one-fifth">Last Run End Time</div>
68-
<div class="column is-one-fifth">Next Run Start</div>
69-
</div>
70-
</div>
71-
</th>
72-
</tr>
73-
</thead>
99+
</div>
100+
</th>
101+
</tr>
102+
</thead>
74103
<tbody>
75104
{% for schedule in schedule_list %}
76105
<tr>
@@ -115,27 +144,32 @@ <h1>Pipeline Dashboard</h1>
115144
</tr>
116145
{% endfor %}
117146
</tbody>
118-
119-
</table>
120-
</div>
147+
</table>
148+
</div>
121149
{% if is_paginated %}
122150
<nav class="pagination is-centered px-5" role="navigation" aria-label="pagination">
123151
{% if page_obj.has_previous %}
124-
<a class="pagination-previous" href="?page={{ page_obj.previous_page_number }}">Previous</a>
152+
<a class="pagination-previous" href="?page={{ page_obj.previous_page_number }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}">Previous</a>
125153
{% endif %}
126154

127155
{% if page_obj.has_next %}
128-
<a class="pagination-next" href="?page={{ page_obj.next_page_number }}">Next page</a>
156+
<a class="pagination-next" href="?page={{ page_obj.next_page_number }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}">Next page</a>
129157
{% endif %}
158+
130159
<ul class="pagination-list">
131-
<li><a class="pagination-link" aria-label="Goto page 1" href="?page=1">1</a></li>
132-
<li><span class="pagination-ellipsis">&hellip;</span></li>
133-
<li><a class="pagination-link" aria-label="Goto page {{ page_obj.number }}"
134-
href="?page={{ page_obj.paginator.num_pages }}">{{ page_obj.paginator.num_pages }}</a></li>
160+
{% for i in elided_page_range %}
161+
{% if i == page_obj.paginator.ELLIPSIS %}
162+
<li><span class="pagination-ellipsis">&hellip;</span></li>
163+
{% elif page_obj.number == i %}
164+
<li><a class="pagination-link is-current" aria-label="Page {{ i }}" aria-current="page">{{ i }}</a></li>
165+
{% else %}
166+
<li><a class="pagination-link" aria-label="Goto page {{ i }}" href="?page={{ i }}{% if request.GET.search %}&search={{ request.GET.search }}{% endif %}">{{ i }}</a></li>
167+
{% endif %}
168+
{% endfor %}
135169
</ul>
136170
</nav>
137171
{% endif %}
138-
</div>
139-
<div class="column"></div>
172+
</div>
173+
<div class="column"></div>
140174
</div>
141-
{% endblock %}
175+
{% endblock %}

vulnerabilities/views.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from cvss.exceptions import CVSS3MalformedError
1313
from cvss.exceptions import CVSS4MalformedError
1414
from django.contrib import messages
15+
import django_rq
16+
from rq.worker import Worker
1517
from django.contrib.auth.views import LoginView
1618
from django.core.exceptions import ValidationError
1719
from django.core.mail import send_mail
@@ -755,6 +757,20 @@ def get_context_data(self, **kwargs):
755757
context["disabled_pipeline_count"] = PipelineSchedule.objects.filter(
756758
is_active=False
757759
).count()
760+
761+
queues = [django_rq.get_queue("default")]
762+
workers = Worker.all(connection=django_rq.get_connection())
763+
context["total_workers"] = len(workers)
764+
context["idle_workers"] = len([w for w in workers if w.state == "idle"])
765+
context["busy_workers"] = len([w for w in workers if w.state == "busy"])
766+
context["queue_count"] = sum(q.count for q in queues)
767+
768+
paginator = context.get("paginator")
769+
page_obj = context.get("page_obj")
770+
if paginator and page_obj:
771+
context["elided_page_range"] = paginator.get_elided_page_range(
772+
page_obj.number, on_each_side=2, on_ends=1
773+
)
758774
return context
759775

760776

0 commit comments

Comments
 (0)