Created
August 4, 2016 14:17
-
-
Save CapnKernel/ec97d0ad86d92418c15f06692ef37f19 to your computer and use it in GitHub Desktop.
Groups for Django
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from .require_group import group_required |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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