Custom Scripts page doesn't load #10971

Closed
opened 2025-12-29 21:38:35 +01:00 by adam · 6 comments
Owner

Originally created by @wz4 on GitHub (Mar 31, 2025).

Deployment Type

Self-hosted

NetBox Version

v4.2.6

Python Version

3.11

Steps to Reproduce

Navigate to Customization -> Scripts (/extras/scripts/). A server error is displayed. This problem happens on v4.2.6 but not on v4.2.5.

<class 'AttributeError'>

'StringVar' object has no attribute 'strip'

Expected Behavior

The webpage should load and display a list of custom scripts.

Observed Behavior

Webpage displays ServerError

Error Log

2025-03-31 20:04:25,918 django.request ERROR: Internal Server Error: /extras/scripts/
Traceback (most recent call last):
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/views/generic/base.py", line 104, in view
    return self.dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/netbox/utilities/views.py", line 75, in dispatch
    return super().dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/netbox/utilities/views.py", line 39, in dispatch
    return super().dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/views/generic/base.py", line 143, in dispatch
    return handler(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/netbox/extras/views.py", line 1245, in get
    return render(request, 'extras/script_list.html', {
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/shortcuts.py", line 25, in render
    content = loader.render_to_string(template_name, context, request, using=using)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/backends/django.py", line 107, in render
    return self.template.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 171, in render
    return self._render(context)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 159, in render
    return compiled_parent._render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 159, in render
    return compiled_parent._render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 159, in render
    return compiled_parent._render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 65, in render
    result = block.nodelist.render(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 65, in render
    result = block.nodelist.render(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 65, in render
    result = block.nodelist.render(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/defaulttags.py", line 243, in render
    nodelist.append(node.render_annotated(context))
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/defaulttags.py", line 550, in render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/defaulttags.py", line 327, in render
    return nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/defaulttags.py", line 243, in render
    nodelist.append(node.render_annotated(context))
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/defaulttags.py", line 550, in render
    return self.nodelist.render(context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated
    return self.render(context)
           ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1067, in render
    output = self.filter_expression.resolve(context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 745, in resolve
    new_obj = func(obj, *arg_vals)
              ^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/netbox/utilities/templatetags/builtins/filters.py", line 173, in render_markdown
    html = markdown(value, extensions=[
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/markdown/core.py", line 482, in markdown
    return md.convert(text)
           ^^^^^^^^^^^^^^^^
  File "/opt/netbox/venv/lib64/python3.11/site-packages/markdown/core.py", line 341, in convert
    if not source.strip():
           ^^^^^^^^^^^^
AttributeError: 'StringVar' object has no attribute 'strip'

Originally created by @wz4 on GitHub (Mar 31, 2025). ### Deployment Type Self-hosted ### NetBox Version v4.2.6 ### Python Version 3.11 ### Steps to Reproduce Navigate to Customization -> Scripts (/extras/scripts/). A server error is displayed. This problem happens on v4.2.6 but not on v4.2.5. <class 'AttributeError'> 'StringVar' object has no attribute 'strip' ### Expected Behavior The webpage should load and display a list of custom scripts. ### Observed Behavior Webpage displays ServerError Error Log ``` 2025-03-31 20:04:25,918 django.request ERROR: Internal Server Error: /extras/scripts/ Traceback (most recent call last): File "/opt/netbox/venv/lib64/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/views/generic/base.py", line 104, in view return self.dispatch(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/netbox/utilities/views.py", line 75, in dispatch return super().dispatch(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/netbox/utilities/views.py", line 39, in dispatch return super().dispatch(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/views/generic/base.py", line 143, in dispatch return handler(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/netbox/extras/views.py", line 1245, in get return render(request, 'extras/script_list.html', { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/shortcuts.py", line 25, in render content = loader.render_to_string(template_name, context, request, using=using) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader.py", line 62, in render_to_string return template.render(context, request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/backends/django.py", line 107, in render return self.template.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 171, in render return self._render(context) ^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 163, in _render return self.nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 159, in render return compiled_parent._render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 163, in _render return self.nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 159, in render return compiled_parent._render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 163, in _render return self.nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 159, in render return compiled_parent._render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 163, in _render return self.nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 65, in render result = block.nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 65, in render result = block.nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/loader_tags.py", line 65, in render result = block.nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/defaulttags.py", line 243, in render nodelist.append(node.render_annotated(context)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/defaulttags.py", line 550, in render return self.nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/defaulttags.py", line 327, in render return nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/defaulttags.py", line 243, in render nodelist.append(node.render_annotated(context)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/defaulttags.py", line 550, in render return self.nodelist.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in render return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1008, in <listcomp> return SafeString("".join([node.render_annotated(context) for node in self])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 969, in render_annotated return self.render(context) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 1067, in render output = self.filter_expression.resolve(context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/django/template/base.py", line 745, in resolve new_obj = func(obj, *arg_vals) ^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/netbox/utilities/templatetags/builtins/filters.py", line 173, in render_markdown html = markdown(value, extensions=[ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/markdown/core.py", line 482, in markdown return md.convert(text) ^^^^^^^^^^^^^^^^ File "/opt/netbox/venv/lib64/python3.11/site-packages/markdown/core.py", line 341, in convert if not source.strip(): ^^^^^^^^^^^^ AttributeError: 'StringVar' object has no attribute 'strip' ```
adam added the type: bug label 2025-12-29 21:38:35 +01:00
adam closed this issue 2025-12-29 21:38:35 +01:00
Author
Owner

@jnovinger commented on GitHub (Apr 1, 2025):

@wz4 , I'm having a little trouble replicating using your steps. The only way I can reproduce the issue is to add a malformed script, where it has a script variable defined in the Meta class of the script, like so (note the difference between the two versions of description):

from extras import scripts
from extras.scripts import Script


class SuperSimpleScriptWOCommitDefaultSet(Script):

    class Meta:
        name = "Super Simple Script w/o Commit Default Set"
        # description = "A super simple script to test event rule triggers"
        description = scripts.StringVar(min_length=10, max_length=20)

    def run(self, data, commit):
        self.log_info('Script triggered')
        self.log_success('Script triggered')

Can you provide more details to help reproduce this? Any chance you can share the script in question?

@jnovinger commented on GitHub (Apr 1, 2025): @wz4 , I'm having a little trouble replicating using your steps. The only way I can reproduce the issue is to add a malformed script, where it has a script variable defined in the `Meta` class of the script, like so (note the difference between the two versions of `description`): ```python from extras import scripts from extras.scripts import Script class SuperSimpleScriptWOCommitDefaultSet(Script): class Meta: name = "Super Simple Script w/o Commit Default Set" # description = "A super simple script to test event rule triggers" description = scripts.StringVar(min_length=10, max_length=20) def run(self, data, commit): self.log_info('Script triggered') self.log_success('Script triggered') ``` Can you provide more details to help reproduce this? Any chance you can share the script in question?
Author
Owner

@wz4 commented on GitHub (Apr 1, 2025):

You're right, I have a defective script. The problem is related to StringVar variable. By commenting out description the problem is resolved. Here is the script.

from dcim.models import Device, Site, Interface, VLAN
from extras.scripts import *

class ConfigureAccessPort(Script):

    SPEED_CHOICES = (
        ('auto', 'Auto'),
        ('10000', '10 Mbps'),
        ('100000', '100 Mbps'),
        ('1000000', '1 Gbps'),
    )

    class Meta:
        name = "Configure Access Port"
        description = "Set VLAN, description, and other interface attributes"
        scheduling_enabled = False

    site = ObjectVar(
        label="Site",
        model=Site,
        required=False,
        query_params={
            'group_id': '$group'
        },
    )
    device = ObjectVar(
        label="Device",
        model=Device,
        required=True,
        query_params={
            'site_id': '$site',
            'has_primary_ip': True,
            'role': 'net-access',
        },
    )
    interface = ObjectVar(
        label="Interface",
        model=Interface,
        required=True,
        query_params={
            'device_id': '$device',
            'mgmt_only': False,
            'tag__n': 'trunk',
            'type__n': 'virtual'
        },
    )
    description = StringVar(
        label="Description",
        required=False,
        max_length=200,
    )
    untagged_vlan = ObjectVar(
        label="Access VLAN",
        model=VLAN,
        required=True,
        query_params={
            'available_on_device': '$device',
            'role': 'data'
        },
    )
    voice_vlan = ObjectVar(
        label="Voice VLAN",
        model=VLAN,
        required=False,
        query_params={
            'available_on_device': '$device',
            'role': 'voice'
        },
        description="Select the VLAN to be used for VoIP"
    )
    speed = ChoiceVar(
        label="Speed",
        required=False,
        choices=SPEED_CHOICES
    )

    fieldsets = (
        ('Target', ('site', 'device', 'interface')),
        ('VLAN', ('untagged_vlan', 'voice_vlan')),
        ('Port Settings', ('description', 'speed')),
    )

    def run(self, data, commit):
        return
@wz4 commented on GitHub (Apr 1, 2025): You're right, I have a defective script. The problem is related to StringVar variable. By commenting out description the problem is resolved. Here is the script. ``` from dcim.models import Device, Site, Interface, VLAN from extras.scripts import * class ConfigureAccessPort(Script): SPEED_CHOICES = ( ('auto', 'Auto'), ('10000', '10 Mbps'), ('100000', '100 Mbps'), ('1000000', '1 Gbps'), ) class Meta: name = "Configure Access Port" description = "Set VLAN, description, and other interface attributes" scheduling_enabled = False site = ObjectVar( label="Site", model=Site, required=False, query_params={ 'group_id': '$group' }, ) device = ObjectVar( label="Device", model=Device, required=True, query_params={ 'site_id': '$site', 'has_primary_ip': True, 'role': 'net-access', }, ) interface = ObjectVar( label="Interface", model=Interface, required=True, query_params={ 'device_id': '$device', 'mgmt_only': False, 'tag__n': 'trunk', 'type__n': 'virtual' }, ) description = StringVar( label="Description", required=False, max_length=200, ) untagged_vlan = ObjectVar( label="Access VLAN", model=VLAN, required=True, query_params={ 'available_on_device': '$device', 'role': 'data' }, ) voice_vlan = ObjectVar( label="Voice VLAN", model=VLAN, required=False, query_params={ 'available_on_device': '$device', 'role': 'voice' }, description="Select the VLAN to be used for VoIP" ) speed = ChoiceVar( label="Speed", required=False, choices=SPEED_CHOICES ) fieldsets = ( ('Target', ('site', 'device', 'interface')), ('VLAN', ('untagged_vlan', 'voice_vlan')), ('Port Settings', ('description', 'speed')), ) def run(self, data, commit): return ```
Author
Owner

@jnovinger commented on GitHub (Apr 1, 2025):

Going to accept this based on the very valid assertion "there should probably be better error handling on the Netbox side in case of this kind of problem" re: a malformed script like I described in https://github.com/netbox-community/netbox/issues/19045#issuecomment-2767546545.

FWIW, I'm also seeing this issue in v4.2.5 all the way back to v4.2.0.

@jnovinger commented on GitHub (Apr 1, 2025): Going to accept this based on the very valid assertion "there should probably be better error handling on the Netbox side in case of this kind of problem" re: a malformed script like I described in https://github.com/netbox-community/netbox/issues/19045#issuecomment-2767546545. FWIW, I'm also seeing this issue ~~in v4.2.5~~ all the way back to v4.2.0.
Author
Owner

@Kani999 commented on GitHub (Apr 14, 2025):

Hello,
After upgrading to NetBox 4.2.7, I encountered the following error when accessing custom scripts /extras/scripts/

Does my problem has something to do with the question in this issue?

<class 'django.urls.exceptions.NoReverseMatch'>

Reverse for 'script_jobs' with arguments '('',)' not found. 2 pattern(s) tried: ['extras/scripts/(?P<module>[^/]+)\\.(?P<name>[^/]+)/jobs/\\Z', 'extras/scripts/(?P<pk>[0-9]+)/jobs/\\Z']

Python version: 3.12.3
NetBox version: 4.2.7-Docker-3.2.0
Plugins: 
  cesnet_service_path_plugin: 4.0.0
  inventory_monitor: 10.1.5
  netbox_attachments: 7.2.0
  netbox_authorized_keys: 0.0.1
  netbox_bgp: 0.15.0
  netbox_cesnet_services_plugin: 0.1.0
  netbox_contextmenus: 1.4.7
  netbox_floorplan: 0.6.0
  netbox_plugin_reloader: 0.0.2
  netbox_reorder_rack: 1.1.3
@Kani999 commented on GitHub (Apr 14, 2025): Hello, After upgrading to NetBox 4.2.7, I encountered the following error when accessing custom scripts `/extras/scripts/` Does my problem has something to do with the question in this issue? ``` <class 'django.urls.exceptions.NoReverseMatch'> Reverse for 'script_jobs' with arguments '('',)' not found. 2 pattern(s) tried: ['extras/scripts/(?P<module>[^/]+)\\.(?P<name>[^/]+)/jobs/\\Z', 'extras/scripts/(?P<pk>[0-9]+)/jobs/\\Z'] Python version: 3.12.3 NetBox version: 4.2.7-Docker-3.2.0 Plugins: cesnet_service_path_plugin: 4.0.0 inventory_monitor: 10.1.5 netbox_attachments: 7.2.0 netbox_authorized_keys: 0.0.1 netbox_bgp: 0.15.0 netbox_cesnet_services_plugin: 0.1.0 netbox_contextmenus: 1.4.7 netbox_floorplan: 0.6.0 netbox_plugin_reloader: 0.0.2 netbox_reorder_rack: 1.1.3 ```
Author
Owner

@Grandhustla commented on GitHub (Apr 14, 2025):

I have that issue too after the upgrade netbox from v4.2.6 to v4.2.7.
I don't have any plugins. I cleared all scripts in ./scripts folder and the error is still remaining.

@Grandhustla commented on GitHub (Apr 14, 2025): I have that issue too after the upgrade netbox from v4.2.6 to v4.2.7. I don't have any plugins. I cleared all scripts in ./scripts folder and the error is still remaining.
Author
Owner

@jnovinger commented on GitHub (Apr 15, 2025):

Hey @Kani999 , @Grandhustla , and @wz4 , apologies for not getting back to this sooner. The root cause of this is a change I made in 4.2.7, related to #18965 .

The tl;dr is that there are a series of reserved identifiers that script authors should not be using as class attributes in their scripts. They are name, description, field_order, fieldsets, commit_default, job_timeout, and scheduling_enabled. These are listed, with a warning not to override them, in https://netboxlabs.com/docs/netbox/en/stable/customization/custom-scripts/#script-attributes.

I'm going to close this issue as not planned and open a subsequent Feature Request that proposes some changes to make it more clear when and how a script is failing to load.

@jnovinger commented on GitHub (Apr 15, 2025): Hey @Kani999 , @Grandhustla , and @wz4 , apologies for not getting back to this sooner. The root cause of this is a [change I made in 4.2.7](https://github.com/netbox-community/netbox/commit/e1e514251e825fadfcc87a191502a931fa9edb5b#diff-8765958a81233f2f6305ce0fad9be6f54280917d7f7369a2007b9728df5389fdR66), related to #18965 . The **tl;dr** is that there are a series of reserved identifiers that script authors should not be using as class attributes in their scripts. They are `name`, `description`, `field_order`, `fieldsets`, `commit_default`, `job_timeout`, and `scheduling_enabled`. These are listed, with a warning not to override them, in https://netboxlabs.com/docs/netbox/en/stable/customization/custom-scripts/#script-attributes. I'm going to close this issue as not planned and open a subsequent Feature Request that proposes some changes to make it more clear when and how a script is failing to load.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/netbox#10971