1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Add general purpose view for individual jobs

This commit is contained in:
jeremystretch
2023-04-17 15:08:18 -04:00
parent 8b040ff930
commit a0893c2e8b
4 changed files with 88 additions and 1 deletions
netbox
core
templates/core

@ -102,6 +102,7 @@ class Job(models.Model):
return reverse(f'extras:report_result', kwargs={'job_pk': self.pk})
if self.object_type.model == 'scriptmodule':
return reverse(f'extras:script_result', kwargs={'job_pk': self.pk})
return reverse('core:job', args=[self.pk])
def get_status_color(self):
return JobStatusChoices.colors.get(self.status)

@ -22,6 +22,7 @@ urlpatterns = (
# Job results
path('jobs/', views.JobListView.as_view(), name='job_list'),
path('jobs/delete/', views.JobBulkDeleteView.as_view(), name='job_bulk_delete'),
path('jobs/<int:pk>/', views.JobView.as_view(), name='job'),
path('jobs/<int:pk>/delete/', views.JobDeleteView.as_view(), name='job_delete'),
)

@ -127,7 +127,11 @@ class JobListView(generic.ObjectListView):
filterset = filtersets.JobFilterSet
filterset_form = forms.JobFilterForm
table = tables.JobTable
actions = ('export', 'delete', 'bulk_delete', )
actions = ('export', 'delete', 'bulk_delete')
class JobView(generic.ObjectView):
queryset = Job.objects.all()
class JobDeleteView(generic.ObjectDeleteView):

@ -0,0 +1,81 @@
{% extends 'generic/object.html' %}
{% load buttons %}
{% load helpers %}
{% load perms %}
{% block controls %}
<div class="controls">
<div class="control-group">
{% if request.user|can_delete:object %}
{% delete_button object %}
{% endif %}
</div>
</div>
{% endblock controls %}
{% block content %}
<div class="row mb-3">
<div class="col col-md-6">
<div class="card">
<h5 class="card-header">Job</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Object Type</th>
<td>
<a href="{% url 'core:job_list' %}?object_type={{ object.object_type_id }}">{{ object.object_type }}</a>
</td>
</tr>
<tr>
<th scope="row">Name</th>
<td>{{ object.name|placeholder }}</td>
</tr>
<tr>
<th scope="row">Status</th>
<td>{% badge object.get_status_display object.get_status_color %}</td>
</tr>
<tr>
<th scope="row">Created By</th>
<td>{{ object.user|placeholder }}</td>
</tr>
</table>
</div>
</div>
</div>
<div class="col col-md-6">
<div class="card">
<h5 class="card-header">Scheduling</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Created</th>
<td>{{ object.created|annotated_date }}</td>
</tr>
<tr>
<th scope="row">Scheduled</th>
<td>{{ object.scheduled|annotated_date|placeholder }}{% if object.interval %} (every {{ object.interval }} seconds){% endif %}</td>
</tr>
<tr>
<th scope="row">Started</th>
<td>{{ object.started|annotated_date|placeholder }}</td>
</tr>
<tr>
<th scope="row">Completed</th>
<td>{{ object.completed|annotated_date|placeholder }}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col col-12">
<div class="card">
<h5 class="card-header">Data</h5>
<div class="card-body">
<pre>{{ object.data|json }}</pre>
</div>
</div>
</div>
</div>
{% endblock %}