diff --git a/action/views.py b/action/views.py index e2ce896..f912045 100644 --- a/action/views.py +++ b/action/views.py @@ -2,6 +2,7 @@ from django.views import View from django.shortcuts import redirect, get_object_or_404 from django.contrib import messages from action.forms import ChangeStateForm, AddNoteForm +from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic.edit import DeleteView, CreateView, UpdateView, FormView from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ @@ -9,7 +10,7 @@ from action.models import State, StateDefinition, Note, DeviceLog from device.models import Device -class ChangeStateView(FormView): +class ChangeStateView(LoginRequiredMixin, FormView): form_class = ChangeStateForm def form_valid(self, form): @@ -42,7 +43,7 @@ class ChangeStateView(FormView): return self.request.META.get('HTTP_REFERER') or reverse_lazy('device:details') -class AddNoteView(FormView): +class AddNoteView(LoginRequiredMixin, FormView): form_class = AddNoteForm def form_valid(self, form): @@ -73,7 +74,7 @@ class AddNoteView(FormView): return self.request.META.get('HTTP_REFERER') or reverse_lazy('device:details') -class UpdateNoteView(UpdateView): +class UpdateNoteView(LoginRequiredMixin, UpdateView): model = Note fields = ['description'] pk_url_kwarg = 'pk' @@ -93,19 +94,19 @@ class UpdateNoteView(UpdateView): ) messages.success(self.request, "Note has been updated.") return super().form_valid(form) - + def form_invalid(self, form): new_description = form.cleaned_data.get('description', '').strip() if not new_description: messages.error(self.request, _("Note cannot be empty.")) super().form_invalid(form) return redirect(self.get_success_url()) - + def get_success_url(self): return self.request.META.get('HTTP_REFERER', reverse_lazy('device:details')) -class DeleteNoteView(View): +class DeleteNoteView(LoginRequiredMixin, View): model = Note def post(self, request, *args, **kwargs): diff --git a/admin/views.py b/admin/views.py index 5b2c0cc..df4cf16 100644 --- a/admin/views.py +++ b/admin/views.py @@ -25,7 +25,7 @@ class AdminView(DashboardView): response = super().get(*args, **kwargs) if not self.request.user.is_admin: raise Http403 - + return response class PanelView(AdminView, TemplateView): @@ -111,7 +111,7 @@ class EditUserView(AdminView, UpdateView): kwargs = super().get_form_kwargs() return kwargs - + class InstitutionView(AdminView, UpdateView): template_name = "institution.html" title = _("Edit institution") @@ -168,8 +168,9 @@ class AddStateDefinitionView(AdminView, StateDefinitionContextMixin, CreateView) messages.error(self.request, _("State is already defined.")) return self.form_invalid(form) - def form_invalid(self, form): - return super().form_invalid(form) + def form_invalid(self, form): + super().form_invalid(form) + return redirect(self.success_url) class DeleteStateDefinitionView(AdminView, StateDefinitionContextMixin, SuccessMessageMixin, DeleteView): @@ -218,14 +219,21 @@ class UpdateStateDefinitionView(AdminView, UpdateView): model = StateDefinition template_name = 'states_panel.html' fields = ['state'] + success_url = reverse_lazy('admin:states_panel') pk_url_kwarg = 'pk' def get_queryset(self): return StateDefinition.objects.filter(institution=self.request.user.institution) - def get_success_url(self): - messages.success(self.request, _("State definition updated successfully.")) - return reverse_lazy('admin:states_panel') - def form_valid(self, form): - return super().form_valid(form) + try: + response = super().form_valid(form) + messages.success(self.request, _("State definition updated successfully.")) + return response + except IntegrityError: + messages.error(self.request, _("State is already defined.")) + return self.form_invalid(form) + + def form_invalid(self, form): + super().form_invalid(form) + return redirect(self.get_success_url())