barker/barker/views/role.py

93 lines
3.6 KiB
Python

import uuid
import transaction
from pyramid.response import Response
from pyramid.view import view_config
from barker.models import Permission, Role
@view_config(request_method='POST', route_name='v1_roles_new', renderer='json', permission='Users', trans=True)
def save(request):
item = Role(request.json_body['name'])
request.dbsession.add(item)
add_permissions(item, request.json_body['permissions'], request.dbsession)
transaction.commit()
item = request.dbsession.query(Role).filter(Role.id == item.id).first()
permissions = request.dbsession.query(Permission).order_by(Permission.name).all()
return role_info(item, permissions)
@view_config(request_method='PUT', route_name='v1_roles_id', renderer='json', permission='Users', trans=True)
def update(request):
id_ = request.matchdict['id']
item = request.dbsession.query(Role).filter(Role.id == uuid.UUID(id_)).one()
item.name = request.json_body['name']
add_permissions(item, request.json_body['permissions'], request.dbsession)
transaction.commit()
item = request.dbsession.query(Role).filter(Role.id == item.id).first()
permissions = request.dbsession.query(Permission).order_by(Permission.name).all()
return role_info(item, permissions)
def add_permissions(role, permissions, dbsession):
for permission in permissions:
id_ = uuid.UUID(permission['id'])
rp = [p for p in role.permissions if p.id == id_]
rp = None if len(rp) == 0 else rp[0]
if permission['enabled'] and rp is None:
permission_object = dbsession.query(Permission).filter(Permission.id == id_).one()
role.permissions.append(permission_object)
elif not permission['enabled'] and rp:
role.permissions.remove(rp)
@view_config(request_method='DELETE', route_name='v1_roles_id', renderer='json', permission='Users', trans=True)
def delete(request):
id_ = request.matchdict['id']
if id_ is None:
response = Response("Role is Null")
response.status_int = 500
return response
else:
response = Response("Role deletion not implemented")
response.status_int = 500
return response
@view_config(request_method='GET', route_name='v1_roles_id', renderer='json', permission='Authenticated')
def show_id(request):
id_ = uuid.UUID(request.matchdict['id'])
item = request.dbsession.query(Role).filter(Role.id == id_).first()
permissions = request.dbsession.query(Permission).order_by(Permission.name).all()
return role_info(item, permissions)
@view_config(request_method='GET', route_name='v1_roles_new', renderer='json', permission='Authenticated')
def show_blank(request):
permissions = request.dbsession.query(Permission).order_by(Permission.name).all()
return role_info(None, permissions)
@view_config(request_method='GET', route_name='v1_roles_list', renderer='json', permission='Authenticated')
def show_list(request):
list_ = request.dbsession.query(Role).order_by(Role.name).all()
return [
{'id': item.id, 'name': item.name, 'permissions': sorted(p.name for p in item.permissions)} for item in list_
]
def role_info(item, permissions):
if item is not None:
return {
'id': item.id,
'name': item.name,
'permissions': [{'id': p.id, 'name': p.name, 'enabled': True if p in item.permissions else False}
for p in permissions]
}
else:
return {
'name': '',
'permissions': [{'id': p.id, 'name': p.name, 'enabled': False} for p in permissions]
}