From 25ff9d729fbf549c6fe29b4026212a221a003fde Mon Sep 17 00:00:00 2001 From: Arthur Darcet Date: Sat, 2 Feb 2013 17:05:28 +0100 Subject: [PATCH] group_required decorator --- xnet/accounts/decorators.py | 21 +++++++++++++++++++++ xnet/accounts/models.py | 3 ++- xnet/accounts/urls.py | 2 +- xnet/accounts/views.py | 4 ++-- xnet/templates/groups/{view.html => home.html} | 0 xnet/templates/groups/index.html | 2 +- 6 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 xnet/accounts/decorators.py rename xnet/templates/groups/{view.html => home.html} (100%) diff --git a/xnet/accounts/decorators.py b/xnet/accounts/decorators.py new file mode 100644 index 0000000..4496b10 --- /dev/null +++ b/xnet/accounts/decorators.py @@ -0,0 +1,21 @@ +from functools import wraps + +from django.http import HttpResponseForbidden +from django.shortcuts import get_object_or_404 + +from .models import XGroup, Membership + + +def group_required(view_func, level=Membership.LEVEL_MEMBER): + @wraps(view_func) + def _wrapped_view_func(request, group_id, *args, **kwargs): + group = get_object_or_404(XGroup, pk=group_id) + if request.user.memberships.filter( + xgroup=group, + level__gte=level, + state='enabled', + ).exists(): + return view_func(request, group, *args, **kwargs) + else: + return HttpResponseForbidden() + return _wrapped_view_func diff --git a/xnet/accounts/models.py b/xnet/accounts/models.py index c5c3362..6308429 100644 --- a/xnet/accounts/models.py +++ b/xnet/accounts/models.py @@ -104,6 +104,7 @@ class Membership(xwf_models.WorkflowEnabled, models.Model): class Meta: verbose_name = u"adhérent" verbose_name_plural = u"adhérents" + unique_together = ['xgroup', 'xuser'] def __unicode__(self): - return self.name + return u"{} {} de {} [{}]".format(self.xuser, dict(Membership.LEVEL_CHOICES)[self.level], self.xgroup, self.state) diff --git a/xnet/accounts/urls.py b/xnet/accounts/urls.py index c50b6d1..772093c 100644 --- a/xnet/accounts/urls.py +++ b/xnet/accounts/urls.py @@ -4,5 +4,5 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns( 'xnet.accounts.views', url(r'^$', 'index', name='group-list'), - url(r'^view/([0-9]+)$', 'view', name='group-view'), + url(r'^home/([0-9]+)$', 'home', name='group-home'), ) diff --git a/xnet/accounts/views.py b/xnet/accounts/views.py index 358de78..e525b86 100644 --- a/xnet/accounts/views.py +++ b/xnet/accounts/views.py @@ -7,5 +7,5 @@ from xnet.accounts.models import XGroup def index(request): return render(request, 'groups/index.html', {'groups': XGroup.objects.order_by('kind')}) -def view(request, pk): - return render(request, 'groups/view.html', {'group': get_object_or_404(XGroup, pk=pk)}) +def home(request, pk): + return render(request, 'groups/home.html', {'group': get_object_or_404(XGroup, pk=pk)}) diff --git a/xnet/templates/groups/view.html b/xnet/templates/groups/home.html similarity index 100% rename from xnet/templates/groups/view.html rename to xnet/templates/groups/home.html diff --git a/xnet/templates/groups/index.html b/xnet/templates/groups/index.html index c6390fb..3d47d7f 100644 --- a/xnet/templates/groups/index.html +++ b/xnet/templates/groups/index.html @@ -24,7 +24,7 @@ -- 2.1.4