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

Tweak evaluation of required permission for ObjectEditView

Jeremy Stretch 5 лет назад
Родитель
Сommit
5381c4e0ae
1 измененных файлов с 17 добавлено и 11 удалено
  1. 17 11
      netbox/utilities/views.py

+ 17 - 11
netbox/utilities/views.py

@@ -291,10 +291,9 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
     template_name = 'utilities/obj_edit.html'
 
     def get_required_permission(self):
-        # Determine required permission based on whether we are editing an existing object
-        if self.obj.pk is None:
-            return get_permission_for_model(self.queryset.model, 'add')
-        return get_permission_for_model(self.queryset.model, 'change')
+        # self._permission_action is set by dispatch() to either "add" or "change" depending on whether
+        # we are modifying an existing object or creating a new one.
+        return get_permission_for_model(self.queryset.model, self._permission_action)
 
     def get_object(self, kwargs):
         # Look up an existing object by slug or PK, if provided.
@@ -311,25 +310,32 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
         return obj
 
     def dispatch(self, request, *args, **kwargs):
-        self.obj = self.alter_obj(self.get_object(kwargs), request, args, kwargs)
+        # Determine required permission based on whether we are editing an existing object
+        self._permission_action = 'change' if kwargs else 'add'
 
         return super().dispatch(request, *args, **kwargs)
 
     def get(self, request, *args, **kwargs):
+        obj = self.alter_obj(self.get_object(kwargs), request, args, kwargs)
+
         # Parse initial data manually to avoid setting field values as lists
         initial_data = {k: request.GET[k] for k in request.GET}
-        form = self.model_form(instance=self.obj, initial=initial_data)
+        form = self.model_form(instance=obj, initial=initial_data)
 
         return render(request, self.template_name, {
-            'obj': self.obj,
+            'obj': obj,
             'obj_type': self.queryset.model._meta.verbose_name,
             'form': form,
-            'return_url': self.get_return_url(request, self.obj),
+            'return_url': self.get_return_url(request, obj),
         })
 
     def post(self, request, *args, **kwargs):
         logger = logging.getLogger('netbox.views.ObjectEditView')
-        form = self.model_form(request.POST, request.FILES, instance=self.obj)
+        form = self.model_form(
+            data=request.POST,
+            files=request.FILES,
+            instance=self.alter_obj(self.get_object(kwargs), request, args, kwargs)
+        )
 
         if form.is_valid():
             logger.debug("Form validation was successful")
@@ -376,10 +382,10 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
             logger.debug("Form validation failed")
 
         return render(request, self.template_name, {
-            'obj': self.obj,
+            'obj': obj,
             'obj_type': self.queryset.model._meta.verbose_name,
             'form': form,
-            'return_url': self.get_return_url(request, self.obj),
+            'return_url': self.get_return_url(request, obj),
         })