Ver Fonte

Add general purpose view for individual jobs

jeremystretch há 2 anos atrás
pai
commit
a0893c2e8b

+ 1 - 0
netbox/core/models/jobs.py

@@ -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)

+ 1 - 0
netbox/core/urls.py

@@ -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'),
 
 )

+ 5 - 1
netbox/core/views.py

@@ -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):

+ 81 - 0
netbox/templates/core/job.html

@@ -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 %}