Skip to content

Commit 503dc5d

Browse files
committed
Add pipeline run list view
Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent abb49e1 commit 503dc5d

File tree

2 files changed

+151
-0
lines changed

2 files changed

+151
-0
lines changed
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
{% extends "base.html" %}
2+
3+
{% block title %}
4+
{{ pipeline_name }} Runs
5+
{% endblock %}
6+
7+
{% block extrahead %}
8+
<style>
9+
10+
thead th {
11+
border-bottom: none !important;
12+
}
13+
14+
tbody tr:hover {
15+
background-color: #e0e0e0 !important;
16+
cursor: pointer;
17+
}
18+
19+
tbody tr:nth-child(even):hover {
20+
background-color: #d3d3d3 !important;
21+
}
22+
23+
.column {
24+
word-break: break-word;
25+
}
26+
</style>
27+
{% endblock %}
28+
29+
30+
{% block content %}
31+
<div class="columns">
32+
<div class="column">
33+
</div>
34+
35+
<div class="column is-four-fifths">
36+
<div class="content is-normal">
37+
<h1>{{ pipeline_name }} Runs</h1>
38+
<hr />
39+
</div>
40+
<div class="box">
41+
<table class="table is-striped is-hoverable is-fullwidth">
42+
<thead>
43+
<tr>
44+
<th colspan="6">
45+
<div class="box is-small">
46+
<div class="columns is-mobile is-vcentered">
47+
<div class="column is-one-quarter">Job ID</div>
48+
<div class="column is-one-eighth">Status</div>
49+
<div class="column is-one-eighth">Execution Time</div>
50+
<div class="column is-one-fifth">Start Time</div>
51+
<div class="column is-one-fifth">End Time</div>
52+
</div>
53+
</div>
54+
</th>
55+
</tr>
56+
</thead>
57+
<tbody>
58+
{% for run in run_list %}
59+
<tr>
60+
<td colspan="6">
61+
<a href="{% url 'run-details' pipeline_id=run.pipeline.pipeline_id run_id=run.run_id %}"
62+
class="has-text-info">
63+
<div class="columns px-1 is-mobile is-vcentered">
64+
<div class="column is-one-quarter">{{ run.run_id }}</div>
65+
<div class="column is-one-eighth">
66+
<span class="is-flex is-align-items-center">
67+
{% if run.status == "running" %}
68+
<span class="icon has-text-info mr-1"><i class="fa fa-spinner fa-spin"></i></span>
69+
<span>Running</span>
70+
{% elif run.status == "success" %}
71+
<span class="icon has-text-success mr-1"><i class="fa fa-check-circle"></i></span>
72+
<span>Success</span>
73+
{% elif run.status == "failure" %}
74+
<span class="icon has-text-danger mr-1"><i class="fa fa-times-circle"></i></span>
75+
<span>Failure</span>
76+
{% elif run.status == "scheduled" %}
77+
<span class="icon has-text-grey mr-1"><i class="fa fa-clock-o"></i></span>
78+
<span>Scheduled</span>
79+
{% else %}
80+
<span class="icon mr-1"><i class="fa fa-question-circle"></i></span>
81+
<span>Unknown</span>
82+
{% endif %}
83+
</span>
84+
</div>
85+
<div class="column is-one-eighth">{{ run.execution_time }}</div>
86+
<div class="column is-one-fifth has-text-grey-light" title="{{ run.latest_run_date }}">
87+
{{ run.run_start_date|date:"Y-m-d H:i" }}
88+
</div>
89+
<div class="column is-one-fifth has-text-grey-light" title="{{ run.next_run_date }}">
90+
{{ run.run_end_date|date:"Y-m-d H:i" }}
91+
</div>
92+
93+
</div>
94+
</a>
95+
</td>
96+
</tr>
97+
{% empty %}
98+
<tr>
99+
<td colspan="6" class="has-text-centered">No run found.</td>
100+
</tr>
101+
{% endfor %}
102+
</tbody>
103+
</table>
104+
<a href="{% url 'schedule' %}" class="button is-link mt-4">← Back to Schedules</a>
105+
</div>
106+
{% if is_paginated %}
107+
<nav class="pagination is-centered px-5" role="navigation" aria-label="pagination">
108+
{% if page_obj.has_previous %}
109+
<a class="pagination-previous" href="?page={{ page_obj.previous_page_number }}">Previous</a>
110+
{% endif %}
111+
112+
{% if page_obj.has_next %}
113+
<a class="pagination-next" href="?page={{ page_obj.next_page_number }}">Next page</a>
114+
{% endif %}
115+
<ul class="pagination-list">
116+
<li><a class="pagination-link" aria-label="Goto page 1" href="?page=1">1</a></li>
117+
<li><span class="pagination-ellipsis">&hellip;</span></li>
118+
<li><a class="pagination-link" aria-label="Goto page {{ page_obj.number }}"
119+
href="?page={{ page_obj.paginator.num_pages }}">{{ page_obj.paginator.num_pages }}</a></li>
120+
</ul>
121+
</nav>
122+
{% endif %}
123+
</div>
124+
<div class="column"></div>
125+
</div>
126+
{% endblock %}

vulnerabilities/views.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,3 +365,28 @@ def get_queryset(self):
365365
pipeline_id__icontains=form.cleaned_data.get("search")
366366
)
367367
return PipelineSchedule.objects.all()
368+
369+
370+
class PipelineRunListView(ListView):
371+
model = PipelineRun
372+
context_object_name = "run_list"
373+
template_name = "pipeline_run_list.html"
374+
paginate_by = 30
375+
slug_url_kwarg = "pipeline_id"
376+
slug_field = "pipeline_id"
377+
378+
def get_queryset(self):
379+
pipeline = get_object_or_404(
380+
PipelineSchedule,
381+
pipeline_id=self.kwargs["pipeline_id"],
382+
)
383+
return pipeline.all_runs
384+
385+
def get_context_data(self, **kwargs):
386+
context = super().get_context_data(**kwargs)
387+
pipeline = get_object_or_404(
388+
PipelineSchedule,
389+
pipeline_id=self.kwargs["pipeline_id"],
390+
)
391+
context["pipeline_name"] = pipeline.pipeline_class.__name__
392+
return context

0 commit comments

Comments
 (0)