diff --git a/conntrackt/views.py b/conntrackt/views.py --- a/conntrackt/views.py +++ b/conntrackt/views.py @@ -30,6 +30,7 @@ from django.contrib import messages from django.core.exceptions import ValidationError from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import Q +from django.db.models.deletion import Collector from django.http import HttpResponse from django.shortcuts import render_to_response, get_object_or_404 from django.views.generic import TemplateView, DetailView, CreateView, UpdateView, DeleteView, View @@ -65,6 +66,43 @@ class RedirectToNextMixin(object): return self.request.GET.get(self.next_parameter, super(RedirectToNextMixin, self).get_success_url()) +class RelatedItemsMixin(object): + """ + View mixin that adds related items of a referenced model object to context + data in form of a nested list, including the reference model object as the + first element of a list. + + The context data will be passed using the "related_items" key. + + This data can be used in the template by passing it through the + unordered_list template tag. + + The reference object is accessed via "object" property of calling view + (i.e. self.object). + + For more details on implementation, see: + + RelatedCollectorMixin.get_dependant_objects_representation method + """ + + def get_context_data(self, **kwargs): + """ + Adds the related items of a reference model object to context data. + + Returns: + Context data. + """ + + # Set the context using the parent class. + context = super(RelatedItemsMixin, self).get_context_data(**kwargs) + + # Add to context the nested list of string representations of related + # items. + context["related_items"] = self.object.get_dependant_objects_representation() + + return context + + class IndexView(MultiplePermissionsRequiredMixin, TemplateView): """ Custom view used for rendering the index page. @@ -337,7 +375,7 @@ class ProjectUpdateView(RedirectToNextMi return "Update project %s" % self.object.name -class ProjectDeleteView(RedirectToNextMixin, SetHeadlineMixin, MultiplePermissionsRequiredMixin, DeleteView): +class ProjectDeleteView(RelatedItemsMixin, RedirectToNextMixin, SetHeadlineMixin, MultiplePermissionsRequiredMixin, DeleteView): """ View for deleting a project. """ @@ -421,7 +459,7 @@ class LocationUpdateView(RedirectToNextM return "Update location %s" % self.object.name -class LocationDeleteView(RedirectToNextMixin, SetHeadlineMixin, MultiplePermissionsRequiredMixin, DeleteView): +class LocationDeleteView(RelatedItemsMixin, RedirectToNextMixin, SetHeadlineMixin, MultiplePermissionsRequiredMixin, DeleteView): """ View for deleting a location. """ @@ -538,7 +576,7 @@ class EntityUpdateView(RedirectToNextMix return "Update entity %s" % self.object.name -class EntityDeleteView(RedirectToNextMixin, SetHeadlineMixin, MultiplePermissionsRequiredMixin, DeleteView): +class EntityDeleteView(RelatedItemsMixin, RedirectToNextMixin, SetHeadlineMixin, MultiplePermissionsRequiredMixin, DeleteView): """ View for deleting an entity. """ @@ -694,7 +732,7 @@ class InterfaceUpdateView(RedirectToNext return "Update interface %s" % self.object.name -class InterfaceDeleteView(RedirectToNextMixin, SetHeadlineMixin, MultiplePermissionsRequiredMixin, DeleteView): +class InterfaceDeleteView(RelatedItemsMixin, RedirectToNextMixin, SetHeadlineMixin, MultiplePermissionsRequiredMixin, DeleteView): """ View for deleting an interface. """ @@ -887,7 +925,7 @@ class CommunicationUpdateView(RedirectTo return "Update communication %s" % self.object -class CommunicationDeleteView(RedirectToNextMixin, SetHeadlineMixin, MultiplePermissionsRequiredMixin, DeleteView): +class CommunicationDeleteView(RelatedItemsMixin, RedirectToNextMixin, SetHeadlineMixin, MultiplePermissionsRequiredMixin, DeleteView): """ View for deleting an communication. """