Custom scripts failures #10801

Closed
opened 2025-12-29 21:36:04 +01:00 by adam · 3 comments
Owner

Originally created by @iamjpy on GitHub (Feb 24, 2025).

Originally assigned to: @bctiemann on GitHub.

Deployment Type

Self-hosted

NetBox Version

v4.2.3

Python Version

3.12

Steps to Reproduce

  1. Upload custom script to UI
from extras.scripts import Script
class Test(Script):
    def run(self, data, commit):
        
        self.log_info("Netbox Test")

Expected Behavior

The script should execute properly and accurate results show be rendered in UI

Observed Behavior

One of two outcomes can occur:

  1. When running the script via the UI, the script execution completes with an incorrect Error result in the UI
Image

log:

netbox-worker-f9bb66977-p75nj netbox-worker 15:41:08 Successfully completed handle(commit=True, data={}, job=<Job: f78c9970-15e2-4afa-bc99-a5c2a0ef9f92>, request=<utilities.request.NetBoxFakeRequest object at 0x7fc1cdbf90d0>) job in 0:00:00.050665s on worker 49aec44fc373495eb3b5f05233990f88
netbox-worker-f9bb66977-p75nj netbox-worker 15:41:08 default: Job OK (f78c9970-15e2-4afa-bc99-a5c2a0ef9f92)
netbox-worker-f9bb66977-p75nj netbox-worker 15:41:08 Result is kept for 500 seconds
  1. When running the script via the UI, a server error occurs
Image

Backtrace:

netbox-556b8d659f-zlg9p netbox Internal Server Error: /extras/scripts/results/61/
netbox-556b8d659f-zlg9p netbox Traceback (most recent call last):
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
netbox-556b8d659f-zlg9p netbox     response = get_response(request)
netbox-556b8d659f-zlg9p netbox                ^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
netbox-556b8d659f-zlg9p netbox     response = wrapped_callback(request, *callback_args, **callback_kwargs)
netbox-556b8d659f-zlg9p netbox                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/views/generic/base.py", line 104, in view
netbox-556b8d659f-zlg9p netbox     return self.dispatch(request, *args, **kwargs)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/netbox/views/generic/base.py", line 26, in dispatch
netbox-556b8d659f-zlg9p netbox     return super().dispatch(request, *args, **kwargs)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/utilities/views.py", line 125, in dispatch
netbox-556b8d659f-zlg9p netbox     return super().dispatch(request, *args, **kwargs)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/utilities/views.py", line 39, in dispatch
netbox-556b8d659f-zlg9p netbox     return super().dispatch(request, *args, **kwargs)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/views/generic/base.py", line 143, in dispatch
netbox-556b8d659f-zlg9p netbox     return handler(request, *args, **kwargs)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/extras/views.py", line 1409, in get
netbox-556b8d659f-zlg9p netbox     return render(request, 'extras/script_result.html', context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/shortcuts.py", line 25, in render
netbox-556b8d659f-zlg9p netbox     content = loader.render_to_string(template_name, context, request, using=using)
netbox-556b8d659f-zlg9p netbox               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader.py", line 62, in render_to_string
netbox-556b8d659f-zlg9p netbox     return template.render(context, request)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render
netbox-556b8d659f-zlg9p netbox     return self.template.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render
netbox-556b8d659f-zlg9p netbox     return self._render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
netbox-556b8d659f-zlg9p netbox     return self.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render
netbox-556b8d659f-zlg9p netbox     return compiled_parent._render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
netbox-556b8d659f-zlg9p netbox     return self.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render
netbox-556b8d659f-zlg9p netbox     return compiled_parent._render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
netbox-556b8d659f-zlg9p netbox     return self.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render
netbox-556b8d659f-zlg9p netbox     return compiled_parent._render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render
netbox-556b8d659f-zlg9p netbox     return self.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render
netbox-556b8d659f-zlg9p netbox     result = block.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render
netbox-556b8d659f-zlg9p netbox     result = block.nodelist.render(context)
netbox-556b8d659f-zlg9p netbox              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render
netbox-556b8d659f-zlg9p netbox     return nodelist.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render
netbox-556b8d659f-zlg9p netbox     return SafeString("".join([node.render_annotated(context) for node in self]))
netbox-556b8d659f-zlg9p netbox                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated
netbox-556b8d659f-zlg9p netbox     return self.render(context)
netbox-556b8d659f-zlg9p netbox            ^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/library.py", line 258, in render
netbox-556b8d659f-zlg9p netbox     _dict = self.func(*resolved_args, **resolved_kwargs)
netbox-556b8d659f-zlg9p netbox             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/utilities/templatetags/helpers.py", line 263, in table_config_form
netbox-556b8d659f-zlg9p netbox     'form': TableConfigForm(table=table),
netbox-556b8d659f-zlg9p netbox             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox   File "/opt/netbox/netbox/utilities/forms/forms.py", line 135, in __init__
netbox-556b8d659f-zlg9p netbox     self.fields['available_columns'].choices = table.available_columns
netbox-556b8d659f-zlg9p netbox                                                ^^^^^^^^^^^^^^^^^^^^^^^
netbox-556b8d659f-zlg9p netbox AttributeError: 'NoneType' object has no attribute 'available_columns'

The script runs successfully via the CLI and the results are displayed properly in the UI, but does not run successfully in the UI

$ python /opt/netbox/netbox/manage.py runscript netbox_test.Test
🧬 loaded config '/etc/netbox/config/configuration.py'
🧬 loaded config '/etc/netbox/config/extra.py'
🧬 loaded config '/etc/netbox/config/logging.py'
🧬 loaded config '/etc/netbox/config/plugins.py'
[2025-02-24 15:25:33,732][INFO] - Running script (commit=False)
[2025-02-24 15:25:33,733][INFO] - Netbox Test
[2025-02-24 15:25:33,733][INFO] - Database changes have been reverted automatically.
[2025-02-24 15:25:33,738][INFO] - Script completed in 0 minutes, 0.01 seconds
Image

Deployed using netbox-community/netbox-chart

Originally created by @iamjpy on GitHub (Feb 24, 2025). Originally assigned to: @bctiemann on GitHub. ### Deployment Type Self-hosted ### NetBox Version v4.2.3 ### Python Version 3.12 ### Steps to Reproduce 1. Upload custom script to UI ``` from extras.scripts import Script class Test(Script): def run(self, data, commit): self.log_info("Netbox Test") ``` ### Expected Behavior The script should execute properly and accurate results show be rendered in UI ### Observed Behavior One of two outcomes can occur: 1. When running the script via the UI, the script execution completes with an incorrect Error result in the UI <img width="528" alt="Image" src="https://github.com/user-attachments/assets/b375e1bb-5ce5-46f1-90fd-25846ca3f3ce" /> log: ``` netbox-worker-f9bb66977-p75nj netbox-worker 15:41:08 Successfully completed handle(commit=True, data={}, job=<Job: f78c9970-15e2-4afa-bc99-a5c2a0ef9f92>, request=<utilities.request.NetBoxFakeRequest object at 0x7fc1cdbf90d0>) job in 0:00:00.050665s on worker 49aec44fc373495eb3b5f05233990f88 netbox-worker-f9bb66977-p75nj netbox-worker 15:41:08 default: Job OK (f78c9970-15e2-4afa-bc99-a5c2a0ef9f92) netbox-worker-f9bb66977-p75nj netbox-worker 15:41:08 Result is kept for 500 seconds ``` 2. When running the script via the UI, a server error occurs <img width="599" alt="Image" src="https://github.com/user-attachments/assets/ec538057-5687-413f-93b0-63c4a9027454" /> Backtrace: ``` netbox-556b8d659f-zlg9p netbox Internal Server Error: /extras/scripts/results/61/ netbox-556b8d659f-zlg9p netbox Traceback (most recent call last): netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner netbox-556b8d659f-zlg9p netbox response = get_response(request) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response netbox-556b8d659f-zlg9p netbox response = wrapped_callback(request, *callback_args, **callback_kwargs) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/views/generic/base.py", line 104, in view netbox-556b8d659f-zlg9p netbox return self.dispatch(request, *args, **kwargs) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/netbox/netbox/views/generic/base.py", line 26, in dispatch netbox-556b8d659f-zlg9p netbox return super().dispatch(request, *args, **kwargs) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/netbox/utilities/views.py", line 125, in dispatch netbox-556b8d659f-zlg9p netbox return super().dispatch(request, *args, **kwargs) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/netbox/utilities/views.py", line 39, in dispatch netbox-556b8d659f-zlg9p netbox return super().dispatch(request, *args, **kwargs) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/views/generic/base.py", line 143, in dispatch netbox-556b8d659f-zlg9p netbox return handler(request, *args, **kwargs) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/netbox/extras/views.py", line 1409, in get netbox-556b8d659f-zlg9p netbox return render(request, 'extras/script_result.html', context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/shortcuts.py", line 25, in render netbox-556b8d659f-zlg9p netbox content = loader.render_to_string(template_name, context, request, using=using) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader.py", line 62, in render_to_string netbox-556b8d659f-zlg9p netbox return template.render(context, request) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/backends/django.py", line 107, in render netbox-556b8d659f-zlg9p netbox return self.template.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 171, in render netbox-556b8d659f-zlg9p netbox return self._render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render netbox-556b8d659f-zlg9p netbox return self.nodelist.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render netbox-556b8d659f-zlg9p netbox return SafeString("".join([node.render_annotated(context) for node in self])) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated netbox-556b8d659f-zlg9p netbox return self.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render netbox-556b8d659f-zlg9p netbox return compiled_parent._render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render netbox-556b8d659f-zlg9p netbox return self.nodelist.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render netbox-556b8d659f-zlg9p netbox return SafeString("".join([node.render_annotated(context) for node in self])) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated netbox-556b8d659f-zlg9p netbox return self.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render netbox-556b8d659f-zlg9p netbox return compiled_parent._render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render netbox-556b8d659f-zlg9p netbox return self.nodelist.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render netbox-556b8d659f-zlg9p netbox return SafeString("".join([node.render_annotated(context) for node in self])) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated netbox-556b8d659f-zlg9p netbox return self.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 159, in render netbox-556b8d659f-zlg9p netbox return compiled_parent._render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 163, in _render netbox-556b8d659f-zlg9p netbox return self.nodelist.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render netbox-556b8d659f-zlg9p netbox return SafeString("".join([node.render_annotated(context) for node in self])) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated netbox-556b8d659f-zlg9p netbox return self.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render netbox-556b8d659f-zlg9p netbox result = block.nodelist.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render netbox-556b8d659f-zlg9p netbox return SafeString("".join([node.render_annotated(context) for node in self])) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated netbox-556b8d659f-zlg9p netbox return self.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/loader_tags.py", line 65, in render netbox-556b8d659f-zlg9p netbox result = block.nodelist.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render netbox-556b8d659f-zlg9p netbox return SafeString("".join([node.render_annotated(context) for node in self])) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated netbox-556b8d659f-zlg9p netbox return self.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/defaulttags.py", line 327, in render netbox-556b8d659f-zlg9p netbox return nodelist.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 1008, in render netbox-556b8d659f-zlg9p netbox return SafeString("".join([node.render_annotated(context) for node in self])) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/base.py", line 969, in render_annotated netbox-556b8d659f-zlg9p netbox return self.render(context) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/venv/lib/python3.12/site-packages/django/template/library.py", line 258, in render netbox-556b8d659f-zlg9p netbox _dict = self.func(*resolved_args, **resolved_kwargs) netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/netbox/utilities/templatetags/helpers.py", line 263, in table_config_form netbox-556b8d659f-zlg9p netbox 'form': TableConfigForm(table=table), netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox File "/opt/netbox/netbox/utilities/forms/forms.py", line 135, in __init__ netbox-556b8d659f-zlg9p netbox self.fields['available_columns'].choices = table.available_columns netbox-556b8d659f-zlg9p netbox ^^^^^^^^^^^^^^^^^^^^^^^ netbox-556b8d659f-zlg9p netbox AttributeError: 'NoneType' object has no attribute 'available_columns' ``` The script runs successfully via the CLI and the results are displayed properly in the UI, but does not run successfully in the UI ``` $ python /opt/netbox/netbox/manage.py runscript netbox_test.Test 🧬 loaded config '/etc/netbox/config/configuration.py' 🧬 loaded config '/etc/netbox/config/extra.py' 🧬 loaded config '/etc/netbox/config/logging.py' 🧬 loaded config '/etc/netbox/config/plugins.py' [2025-02-24 15:25:33,732][INFO] - Running script (commit=False) [2025-02-24 15:25:33,733][INFO] - Netbox Test [2025-02-24 15:25:33,733][INFO] - Database changes have been reverted automatically. [2025-02-24 15:25:33,738][INFO] - Script completed in 0 minutes, 0.01 seconds ``` <img width="1383" alt="Image" src="https://github.com/user-attachments/assets/ebe2ccd8-86d0-42b2-890b-a46f079fa2fa" /> Deployed using netbox-community/netbox-chart
adam added the type: bugstatus: acceptedseverity: medium labels 2025-12-29 21:36:04 +01:00
adam closed this issue 2025-12-29 21:36:05 +01:00
Author
Owner

@bctiemann commented on GitHub (Feb 24, 2025):

The AttributeError can be addressed trivially by handling this code more defensively:

beb0aff656/netbox/utilities/forms/forms.py (L132-L136)

But the underlying issue of the script completing with Errored status needs more attention. You can see the error that caused the failure in the job details, e.g. http://127.0.0.1:8000/core/jobs/14/

@iamjpy What is the error condition in your case?

@bctiemann commented on GitHub (Feb 24, 2025): The `AttributeError` can be addressed trivially by handling this code more defensively: https://github.com/netbox-community/netbox/blob/beb0aff6569ca2f6656c765077cba68d69386453/netbox/utilities/forms/forms.py#L132-L136 But the underlying issue of the script completing with `Errored` status needs more attention. You can see the error that caused the failure in the job details, e.g. http://127.0.0.1:8000/core/jobs/14/ @iamjpy What is the error condition in your case?
Author
Owner

@mattg66 commented on GitHub (Feb 25, 2025):

I'm observing the same issue, a simple script such as this with an event rule to run on cable creation results in the following.

from extras.scripts import *

class CableLabelGenerator(Script):
    class Meta:
        name = "CableLabelGenerator"
        description = "Generates unique cable labels"
    def run(self, data, commit):
        cable_id = int(data['id'])
        self.log_success(cable_id)

Image

Image

@mattg66 commented on GitHub (Feb 25, 2025): I'm observing the same issue, a simple script such as this with an event rule to run on cable creation results in the following. ``` from extras.scripts import * class CableLabelGenerator(Script): class Meta: name = "CableLabelGenerator" description = "Generates unique cable labels" def run(self, data, commit): cable_id = int(data['id']) self.log_success(cable_id) ``` ![Image](https://github.com/user-attachments/assets/0971f774-72a4-4367-b67c-bd85749648f7) ![Image](https://github.com/user-attachments/assets/a42e9661-9d4c-47f9-9128-318009a626b2)
Author
Owner

@iamjpy commented on GitHub (Feb 25, 2025):

@bctiemann This was the error condition. Sometimes I get this Errored result, other times I get the server error

Image
@iamjpy commented on GitHub (Feb 25, 2025): @bctiemann This was the error condition. Sometimes I get this `Errored` result, other times I get the server error <img width="473" alt="Image" src="https://github.com/user-attachments/assets/900bf5c4-ef02-4d79-8756-6226c6978147" />
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/netbox#10801