GithubHelp home page GithubHelp logo

nautobot / nautobot-app-welcome-wizard Goto Github PK

View Code? Open in Web Editor NEW
13.0 12.0 6.0 27.72 MB

Magic and wonder UI wizard that simplifies getting started with Nautobot.

Home Page: https://docs.nautobot.com/projects/welcome-wizard/en/latest/

License: Other

Dockerfile 2.98% Python 84.66% HTML 11.74% Jinja 0.61%
python nautobot-plugin nautobot hacktoberfest

nautobot-app-welcome-wizard's Introduction

Welcome Wizard



An App for Nautobot.

Overview

What is the Nautobot Welcome Wizard?

The Welcome Wizard is a getting started wizard for Nautobot to assist a new user with necessary initial steps in populating data.

Welcome Wizard GIF

Key Features

The Welcome Wizard adds four (4) key features:

  1. Import Wizard - Welcome Wizard uses the Import Wizard to allow ease of adding community defined Device Types and Manufacturers into Nautobot.

  2. Quick-Start Settings - Welcome Wizard includes settings that are enabled by default to ease the user in setting up and syncing from a Git Repository.

  3. Helpful Middleware - Welcome Wizard includes middleware banners to assist with Nautobot resource creation.

  4. Dashboard - The Welcome Wizard Dashboard contains a list of common Nautobot Data Models that many other Nautobot models require. This page allows ease of adding items to Nautobot or, if supported, importing them. This ties all of the features together.

Screenshots

More screenshots can be found in the Using the App page in the documentation. Here's a quick overview of some of the app's added functionality:

Welcome Wizard Banner

Welcome Wizard Middleware

Welcome Wizard Dashboard

Welcome Wizard Completions

Welcome Wizard Import Device Types

Documentation

Full documentation for this App can be found over on the Nautobot Docs website:

Contributing to the Documentation

You can find all the Markdown source for the App documentation under the docs folder in this repository. For simple edits, a Markdown capable editor is sufficient: clone the repository and edit away.

If you need to view the fully-generated documentation site, you can build it with MkDocs. A container hosting the documentation can be started using the invoke commands (details in the Development Environment Guide) on http://localhost:8001. Using this container, as your changes to the documentation are saved, they will be automatically rebuilt and any pages currently being viewed will be reloaded in your browser.

Any PRs with fixes or improvements are very welcome!

Questions

For any questions or comments, please check the FAQ first. Feel free to also swing by the Network to Code Slack (channel #nautobot), sign up here if you don't have an account.

nautobot-app-welcome-wizard's People

Contributors

briddo avatar bryanculver avatar chadell avatar cmsirbu avatar dgarros avatar jeffkala avatar joewesch avatar jvanderaa avatar lonestar-swish avatar nniehoff avatar qduk avatar smk4664 avatar snaselj avatar tjunyat avatar ubajze avatar whitej6 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nautobot-app-welcome-wizard's Issues

Add error output to DeviceType import

Environment

  • Nautobot version: 2.0.0
  • nautobot-welcome-wizard version: 2.0.0

Proposed Functionality

When loading a custom yaml file for a DeviceType, required fields may be missed and the only error that we get is from the form's .save() method. This error message, unfortunately, isn't too helpful:

ValueError: The DeviceType could not be created because the data didn't validate.

We should wrap the save method in a try block and if it fails look for validation errors to present to the user. Here is an example of a possible change to the existing code:

    dtif = DeviceTypeImportForm(data)
    try:
        devtype = dtif.save()
    except ValueError as exc:
        if dtif.errors:
            raise ValueError(f"Unable to import this device_type, {dtif.errors}")
        raise exc

Use Case

  • Easier troubleshooting

nautobot-welcome-wizard dashboard

Environment

  • Python version: 3.10.12
  • Nautobot version: 2.1.5 , 2.1.6
  • nautobot-welcome-wizard version: 2.0.0

Expected Behavior

image

Observed Behavior

image

Steps to Reproduce

1.Upgrade from a previous version < 2.1.5
2.Uninstall nautobot-welcome-wizard plugin
3.Force reinstall : pip install nautobot-welcome-wizard --force-reinstall

Same odd behaviour

Resolution

Launch: nautobot-server nbshell

delete : Merlin.objects.filter(nautobot_list_link="dcim:site_list").delete()
delete : Merlin.objects.filter(nautobot_list_link="dcim:devicerole_list").delete()

Lots of thanks @joewesch

[Nautobot 1.4] Possibly add LocationType and Location recommendations to the banners?

Environment

  • Nautobot version: 1.4.0a2
  • nautobot-welcome-wizard version:

Proposed Functionality

  • When creating a Location, warn the user if LocationTypes are not yet defined (this may be automatically supported with existing code?)
  • When creating Location-aware models (such as Device, Prefix, etc.), even though Location is currently an optional field (not required), perhaps the plugin should add a banner to suggest that the user configure Locations if none are yet defined?

Use Case

Ongoing support for new data models.

Error when pulling down updated device_type git repo

Environment

  • Python version:
  • Nautobot version: v1.5.16
  • nautobot-welcome-wizard version: 1.1.4

Expected Behavior

Ran a sync on the devicetype-library git repo and expected it to show succeful

Observed Behavior

Shows failure, but seems to only be failing for one of the main processes for a duplicate key generated for Import Wizard

Steps to Reproduce

  1. Navigate to Extensibility > Git Repositories
  2. Attempt sync on devicetype-library
    Screenshot 2023-06-14 at 11 16 35 AM

Missing views for action(s) add, import

Environment

  • Python version: Python 3.7.10
  • Nautobot version: 1.4.1
  • nautobot-welcome-wizard version: 1.1.0

I did a new install of nautobot with the welcome wizard for the first time. When I browse to the Welcome Wizard plugin page I see an error on the top of the page in red:
Missing views for action(s) add, import

image
I'm unsure if the error is because of a step missing from the installation of the wizard or if something else is broken/missing from Nautobot.

Add Nautobot Documentation Support

Proposed Functionality

Make Welcome Wizard match other Nautobot Documentation.

Use Case

Consistent Documentation style across all repositories.

Trigger Welcome Wizard Import via API call

Environment

  • Nautobot version: v2.0.3
  • nautobot-welcome-wizard version: 2.0.0

I have multiple new instances of Nautobot and I'd like to trigger Welcome Wizard import via API

Proposed Functionality

POST to /plugins/welcome_wizard/devicetypeimport/import/{id}

Accepts id of Manufacturer or single Device Type

This then triggers an import.

Use Case

I have a new Nautobot and I want to automatically trigger Welcome Wizard from an external source.

Unable to add an object to a model in Django Admin view

Environment

  • Python version: 3.9
  • Nautobot version: 1.1.2
  • nautobot-welcome-wizard version: 1.1.2

Expected Behavior

Able to create a custom field

Observed Behavior

Received the error when trying to create a new custom field:

18:45:00.307 ERROR   django.request :
  Internal Server Error: /admin/extras/customfield/add/
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 171, in _get_response
    response = middleware_method(request, callback, callback_args, callback_kwargs)
  File "/opt/nautobot/.local/lib/python3.9/site-packages/welcome_wizard/middleware.py", line 34, in process_view
    base_fields = view_func.view_class.model_form.base_fields
AttributeError: 'function' object has no attribute 'view_class'
[pid: 45|app: 0|req: 193/923] 172.26.0.7 () {60 vars in 1393 bytes} [Mon Aug 30 18:45:00 2021] GET /admin/extras/customfield/add/ => generated 1846 bytes in 7 msecs (HTTP/1.0 500) 6 headers in 214 bytes (1 switches on core 0)

Steps to Reproduce

  1. Install Welcome Wizard Plugin
  2. Go to admin panel
  3. Select Custom Fields
  4. Select create custom field
  5. Receive the error

TypeError on accessing ManufacturerListView or DeviceTypeListView under Nautobot 1.3

Environment

  • Python version:
  • Nautobot version: 1.3.8
  • nautobot-welcome-wizard version: 1.1.0

Expected Behavior

ManufacturerListView and DeviceTypeListView to load successfully

Observed Behavior

Page access raises a TypeError:

Traceback (most recent call last):
  File "/opt/nautobot/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/opt/nautobot/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/opt/nautobot/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/opt/nautobot/lib/python3.8/site-packages/nautobot/utilities/views.py", line 114, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "/opt/nautobot/lib/python3.8/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "/opt/nautobot/lib/python3.8/site-packages/welcome_wizard/views.py", line 68, in get
    return super().get(request, *args, **kwargs)
  File "/opt/nautobot/lib/python3.8/site-packages/nautobot/core/views/generic.py", line 276, in get
    valid_actions = self.validate_action_buttons(request)
  File "/opt/nautobot/lib/python3.8/site-packages/nautobot/core/views/generic.py", line 196, in validate_action_buttons
    for action in self.action_buttons:
Exception Type: TypeError at /plugins/welcome_wizard/manufacturers/
Exception Value: 'NoneType' object is not iterable

The issue appears to be that these views declare action_buttons = None but Nautobot core is expecting these to be iterables, i.e. [] or (). The validation of this expectation was added in nautobot/nautobot#1806 so this probably was passing in earlier Nautobot releases.

I will also open an issue against Nautobot core to not error out in this check when action_buttons is None.

Banner is been shown to all users

Environment

  • Python version: 3.9.11
  • Nautobot version: 1.2.10
  • nautobot-welcome-wizard version: 1.0.3

Expected Behavior

Just users with permissions to access this plugin can see plugin top banner.

Observed Behavior

Even a user without any permissions would see plugin banner.

Steps to Reproduce

  1. Create a user without permissions, just active.
  2. Activate 'HIDE RESTRICTED UI' parameter
  3. Login and you would see 'The Nautobot Welcome Wizard can help you get started with Nautobot!'

With Welcome Wizard installed cannot Add Devices to Virtualization / Cluster

Environment

  • Python version: 3.9.14
  • Nautobot version: 1.4.5
  • nautobot-welcome-wizard version: 1.1.1

On clicking 'Add Devices' under a Cluster, be displayed the page form with details to add a device.

Observed Behavior

Receive server error:

Server Error

There was a problem with your request. Please contact an administrator.

The complete exception is provided below:

<class 'AttributeError'>

'NoneType' object has no attribute 'base_fields'

Python version: 3.9.14
Nautobot version: 1.4.5

Steps to Reproduce

  1. install Welcome Wizard plugin
  2. Under Virtualisation - Cluster, click Add Devices

Device Type view conflict

Environment

  • Python version: 3.9.11
  • Nautobot version: 1.2.10
  • nautobot-welcome-wizard version: 1.0.3

Expected Behavior

Configure columns to see in Import Device Types view.

Observed Behavior

Conflict with user preference between device type view and device type view in plugin. Name field is missing in plugin device type view.

Steps to Reproduce

  1. Go to dcim/device-types/ and make some configuration in Configure button
  2. Go to plugins/welcome_wizard/devicetypes/ and Name field is missing.

Welcome Wizard does not install on Nautobot v2.x.x

Environment

  • Python version: 3.8
  • Nautobot version: V2.0.1
  • nautobot-welcome-wizard version: V1.1.4

Side Note

After talking with Nautobot team, the issue is because Sites and Regions are changing to Locations in V2.x.x. This Issue is to track the update.

Expected Behavior

I expected the app would install while running the post_upgrade script

Observed Behavior

The app did not install and and error was thrown.

Steps to Reproduce

  1. Install app according to normal install procedure.
  2. pip install welcome_wizard
  3. Add to nautobot.py file.
  4. Run post_upgrade script.

Debugging results

[nautobot@nautobot-server ~]$ nautobot-server post_upgrade
Traceback (most recent call last):
  File "/home/nautobot/bin/nautobot-server", line 8, in <module>
    sys.exit(main())
  File "/home/nautobot/lib64/python3.8/site-packages/nautobot/core/cli/__init__.py", line 54, in main
    run_app(
  File "/home/nautobot/lib64/python3.8/site-packages/nautobot/core/runner/runner.py", line 297, in run_app
    management.execute_from_command_line([runner_name, command] + command_args)
  File "/home/nautobot/lib64/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/home/nautobot/lib64/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
    django.setup()
  File "/home/nautobot/lib64/python3.8/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/nautobot/lib64/python3.8/site-packages/django/apps/registry.py", line 122, in populate
    app_config.ready()
  File "/home/nautobot/lib64/python3.8/site-packages/nautobot/core/apps/__init__.py", line 848, in ready
    super().ready()
  File "/home/nautobot/lib64/python3.8/site-packages/nautobot/core/apps/__init__.py", line 71, in ready
    registry["new_ui_ready_routes"].update(get_all_new_ui_ready_routes())
  File "/home/nautobot/lib64/python3.8/site-packages/nautobot/core/utils/navigation.py", line 47, in get_all_new_ui_ready_routes
    url_patterns = resolver.url_patterns
  File "/home/nautobot/lib64/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/nautobot/lib64/python3.8/site-packages/django/urls/resolvers.py", line 602, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/nautobot/lib64/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/nautobot/lib64/python3.8/site-packages/django/urls/resolvers.py", line 595, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib64/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 843, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/nautobot/lib64/python3.8/site-packages/nautobot/core/urls.py", line 7, in <module>
    from nautobot.extras.plugins.urls import (
  File "/home/nautobot/lib64/python3.8/site-packages/nautobot/extras/plugins/urls.py", line 32, in <module>
    urlpatterns = import_object(f"{plugin_path}.urls.urlpatterns")
  File "/home/nautobot/lib64/python3.8/site-packages/nautobot/extras/plugins/utils.py", line 46, in import_object
    spec.loader.exec_module(module)
  File "/home/nautobot/lib64/python3.8/site-packages/welcome_wizard/urls.py", line 6, in <module>
    from . import views
  File "/home/nautobot/lib64/python3.8/site-packages/welcome_wizard/views.py", line 13, in <module>
    from nautobot.dcim.models import Site, DeviceType, Manufacturer
ImportError: cannot import name 'Site' from 'nautobot.dcim.models' (/home/nautobot/lib64/python3.8/site-packages/nautobot/dcim/models/__init__.py)

Cannot create API token through user profile

Environment

  • Python version: 3.8.10
  • Nautobot version: 1.2.2
  • nautobot-welcome-wizard version: 1.0.2

Expected Behavior

The New Token form would be displayed, allowing me to create a new token.

Observed Behavior

I received the following error:
<class 'AttributeError'>

type object 'TokenEditView' has no attribute 'model_form'

Steps to Reproduce

  1. Select Profile in the upper right hand corner
  2. Click on API Tokens
  3. Click on Add a Token

Bug when importing Device Types

Environment

  • Python version: Python 3.10.6
  • Nautobot version: 1.5.16
  • nautobot-welcome-wizard version: 1.1.3

Expected Behavior

Device types to be added

Observed Behavior

An error when adding the device type:

InterfaceTemplate() got an unexpected keyword argument 'poe_mode'

Steps to Reproduce

  1. Add Cisco as a manufacturer through the welcome wizard
  2. Select a subset of Cisco models from the add device-type welcome wizard screen

Screenshot 2023-04-14 at 15 48 33

  1. Observe the error:
nautobot-device-onboarding-nautobot-1  |   Internal Server Error: /plugins/welcome_wizard/devicetypes/import/
nautobot-device-onboarding-nautobot-1  | Traceback (most recent call last):
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
nautobot-device-onboarding-nautobot-1  |     response = get_response(request)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/django/core/handlers/base.py", line 181, in _get_response
nautobot-device-onboarding-nautobot-1  |     response = wrapped_callback(request, *callback_args, **callback_kwargs)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/django/views/generic/base.py", line 70, in view
nautobot-device-onboarding-nautobot-1  |     return self.dispatch(request, *args, **kwargs)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/welcome_wizard/views.py", line 106, in dispatch
nautobot-device-onboarding-nautobot-1  |     return super().dispatch(request, *args, **kwargs)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/django/views/generic/base.py", line 98, in dispatch
nautobot-device-onboarding-nautobot-1  |     return handler(request, *args, **kwargs)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/welcome_wizard/views.py", line 158, in post
nautobot-device-onboarding-nautobot-1  |     job.run(data, commit=True)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/welcome_wizard/jobs.py", line 101, in run
nautobot-device-onboarding-nautobot-1  |     devtype = import_device_type(data)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/welcome_wizard/jobs.py", line 49, in import_device_type
nautobot-device-onboarding-nautobot-1  |     component_list = [component_class(device_type=devtype, **item) for item in data[key]]
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/welcome_wizard/jobs.py", line 49, in <listcomp>
nautobot-device-onboarding-nautobot-1  |     component_list = [component_class(device_type=devtype, **item) for item in data[key]]
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/django/db/models/base.py", line 503, in __init__
nautobot-device-onboarding-nautobot-1  |     raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
nautobot-device-onboarding-nautobot-1  | TypeError: InterfaceTemplate() got an unexpected keyword argument 'poe_mode'
nautobot-device-onboarding-nautobot-1  | Internal Server Error: /plugins/welcome_wizard/devicetypes/import/
nautobot-device-onboarding-nautobot-1  | Traceback (most recent call last):
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
nautobot-device-onboarding-nautobot-1  |     response = get_response(request)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/django/core/handlers/base.py", line 181, in _get_response
nautobot-device-onboarding-nautobot-1  |     response = wrapped_callback(request, *callback_args, **callback_kwargs)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/django/views/generic/base.py", line 70, in view
nautobot-device-onboarding-nautobot-1  |     return self.dispatch(request, *args, **kwargs)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/welcome_wizard/views.py", line 106, in dispatch
nautobot-device-onboarding-nautobot-1  |     return super().dispatch(request, *args, **kwargs)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/django/views/generic/base.py", line 98, in dispatch
nautobot-device-onboarding-nautobot-1  |     return handler(request, *args, **kwargs)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/welcome_wizard/views.py", line 158, in post
nautobot-device-onboarding-nautobot-1  |     job.run(data, commit=True)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/welcome_wizard/jobs.py", line 101, in run
nautobot-device-onboarding-nautobot-1  |     devtype = import_device_type(data)
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/welcome_wizard/jobs.py", line 49, in import_device_type
nautobot-device-onboarding-nautobot-1  |     component_list = [component_class(device_type=devtype, **item) for item in data[key]]
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/welcome_wizard/jobs.py", line 49, in <listcomp>
nautobot-device-onboarding-nautobot-1  |     component_list = [component_class(device_type=devtype, **item) for item in data[key]]
nautobot-device-onboarding-nautobot-1  |   File "/usr/local/lib/python3.10/site-packages/django/db/models/base.py", line 503, in __init__
nautobot-device-onboarding-nautobot-1  |     raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
nautobot-device-onboarding-nautobot-1  | TypeError: InterfaceTemplate() got an unexpected keyword argument 'poe_mode'
nautobot-device-onboarding-nautobot-1  | 19:42:46.036 ERROR   django.server :

Add Model Search to Import

Environment

  • Nautobot version: 1.5.16
  • nautobot-welcome-wizard version: 1.1.3

Proposed Functionality

Add a free search filter for the device types in addition to a manufacturer filter.

Use Case

As a welcome wizard user, I would like to add specific subsets of models. When there are a lot of models under a manufacturer, it can be hard to get through the whole list.

With the ability to search, I can quickly find the models that I'd like to add as device types.

AttributeError when trying to import Manufacturers or DeviceTypes

Environment

  • Python version: 3.11.7
  • Nautobot version: 2.1.0
  • nautobot-welcome-wizard version: 2.0.0

When clicking the 'Import' wizard hat icon, I expect manufacturers to be imported into the Nautobot Manufacturer model automatically without errors.

When clicking the 'Import' wizard hat icon, I expect Device Types to be imported into the Nautobot Device Type model automatically without errors.

Clicking either Import for Manufacturers, or Device Types results in an AttributeError: 'NoneType' object has not attribute 'pop'.

This happens consistently on a new installation(s) of Nautobot with just the Welcome Wizard plugin enabled.

21:19:45.982 INFO    django.server :
  "GET /plugins/welcome_wizard/manufacturers/import/ HTTP/1.1" 302 0
21:19:46.076 ERROR   django.request :
  Internal Server Error: /plugins/welcome_wizard/manufacturers/
Traceback (most recent call last):
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/nautobot/core/views/mixins.py", line 168, in dispatch
    return super().dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/welcome_wizard/views.py", line 64, in get
    check_sync(instance=self, request=request)
  File "/opt/nautobot/.local/lib/python3.11/site-packages/welcome_wizard/views.py", line 48, in check_sync
    enqueue_pull_git_repository_and_refresh_data(repo, request.user)
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/datasources/git.py", line 77, in enqueue_pull_git_repository_and_refresh_data
    return enqueue_git_repository_helper(repository, user, GitRepositorySync)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/datasources/git.py", line 61, in enqueue_git_repository_helper
    return JobResult.enqueue_job(job_model, user, repository=repository.pk)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/models/jobs.py", line 673, in enqueue_job
    transaction.on_commit(
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/db/transaction.py", line 128, in on_commit
    get_connection(using).on_commit(func)
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/db/backends/base/base.py", line 645, in on_commit
    func()
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/models/jobs.py", line 674, in <lambda>
    lambda: job_model.job_task.apply_async(
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/task.py", line 594, in apply_async
    return app.send_task(
           ^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/base.py", line 736, in send_task
    options = router.route(
              ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/routes.py", line 74, in route
    options = lpmerge(self.expand_destination(
                      ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/routes.py", line 85, in expand_destination
    queue = route.pop('queue', None)
            ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'pop'
21:19:46.082 ERROR   django.server :
  "GET /plugins/welcome_wizard/manufacturers/ HTTP/1.1" 500 187089
21:19:49.371 INFO    django.server :
  "GET /plugins/welcome_wizard/manufacturers/import/ HTTP/1.1" 302 0
21:19:49.457 ERROR   django.request :
  Internal Server Error: /plugins/welcome_wizard/manufacturers/
Traceback (most recent call last):
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/nautobot/core/views/mixins.py", line 168, in dispatch
    return super().dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/welcome_wizard/views.py", line 64, in get
    check_sync(instance=self, request=request)
  File "/opt/nautobot/.local/lib/python3.11/site-packages/welcome_wizard/views.py", line 48, in check_sync
    enqueue_pull_git_repository_and_refresh_data(repo, request.user)
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/datasources/git.py", line 77, in enqueue_pull_git_repository_and_refresh_data
    return enqueue_git_repository_helper(repository, user, GitRepositorySync)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/datasources/git.py", line 61, in enqueue_git_repository_helper
    return JobResult.enqueue_job(job_model, user, repository=repository.pk)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/models/jobs.py", line 673, in enqueue_job
    transaction.on_commit(
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/db/transaction.py", line 128, in on_commit
    get_connection(using).on_commit(func)
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/db/backends/base/base.py", line 645, in on_commit
    func()
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/models/jobs.py", line 674, in <lambda>
    lambda: job_model.job_task.apply_async(
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/task.py", line 594, in apply_async
    return app.send_task(
           ^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/base.py", line 736, in send_task
    options = router.route(
              ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/routes.py", line 74, in route
    options = lpmerge(self.expand_destination(
                      ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/routes.py", line 85, in expand_destination
    queue = route.pop('queue', None)
            ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'pop'
21:19:49.461 ERROR   django.server :
  "GET /plugins/welcome_wizard/manufacturers/ HTTP/1.1" 500 186903
21:19:53.201 INFO    django.server :
  "GET /plugins/welcome_wizard/manufacturers/import/ HTTP/1.1" 302 0
21:19:53.326 ERROR   django.request :
  Internal Server Error: /plugins/welcome_wizard/manufacturers/
Traceback (most recent call last):
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/nautobot/core/views/mixins.py", line 168, in dispatch
    return super().dispatch(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/nautobot/.local/lib/python3.11/site-packages/welcome_wizard/views.py", line 64, in get
    check_sync(instance=self, request=request)
  File "/opt/nautobot/.local/lib/python3.11/site-packages/welcome_wizard/views.py", line 48, in check_sync
    enqueue_pull_git_repository_and_refresh_data(repo, request.user)
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/datasources/git.py", line 77, in enqueue_pull_git_repository_and_refresh_data
    return enqueue_git_repository_helper(repository, user, GitRepositorySync)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/datasources/git.py", line 61, in enqueue_git_repository_helper
    return JobResult.enqueue_job(job_model, user, repository=repository.pk)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/models/jobs.py", line 673, in enqueue_job
    transaction.on_commit(
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/db/transaction.py", line 128, in on_commit
    get_connection(using).on_commit(func)
  File "/opt/nautobot/.local/lib/python3.11/site-packages/django/db/backends/base/base.py", line 645, in on_commit
    func()
  File "/usr/local/lib/python3.11/site-packages/nautobot/extras/models/jobs.py", line 674, in <lambda>
    lambda: job_model.job_task.apply_async(
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/task.py", line 594, in apply_async
    return app.send_task(
           ^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/base.py", line 736, in send_task
    options = router.route(
              ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/routes.py", line 74, in route
    options = lpmerge(self.expand_destination(
                      ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/celery/app/routes.py", line 85, in expand_destination
    queue = route.pop('queue', None)
            ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'pop'
21:19:53.331 ERROR   django.server :
  "GET /plugins/welcome_wizard/manufacturers/ HTTP/1.1" 500 186952

Steps to Reproduce (followed from installation guide: https://docs.nautobot.com/projects/welcome-wizard/en/latest/admin/install/)

  1. Install the additional Python package pip install nautobot-welcome-wizard
  2. Configure Nautobot Welcome Wizard:
# PLUGIN Configuration                     
                                                                
PLUGINS = ['welcome_wizard']                                           
                                                                          
PLUGINS_CONFIG = {                                 
    'welcome_wizard': {                                             
        'enable_device_type_library': True,                         
        'enable_welcome_banner': False,                                       
    }                                                         
}  
  1. Run Post Upgrade nautobot-server post_upgrade
app $ nautobot-server post_upgrade
21:09:52.349 DEBUG   nautobot.core.celery __init__.py        import_jobs_as_celery_tasks() :
  Importing system Jobs
21:09:52.353 DEBUG   nautobot.core.celery __init__.py                      register_jobs() :
  Registering job nautobot.core.jobs.ExportObjectList
21:09:52.357 DEBUG   nautobot.core.celery __init__.py                      register_jobs() :
  Registering job nautobot.core.jobs.GitRepositorySync
21:09:52.357 DEBUG   nautobot.core.celery __init__.py                      register_jobs() :
  Registering job nautobot.core.jobs.GitRepositoryDryRun
21:09:53.069 DEBUG   nautobot.core.celery __init__.py                      register_jobs() :
  Registering job welcome_wizard.jobs.WelcomeWizardImportManufacturer
21:09:53.069 DEBUG   nautobot.core.celery __init__.py                      register_jobs() :
  Registering job welcome_wizard.jobs.WelcomeWizardImportDeviceType
Performing database migrations...
Operations to perform:
  Apply all migrations: admin, auth, circuits, contenttypes, database, dcim, django_celery_beat, django_celery_results, extras, ipam, sessions, social_django, taggit, tenancy, users, virtualization, welcome_wizard
Running migrations:
  Applying welcome_wizard.0001_initial... OK
  Applying welcome_wizard.0002_merlin_nautobot_list_link... OK
  Applying welcome_wizard.0003_auto_20210705_1912... OK
  Applying welcome_wizard.0004_remove_manufacturerimport_slug... OK
21:09:54.163 DEBUG   nautobot.core.celery __init__.py        import_jobs_as_celery_tasks() :
  Importing system Jobs
21:09:54.173 INFO    nautobot.extras.utils utils.py        refresh_job_model_from_job_class() :
  Refreshed Job "System Jobs: Export Object List" from <ExportObjectList>
21:09:54.181 INFO    nautobot.extras.utils utils.py        refresh_job_model_from_job_class() :
  Refreshed Job "System Jobs: Git Repository: Sync" from <GitRepositorySync>
21:09:54.189 INFO    nautobot.extras.utils utils.py        refresh_job_model_from_job_class() :
  Refreshed Job "System Jobs: Git Repository: Dry-Run" from <GitRepositoryDryRun>
21:09:54.200 INFO    nautobot.extras.utils utils.py        refresh_job_model_from_job_class() :
  Created Job "Welcome Wizard: Welcome Wizard - Import Manufacturer" from <WelcomeWizardImportManufacturer>
21:09:54.209 INFO    nautobot.extras.utils utils.py        refresh_job_model_from_job_class() :
  Created Job "Welcome Wizard: Welcome Wizard - Import Device Type" from <WelcomeWizardImportDeviceType>

Generating cable paths...
Found no missing circuit termination paths; skipping
Found no missing console port paths; skipping
Found no missing console server port paths; skipping
Found no missing interface paths; skipping
Found no missing power feed paths; skipping
Found no missing power outlet paths; skipping
Found no missing power port paths; skipping
Finished.

Collecting static files...

0 static files copied to '/opt/nautobot/static', 986 unmodified.

Removing stale content types...

Removing expired sessions...

Sending installation metrics...
Installation metrics are disabled by INSTALLATION_METRICS_ENABLED setting, skipping.

Refreshing _content_type cache
Refreshing content type cache

Refreshing dynamic group member caches...
DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT is set to 0; skipping cache refresh
  1. Start Nautobot

Rename Plugin

Proposed Functionality

We need to rename the plugin to match standards. The current name has conflict and potential usage rights. Maybe nautobot-plugin-getting-started-wizard.

Use Case

Current name conflicts in Pypi and doesn't describe what this project provides.

Update Dashboard

Refactor dashboard into using Nautobot Tables

Multiple tables on a single page woudl be ideal

DCIM

IPAM

Circuits

Virtualization

Filering on the device type / manufacturer import view buggy on Nautobot 1.5.2

Environment

  • Python version: 3.8.12
  • Nautobot version: 1.5.2
  • nautobot-welcome-wizard version: 1.1.2

Expected Behavior

When importing device types or manufacturer, there used to be a filtering field allowing free-text search on both manufacturers and device types. That field is now gone, perhaps due to all the filtering updates that happened on Nautobot 1.5.x

Observed Behavior

image
image

Steps to Reproduce

  1. Open the device type or manufacturer import view
  2. Verify that the filtering is either buggy or non-existent (in the case of manufacturer import)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.