145 lines
5.4 KiB
Python
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)
|