Просмотр исходного кода

Closes #4363: Standardize secret creation URL

Jeremy Stretch 6 лет назад
Родитель
Сommit
a28509019a

+ 0 - 2
netbox/dcim/urls.py

@@ -2,7 +2,6 @@ from django.urls import path
 
 from extras.views import ObjectChangeLogView, ImageAttachmentEditView
 from ipam.views import ServiceCreateView
-from secrets.views import secret_add
 from . import views
 from .models import (
     Cable, ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, FrontPort, Interface, Manufacturer, Platform,
@@ -179,7 +178,6 @@ urlpatterns = [
     path('devices/<int:pk>/status/', views.DeviceStatusView.as_view(), name='device_status'),
     path('devices/<int:pk>/lldp-neighbors/', views.DeviceLLDPNeighborsView.as_view(), name='device_lldp_neighbors'),
     path('devices/<int:pk>/config/', views.DeviceConfigView.as_view(), name='device_config'),
-    path('devices/<int:pk>/add-secret/', secret_add, name='device_addsecret'),
     path('devices/<int:device>/services/assign/', ServiceCreateView.as_view(), name='device_service_assign'),
     path('devices/<int:object_id>/images/add/', ImageAttachmentEditView.as_view(), name='device_add_image', kwargs={'model': Device}),
 

+ 7 - 1
netbox/secrets/forms.py

@@ -71,6 +71,12 @@ class SecretRoleCSVForm(forms.ModelForm):
 #
 
 class SecretForm(BootstrapMixin, CustomFieldModelForm):
+    device = DynamicModelChoiceField(
+        queryset=Device.objects.all(),
+        widget=APISelect(
+            api_url="/api/dcim/devices/"
+        )
+    )
     plaintext = forms.CharField(
         max_length=SECRET_PLAINTEXT_MAX_LENGTH,
         required=False,
@@ -100,7 +106,7 @@ class SecretForm(BootstrapMixin, CustomFieldModelForm):
     class Meta:
         model = Secret
         fields = [
-            'role', 'name', 'plaintext', 'plaintext2', 'tags',
+            'device', 'role', 'name', 'plaintext', 'plaintext2', 'tags',
         ]
 
     def __init__(self, *args, **kwargs):

+ 1 - 0
netbox/secrets/urls.py

@@ -17,6 +17,7 @@ urlpatterns = [
 
     # Secrets
     path('secrets/', views.SecretListView.as_view(), name='secret_list'),
+    path('secrets/add/', views.secret_add, name='secret_add'),
     path('secrets/import/', views.SecretBulkImportView.as_view(), name='secret_import'),
     path('secrets/edit/', views.SecretBulkEditView.as_view(), name='secret_bulk_edit'),
     path('secrets/delete/', views.SecretBulkDeleteView.as_view(), name='secret_bulk_delete'),

+ 9 - 10
netbox/secrets/views.py

@@ -8,9 +8,8 @@ from django.shortcuts import get_object_or_404, redirect, render
 from django.urls import reverse
 from django.views.generic import View
 
-from dcim.models import Device
 from utilities.views import (
-    BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
+    BulkDeleteView, BulkEditView, BulkImportView, GetReturnURLMixin, ObjectDeleteView, ObjectEditView, ObjectListView,
 )
 from . import filters, forms, tables
 from .decorators import userkey_required
@@ -89,12 +88,9 @@ class SecretView(PermissionRequiredMixin, View):
 
 @permission_required('secrets.add_secret')
 @userkey_required()
-def secret_add(request, pk):
+def secret_add(request):
 
-    # Retrieve device
-    device = get_object_or_404(Device, pk=pk)
-
-    secret = Secret(device=device)
+    secret = Secret()
     session_key = get_session_key(request)
 
     if request.method == 'POST':
@@ -123,17 +119,20 @@ def secret_add(request, pk):
 
                     messages.success(request, "Added new secret: {}.".format(secret))
                     if '_addanother' in request.POST:
-                        return redirect('dcim:device_addsecret', pk=device.pk)
+                        return redirect('secrets:secret_add')
                     else:
                         return redirect('secrets:secret', pk=secret.pk)
 
     else:
-        form = forms.SecretForm(instance=secret)
+        initial_data = {
+            'device': request.GET.get('device'),
+        }
+        form = forms.SecretForm(initial=initial_data)
 
     return render(request, 'secrets/secret_edit.html', {
         'secret': secret,
         'form': form,
-        'return_url': device.get_absolute_url(),
+        'return_url': GetReturnURLMixin().get_return_url(request, secret)
     })
 
 

+ 1 - 1
netbox/templates/dcim/device.html

@@ -426,7 +426,7 @@
                             {% csrf_token %}
                         </form>
                         <div class="panel-footer text-right noprint">
-                            <a href="{% url 'dcim:device_addsecret' pk=device.pk %}" class="btn btn-xs btn-primary">
+                            <a href="{% url 'secrets:secret_add' %}?device={{ device.pk }}&return_url={{ device.get_absolute_url }}" class="btn btn-xs btn-primary">
                                 <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
                                 Add secret
                             </a>

+ 1 - 0
netbox/templates/inc/nav_menu.html

@@ -462,6 +462,7 @@
                         <li{% if not perms.secrets.view_secret %} class="disabled"{% endif %}>
                             {% if perms.secrets.add_secret %}
                                 <div class="buttons pull-right">
+                                    <a href="{% url 'secrets:secret_add' %}" class="btn btn-xs btn-success" title="Add"><i class="fa fa-plus"></i></a>
                                     <a href="{% url 'secrets:secret_import' %}" class="btn btn-xs btn-info" title="Import"><i class="fa fa-download"></i></a>
                                 </div>
                             {% endif %}

+ 1 - 6
netbox/templates/secrets/secret_edit.html

@@ -21,12 +21,7 @@
             <div class="panel panel-default">
                 <div class="panel-heading"><strong>Secret Attributes</strong></div>
                 <div class="panel-body">
-                    <div class="form-group">
-                        <label class="col-md-3 control-label required">Device</label>
-                        <div class="col-md-9">
-                            <p class="form-control-static">{{ secret.device }}</p>
-                        </div>
-                    </div>
+                    {% render_field form.device %}
                     {% render_field form.role %}
                     {% render_field form.name %}
                     {% render_field form.userkeys %}