Allow overloading action_add and action_remove

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2019-04-28 00:57:54 -04:00
parent dda0f0d2af
commit 33056dec04
6 changed files with 47 additions and 32 deletions

View File

@@ -4,6 +4,7 @@ from django.conf import settings
from django.contrib import messages
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ImproperlyConfigured
from django.db import transaction
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.encoding import force_text
@@ -178,8 +179,8 @@ class AddRemoveView(ExternalObjectMixin, ExtraContextMixin, ViewPermissionCheckM
secondary_object_source_queryset = None
# Main object methods to use to add and remove selections
action_add_method = None
action_remove_method = None
main_object_method_add = None
main_object_method_remove = None
# If a method is not specified, use this related field to add and remove
# selections
@@ -196,32 +197,42 @@ class AddRemoveView(ExternalObjectMixin, ExtraContextMixin, ViewPermissionCheckM
super(AddRemoveView, self).__init__(*args, **kwargs)
def action_add(self, queryset):
if self.action_add_method:
kwargs = {'queryset': queryset}
kwargs.update(self.get_action_add_extra_kwargs())
kwargs.update(self.get_actions_extra_kwargs())
getattr(self.main_object, self.action_add_method)(**kwargs)
def _action_add(self, queryset):
kwargs = {'queryset': queryset}
kwargs.update(self.get_action_add_extra_kwargs())
kwargs.update(self.get_actions_extra_kwargs())
if hasattr(self, 'action_add'):
with transaction.atomic():
self.action_add(**kwargs)
elif self.main_object_method_add:
getattr(self.main_object, self.main_object_method_add)(**kwargs)
elif self.related_field:
getattr(self.main_object, self.related_field).add(*queryset)
else:
raise ImproperlyConfigured(
'View %s must be called with either an action_add_method, a '
'related_field.' % self.__class__.__name__
'View %s must be called with a main_object_method_add, a '
'related_field, or an action_add '
'method.' % self.__class__.__name__
)
def action_remove(self, queryset):
if self.action_remove_method:
kwargs = {'queryset': queryset}
kwargs.update(self.get_action_remove_extra_kwargs())
kwargs.update(self.get_actions_extra_kwargs())
getattr(self.main_object, self.action_remove_method)(**kwargs)
def _action_remove(self, queryset):
kwargs = {'queryset': queryset}
kwargs.update(self.get_action_remove_extra_kwargs())
kwargs.update(self.get_actions_extra_kwargs())
if hasattr(self, 'action_remove'):
with transaction.atomic():
self.action_remove(**kwargs)
elif self.main_object_method_remove:
getattr(self.main_object, self.main_object_method_remove)(**kwargs)
elif self.related_field:
getattr(self.main_object, self.related_field).remove(*queryset)
else:
raise ImproperlyConfigured(
'View %s must be called with either an action_remove_method, a '
'related_field.' % self.__class__.__name__
'View %s must be called with a main_object_method_remove, a '
'related_field, or an action_remove '
'method.' % self.__class__.__name__
)
def dispatch(self, request, *args, **kwargs):
@@ -237,7 +248,7 @@ class AddRemoveView(ExternalObjectMixin, ExtraContextMixin, ViewPermissionCheckM
pk__in=forms['form_available'].cleaned_data['selection']
)
self.action_add(queryset=selection_add)
self._action_add(queryset=selection_add)
if 'added-remove_all' in self.request.POST:
selection_remove = self.get_list_added_queryset()
@@ -246,7 +257,7 @@ class AddRemoveView(ExternalObjectMixin, ExtraContextMixin, ViewPermissionCheckM
pk__in=forms['form_added'].cleaned_data['selection']
)
self.action_remove(queryset=selection_remove)
self._action_remove(queryset=selection_remove)
return super(AddRemoveView, self).forms_valid(forms=forms)