diff --git a/pyproject.toml b/pyproject.toml index e571243..2ff5219 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ dependencies = [ "whitenoise==6.6.0", "django-zen-queries==2.1.0", "django-registries==0.0.3", + "django-view-decorator==0.0.4", ] dynamic = ["version"] diff --git a/requirements/base.txt b/requirements/base.txt index 7213dee..4d4f8f1 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -30,6 +30,7 @@ django==5.0.1 # django-allauth # django-money # django-registries + # django-view-decorator # django-zen-queries # membersystem (pyproject.toml) django-allauth==0.60.0 @@ -40,6 +41,8 @@ django-money==3.4.1 # via membersystem (pyproject.toml) django-registries==0.0.3 # via membersystem (pyproject.toml) +django-view-decorator==0.0.4 + # via membersystem (pyproject.toml) django-zen-queries==2.1.0 # via membersystem (pyproject.toml) environs[django]==10.0.0 diff --git a/src/membership/views.py b/src/membership/views.py index a325e29..7655d12 100644 --- a/src/membership/views.py +++ b/src/membership/views.py @@ -1,6 +1,5 @@ -from django.contrib.auth.decorators import login_required -from django.contrib.auth.decorators import permission_required from django.utils.translation import gettext_lazy as _ +from django_view_decorator import namespaced_decorator_factory from .permissions import ADMINISTRATE_MEMBERS from .selectors import get_member @@ -12,7 +11,14 @@ from utils.view_utils import render_list from utils.view_utils import RowAction -@login_required +member_view = namespaced_decorator_factory(namespace="member", base_path="membership") + + +@member_view( + paths="", + name="membership-overview", + login_required=True, +) def membership_overview(request): memberships = get_memberships(member=request.user) current_membership = memberships.current() @@ -33,8 +39,18 @@ def membership_overview(request): ) -@login_required -@permission_required(ADMINISTRATE_MEMBERS.path) +admin_members_view = namespaced_decorator_factory( + namespace="admin-members", + base_path="admin", +) + + +@admin_members_view( + paths="members/", + name="list", + login_required=True, + permissions=[ADMINISTRATE_MEMBERS.path], +) def members_admin(request): users = get_members() @@ -54,15 +70,19 @@ def members_admin(request): row_actions=[ RowAction( label=_("View"), - url_name="admin-members-detail", + url_name="admin-members:detail", url_kwargs={"member_id": "id"}, ), ], ) -@login_required -@permission_required(ADMINISTRATE_MEMBERS.path) +@admin_members_view( + paths="/", + name="detail", + login_required=True, + permissions=[ADMINISTRATE_MEMBERS.path], +) def members_admin_detail(request, member_id): member = get_member(member_id=member_id) subscription_periods = get_subscription_periods(member=member) @@ -70,7 +90,7 @@ def members_admin_detail(request, member_id): context = { "member": member, "subscription_periods": subscription_periods, - "base_path": "admin-members", + "base_path": "admin-members:list", } return render( diff --git a/src/project/settings.py b/src/project/settings.py index 9c445eb..d59b19d 100644 --- a/src/project/settings.py +++ b/src/project/settings.py @@ -40,6 +40,7 @@ DJANGO_APPS = [ THIRD_PARTY_APPS = [ "allauth", "allauth.account", + "django_view_decorator", "django_registries", ] diff --git a/src/project/templates/base.html b/src/project/templates/base.html index dc94bce..6aaa0b3 100644 --- a/src/project/templates/base.html +++ b/src/project/templates/base.html @@ -64,7 +64,7 @@ {% if perms.membership.administrate_memberships %}
  • - + Admin
  • diff --git a/src/project/urls.py b/src/project/urls.py index ecc691b..17e788b 100644 --- a/src/project/urls.py +++ b/src/project/urls.py @@ -1,26 +1,12 @@ """URLs for the membersystem""" from django.conf import settings from django.contrib import admin -from django.contrib.auth.decorators import login_required from django.urls import include from django.urls import path - -from .views import index -from .views import services_overview -from membership.views import members_admin -from membership.views import members_admin_detail -from membership.views import membership_overview +from django_view_decorator import include_view_urls urlpatterns = [ - path("", login_required(index), name="index"), - path("services/", login_required(services_overview), name="services"), - path("membership/", membership_overview, name="membership-overview"), - path("admin/members/", members_admin, name="admin-members"), - path( - "admin/members//", - members_admin_detail, - name="admin-members-detail", - ), + path("", include_view_urls(extra_modules=["project.views"])), path("accounts/", include("allauth.urls")), path("_admin/", admin.site.urls), ] diff --git a/src/project/views.py b/src/project/views.py index b7ad26f..a8e8dae 100644 --- a/src/project/views.py +++ b/src/project/views.py @@ -1,12 +1,24 @@ +from django_view_decorator import view + from membership.models import ServiceAccess from services.registry import ServiceRegistry from utils.view_utils import render +@view( + paths="", + name="index", + login_required=True, +) def index(request): return render(request, "index.html") +@view( + paths="services/", + name="services", + login_required=True, +) def services_overview(request): active_services = [ access.service_implementation