Improve form and object data passing code.

This commit is contained in:
Roberto Rosario
2015-08-25 20:28:59 -04:00
parent 7a45164251
commit 72c63bfedc
3 changed files with 48 additions and 21 deletions

View File

@@ -249,7 +249,7 @@ class SimpleView(ViewPermissionCheckMixin, ExtraContextMixin, TemplateView):
pass pass
class SingleObjectCreateView(InstanceExtraDataMixin, ViewPermissionCheckMixin, ExtraContextMixin, RedirectionMixin, CreateView): class SingleObjectCreateView(ViewPermissionCheckMixin, ExtraContextMixin, RedirectionMixin, CreateView):
template_name = 'appearance/generic_form.html' template_name = 'appearance/generic_form.html'
def form_invalid(self, form): def form_invalid(self, form):
@@ -266,7 +266,21 @@ class SingleObjectCreateView(InstanceExtraDataMixin, ViewPermissionCheckMixin, E
return result return result
def form_valid(self, form): def form_valid(self, form):
result = super(SingleObjectCreateView, self).form_valid(form) # This overrides the original Django form_valid method
self.object = form.save(commit=False)
if hasattr(self, 'get_instance_extra_data'):
for key, value in self.get_instance_extra_data().items():
setattr(self.object, key, value)
if hasattr(self, 'get_save_extra_data'):
save_extra_data = self.get_save_extra_data()
else:
save_extra_data = {}
self.object.save(**save_extra_data)
try: try:
messages.success( messages.success(
self.request, self.request,
@@ -279,7 +293,7 @@ class SingleObjectCreateView(InstanceExtraDataMixin, ViewPermissionCheckMixin, E
self.request, _('New object created successfully.') self.request, _('New object created successfully.')
) )
return result return HttpResponseRedirect(self.get_success_url())
class SingleObjectDeleteView(DeleteExtraDataMixin, ViewPermissionCheckMixin, ObjectPermissionCheckMixin, ExtraContextMixin, RedirectionMixin, DeleteView): class SingleObjectDeleteView(DeleteExtraDataMixin, ViewPermissionCheckMixin, ObjectPermissionCheckMixin, ExtraContextMixin, RedirectionMixin, DeleteView):
@@ -332,7 +346,7 @@ class SingleObjectDetailView(ViewPermissionCheckMixin, ObjectPermissionCheckMixi
# TODO: check/test if ViewPermissionCheckMixin, ObjectPermissionCheckMixin are # TODO: check/test if ViewPermissionCheckMixin, ObjectPermissionCheckMixin are
# in the right MRO # in the right MRO
class SingleObjectEditView(InstanceExtraDataMixin, ViewPermissionCheckMixin, ObjectPermissionCheckMixin, ExtraContextMixin, RedirectionMixin, UpdateView): class SingleObjectEditView(ViewPermissionCheckMixin, ObjectPermissionCheckMixin, ExtraContextMixin, RedirectionMixin, UpdateView):
template_name = 'appearance/generic_form.html' template_name = 'appearance/generic_form.html'
def form_invalid(self, form): def form_invalid(self, form):
@@ -353,7 +367,20 @@ class SingleObjectEditView(InstanceExtraDataMixin, ViewPermissionCheckMixin, Obj
return result return result
def form_valid(self, form): def form_valid(self, form):
result = super(SingleObjectEditView, self).form_valid(form) # This overrides the original Django form_valid method
self.object = form.save(commit=False)
if hasattr(self, 'get_instance_extra_data'):
for key, value in self.get_instance_extra_data().items():
setattr(self.object, key, value)
if hasattr(self, 'get_save_extra_data'):
save_extra_data = self.get_save_extra_data()
else:
save_extra_data = {}
self.object.save(**save_extra_data)
try: try:
messages.success( messages.success(
@@ -367,7 +394,16 @@ class SingleObjectEditView(InstanceExtraDataMixin, ViewPermissionCheckMixin, Obj
self.request, _('Details saved successfully.') self.request, _('Details saved successfully.')
) )
return result return HttpResponseRedirect(self.get_success_url())
def get_object(self, queryset=None):
obj = super(SingleObjectEditView, self).get_object(queryset=queryset)
if hasattr(self, 'get_instance_extra_data'):
for key, value in self.get_instance_extra_data().items():
setattr(obj, key, value)
return obj
class SingleObjectListView(PaginationMixin, ViewPermissionCheckMixin, ObjectListPermissionFilterMixin, ExtraContextMixin, RedirectionMixin, ListView): class SingleObjectListView(PaginationMixin, ViewPermissionCheckMixin, ObjectListPermissionFilterMixin, ExtraContextMixin, RedirectionMixin, ListView):

View File

@@ -10,7 +10,7 @@ from acls.models import AccessControlList
from permissions import Permission from permissions import Permission
__all__ = ( __all__ = (
'DeleteExtraDataMixin', 'ExtraContextMixin', 'InstanceExtraDataMixin', 'DeleteExtraDataMixin', 'ExtraContextMixin',
'ObjectListPermissionFilterMixin', 'ObjectPermissionCheckMixin', 'ObjectListPermissionFilterMixin', 'ObjectPermissionCheckMixin',
'RedirectionMixin', 'ViewPermissionCheckMixin' 'RedirectionMixin', 'ViewPermissionCheckMixin'
) )
@@ -40,20 +40,6 @@ class ExtraContextMixin(object):
return context return context
class InstanceExtraDataMixin(object):
def form_valid(self, form):
if hasattr(self, 'get_instance_extra_data'):
self.object = form.save(commit=False)
for key, value in self.get_instance_extra_data().items():
setattr(self.object, key, value)
self.object.save()
else:
self.object = form.save()
return super(InstanceExtraDataMixin, self).form_valid(form)
class MultipleInstanceActionMixin(object): class MultipleInstanceActionMixin(object):
model = None model = None

View File

@@ -52,6 +52,11 @@ class DocumentCommentCreateView(SingleObjectCreateView):
'document': self.get_document(), 'user': self.request.user, 'document': self.get_document(), 'user': self.request.user,
} }
def get_save_extra_data(self):
return {
'_user': self.request.user,
}
def get_post_action_redirect(self): def get_post_action_redirect(self):
return reverse( return reverse(
'comments:comments_for_document', args=(self.kwargs['pk'],) 'comments:comments_for_document', args=(self.kwargs['pk'],)