vkk.generic.views

A collection of of reusable and extendable view classes.

  1"""
  2A collection of of reusable and extendable view classes.
  3"""
  4
  5from functools import reduce
  6from django.views.generic import (
  7    DetailView, CreateView, UpdateView, DeleteView, ListView, TemplateView
  8)
  9from django.db.models import Q
 10from django.http import JsonResponse
 11from django.core.exceptions import ImproperlyConfigured
 12from django.utils.translation import gettext_lazy as _
 13from .mixins import OnSuccessMixin
 14from .forms import FilterForm
 15
 16
 17class CustomDetailView(DetailView):
 18    """
 19    A generic view class providing customized version of the `DetailView` class.
 20    """
 21    fields = None
 22    action_options = {'update': _('Update'), 'delete': _('Delete')}
 23    template_name = 'vkk/generic/details.html'
 24
 25
 26class CustomCreateView(OnSuccessMixin, CreateView):
 27    """
 28    A generic view class providing customized version of the `CreateView` class.
 29    """
 30    on_success = 'create_success'
 31    template_name = 'vkk/generic/create.html'
 32
 33
 34class CustomUpdateView(OnSuccessMixin, UpdateView):
 35    """
 36    A generic view class providing customized version of the `UpdateView` class.
 37    """
 38    on_success = 'update_success'
 39    template_name = 'vkk/generic/update.html'
 40    drop_key = 'pk'
 41
 42
 43class CustomDeleteView(OnSuccessMixin, DeleteView):
 44    """
 45    A generic view class providing customized version of the `DeleteView` class.
 46    """
 47    on_success = 'delete_success'
 48    template_name = 'vkk/generic/delete.html'
 49    drop_key = 'pk'
 50
 51
 52class CustomSuccessView(OnSuccessMixin, TemplateView):
 53    """
 54    A generic view class offering some functionality for successful actions.
 55    """
 56    model = None
 57    on_success = 'default'
 58
 59
 60class CustomListView(ListView):
 61    """
 62    A generic view class providing customized and extended version of the
 63     `ListView` class.
 64    """
 65    keys = None
 66    fields = None
 67    paginate_by = 25
 68    action_options = {'update': _('Update'), 'delete': _('Delete')}
 69    template_name = 'vkk/generic/list.html'
 70
 71
 72class CustomFilterView(CustomListView):
 73    """
 74    A generic view class extending `CustomListView` with added functionality 
 75    for filtering objects.
 76    """
 77    template_name = 'vkk/generic/filter.html'
 78    filter_fields = None
 79
 80    def get_filter_fields(self):
 81        """
 82        Returns a list of fields associated with object model used for filtering.
 83        """
 84        if self.filter_fields is not None:
 85            return self.filter_fields
 86        elif self.fields is not None and self.fields != '__all__':
 87            return self.fields
 88        elif self.fields is None:
 89            raise ImproperlyConfigured(
 90                'filter_fields or fields not specified.')
 91        elif self.fields == '__all__':
 92            raise ImproperlyConfigured(
 93                "'__all__' not allowed (for security reasons).")
 94
 95    def get_filter(self):
 96        """
 97        Returns a list of arguments for the filter()-method on a manager.
 98        """
 99        filter_fields = self.get_filter_fields()
100        form = FilterForm(self.request.GET)
101        if form.is_valid():
102            parameters = form.cleaned_data['query'].split()
103        else:
104            parameters = []
105        if parameters:
106            qs = (
107                Q(
108                    **{field + '__icontains': str(param)}
109                ) for field in filter_fields for param in parameters
110            )
111            query_filter = reduce(lambda q1, q2: q1 | q2, qs)
112        else:
113            query_filter = ~Q(pk=None)
114        return query_filter
115
116    def get_queryset(self):
117        """
118        Returns a filtered queryset.
119        """
120        return super().get_queryset().filter(self.get_filter())
121
122    def get(self, request, *args, **kwargs):
123        if request.content_type == 'application/json':
124            query_values = self.get_queryset().values(
125                *self.get_filter_fields()
126            )
127            suggestions = [' '.join(
128                (str(val) for val in obj.values())
129            ) for obj in query_values]
130            return JsonResponse({'suggestions': suggestions})
131        else:
132            return super().get(request)
133
134    def get_context_data(self, **kwargs):
135        context = super().get_context_data(**kwargs)
136        context["filter_form"] = FilterForm()
137        return context
class CustomDetailView(django.views.generic.detail.DetailView):
18class CustomDetailView(DetailView):
19    """
20    A generic view class providing customized version of the `DetailView` class.
21    """
22    fields = None
23    action_options = {'update': _('Update'), 'delete': _('Delete')}
24    template_name = 'vkk/generic/details.html'

A generic view class providing customized version of the DetailView class.

fields = None
action_options = {'update': 'Ändern', 'delete': 'Löschen'}
template_name = 'vkk/generic/details.html'
Inherited Members
django.views.generic.base.View
View
http_method_names
view_is_async
as_view
setup
dispatch
http_method_not_allowed
options
django.views.generic.detail.SingleObjectTemplateResponseMixin
template_name_field
template_name_suffix
get_template_names
django.views.generic.base.TemplateResponseMixin
template_engine
response_class
content_type
render_to_response
django.views.generic.detail.BaseDetailView
get
django.views.generic.detail.SingleObjectMixin
model
queryset
slug_field
context_object_name
slug_url_kwarg
pk_url_kwarg
query_pk_and_slug
get_object
get_queryset
get_slug_field
get_context_object_name
get_context_data
django.views.generic.base.ContextMixin
extra_context
class CustomCreateView(vkk.generic.mixins.OnSuccessMixin, django.views.generic.edit.CreateView):
27class CustomCreateView(OnSuccessMixin, CreateView):
28    """
29    A generic view class providing customized version of the `CreateView` class.
30    """
31    on_success = 'create_success'
32    template_name = 'vkk/generic/create.html'

A generic view class providing customized version of the CreateView class.

on_success = 'create_success'
template_name = 'vkk/generic/create.html'
Inherited Members
django.views.generic.base.View
View
http_method_names
view_is_async
as_view
setup
dispatch
http_method_not_allowed
options
vkk.generic.mixins.OnSuccessMixin
drop_key
kwarg_override
get_success_url
django.views.generic.edit.CreateView
template_name_suffix
django.views.generic.detail.SingleObjectTemplateResponseMixin
template_name_field
get_template_names
django.views.generic.base.TemplateResponseMixin
template_engine
response_class
content_type
render_to_response
django.views.generic.edit.BaseCreateView
get
post
django.views.generic.edit.ModelFormMixin
fields
get_form_class
get_form_kwargs
form_valid
django.views.generic.edit.FormMixin
initial
form_class
success_url
prefix
get_initial
get_prefix
get_form
form_invalid
get_context_data
django.views.generic.detail.SingleObjectMixin
model
queryset
slug_field
context_object_name
slug_url_kwarg
pk_url_kwarg
query_pk_and_slug
get_object
get_queryset
get_slug_field
get_context_object_name
django.views.generic.base.ContextMixin
extra_context
django.views.generic.edit.ProcessFormView
put
class CustomUpdateView(vkk.generic.mixins.OnSuccessMixin, django.views.generic.edit.UpdateView):
35class CustomUpdateView(OnSuccessMixin, UpdateView):
36    """
37    A generic view class providing customized version of the `UpdateView` class.
38    """
39    on_success = 'update_success'
40    template_name = 'vkk/generic/update.html'
41    drop_key = 'pk'

A generic view class providing customized version of the UpdateView class.

on_success = 'update_success'
template_name = 'vkk/generic/update.html'
drop_key = 'pk'
Inherited Members
django.views.generic.base.View
View
http_method_names
view_is_async
as_view
setup
dispatch
http_method_not_allowed
options
vkk.generic.mixins.OnSuccessMixin
kwarg_override
get_success_url
django.views.generic.edit.UpdateView
template_name_suffix
django.views.generic.detail.SingleObjectTemplateResponseMixin
template_name_field
get_template_names
django.views.generic.base.TemplateResponseMixin
template_engine
response_class
content_type
render_to_response
django.views.generic.edit.BaseUpdateView
get
post
django.views.generic.edit.ModelFormMixin
fields
get_form_class
get_form_kwargs
form_valid
django.views.generic.edit.FormMixin
initial
form_class
success_url
prefix
get_initial
get_prefix
get_form
form_invalid
get_context_data
django.views.generic.detail.SingleObjectMixin
model
queryset
slug_field
context_object_name
slug_url_kwarg
pk_url_kwarg
query_pk_and_slug
get_object
get_queryset
get_slug_field
get_context_object_name
django.views.generic.base.ContextMixin
extra_context
django.views.generic.edit.ProcessFormView
put
class CustomDeleteView(vkk.generic.mixins.OnSuccessMixin, django.views.generic.edit.DeleteView):
44class CustomDeleteView(OnSuccessMixin, DeleteView):
45    """
46    A generic view class providing customized version of the `DeleteView` class.
47    """
48    on_success = 'delete_success'
49    template_name = 'vkk/generic/delete.html'
50    drop_key = 'pk'

A generic view class providing customized version of the DeleteView class.

on_success = 'delete_success'
template_name = 'vkk/generic/delete.html'
drop_key = 'pk'
Inherited Members
django.views.generic.edit.BaseDeleteView
BaseDeleteView
form_class
post
form_valid
vkk.generic.mixins.OnSuccessMixin
kwarg_override
get_success_url
django.views.generic.edit.DeleteView
template_name_suffix
django.views.generic.detail.SingleObjectTemplateResponseMixin
template_name_field
get_template_names
django.views.generic.base.TemplateResponseMixin
template_engine
response_class
content_type
render_to_response
django.views.generic.edit.DeletionMixin
success_url
delete
django.views.generic.edit.FormMixin
initial
prefix
get_initial
get_prefix
get_form_class
get_form
get_form_kwargs
form_invalid
get_context_data
django.views.generic.detail.BaseDetailView
get
django.views.generic.detail.SingleObjectMixin
model
queryset
slug_field
context_object_name
slug_url_kwarg
pk_url_kwarg
query_pk_and_slug
get_object
get_queryset
get_slug_field
get_context_object_name
django.views.generic.base.ContextMixin
extra_context
django.views.generic.base.View
http_method_names
view_is_async
as_view
setup
dispatch
http_method_not_allowed
options
class CustomSuccessView(vkk.generic.mixins.OnSuccessMixin, django.views.generic.base.TemplateView):
53class CustomSuccessView(OnSuccessMixin, TemplateView):
54    """
55    A generic view class offering some functionality for successful actions.
56    """
57    model = None
58    on_success = 'default'

A generic view class offering some functionality for successful actions.

model = None
on_success = 'default'
Inherited Members
django.views.generic.base.View
View
http_method_names
view_is_async
as_view
setup
dispatch
http_method_not_allowed
options
vkk.generic.mixins.OnSuccessMixin
drop_key
kwarg_override
get_success_url
django.views.generic.base.TemplateView
get
django.views.generic.base.TemplateResponseMixin
template_name
template_engine
response_class
content_type
render_to_response
get_template_names
django.views.generic.base.ContextMixin
extra_context
get_context_data
class CustomListView(django.views.generic.list.ListView):
61class CustomListView(ListView):
62    """
63    A generic view class providing customized and extended version of the
64     `ListView` class.
65    """
66    keys = None
67    fields = None
68    paginate_by = 25
69    action_options = {'update': _('Update'), 'delete': _('Delete')}
70    template_name = 'vkk/generic/list.html'

A generic view class providing customized and extended version of the ListView class.

keys = None
fields = None
paginate_by = 25
action_options = {'update': 'Ändern', 'delete': 'Löschen'}
template_name = 'vkk/generic/list.html'
Inherited Members
django.views.generic.base.View
View
http_method_names
view_is_async
as_view
setup
dispatch
http_method_not_allowed
options
django.views.generic.list.MultipleObjectTemplateResponseMixin
template_name_suffix
get_template_names
django.views.generic.base.TemplateResponseMixin
template_engine
response_class
content_type
render_to_response
django.views.generic.list.BaseListView
get
django.views.generic.list.MultipleObjectMixin
allow_empty
queryset
model
paginate_orphans
context_object_name
paginator_class
page_kwarg
ordering
get_queryset
get_ordering
paginate_queryset
get_paginate_by
get_paginator
get_paginate_orphans
get_allow_empty
get_context_object_name
get_context_data
django.views.generic.base.ContextMixin
extra_context
class CustomFilterView(CustomListView):
 73class CustomFilterView(CustomListView):
 74    """
 75    A generic view class extending `CustomListView` with added functionality 
 76    for filtering objects.
 77    """
 78    template_name = 'vkk/generic/filter.html'
 79    filter_fields = None
 80
 81    def get_filter_fields(self):
 82        """
 83        Returns a list of fields associated with object model used for filtering.
 84        """
 85        if self.filter_fields is not None:
 86            return self.filter_fields
 87        elif self.fields is not None and self.fields != '__all__':
 88            return self.fields
 89        elif self.fields is None:
 90            raise ImproperlyConfigured(
 91                'filter_fields or fields not specified.')
 92        elif self.fields == '__all__':
 93            raise ImproperlyConfigured(
 94                "'__all__' not allowed (for security reasons).")
 95
 96    def get_filter(self):
 97        """
 98        Returns a list of arguments for the filter()-method on a manager.
 99        """
100        filter_fields = self.get_filter_fields()
101        form = FilterForm(self.request.GET)
102        if form.is_valid():
103            parameters = form.cleaned_data['query'].split()
104        else:
105            parameters = []
106        if parameters:
107            qs = (
108                Q(
109                    **{field + '__icontains': str(param)}
110                ) for field in filter_fields for param in parameters
111            )
112            query_filter = reduce(lambda q1, q2: q1 | q2, qs)
113        else:
114            query_filter = ~Q(pk=None)
115        return query_filter
116
117    def get_queryset(self):
118        """
119        Returns a filtered queryset.
120        """
121        return super().get_queryset().filter(self.get_filter())
122
123    def get(self, request, *args, **kwargs):
124        if request.content_type == 'application/json':
125            query_values = self.get_queryset().values(
126                *self.get_filter_fields()
127            )
128            suggestions = [' '.join(
129                (str(val) for val in obj.values())
130            ) for obj in query_values]
131            return JsonResponse({'suggestions': suggestions})
132        else:
133            return super().get(request)
134
135    def get_context_data(self, **kwargs):
136        context = super().get_context_data(**kwargs)
137        context["filter_form"] = FilterForm()
138        return context

A generic view class extending CustomListView with added functionality for filtering objects.

template_name = 'vkk/generic/filter.html'
filter_fields = None
def get_filter_fields(self):
81    def get_filter_fields(self):
82        """
83        Returns a list of fields associated with object model used for filtering.
84        """
85        if self.filter_fields is not None:
86            return self.filter_fields
87        elif self.fields is not None and self.fields != '__all__':
88            return self.fields
89        elif self.fields is None:
90            raise ImproperlyConfigured(
91                'filter_fields or fields not specified.')
92        elif self.fields == '__all__':
93            raise ImproperlyConfigured(
94                "'__all__' not allowed (for security reasons).")

Returns a list of fields associated with object model used for filtering.

def get_filter(self):
 96    def get_filter(self):
 97        """
 98        Returns a list of arguments for the filter()-method on a manager.
 99        """
100        filter_fields = self.get_filter_fields()
101        form = FilterForm(self.request.GET)
102        if form.is_valid():
103            parameters = form.cleaned_data['query'].split()
104        else:
105            parameters = []
106        if parameters:
107            qs = (
108                Q(
109                    **{field + '__icontains': str(param)}
110                ) for field in filter_fields for param in parameters
111            )
112            query_filter = reduce(lambda q1, q2: q1 | q2, qs)
113        else:
114            query_filter = ~Q(pk=None)
115        return query_filter

Returns a list of arguments for the filter()-method on a manager.

def get_queryset(self):
117    def get_queryset(self):
118        """
119        Returns a filtered queryset.
120        """
121        return super().get_queryset().filter(self.get_filter())

Returns a filtered queryset.

def get(self, request, *args, **kwargs):
123    def get(self, request, *args, **kwargs):
124        if request.content_type == 'application/json':
125            query_values = self.get_queryset().values(
126                *self.get_filter_fields()
127            )
128            suggestions = [' '.join(
129                (str(val) for val in obj.values())
130            ) for obj in query_values]
131            return JsonResponse({'suggestions': suggestions})
132        else:
133            return super().get(request)
def get_context_data(self, **kwargs):
135    def get_context_data(self, **kwargs):
136        context = super().get_context_data(**kwargs)
137        context["filter_form"] = FilterForm()
138        return context

Get the context for this view.

Inherited Members
django.views.generic.base.View
View
http_method_names
view_is_async
as_view
setup
dispatch
http_method_not_allowed
options
CustomListView
keys
fields
paginate_by
action_options
django.views.generic.list.MultipleObjectTemplateResponseMixin
template_name_suffix
get_template_names
django.views.generic.base.TemplateResponseMixin
template_engine
response_class
content_type
render_to_response
django.views.generic.list.MultipleObjectMixin
allow_empty
queryset
model
paginate_orphans
context_object_name
paginator_class
page_kwarg
ordering
get_ordering
paginate_queryset
get_paginate_by
get_paginator
get_paginate_orphans
get_allow_empty
get_context_object_name
django.views.generic.base.ContextMixin
extra_context