Skip to content

Commit 8c35620

Browse files
committed
Create OnboardingTaskCreateView and associated forms (#9)
1 parent 71467fb commit 8c35620

File tree

4 files changed

+62
-12
lines changed

4 files changed

+62
-12
lines changed

netbox_onboarding/forms.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,24 @@
2424
BLANK_CHOICE = (("", "---------"),)
2525

2626

27+
class OnboardingTaskForm(BootstrapMixin, forms.ModelForm):
28+
"""Form for creating a new OnboardingTask instance."""
29+
30+
ip_address = forms.CharField(required=True, label="IP address", help_text="IP address of the device to onboard")
31+
32+
site = forms.ModelChoiceField(required=True, queryset=Site.objects.all(), to_field_name="slug")
33+
34+
username = forms.CharField(required=False, help_text="Device username (will not be stored in database)")
35+
password = forms.CharField(required=False, help_text="Device password (will not be stored in database)")
36+
secret = forms.CharField(required=False, help_text="Device secret (will not be stored in database)")
37+
38+
device_type = forms.CharField(required=False, help_text="Device type slug (optional)")
39+
40+
class Meta: # noqa: D106 "Missing docstring in public nested class"
41+
model = OnboardingTask
42+
fields = ["ip_address", "site", "username", "password", "secret", "role", "device_type", "platform", "port", "timeout"]
43+
44+
2745
class OnboardingTaskFilterForm(BootstrapMixin, forms.ModelForm):
2846
"""Form for filtering OnboardingTask instances."""
2947

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{% extends 'utilities/obj_edit.html' %}
2+
{% load form_helpers %}

netbox_onboarding/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313
"""
1414
from django.urls import path
1515

16-
from .views import OnboardingTaskListView, OnboardingTaskFeedBulkImportView
16+
from .views import OnboardingTaskListView, OnboardingTaskCreateView, OnboardingTaskFeedBulkImportView
1717

1818
urlpatterns = [
1919
path("", OnboardingTaskListView.as_view(), name="onboarding_task_list"),
20+
path("add/", OnboardingTaskCreateView.as_view(), name="onboarding_task_add"),
2021
path("import/", OnboardingTaskFeedBulkImportView.as_view(), name="onboarding_task_import"),
2122
]

netbox_onboarding/views.py

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
from django.db import transaction
1919
from django.shortcuts import render
2020
from django_rq import get_queue
21-
from utilities.views import BulkImportView, ObjectListView
21+
from utilities.views import BulkImportView, ObjectEditView, ObjectListView
2222

2323
from netbox_onboarding.utils.credentials import Credentials
2424
from .filters import OnboardingTaskFilter
25-
from .forms import OnboardingTaskFilterForm, OnboardingTaskFeedCSVForm
25+
from .forms import OnboardingTaskForm, OnboardingTaskFilterForm, OnboardingTaskFeedCSVForm
2626
from .models import OnboardingTask
2727
from .tables import OnboardingTaskTable, OnboardingTaskFeedBulkTable
2828

@@ -41,6 +41,43 @@ class OnboardingTaskListView(PermissionRequiredMixin, ObjectListView):
4141
template_name = "netbox_onboarding/onboarding_tasks_list.html"
4242

4343

44+
def handle_created_onboarding_task(task, owner):
45+
"""Sanitize the OnboardingTask and hand it off to the worker queue."""
46+
credentials = Credentials(username=task.username, password=task.password, secret=task.secret)
47+
48+
task.username = ""
49+
task.password = ""
50+
task.secret = ""
51+
task.owner = owner
52+
task.save()
53+
54+
get_queue("default").enqueue("netbox_onboarding.worker.onboard_device", task.pk, credentials)
55+
56+
57+
class OnboardingTaskCreateView(PermissionRequiredMixin, ObjectEditView):
58+
"""View for creating a new OnboardingTask."""
59+
60+
permission_required = "dcim.add_device"
61+
model = OnboardingTask
62+
queryset = OnboardingTask.objects.all()
63+
model_form = OnboardingTaskForm
64+
template_name = "netbox_onboarding/onboarding_task_edit.html"
65+
default_return_url = "plugins:netbox_onboarding:onboarding_task_list"
66+
67+
def post(self, request):
68+
"""Process an HTTP POST request."""
69+
form = self.model_form(request.POST)
70+
71+
if form.is_valid():
72+
obj = form.save()
73+
handle_created_onboarding_task(obj, self.request.user)
74+
75+
return render(
76+
request,
77+
self.template_name,
78+
{"form": form}
79+
)
80+
4481
class OnboardingTaskFeedBulkImportView(PermissionRequiredMixin, BulkImportView):
4582
"""View for bulk-importing a CSV file to create OnboardingTasks."""
4683

@@ -70,15 +107,7 @@ def post(self, request):
70107
raise ValidationError("")
71108

72109
for ot in new_objs:
73-
credentials = Credentials(username=ot.username, password=ot.password, secret=ot.secret,)
74-
75-
ot.username = ""
76-
ot.password = ""
77-
ot.secret = ""
78-
ot.owner = self.request.user
79-
ot.save()
80-
81-
get_queue("default").enqueue("netbox_onboarding.worker.onboard_device", ot.pk, credentials)
110+
handle_created_onboarding_task(ot, self.request.user)
82111

83112
if new_objs:
84113
msg = "Imported {} {}".format(len(new_objs), new_objs[0]._meta.verbose_name_plural)

0 commit comments

Comments
 (0)