Add duplication check to SingleObjectCreateView
Add an extra step before creation of the instance to validate for duplication. Add the error_message_duplicate class attribute to allow customization of the error message. Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
@@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured, ValidationError
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.utils.encoding import force_text
|
from django.utils.encoding import force_text
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
@@ -349,6 +349,7 @@ class SimpleView(ViewPermissionCheckMixin, ExtraContextMixin, TemplateView):
|
|||||||
|
|
||||||
class SingleObjectCreateView(ObjectNameMixin, ViewPermissionCheckMixin, ExtraContextMixin, RedirectionMixin, FormExtraKwargsMixin, CreateView):
|
class SingleObjectCreateView(ObjectNameMixin, ViewPermissionCheckMixin, ExtraContextMixin, RedirectionMixin, FormExtraKwargsMixin, CreateView):
|
||||||
template_name = 'appearance/generic_form.html'
|
template_name = 'appearance/generic_form.html'
|
||||||
|
error_message_duplicate = None
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
# This overrides the original Django form_valid method
|
# This overrides the original Django form_valid method
|
||||||
@@ -364,6 +365,24 @@ class SingleObjectCreateView(ObjectNameMixin, ViewPermissionCheckMixin, ExtraCon
|
|||||||
else:
|
else:
|
||||||
save_extra_data = {}
|
save_extra_data = {}
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.object.validate_unique()
|
||||||
|
except ValidationError as exception:
|
||||||
|
context = self.get_context_data()
|
||||||
|
|
||||||
|
error_message = self.get_error_message_duplicate() or _(
|
||||||
|
'Duplicate data error: %(error)s'
|
||||||
|
) % {
|
||||||
|
'error': '\n'.join(exception.messages)
|
||||||
|
}
|
||||||
|
|
||||||
|
messages.error(
|
||||||
|
request=self.request, message=error_message
|
||||||
|
)
|
||||||
|
return super(
|
||||||
|
SingleObjectCreateView, self
|
||||||
|
).form_invalid(form=form)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.object.save(**save_extra_data)
|
self.object.save(**save_extra_data)
|
||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
@@ -391,6 +410,9 @@ class SingleObjectCreateView(ObjectNameMixin, ViewPermissionCheckMixin, ExtraCon
|
|||||||
|
|
||||||
return HttpResponseRedirect(self.get_success_url())
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
def get_error_message_duplicate(self):
|
||||||
|
return self.error_message_duplicate
|
||||||
|
|
||||||
|
|
||||||
class SingleObjectDynamicFormCreateView(DynamicFormViewMixin, SingleObjectCreateView):
|
class SingleObjectDynamicFormCreateView(DynamicFormViewMixin, SingleObjectCreateView):
|
||||||
pass
|
pass
|
||||||
@@ -550,18 +572,18 @@ class SingleObjectListView(ListModeMixin, PaginationMixin, ViewPermissionCheckMi
|
|||||||
return setting_paginate_by.value
|
return setting_paginate_by.value
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
self.field_name = self.get_sort_field()
|
|
||||||
if self.get_sort_order() == TEXT_SORT_ORDER_CHOICE_ASCENDING:
|
|
||||||
sort_order = ''
|
|
||||||
else:
|
|
||||||
sort_order = '-'
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
queryset = super(SingleObjectListView, self).get_queryset()
|
queryset = super(SingleObjectListView, self).get_queryset()
|
||||||
except ImproperlyConfigured:
|
except ImproperlyConfigured:
|
||||||
self.queryset = self.get_object_list()
|
self.queryset = self.get_object_list()
|
||||||
queryset = super(SingleObjectListView, self).get_queryset()
|
queryset = super(SingleObjectListView, self).get_queryset()
|
||||||
|
|
||||||
|
self.field_name = self.get_sort_field()
|
||||||
|
if self.get_sort_order() == TEXT_SORT_ORDER_CHOICE_ASCENDING:
|
||||||
|
sort_order = ''
|
||||||
|
else:
|
||||||
|
sort_order = '-'
|
||||||
|
|
||||||
if self.field_name:
|
if self.field_name:
|
||||||
queryset = queryset.order_by(
|
queryset = queryset.order_by(
|
||||||
'{}{}'.format(sort_order, self.field_name)
|
'{}{}'.format(sort_order, self.field_name)
|
||||||
|
|||||||
Reference in New Issue
Block a user