group_required decorator
authorArthur Darcet <arthur.darcet@m4x.org>
Sat, 2 Feb 2013 16:05:28 +0000 (17:05 +0100)
committerArthur Darcet <arthur.darcet@m4x.org>
Sat, 2 Feb 2013 16:05:33 +0000 (17:05 +0100)
xnet/accounts/decorators.py [new file with mode: 0644]
xnet/accounts/models.py
xnet/accounts/urls.py
xnet/accounts/views.py
xnet/templates/groups/home.html [moved from xnet/templates/groups/view.html with 100% similarity]
xnet/templates/groups/index.html

diff --git a/xnet/accounts/decorators.py b/xnet/accounts/decorators.py
new file mode 100644 (file)
index 0000000..4496b10
--- /dev/null
@@ -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
index c5c3362..6308429 100644 (file)
@@ -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)
index c50b6d1..772093c 100644 (file)
@@ -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'),
 )
index 358de78..e525b86 100644 (file)
@@ -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)})
index c6390fb..3d47d7f 100644 (file)
@@ -24,7 +24,7 @@
     <input type="text" class="search-field" data-target="{{ group.grouper }}_type" />
     <ul>
         {% for item in group.list %}
-          <li><a href="{% url 'accounts:group-view' item.pk %}">{{ item }}</a></li>
+          <li><a href="{% url 'accounts:group-home' item.pk %}">{{ item }}</a></li>
         {% endfor %}
     </ul>
 </div>