Просмотр исходного кода

WIP: Moving JobResults out of the admin panel

kkthxbye-code 3 лет назад
Родитель
Сommit
06dea8ef3f

+ 2 - 22
netbox/extras/filtersets.py

@@ -87,27 +87,6 @@ class CustomFieldFilterSet(BaseFilterSet):
             Q(description__icontains=value)
         )
 
-class JobResultFilterSet(BaseFilterSet):
-    q = django_filters.CharFilter(
-        method='search',
-        label='Search',
-    )
-
-    # TODO: Add filters
-
-    class Meta:
-        model = JobResult
-        fields = [
-            'id', 'name', 'obj_type', 'created', 'completed', 'user', 'status'
-        ]
-
-    def search(self, queryset, name, value):
-        if not value.strip():
-            return queryset
-        return queryset.filter(
-            Q(name__icontains=value)
-        )
-
 class CustomLinkFilterSet(BaseFilterSet):
     q = django_filters.CharFilter(
         method='search',
@@ -472,7 +451,8 @@ class JobResultFilterSet(BaseFilterSet):
         if not value.strip():
             return queryset
         return queryset.filter(
-            Q(user__username__icontains=value)
+            Q(user__username__icontains=value) |
+            Q(name__icontains=value)
         )
 
 

+ 2 - 3
netbox/extras/models/models.py

@@ -518,8 +518,7 @@ class JobResult(models.Model):
         return str(self.job_id)
 
     def get_absolute_url(self):
-        # TODO: Fix this to point the right place
-        return reverse('virtualization:clustertype', args=[self.pk])
+        return reverse('extras:jobresult', args=[self.pk])
 
     @property
     def duration(self):
@@ -560,7 +559,7 @@ class JobResult(models.Model):
         )
 
         queue = django_rq.get_queue("default")
-        
+
         if schedule_at := kwargs.pop("schedule_at", None):
             job_result.status = JobResultStatusChoices.STATUS_SCHEDULED
             job_result.save()

+ 1 - 4
netbox/extras/tables/tables.py

@@ -48,12 +48,9 @@ class JobResultTable(NetBoxTable):
     name = tables.Column(
         linkify=True
     )
-    #obj_type = columns.ContentTypesColumn()
-    required = columns.BooleanColumn()
-    ui_visibility = columns.ChoiceFieldColumn(verbose_name="UI visibility")
 
     actions = columns.ActionsColumn(
-        actions=() # TODO: Delete
+        actions=('delete',)
     )
 
     class Meta(NetBoxTable.Meta):

+ 4 - 2
netbox/extras/urls.py

@@ -104,8 +104,10 @@ urlpatterns = [
     re_path(r'^reports/(?P<module>.([^.]+)).(?P<name>.(.+))/', views.ReportView.as_view(), name='report'),
 
     # Job results
-    path('job-results/', views.JobResultListView.as_view(), name='jobresult_view'),
-    # path('custom-fields/<int:pk>/', views.CustomFieldView.as_view(), name='customfield'),
+    path('job-results/', views.JobResultListView.as_view(), name='jobresult_list'),
+    path('job-results/<int:pk>/', views.JobResultView.as_view(), name='jobresult'),
+    path('job-results/delete/', views.JobResultBulkDeleteView.as_view(), name='jobresult_bulk_delete'),
+    path('job-results/<int:pk>/delete/', views.JobResultDeleteView.as_view(), name='jobresult_delete'),
 
     # Scripts
     path('scripts/', views.ScriptListView.as_view(), name='script_list'),

+ 14 - 0
netbox/extras/views.py

@@ -781,8 +781,22 @@ class ScriptResultView(ContentTypePermissionRequiredMixin, GetScriptMixin, View)
 # Job results
 #
 
+class JobResultView(generic.ObjectView):
+    queryset = JobResult.objects.all()
+
+
 class JobResultListView(generic.ObjectListView):
     queryset = JobResult.objects.all()
     filterset = filtersets.JobResultFilterSet
     filterset_form = forms.JobResultFilterForm
+    table = tables.JobResultTable
+    actions = ('delete', 'bulk_delete', )
+
+class JobResultDeleteView(generic.ObjectDeleteView):
+    queryset = JobResult.objects.all()
+
+
+class JobResultBulkDeleteView(generic.BulkDeleteView):
+    queryset = JobResult.objects.all()
+    filterset = filtersets.JobResultFilterSet
     table = tables.JobResultTable

+ 5 - 0
netbox/netbox/navigation_menu.py

@@ -375,6 +375,11 @@ OTHER_MENU = Menu(
                     link_text='Scripts',
                     permissions=['extras.view_script']
                 ),
+                MenuItem(
+                    link='extras:jobresult_list',
+                    link_text='Job Results',
+                    permissions=['extras.view_jobresult'],
+                ),
             ),
         ),
         MenuGroup(

+ 60 - 0
netbox/templates/extras/jobresult.html

@@ -0,0 +1,60 @@
+{% extends 'generic/object.html' %}
+{% load helpers %}
+{% load plugins %}
+
+{% block title %}{{ object.name }} ({{object.job_id}}){% endblock %}
+
+{# JobResult does not support add/edit controls #}
+{% block controls %}{% endblock %}
+{% block subtitle %}{% endblock %}
+
+{% block content %}
+  <div class="row">
+    <div class="col col-md-6">
+      <div class="card">
+        <h5 class="card-header">
+          Tag
+        </h5>
+        <div class="card-body">
+          <table class="table table-hover panel-body attr-table">
+            <tr>
+              <th scope="row">Name</th>
+              <td>
+                {{ object.name }}
+              </td>
+            </tr>
+            <tr>
+              <th scope="row">Created</th>
+              <td>
+                  {{ object.created|annotated_date }}
+              </td>
+            </tr>
+            <tr>
+              <th scope="row">Completed</th>
+              <td>
+                  {{ object.completed|annotated_date }}
+              </td>
+            </tr>
+          </table>
+        </div>
+      </div>
+    </div>
+    <div class="col col-md-6">
+      <div class="card">
+        <h5 class="card-header">
+          TODO
+        </h5>
+        <div class="card-body">
+          <table class="table table-hover panel-body attr-table">
+            TODO
+          </table>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="col col-md-12">
+      {% plugin_full_width_page object %}
+    </div>
+  </div>
+{% endblock %}