barker/barker/views/user.py

145 lines
5.4 KiB
Python

import re
import uuid
import transaction
from pyramid.response import Response
from pyramid.view import view_config
from barker.exceptions import ValidationFailure
from barker.models import Role, User
@view_config(request_method='POST', route_name='v1_users_new', renderer='json', permission='Users', trans=True)
def save(request):
json = request.json_body
item = User(json['name'], json['password'], json['lockedOut'])
request.dbsession.add(item)
add_roles(item, json['roles'], request.dbsession)
transaction.commit()
item = request.dbsession.query(User).filter(User.id == item.id).first()
roles = request.dbsession.query(Role).order_by(Role.name).all() if request.has_permission('Users') else []
return user_info(item, roles)
@view_config(request_method='PUT', route_name='v1_users_id', renderer='json', permission='Users', trans=True)
def update(request):
json = request.json_body
id_ = request.matchdict['id']
p = re.compile('^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$')
if p.match(id_):
item = request.dbsession.query(User).filter(User.id == uuid.UUID(id_)).one()
else:
item = request.dbsession.query(User).filter(User.name.ilike(id_)).first()
if item is None:
raise ValidationFailure('User name / id not found')
if request.has_permission('Users'):
item.name = json['name']
item.locked_out = json['lockedOut']
add_roles(item, json['roles'], request.dbsession)
if json['password'] != '' and json['password'] != item.password:
item.password = json['password']
transaction.commit()
item = request.dbsession.query(User).filter(User.id == item.id).first()
roles = request.dbsession.query(Role).order_by(Role.name).all() if request.has_permission('Users') else []
return user_info(item, roles)
@view_config(request_method='DELETE', route_name='v1_users_id', renderer='json', permission='Users', trans=True)
def delete(request):
id_ = request.matchdict['id']
if id_ is None:
response = Response("User is Null")
response.status_int = 500
return response
else:
response = Response("User deletion not implemented")
response.status_int = 500
return response
@view_config(request_method='POST', route_name='v1_users_id', renderer='json', request_param='p',
permission='Authenticated', trans=True)
def update_password(request):
json = request.json_body
name = request.matchdict['id']
old_password = json['oldPassword']
new_password = json['newPassword']
found, user = User.auth(name, old_password, request.dbsession)
if found:
user.password = new_password
transaction.commit()
return found
@view_config(request_method='GET', route_name='v1_users_id', renderer='json', permission='Authenticated')
def show_id(request):
id_ = request.matchdict['id']
p = re.compile('^[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}$')
if p.match(id_):
item = request.dbsession.query(User).filter(User.id == uuid.UUID(id_)).one()
else:
item = request.dbsession.query(User).filter(User.name.ilike(id_)).first()
if item is None:
raise ValidationFailure('User name / id not found')
roles = request.dbsession.query(Role).order_by(Role.name).all() if request.has_permission('Users') else []
return user_info(item, roles)
@view_config(request_method='GET', route_name='v1_users_new', renderer='json', permission='Authenticated')
def show_blank(request):
roles = request.dbsession.query(Role).order_by(Role.name).all() if request.has_permission('Users') else []
return user_info(None, roles)
@view_config(request_method='GET', route_name='v1_users_list', renderer='json', permission='Users')
def show_list(request):
list_ = request.dbsession.query(User).order_by(User.name).all()
return [{
'id': item.id,
'name': item.name,
'lockedOut': item.locked_out,
'roles': sorted(r.name for r in item.roles)
} for item in list_]
@view_config(request_method='GET', route_name='v1_users_list', renderer='json', request_param='names',
permission='Authenticated')
def show_name(request):
list = request.dbsession.query(User).filter(User.locked_out == False).order_by(User.name).all()
return [{'name': item.name} for item in list]
def user_info(item, roles):
if item is not None:
return {
'id': item.id,
'name': item.name,
'password': '',
'lockedOut': item.locked_out,
'roles': [
{'id': role.id, 'name': role.name, 'enabled': True if role in item.roles else False} for role in roles
]
}
else:
return {
'name': '',
'password': '',
'lockedOut': False,
'roles': [
{'id': role.id, 'name': role.name, 'enabled': False} for role in roles
]
}
def add_roles(user, roles, dbsession):
for role in roles:
id_ = uuid.UUID(role['id'])
ur = [r for r in user.roles if r.id == id_]
ur = None if len(ur) == 0 else ur[0]
if role['enabled'] and ur is None:
role_object = dbsession.query(Role).filter(Role.id == id_).one()
user.roles.append(role_object)
elif not role['enabled'] and ur:
user.roles.remove(ur)