misc: add filter on job status to job page (#88641)
gitea/passerelle/pipeline/head This commit looks good Details

This commit is contained in:
Benjamin Dauvergne 2024-03-28 16:19:59 +01:00
parent 31f897ded7
commit 87d8b23222
3 changed files with 110 additions and 10 deletions

View File

@ -233,28 +233,53 @@ class GenericViewJobsConnectorView(GenericConnectorMixin, ListView):
template_name = 'passerelle/manage/service_jobs.html'
paginate_by = 25
def setup(self, request, *args, **kwargs):
super().setup(request, *args, **kwargs)
self.object = self.model.objects.get(slug=self.kwargs['slug'])
self.jobs = self.object.jobs_set()
self.status_filters = [slug for slug, _ in Job.STATUS_CHOICES]
self.status_filter = request.GET.get('job-status-filter')
if self.status_filter not in self.status_filters:
self.status_filter = 'all'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
connector = self.get_object()
context['object'] = connector
context['object'] = self.object
context['query'] = self.request.GET.get('q') or ''
if self.request.GET.get('job_id'):
try:
resource_type = ContentType.objects.get_for_model(connector)
context['job_target'] = Job.objects.get(
resource_type=resource_type, resource_pk=connector.pk, pk=self.request.GET['job_id']
)
context['job_target'] = self.jobs.get(pk=self.request.GET['job_id'])
except (ValueError, Job.DoesNotExist):
pass
context['job_status_filter'] = self.status_filter
status_choices = [
('all', _('All but completed'), self.status_filter_to_queryset(self.jobs, 'all').count())
]
for slug, label in Job.STATUS_CHOICES:
status_choices.append(
(
slug,
label,
self.status_filter_to_queryset(self.jobs, slug).count(),
)
)
context['job_status_choices'] = status_choices
return context
def get_object(self):
return self.model.objects.get(slug=self.kwargs['slug'])
def status_filter_to_queryset(self, qs, status_filter):
if status_filter in self.status_filters:
return qs.filter(status=status_filter)
else:
return qs.exclude(status='completed')
def get_queryset(self):
connector = self.get_object()
qs = connector.jobs_set().order_by('-creation_timestamp')
qs = self.jobs.order_by('-creation_timestamp')
qs = self.status_filter_to_queryset(qs, self.status_filter)
query = self.request.GET.get('q')
if query:
try:
date = date_parser.parse(query, dayfirst=True)

View File

@ -13,6 +13,19 @@
{% block content %}
<div id="filters">
<p>{% trans "Filter by status:" %}
{% for slug, label, count in job_status_choices %}
<span class="job-status">
{% if job_status_filter != slug %}<a href="?job-status-filter={{ slug }}{% if query %}&q={{ query }}{% endif %}">{% endif %}
{{ label }} ({{ count }})
{% if job_status_filter != slug %}</a>{% endif %}
</span>
{% if not forloop.last %}|{% endif %}
{% endfor %}
</p>
</div>
<div id="jobs">
<form>

View File

@ -548,13 +548,75 @@ def test_jobs(app, admin_user):
assert 'jobs' in resp.text
assert 'sample_job' in resp.text
def get_filters(resp):
job_statuses = list(resp.pyquery('.job-status').items())
return [(item.text(), item.find('a').attr('href')) for item in job_statuses]
resp = resp.click('Full page', index=1)
assert get_filters(resp) == [
(
'All but completed (1)',
None,
),
(
'Registered (1)',
'?job-status-filter=registered',
),
(
'Running (0)',
'?job-status-filter=running',
),
(
'Failed (0)',
'?job-status-filter=failed',
),
(
'Failed and restarted (0)',
'?job-status-filter=restarted',
),
(
'Completed (0)',
'?job-status-filter=completed',
),
]
assert resp.text.count('<tr data-pk') == 1
assert resp.text.count('sample_job') == 1
resp.form['q'] = 'sample'
resp = resp.form.submit()
assert resp.text.count('<tr data-pk') == 1
assert get_filters(resp) == [
(
'All but completed (1)',
None,
),
(
'Registered (1)',
'?job-status-filter=registered&q=sample',
),
(
'Running (0)',
'?job-status-filter=running&q=sample',
),
(
'Failed (0)',
'?job-status-filter=failed&q=sample',
),
(
'Failed and restarted (0)',
'?job-status-filter=restarted&q=sample',
),
(
'Completed (0)',
'?job-status-filter=completed&q=sample',
),
]
resp = resp.click('Running')
assert resp.text.count('<tr data-pk') == 0
resp = resp.click('All but completed')
resp.form['q'] = 'blah'
resp = resp.form.submit()