Move get_extra_context() to base views

This commit is contained in:
jeremystretch
2022-01-21 13:56:58 -05:00
parent 54834c47f8
commit e03593d86f
4 changed files with 84 additions and 56 deletions

View File

@@ -3,7 +3,7 @@ from django.views.generic import View
from utilities.views import ObjectPermissionRequiredMixin
class GenericView(ObjectPermissionRequiredMixin, View):
class BaseObjectView(ObjectPermissionRequiredMixin, View):
"""
Base view class for reusable generic views.
@@ -13,3 +13,34 @@ class GenericView(ObjectPermissionRequiredMixin, View):
"""
queryset = None
template_name = None
def get_extra_context(self, request, instance):
"""
Return any additional context data to include when rendering the template.
Args:
request: The current request
instance: The object being viewed
"""
return {}
class BaseMultiObjectView(ObjectPermissionRequiredMixin, View):
"""
Base view class for reusable generic views.
Attributes:
queryset: Django QuerySet from which the object(s) will be fetched
template_name: The name of the HTML template file to render
"""
queryset = None
template_name = None
def get_extra_context(self, request):
"""
Return any additional context data to include when rendering the template.
Args:
request: The current request
"""
return {}

View File

@@ -23,7 +23,7 @@ from utilities.htmx import is_htmx
from utilities.permissions import get_permission_for_model
from utilities.tables import configure_table
from utilities.views import GetReturnURLMixin
from .base import GenericView
from .base import BaseMultiObjectView
__all__ = (
'BulkComponentCreateView',
@@ -36,7 +36,7 @@ __all__ = (
)
class ObjectListView(GenericView):
class ObjectListView(BaseMultiObjectView):
"""
Display multiple objects, all of the same type, as a table.
@@ -70,15 +70,6 @@ class ObjectListView(GenericView):
return table
def get_extra_context(self, request):
"""
Return any additional context data for the template.
Agrs:
request: The current request
"""
return {}
def get(self, request):
"""
GET request handler.
@@ -139,8 +130,8 @@ class ObjectListView(GenericView):
'permissions': permissions,
'action_buttons': self.action_buttons,
'filter_form': self.filterset_form(request.GET, label_suffix='') if self.filterset_form else None,
**self.get_extra_context(request),
}
context.update(self.get_extra_context(request))
return render(request, self.template_name, context)
@@ -196,7 +187,7 @@ class ObjectListView(GenericView):
return redirect(request.path)
class BulkCreateView(GetReturnURLMixin, GenericView):
class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView):
"""
Create new objects in bulk.
@@ -251,6 +242,7 @@ class BulkCreateView(GetReturnURLMixin, GenericView):
'form': form,
'model_form': model_form,
'return_url': self.get_return_url(request),
**self.get_extra_context(request),
})
def post(self, request):
@@ -295,10 +287,11 @@ class BulkCreateView(GetReturnURLMixin, GenericView):
'model_form': model_form,
'obj_type': model._meta.verbose_name,
'return_url': self.get_return_url(request),
**self.get_extra_context(request),
})
class BulkImportView(GetReturnURLMixin, GenericView):
class BulkImportView(GetReturnURLMixin, BaseMultiObjectView):
"""
Import objects in bulk (CSV format).
@@ -375,6 +368,7 @@ class BulkImportView(GetReturnURLMixin, GenericView):
'fields': self.model_form().fields,
'obj_type': self.model_form._meta.model._meta.verbose_name,
'return_url': self.get_return_url(request),
**self.get_extra_context(request),
})
def post(self, request):
@@ -423,10 +417,11 @@ class BulkImportView(GetReturnURLMixin, GenericView):
'fields': self.model_form().fields,
'obj_type': self.model_form._meta.model._meta.verbose_name,
'return_url': self.get_return_url(request),
**self.get_extra_context(request),
})
class BulkEditView(GetReturnURLMixin, GenericView):
class BulkEditView(GetReturnURLMixin, BaseMultiObjectView):
"""
Edit objects in bulk.
@@ -578,10 +573,11 @@ class BulkEditView(GetReturnURLMixin, GenericView):
'table': table,
'obj_type_plural': model._meta.verbose_name_plural,
'return_url': self.get_return_url(request),
**self.get_extra_context(request),
})
class BulkRenameView(GetReturnURLMixin, GenericView):
class BulkRenameView(GetReturnURLMixin, BaseMultiObjectView):
"""
An extendable view for renaming objects in bulk.
"""
@@ -668,7 +664,7 @@ class BulkRenameView(GetReturnURLMixin, GenericView):
})
class BulkDeleteView(GetReturnURLMixin, GenericView):
class BulkDeleteView(GetReturnURLMixin, BaseMultiObjectView):
"""
Delete objects in bulk.
@@ -684,6 +680,18 @@ class BulkDeleteView(GetReturnURLMixin, GenericView):
def get_required_permission(self):
return get_permission_for_model(self.queryset.model, 'delete')
def get_form(self):
"""
Provide a standard bulk delete form if none has been specified for the view
"""
class BulkDeleteForm(ConfirmationForm):
pk = ModelMultipleChoiceField(queryset=self.queryset, widget=MultipleHiddenInput)
if self.form:
return self.form
return BulkDeleteForm
def get(self, request):
return redirect(self.get_return_url(request))
@@ -746,26 +754,15 @@ class BulkDeleteView(GetReturnURLMixin, GenericView):
'obj_type_plural': model._meta.verbose_name_plural,
'table': table,
'return_url': self.get_return_url(request),
**self.get_extra_context(request),
})
def get_form(self):
"""
Provide a standard bulk delete form if none has been specified for the view
"""
class BulkDeleteForm(ConfirmationForm):
pk = ModelMultipleChoiceField(queryset=self.queryset, widget=MultipleHiddenInput)
if self.form:
return self.form
return BulkDeleteForm
#
# Device/VirtualMachine components
#
class BulkComponentCreateView(GetReturnURLMixin, GenericView):
class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView):
"""
Add one or more components (e.g. interfaces, console ports, etc.) to a set of Devices or VirtualMachines.
"""

View File

@@ -21,7 +21,7 @@ from utilities.permissions import get_permission_for_model
from utilities.tables import configure_table
from utilities.utils import normalize_querydict, prepare_cloned_fields
from utilities.views import GetReturnURLMixin
from .base import GenericView
from .base import BaseObjectView
__all__ = (
'ComponentCreateView',
@@ -33,13 +33,12 @@ __all__ = (
)
class ObjectView(GenericView):
class ObjectView(BaseObjectView):
"""
Retrieve a single object for display.
Note: If `template_name` is not specified, it will be determined automatically based on the queryset model.
"""
def get_required_permission(self):
return get_permission_for_model(self.queryset.model, 'view')
@@ -60,16 +59,6 @@ class ObjectView(GenericView):
model_opts = self.queryset.model._meta
return f'{model_opts.app_label}/{model_opts.model_name}.html'
def get_extra_context(self, request, instance):
"""
Return any additional context data for the template.
Args:
request: The current request
instance: The object being viewed
"""
return {}
def get(self, request, **kwargs):
"""
GET request handler. `*args` and `**kwargs` are passed to identify the object being queried.
@@ -152,7 +141,7 @@ class ObjectChildrenView(ObjectView):
})
class ObjectImportView(GetReturnURLMixin, GenericView):
class ObjectImportView(GetReturnURLMixin, BaseObjectView):
"""
Import a single object (YAML or JSON format).
@@ -291,7 +280,7 @@ class ObjectImportView(GetReturnURLMixin, GenericView):
})
class ObjectEditView(GetReturnURLMixin, GenericView):
class ObjectEditView(GetReturnURLMixin, BaseObjectView):
"""
Create or edit a single object.
@@ -362,6 +351,7 @@ class ObjectEditView(GetReturnURLMixin, GenericView):
'obj_type': self.queryset.model._meta.verbose_name,
'form': form,
'return_url': self.get_return_url(request, obj),
**self.get_extra_context(request, obj),
})
def post(self, request, *args, **kwargs):
@@ -435,10 +425,11 @@ class ObjectEditView(GetReturnURLMixin, GenericView):
'obj_type': self.queryset.model._meta.verbose_name,
'form': form,
'return_url': self.get_return_url(request, obj),
**self.get_extra_context(request, obj),
})
class ObjectDeleteView(GetReturnURLMixin, GenericView):
class ObjectDeleteView(GetReturnURLMixin, BaseObjectView):
"""
Delete a single object.
"""
@@ -481,6 +472,7 @@ class ObjectDeleteView(GetReturnURLMixin, GenericView):
'object_type': self.queryset.model._meta.verbose_name,
'form': form,
'form_url': form_url,
**self.get_extra_context(request, obj),
})
return render(request, self.template_name, {
@@ -488,6 +480,7 @@ class ObjectDeleteView(GetReturnURLMixin, GenericView):
'object_type': self.queryset.model._meta.verbose_name,
'form': form,
'return_url': self.get_return_url(request, obj),
**self.get_extra_context(request, obj),
})
def post(self, request, *args, **kwargs):
@@ -529,6 +522,7 @@ class ObjectDeleteView(GetReturnURLMixin, GenericView):
'object_type': self.queryset.model._meta.verbose_name,
'form': form,
'return_url': self.get_return_url(request, obj),
**self.get_extra_context(request, obj),
})
@@ -536,7 +530,7 @@ class ObjectDeleteView(GetReturnURLMixin, GenericView):
# Device/VirtualMachine components
#
class ComponentCreateView(GetReturnURLMixin, GenericView):
class ComponentCreateView(GetReturnURLMixin, BaseObjectView):
"""
Add one or more components (e.g. interfaces, console ports, etc.) to a Device or VirtualMachine.
"""