library/permissions.py

35 lines
1.0 KiB
Python

import grp
import os
import exceptions
class _PermissionLevel:
def __init__(self, group_name, pretty_name):
self.group_name = group_name
self.pretty_name = pretty_name
PERMISSION_OFFICE = _PermissionLevel("office", "Office worker")
PERMISSION_LIBCOM = _PermissionLevel("libcom", "Library Committee")
def check_permissions(permission_level):
def decorator(fn):
def wrapped_function(*args, **kwargs):
if not has_permission(permission_level):
raise exceptions.PermissionsError(permission_level.pretty_name)
return fn(*args, **kwargs)
return wrapped_function
return decorator
def has_permission(permission_level):
return permission_level.group_name in _CURRENT_GROUPS_GETTER()
def _current_group_names():
group_ids = os.getgroups()
group_names = [grp.getgrgid(group_id).gr_name for group_id in group_ids]
return group_names
# Hack to allow dependency injection for testing
_CURRENT_GROUPS_GETTER = _current_group_names