diff --git a/src/servala/frontend/templates/frontend/organizations/update.html b/src/servala/frontend/templates/frontend/organizations/update.html
index 234622a..0a0fb8b 100644
--- a/src/servala/frontend/templates/frontend/organizations/update.html
+++ b/src/servala/frontend/templates/frontend/organizations/update.html
@@ -9,10 +9,12 @@
{% partialdef org-name %}
{{ form.instance.name }}
+ {% if has_change_permission %}
+ {% endif %}
|
{% endpartialdef org-name %}
{% partialdef org-name-edit %}
diff --git a/src/servala/frontend/views/generic.py b/src/servala/frontend/views/generic.py
index 12300fd..a6846e7 100644
--- a/src/servala/frontend/views/generic.py
+++ b/src/servala/frontend/views/generic.py
@@ -1,18 +1,18 @@
from django.conf import settings
from django.urls import reverse_lazy
from django.utils.functional import cached_property
-from django.views.generic import TemplateView, UpdateView
+from django.views.generic import TemplateView
from servala.core.models import User
from servala.frontend.forms.profile import UserProfileForm
-from servala.frontend.views.mixins import HtmxMixin
+from servala.frontend.views.mixins import HtmxUpdateView
class IndexView(TemplateView):
template_name = "frontend/index.html"
-class ProfileView(HtmxMixin, UpdateView):
+class ProfileView(HtmxUpdateView):
template_name = "frontend/profile.html"
form_class = UserProfileForm
success_url = reverse_lazy("frontend:profile")
diff --git a/src/servala/frontend/views/mixins.py b/src/servala/frontend/views/mixins.py
index 6ab8f0f..055366f 100644
--- a/src/servala/frontend/views/mixins.py
+++ b/src/servala/frontend/views/mixins.py
@@ -1,14 +1,34 @@
from django.utils.functional import cached_property
-from django.views.generic import TemplateView
+from django.views.generic import UpdateView
+from rules.contrib.views import AutoPermissionRequiredMixin
-class HtmxMixin(TemplateView):
+class HtmxUpdateView(AutoPermissionRequiredMixin, UpdateView):
fragments = []
@cached_property
def is_htmx(self):
return self.request.headers.get("HX-Request")
+ @property
+ def permission_type(self):
+ if self.request.method == "POST" or getattr(
+ self, "_test_write_permission", False
+ ):
+ return "change"
+ return "view"
+
+ def has_change_permission(self):
+ self._test_write_permission = True
+ permission = self.get_permission_required()[0]
+ self._test_write_permission = False
+ return self.request.user.has_perm(permission, self.get_permission_object())
+
+ def get_context_data(self, **kwargs):
+ result = super().get_context_data(**kwargs)
+ result["has_change_permission"] = self.has_change_permission()
+ return result
+
def _get_fragment(self):
if self.request.method == "POST":
fragment = self.request.POST.get("fragment")
diff --git a/src/servala/frontend/views/organization.py b/src/servala/frontend/views/organization.py
index 91fcb2a..c91a251 100644
--- a/src/servala/frontend/views/organization.py
+++ b/src/servala/frontend/views/organization.py
@@ -1,14 +1,16 @@
from django.shortcuts import redirect
from django.utils.functional import cached_property
-from django.views.generic import FormView, TemplateView, UpdateView
+from django.views.generic import CreateView, DetailView
+from rules.contrib.views import AutoPermissionRequiredMixin
from servala.core.models import Organization
from servala.frontend.forms import OrganizationForm
-from servala.frontend.views.mixins import HtmxMixin
+from servala.frontend.views.mixins import HtmxUpdateView
-class OrganizationCreateView(FormView):
+class OrganizationCreateView(AutoPermissionRequiredMixin, CreateView):
form_class = OrganizationForm
+ model = Organization
template_name = "frontend/organizations/create.html"
def form_valid(self, form):
@@ -18,27 +20,32 @@ class OrganizationCreateView(FormView):
return redirect(instance.urls.base)
-class OrganizationDashboardView(TemplateView):
- template_name = "frontend/organizations/dashboard.html"
-
-
-class OrganizationUpdateView(HtmxMixin, UpdateView):
- template_name = "frontend/organizations/update.html"
- form_class = OrganizationForm
- fragments = ("org-name", "org-name-edit")
+class OrganizationViewMixin:
model = Organization
context_object_name = "organization"
- def get_success_url(self):
- return self.request.path
+ @cached_property
+ def organization(self):
+ return self.request.organization
def get_object(self):
- return self.request.organization
+ return self.organization
@cached_property
def object(self):
return self.get_object()
- def form_valid(self, form):
- form.save()
- return super().form_valid(form)
+
+class OrganizationDashboardView(
+ AutoPermissionRequiredMixin, OrganizationViewMixin, DetailView
+):
+ template_name = "frontend/organizations/dashboard.html"
+
+
+class OrganizationUpdateView(OrganizationViewMixin, HtmxUpdateView):
+ template_name = "frontend/organizations/update.html"
+ form_class = OrganizationForm
+ fragments = ("org-name", "org-name-edit")
+
+ def get_success_url(self):
+ return self.request.path