From 872691a138486c80fe5589c68314dacc4ec46c25 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 20 Dec 2021 20:45:32 -0500 Subject: [PATCH 01/10] Convert scripts to use HTMX --- netbox/extras/views.py | 11 +++ .../templates/extras/htmx/script_result.html | 52 +++++++++++ netbox/templates/extras/script_result.html | 86 +++---------------- 3 files changed, 73 insertions(+), 76 deletions(-) create mode 100644 netbox/templates/extras/htmx/script_result.html diff --git a/netbox/extras/views.py b/netbox/extras/views.py index ab9e3ba5212..f2cf1b38a1e 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -10,6 +10,7 @@ from rq import Worker from netbox.views import generic from utilities.forms import ConfirmationForm +from utilities.htmx import is_htmx from utilities.tables import paginate_table from utilities.utils import copy_safe_request, count_related, normalize_querydict, shallow_compare_dict from utilities.views import ContentTypePermissionRequiredMixin @@ -820,6 +821,16 @@ class ScriptResultView(ContentTypePermissionRequiredMixin, GetScriptMixin, View) script = self._get_script(result.name) + # If this is an HTMX request, return only the rendered table HTML + if is_htmx(request): + response = render(request, 'extras/htmx/script_result.html', { + 'script': script, + 'result': result, + }) + if result.completed: + response.status_code = 286 + return response + return render(request, 'extras/script_result.html', { 'script': script, 'result': result, diff --git a/netbox/templates/extras/htmx/script_result.html b/netbox/templates/extras/htmx/script_result.html new file mode 100644 index 00000000000..013b4c81d50 --- /dev/null +++ b/netbox/templates/extras/htmx/script_result.html @@ -0,0 +1,52 @@ +{% load helpers %} +{% load log_levels %} + +{% if result.completed %} +

+ Run: {{ result.created|annotated_date }} + {% if result.completed %} + Duration: {{ result.duration }} + {% endif %} +

+
+
Script Log
+
+ + + + + + + {% for log in result.data.log %} + + + + + + {% empty %} + + + + {% endfor %} +
LineLevelMessage
{{ forloop.counter }}{% log_level log.status %}{{ log.message|render_markdown }}
+ No log output +
+
+ {% if execution_time %} + + {% endif %} +
+

Output

+ {% if result.data.output %} +
{{ result.data.output }}
+ {% else %} +

None

+ {% endif %} +{% else %} +
+ Loading... +
+

Results pending...

+{% endif %} diff --git a/netbox/templates/extras/script_result.html b/netbox/templates/extras/script_result.html index 3cbd0c611c5..f00b3bf9154 100644 --- a/netbox/templates/extras/script_result.html +++ b/netbox/templates/extras/script_result.html @@ -4,16 +4,10 @@ {% load log_levels %} {% load static %} -{% block head %} - -{% endblock %} - {% block title %}{{ script }}{% endblock %} {% block subtitle %} {{ script.Meta.description|render_markdown }} - {% include 'extras/inc/job_label.html' with result=result %} {% endblock %} {% block header %} @@ -37,81 +31,21 @@ -
-

- Run: {{ result.created|annotated_date }} - {% if result.completed %} - Duration: {{ result.duration }} - {% else %} -

- Loading... -
- {% endif %} -

-
- {% if result.completed %} -
-
-
-
- Script Log -
-
- - - - - - - {% for log in result.data.log %} - - - - - - {% empty %} - - - - {% endfor %} -
LineLevelMessage
{{ forloop.counter }}{% log_level log.status %}{{ log.message|render_markdown }}
- No log output -
-
- {% if execution_time %} - - {% endif %} -
-
-
- {% else %} -
-
-
Pending Results
-
-
- {% endif %} -
-
-
{{ result.data.output }}
-
-
-

{{ script.filename }}

-
{{ script.source }}
+
+
+
+ {% include 'extras/htmx/script_result.html' %} +
+
+
+

{{ script.filename }}

+
{{ script.source }}
+
{% endblock content-wrapper %} - -{% block data %} - - -{% endblock %} From 4ae2b4e0b90446857b8d2c13cfa6eeed8e175a24 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 20 Dec 2021 20:52:29 -0500 Subject: [PATCH 02/10] Convert reports to use HTMX --- netbox/extras/views.py | 20 +++- .../templates/extras/htmx/report_result.html | 81 ++++++++++++++++ netbox/templates/extras/report_result.html | 96 +------------------ 3 files changed, 100 insertions(+), 97 deletions(-) create mode 100644 netbox/templates/extras/htmx/report_result.html diff --git a/netbox/extras/views.py b/netbox/extras/views.py index f2cf1b38a1e..d5d36d3645d 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -694,16 +694,26 @@ class ReportResultView(ContentTypePermissionRequiredMixin, View): def get(self, request, job_result_pk): report_content_type = ContentType.objects.get(app_label='extras', model='report') - jobresult = get_object_or_404(JobResult.objects.all(), pk=job_result_pk, obj_type=report_content_type) + result = get_object_or_404(JobResult.objects.all(), pk=job_result_pk, obj_type=report_content_type) # Retrieve the Report and attach the JobResult to it - module, report_name = jobresult.name.split('.') + module, report_name = result.name.split('.') report = get_report(module, report_name) - report.result = jobresult + report.result = result + + # If this is an HTMX request, return only the result HTML + if is_htmx(request): + response = render(request, 'extras/htmx/report_result.html', { + 'report': report, + 'result': result, + }) + if result.completed: + response.status_code = 286 + return response return render(request, 'extras/report_result.html', { 'report': report, - 'result': jobresult, + 'result': result, }) @@ -821,7 +831,7 @@ class ScriptResultView(ContentTypePermissionRequiredMixin, GetScriptMixin, View) script = self._get_script(result.name) - # If this is an HTMX request, return only the rendered table HTML + # If this is an HTMX request, return only the result HTML if is_htmx(request): response = render(request, 'extras/htmx/script_result.html', { 'script': script, diff --git a/netbox/templates/extras/htmx/report_result.html b/netbox/templates/extras/htmx/report_result.html new file mode 100644 index 00000000000..3bc5ad27d0a --- /dev/null +++ b/netbox/templates/extras/htmx/report_result.html @@ -0,0 +1,81 @@ +{% load helpers %} + +

+ Run: {{ result.created|annotated_date }} + {% if result.completed %} + Duration: {{ result.duration }} + {% else %} +

+ Loading... +
+ {% endif %} + {% include 'extras/inc/job_label.html' with result=result %} +

+{% if result.completed %} +
+
+ Report Methods +
+
+ + {% for method, data in result.data.items %} + + + + + {% endfor %} +
{{ method }} + {{ data.success }} + {{ data.info }} + {{ data.warning }} + {{ data.failure }} +
+
+
+
+
+ Report Results +
+
+ + + + + + + + + + + {% for method, data in result.data.items %} + + + + {% for time, level, obj, url, message in data.log %} + + + + + + + {% endfor %} + {% endfor %} + +
TimeLevelObjectMessage
+ {{ method }} +
{{ time }} + + + {% if obj and url %} + {{ obj }} + {% elif obj %} + {{ obj }} + {% else %} + + {% endif %} + {{ message|render_markdown }}
+
+
+{% else %} +
Pending results
+{% endif %} diff --git a/netbox/templates/extras/report_result.html b/netbox/templates/extras/report_result.html index 90726d28777..9dd733bef7a 100644 --- a/netbox/templates/extras/report_result.html +++ b/netbox/templates/extras/report_result.html @@ -2,98 +2,10 @@ {% load helpers %} {% load static %} -{% block head %} - -{% endblock %} - {% block content-wrapper %} -
-
-

- Run: {{ result.created|annotated_date }} - {% if result.completed %} - Duration: {{ result.duration }} - {% else %} -

- Loading... -
- {% endif %} - {% include 'extras/inc/job_label.html' with result=result %} -

- {% if result.completed %} -
-
- Report Methods -
-
- - {% for method, data in result.data.items %} - - - - - {% endfor %} -
{{ method }} - {{ data.success }} - {{ data.info }} - {{ data.warning }} - {{ data.failure }} -
-
-
-
-
- Report Results -
-
- - - - - - - - - - - {% for method, data in result.data.items %} - - - - {% for time, level, obj, url, message in data.log %} - - - - - - - {% endfor %} - {% endfor %} - -
TimeLevelObjectMessage
- {{ method }} -
{{ time }} - - - {% if obj and url %} - {{ obj }} - {% elif obj %} - {{ obj }} - {% else %} - - {% endif %} - {{ message|render_markdown }}
-
-
- {% else %} -
Pending results
- {% endif %} +
+
+ {% include 'extras/htmx/report_result.html' %}
-
-{% endblock %} - -{% block data %} - - +
{% endblock %} From 17ba0a97d5a898b409968f66e20bc62b318c42ff Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 20 Dec 2021 20:59:14 -0500 Subject: [PATCH 03/10] Remove jobs Javascript --- netbox/project-static/bundle.js | 1 - netbox/project-static/dist/jobs.js | 30 ------- netbox/project-static/dist/jobs.js.map | 6 -- netbox/project-static/src/global.d.ts | 32 -------- netbox/project-static/src/jobs.ts | 104 ------------------------- 5 files changed, 173 deletions(-) delete mode 100644 netbox/project-static/dist/jobs.js delete mode 100644 netbox/project-static/dist/jobs.js.map delete mode 100644 netbox/project-static/src/jobs.ts diff --git a/netbox/project-static/bundle.js b/netbox/project-static/bundle.js index 100b70ac88b..76a1581ad2e 100644 --- a/netbox/project-static/bundle.js +++ b/netbox/project-static/bundle.js @@ -40,7 +40,6 @@ async function bundleGraphIQL() { async function bundleNetBox() { const entryPoints = { netbox: 'src/index.ts', - jobs: 'src/jobs.ts', lldp: 'src/device/lldp.ts', config: 'src/device/config.ts', status: 'src/device/status.ts', diff --git a/netbox/project-static/dist/jobs.js b/netbox/project-static/dist/jobs.js deleted file mode 100644 index 2aedf121948..00000000000 --- a/netbox/project-static/dist/jobs.js +++ /dev/null @@ -1,30 +0,0 @@ -(()=>{var mr=Object.create;var le=Object.defineProperty,gr=Object.defineProperties,_r=Object.getOwnPropertyDescriptor,Er=Object.getOwnPropertyDescriptors,vr=Object.getOwnPropertyNames,pn=Object.getOwnPropertySymbols,yr=Object.getPrototypeOf,hn=Object.prototype.hasOwnProperty,br=Object.prototype.propertyIsEnumerable;var mn=(i,t,e)=>t in i?le(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e,O=(i,t)=>{for(var e in t||(t={}))hn.call(t,e)&&mn(i,e,t[e]);if(pn)for(var e of pn(t))br.call(t,e)&&mn(i,e,t[e]);return i},je=(i,t)=>gr(i,Er(t)),gn=i=>le(i,"__esModule",{value:!0});var mt=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports),Tr=(i,t)=>{gn(i);for(var e in t)le(i,e,{get:t[e],enumerable:!0})},Ar=(i,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of vr(t))!hn.call(i,n)&&n!=="default"&&le(i,n,{get:()=>t[n],enumerable:!(e=_r(t,n))||e.enumerable});return i},_n=i=>Ar(gn(le(i!=null?mr(yr(i)):{},"default",i&&i.__esModule&&"default"in i?{get:()=>i.default,enumerable:!0}:{value:i,enumerable:!0})),i);var ce=(i,t,e)=>new Promise((n,o)=>{var r=u=>{try{l(e.next(u))}catch(h){o(h)}},s=u=>{try{l(e.throw(u))}catch(h){o(h)}},l=u=>u.done?n(u.value):Promise.resolve(u.value).then(r,s);l((e=e.apply(i,t)).next())});var en=mt((Zo,li)=>{(function(i,t){typeof define=="function"&&define.amd?define(t):typeof li=="object"&&li.exports?li.exports=t():i.EvEmitter=t()})(typeof window!="undefined"?window:Zo,function(){"use strict";function i(){}var t=i.prototype;return t.on=function(e,n){if(!(!e||!n)){var o=this._events=this._events||{},r=o[e]=o[e]||[];return r.indexOf(n)==-1&&r.push(n),this}},t.once=function(e,n){if(!(!e||!n)){this.on(e,n);var o=this._onceEvents=this._onceEvents||{},r=o[e]=o[e]||{};return r[n]=!0,this}},t.off=function(e,n){var o=this._events&&this._events[e];if(!(!o||!o.length)){var r=o.indexOf(n);return r!=-1&&o.splice(r,1),this}},t.emitEvent=function(e,n){var o=this._events&&this._events[e];if(!(!o||!o.length)){o=o.slice(0),n=n||[];for(var r=this._onceEvents&&this._onceEvents[e],s=0;s{(function(i,t){typeof define=="function"&&define.amd?define(t):typeof ci=="object"&&ci.exports?ci.exports=t():i.getSize=t()})(window,function(){"use strict";function t(d){var y=parseFloat(d),E=d.indexOf("%")==-1&&!isNaN(y);return E&&y}function e(){}var n=typeof console=="undefined"?e:function(d){console.error(d)},o=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],r=o.length;function s(){for(var d={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},y=0;y