diff --git a/src/fobi/permissions/default.py b/src/fobi/permissions/default.py index 137315ac..8eef475d 100644 --- a/src/fobi/permissions/default.py +++ b/src/fobi/permissions/default.py @@ -40,6 +40,7 @@ __all__ = ( "DeleteFormElementEntryPermission", "AddFormHandlerEntryPermission", "EditFormHandlerEntryPermission", + "DeleteFormHandlerEntryPermission", ) @@ -113,3 +114,12 @@ class EditFormHandlerEntryPermission(BasePermission): return login_required(request) and permissions_required_func( edit_form_handler_entry_permission )(request.user) + + +class DeleteFormHandlerEntryPermission(BasePermission): + """Permission to delete form handler entries.""" + + def has_permission(self, request, view) -> bool: + return login_required(request) and permissions_required_func( + delete_form_handler_entry_permission + )(request.user) diff --git a/src/fobi/urls/class_based/edit.py b/src/fobi/urls/class_based/edit.py index d8f7cbe5..fc79d6d8 100644 --- a/src/fobi/urls/class_based/edit.py +++ b/src/fobi/urls/class_based/edit.py @@ -36,6 +36,8 @@ from ...views.class_based import ( EditFormElementEntryView, DeleteFormElementEntryView, AddFormHandlerEntryView, + EditFormHandlerEntryView, + DeleteFormHandlerEntryView, ) __title__ = 'fobi.urls.class_based.edit' @@ -122,12 +124,14 @@ urlpatterns = [ # Edit form handler entry url(_(r'^forms/handlers/edit/(?P\d+)/$'), - edit_form_handler_entry, + # view=edit_form_handler_entry, + view=EditFormHandlerEntryView.as_view(), name='fobi.edit_form_handler_entry'), # Delete form handler entry url(_(r'^forms/handlers/delete/(?P\d+)/$'), - delete_form_handler_entry, + # view=delete_form_handler_entry, + view=DeleteFormHandlerEntryView.as_view(), name='fobi.delete_form_handler_entry'), # *********************************************************************** diff --git a/src/fobi/views/class_based.py b/src/fobi/views/class_based.py index e0543b90..c5179f64 100644 --- a/src/fobi/views/class_based.py +++ b/src/fobi/views/class_based.py @@ -51,6 +51,7 @@ from ..permissions.default import ( DeleteFormElementEntryPermission, AddFormHandlerEntryPermission, EditFormHandlerEntryPermission, + DeleteFormHandlerEntryPermission, ) from ..settings import DEBUG, GET_PARAM_INITIAL_DATA, SORT_PLUGINS_BY_VALUE from ..utils import ( @@ -76,6 +77,8 @@ __all__ = ( "EditFormElementEntryView", "DeleteFormElementEntryView", "AddFormHandlerEntryView", + "EditFormHandlerEntryView", + "DeleteFormHandlerEntryView", ) logger = logging.getLogger(__name__) @@ -827,7 +830,6 @@ class EditFormElementEntryView(PermissionMixin, UpdateView): form_entry, form_element_entry_id, form_element_plugin, - form_element_plugin, form_element_plugin_form_cls, obj, ) @@ -862,7 +864,6 @@ class EditFormElementEntryView(PermissionMixin, UpdateView): form_entry, form_element_entry_id, form_element_plugin, - form_element_plugin, form_element_plugin_form_cls, obj, ) = self.get_essential_objects( @@ -901,7 +902,6 @@ class EditFormElementEntryView(PermissionMixin, UpdateView): form_entry, form_element_entry_id, form_element_plugin, - form_element_plugin, form_element_plugin_form_cls, obj, ) = self.get_essential_objects( @@ -1204,3 +1204,184 @@ class AddFormHandlerEntryView(PermissionMixin, CreateView): # ***************************************************************************** # **************************** Edit form handler entry ************************ # ***************************************************************************** + + +class EditFormHandlerEntryView(PermissionMixin, UpdateView): + """Edit form handler entry view.""" + + template_name = None + form_class = None + theme = None + pk_url_kwarg = "form_handler_entry_id" + permission_classes = (EditFormHandlerEntryPermission,) + + def _get_queryset(self, request): + """Get queryset.""" + # TODO: The form element entry has also `form_entry__user` in + # `seleect_related`. Find out if that something that could + # be also be applied here to improve the performance. + return FormHandlerEntry._default_manager \ + .select_related('form_entry') \ + .filter(form_entry__user__pk=request.user.pk) + + def get_essential_objects( + self, + form_handler_entry_id, + request, + ): + """Get essential objects.""" + try: + obj = self.get_object(queryset=self._get_queryset(request)) + except ObjectDoesNotExist as err: + raise Http404(_("Form element entry not found.")) + + form_entry = obj.form_entry + form_handler_plugin = obj.get_plugin(request=request) + form_handler_plugin.request = request + + form_handler_plugin_form_cls = form_handler_plugin.get_form() + + return ( + form_entry, + form_handler_entry_id, + form_handler_plugin, + form_handler_plugin_form_cls, + obj, + ) + + def get_context_data(self, **kwargs): + """Get context data.""" + context = super(EditFormHandlerEntryView, self).get_context_data(**kwargs) + + if not self.theme: + theme = get_theme(request=self.request, as_instance=True) + else: + theme = self.theme + + if theme: + context.update({"fobi_theme": theme}) + return context + + def get_template_names(self): + """Get template names.""" + template_name = self.template_name + if not template_name: + if not self.theme: + theme = get_theme(request=self.request, as_instance=True) + else: + theme = self.theme + template_name = theme.edit_form_handler_entry_template + return [template_name] + + def get(self, request, *args, **kwargs): + """Handle GET requests: instantiate a blank version of the form.""" + ( + form_entry, + form_handler_entry_id, + form_handler_plugin, + form_handler_plugin_form_cls, + obj, + ) = self.get_essential_objects( + self.kwargs.get("form_handler_entry_id"), + self.request, + ) + self.object = obj + form = None + + if not form_handler_plugin_form_cls: + messages.info( + request, + _('The form handler plugin "{0}" is not ' + 'configurable!').format(form_handler_plugin.name) + ) + return redirect('fobi.edit_form_entry', form_entry_id=form_entry.pk) + + else: + form = form_handler_plugin.get_initialised_edit_form_or_404() + + return self.render_to_response( + self.get_context_data( + form=form, + form_entry=form_entry, + form_handler_plugin=form_handler_plugin, + ) + ) + + def post(self, request, *args, **kwargs): + """ + Handle POST requests: instantiate a form instance with the passed + POST variables and then check if it's valid. + """ + self.object = None + ( + form_entry, + form_handler_entry_id, + form_handler_plugin, + form_handler_plugin_form_cls, + obj, + ) = self.get_essential_objects( + self.kwargs.get("form_handler_entry_id"), + self.request, + ) + self.object = obj + + if not form_handler_plugin_form_cls: + messages.info( + request, + _('The form handler plugin "{0}" is not ' + 'configurable!').format(form_handler_plugin.name) + ) + return redirect('fobi.edit_form_entry', form_entry_id=form_entry.pk) + + form = form_handler_plugin.get_initialised_edit_form_or_404( + data=request.POST, + files=request.FILES + ) + + if form.is_valid(): + # Saving the plugin form data. + form.save_plugin_data(request=request) + + # Getting the plugin data. + obj.plugin_data = form.get_plugin_data(request=request) + + # Save the object. + obj.save() + + messages.info( + request, + _('The form handler plugin "{0}" was edited ' + 'successfully.').format(form_handler_plugin.name) + ) + + return redirect( + "{0}?active_tab=tab-form-handlers".format( + reverse_lazy( + 'fobi.edit_form_entry', + kwargs={'form_entry_id': form_entry.pk} + ) + ) + ) + + return self.render_to_response( + self.get_context_data( + form=form, + form_entry=form_entry, + form_handler_plugin=form_handler_plugin, + ) + ) + +# ***************************************************************************** +# **************************** Delete form handler entry ********************** +# ***************************************************************************** + + +class DeleteFormHandlerEntryView(AbstractDeletePluginEntryView): + """Delete form handler entry.""" + + model = FormHandlerEntry + permission_classes = (DeleteFormHandlerEntryPermission,) + pk_url_kwarg = "form_handler_entry_id" + get_user_plugin_uids_func = get_user_form_handler_plugin_uids + message = _('The form handler plugin "{0}" was deleted successfully.') + html_anchor = '?active_tab=tab-form-handlers' diff --git a/src/fobi/views/function_based.py b/src/fobi/views/function_based.py index d6806167..c829434a 100644 --- a/src/fobi/views/function_based.py +++ b/src/fobi/views/function_based.py @@ -1032,18 +1032,17 @@ def edit_form_handler_entry(request, raise Http404(gettext("Form handler entry not found.")) form_entry = obj.form_entry - form_handler_plugin = obj.get_plugin(request=request) form_handler_plugin.request = request - FormHandlerPluginForm = form_handler_plugin.get_form() + form_handler_plugin_form_cls = form_handler_plugin.get_form() form = None - if not FormHandlerPluginForm: + if not form_handler_plugin_form_cls: messages.info( request, gettext('The form handler plugin "{0}" is not ' - 'configurable!').format(form_handler_plugin.name) + 'configurable!').format(form_handler_plugin.name) ) return redirect('fobi.edit_form_entry', form_entry_id=form_entry.pk)