Skip to content

Instantly share code, notes, and snippets.

@CapnKernel
Created August 4, 2016 14:17
Show Gist options
  • Save CapnKernel/ec97d0ad86d92418c15f06692ef37f19 to your computer and use it in GitHub Desktop.
Save CapnKernel/ec97d0ad86d92418c15f06692ef37f19 to your computer and use it in GitHub Desktop.
Groups for Django
from .require_group import group_required
# -*- coding: utf-8 -*-
from django.contrib.auth.decorators import login_required, user_passes_test
# https://djangosnippets.org/snippets/1703/
def group_required(*group_names):
"""Requires user membership in at least one of the groups passed in."""
def in_groups(u):
return u.is_authenticated() and u.is_active and (u.is_superuser or u.groups.filter(name__in=group_names).exists())
return user_passes_test(in_groups)
# -*- coding: utf-8 -*-
from django import template
register = template.Library()
# http://www.abidibo.net/blog/2014/05/22/check-if-user-belongs-group-django-templates/
from django.contrib.auth.models import Group
register = template.Library()
@register.filter(name='in_group')
def in_group(user, groups):
groups_split = groups.split(':')
return user.is_authenticated() and user.is_active and (user.is_superuser or user.groups.filter(name__in=groups_split).exists())
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.contrib.auth.models import User, Group, AnonymousUser
from django.contrib.auth.decorators import login_required
from django.test import TestCase
from django.test.client import RequestFactory
from django.test.utils import setup_test_environment
from groups import group_required
def unprotected_fn(request):
# print "in unprotected_fn"
return HttpResponse('called')
@login_required
def login_required_fn(request):
# print "in login_required"
return HttpResponse('called')
@group_required('money')
def group_required_fn(request):
# print "in group_required"
return HttpResponse('called')
def gotRedirected(res):
# print "res=", res.__dict__
l = res._headers['location']
# This URL is the redirect to my login page. You'll need to replace it with something else.
return len(res._container) == 1 and res._container[0] == u'' and len(l) == 2 and l[0] == 'Location' and l[1].startswith('/my/login?next=')
def wasCalled(res):
return len(res._container) == 1 and res._container[0] == 'called' and 'location' not in res._headers
class GroupRequiredDecoratorTest(TestCase):
def setUp(self):
setup_test_environment()
u_has_money = User.objects.create_user(username = 'has_money')
u_no_money = User.objects.create_user(username = 'no_money')
money_group = Group(name='money')
money_group.save()
u_has_money.groups.add(money_group)
def test_decorator(self):
u_anon = AnonymousUser()
u_has_money = User.objects.get(username='has_money')
u_no_money = User.objects.get(username='no_money')
self.assertTrue(u_has_money.is_authenticated())
rf = RequestFactory()
req = rf.request()
req.user = u_anon
self.assertTrue(wasCalled(unprotected_fn(req)))
req.user = u_has_money
self.assertTrue(wasCalled(unprotected_fn(req)))
req.user = u_no_money
self.assertTrue(wasCalled(unprotected_fn(req)))
req.user = u_anon
self.assertTrue(gotRedirected(login_required_fn(req)))
req.user = u_has_money
self.assertTrue(wasCalled(login_required_fn(req)))
req.user = u_no_money
self.assertTrue(wasCalled(login_required_fn(req)))
req.user = u_anon
self.assertTrue(gotRedirected(group_required_fn(req)))
req.user = u_has_money
self.assertTrue(wasCalled(group_required_fn(req)))
req.user = u_no_money
self.assertTrue(gotRedirected(group_required_fn(req)))
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.template import RequestContext, Template
from django.contrib.auth.models import User, Group, AnonymousUser
from django.contrib.auth.decorators import login_required
from django.test import TestCase
from django.test.client import RequestFactory
from django.test.utils import setup_test_environment
def view_using_tag(request):
template = Template(u'{% load groups %}in_group: {% if user|in_group:"money" %}True{% else %}False{% endif %}')
context = RequestContext(request, {
'user': request.user,
})
return HttpResponse(template.render(context))
def is_in_group(res, b):
c = res._container
# print "c=", c
return len(c) == 1 and c[0] == "in_group: %s" % b
class InGroupTagTest(TestCase):
def setUp(self):
setup_test_environment()
u_has_money = User.objects.create_user(username = 'has_money')
u_no_money = User.objects.create_user(username = 'no_money')
money_group = Group(name='money')
money_group.save()
u_has_money.groups.add(money_group)
def test_tag(self):
u_anon = AnonymousUser()
u_has_money = User.objects.get(username='has_money')
u_no_money = User.objects.get(username='no_money')
self.assertTrue(u_has_money.is_authenticated())
rf = RequestFactory()
req = rf.request()
req.user = u_anon
self.assertTrue(is_in_group(view_using_tag(req), False))
req.user = u_has_money
self.assertTrue(is_in_group(view_using_tag(req), True))
req.user = u_no_money
self.assertTrue(is_in_group(view_using_tag(req), False))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment