authz.py 2.82 KB
Newer Older
1 2 3 4
import logging
import sys

from django.contrib.auth.models import User, Group
5
from django.core.exceptions import PermissionDenied
6 7 8

from xmodule.modulestore import Location

9 10 11 12
# define a couple of simple roles, we just need ADMIN and EDITOR now for our purposes
ADMIN_ROLE_NAME = 'admin'
EDITOR_ROLE_NAME = 'editor'

13 14 15 16 17 18 19 20 21 22 23 24 25 26
# we're just making a Django group for each location/role combo
# to do this we're just creating a Group name which is a formatted string
# of those two variables
def get_course_groupname_for_role(location, role):
    loc = Location(location)
    groupname = loc.course_id  + ':' + role
    return groupname

def get_users_in_course_group_by_role(location, role):
    groupname = get_course_groupname_for_role(location, role)
    group = Group.objects.get(name=groupname)
    return group.user_set.all()


27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
'''
Create all permission groups for a new course and subscribe the caller into those roles
'''
def create_all_course_groups(creator, location):
    create_new_course_group(creator, location, ADMIN_GROUP_NAME)
    create_new_course_group(creator, location, EDITOR_GROUP_NAME)


def create_new_course_group(creator, location, role):
    groupname = get_course_groupname_for_role(location, role)
    (group, created) =Group.get_or_create(name=groupname)
    if created:
        group.save()

    creator.groups.add(group)
    creator.save()

    return


47
def add_user_to_course_group(caller, user, location, role):
48 49 50 51
    # only admins can add/remove other users
    if not is_user_in_course_group_role(caller, location, ADMIN_ROLE_NAME):
        raise PermissionDenied

52 53 54
    if user.is_active and user.is_authenticated:
        groupname = get_course_groupname_for_role(location, role)

55
        group = Group.objects.get(name=groupname)
56 57 58 59 60 61
        user.groups.add(group)
        user.save()
        return True

    return False

62

63 64
def get_user_by_email(email):
    user = None
65
    # try to look up user, return None if not found
66 67 68 69 70 71 72 73 74
    try:
        user = User.objects.get(email=email)
    except:
        pass

    return user


def remove_user_from_course_group(caller, user, location, role):
75 76 77
    # only admins can add/remove other users
    if not is_user_in_course_group_role(caller, location, ADMIN_ROLE_NAME):
        raise PermissionDenied
78

79
    # see if the user is actually in that role, if not then we don't have to do anything
80 81 82 83
    if is_user_in_course_group_role(user, location, role) == True:
        groupname = get_course_groupname_for_role(location, role)

        group = Group.objects.get(name=groupname)
84 85
        user.groups.remove(group)
        user.save()
86 87 88 89


def is_user_in_course_group_role(user, location, role):
    if user.is_active and user.is_authenticated:
90 91
        # all "is_staff" flagged accounts belong to all groups
        return user.is_staff or user.groups.filter(name=get_course_groupname_for_role(location,role)).count() > 0
92 93 94 95

    return False