improved role management
Change-Id: Iaf87385269b2195ba964a951939deca6be938013
Signed-off-by: lombardofr <lombardo@everyup.it>
diff --git a/rolehandler/templates/modal/role_create.html b/rolehandler/templates/modal/role_create.html
index 58d68ca..d8282a7 100644
--- a/rolehandler/templates/modal/role_create.html
+++ b/rolehandler/templates/modal/role_create.html
@@ -17,9 +17,22 @@
<input class="form-control" id="rolename" name="name"
placeholder="Name" required>
</div>
+
</div>
-
-
+ <div class="form-group">
+ <div class="col-sm-6">
+ <div class="checkbox">
+ <label><input type="checkbox" id="create_root" name="root"> Root</label>
+ </div>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="definition" class="col-sm-3 control-label">Definition </label>
+ <div class="col-sm-6">
+ <textarea class="form-control" id="definition" name="definition" placeholder="Yaml definition"
+ rows="3"></textarea>
+ </div>
+ </div>
</div>
<div class="modal-footer">
diff --git a/rolehandler/templates/modal/role_edit.html b/rolehandler/templates/modal/role_edit.html
index 8541177..ca3c4c0 100644
--- a/rolehandler/templates/modal/role_edit.html
+++ b/rolehandler/templates/modal/role_edit.html
@@ -14,10 +14,26 @@
<div class="modal-body" id="modal_edit_role_body">
<div class="form-group">
- <label for="name" class="col-sm-3 control-label">Name</label>
+ <label for="rolename" class="col-sm-3 control-label">Name *</label>
<div class="col-sm-6">
- <input class="form-control" id="edit_role_name" name="role"
- placeholder="Name">
+ <input class="form-control" type="text" id="edit_rolename" name="name"
+ placeholder="Name" required>
+ </div>
+
+ </div>
+ <div class="form-group">
+ <div class="col-sm-6">
+ <div class="checkbox">
+ <label><input type="checkbox" id="edit_root" name="root"> Root</label>
+ </div>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label for="definition" class="col-sm-3 control-label">Definition </label>
+ <div class="col-sm-6">
+ <textarea class="form-control" id="edit_definition" name="definition" placeholder="Yaml definition"
+ rows="3"></textarea>
</div>
</div>
diff --git a/rolehandler/templates/role_list.html b/rolehandler/templates/role_list.html
index 5cf49a1..bfc7566 100644
--- a/rolehandler/templates/role_list.html
+++ b/rolehandler/templates/role_list.html
@@ -19,7 +19,7 @@
{% block breadcrumb_body %}
{{ block.super }}
- <li><a href="#">roles</a></li>
+ <li><a href="#">Roles</a></li>
{% endblock %}
{% block content_body %}
@@ -33,10 +33,10 @@
<div class="box">
<div class="box-header with-border">
- <h3 class="box-title">roles</h3>
+ <h3 class="box-title">Roles</h3>
<div class="box-tools">
<button type="button" class="btn btn-default" data-container="body"
- onclick="javascript:openModalCreateRole({'projects_list_url': '{% url "projects:projects_list" %}'})"
+ onclick="javascript:openModalCreateRole()"
data-toggle="tooltip" data-placement="top" title="New role">
<i class="fa fa-plus"></i> Create role
@@ -128,9 +128,9 @@
'data-toggle="dropdown" aria-expanded="false">Actions ' +
'<span class="fa fa-caret-down"></span></button> ' +
'<ul class="dropdown-menu">' +
- '<li> <a href="#" onclick="javascript:openModalEditRole({role_id:\'' + row['_id'] + '\', rolename:\'' + row['rolename'] + '\'})">' +
+ '<li> <a href="#" onclick="javascript:openModalEditRole({role_id:\'' + row['_id'] + '\'})">' +
'<i class="fa fa-edit"></i> Edit</a></li>' +
- '<li> <a href="#" onclick="javascript:deleteRole(\'' + row['_id'] + '\', \'' + row['rolename'] + '\')"' +
+ '<li> <a href="#" onclick="javascript:deleteRole(\'' + row['_id'] + '\', \'' + row['name'] + '\')"' +
'style="color:red"><i class="fa fa-trash"></i> Delete</a></li> </ul></div>';
},
"targets": 4,
@@ -197,7 +197,7 @@
table.ajax.reload();
bootbox.alert({
title: "Result",
- message: "role successfully modified."
+ message: "Role successfully modified."
});
}).fail(function (result) {
diff --git a/rolehandler/urls.py b/rolehandler/urls.py
index c37325d..64d7ab1 100644
--- a/rolehandler/urls.py
+++ b/rolehandler/urls.py
@@ -20,7 +20,8 @@
urlpatterns = [
url(r'^list$', views.role_list, name='list'),
url(r'^create$', views.create, name='create'),
- url(r'^(?P<user_id>[0-9a-zA-Z]+)/delete$', views.delete, name='delete'),
- url(r'^(?P<user_id>[0-9a-zA-Z]+)', views.update, name='update')
+ url(r'^(?P<role_id>[0-9a-zA-Z]+)/delete$', views.delete, name='delete'),
+ url(r'^(?P<role_id>[0-9a-zA-Z]+)/update$', views.update, name='update'),
+ url(r'^(?P<role_id>[0-9a-zA-Z]+)$', views.get, name='get')
]
diff --git a/rolehandler/views.py b/rolehandler/views.py
index f6a0799..a13e28d 100644
--- a/rolehandler/views.py
+++ b/rolehandler/views.py
@@ -17,6 +17,7 @@
from django.shortcuts import render, redirect
from sf_t3d.decorators import login_required
from django.http import HttpResponse
+import yaml
import json
import logging
import authosm.utils as osmutils
@@ -42,8 +43,21 @@
user = osmutils.get_user(request)
client = Client()
role_data ={
- 'name'
+ 'name': request.POST['name'],
+ 'root': True if request.POST.get('root') else False
}
+ try:
+ if 'definition' in request.POST and request.POST.get('definition') != '':
+ role_definition = yaml.load(request.POST.get('definition'))
+
+ if not isinstance(role_definition, dict):
+ raise ValueError('Role definition should be provided in a key-value fashion')
+ for key, value in role_definition.items():
+ if not isinstance(value, bool):
+ raise ValueError('Value in a role definition should be boolean')
+ role_data[key] = value
+ except Exception as e:
+ return __response_handler(request, {'status': 400, 'code': 'BAD_REQUEST', 'detail': e.message} , url=None, status=400)
result = client.role_create(user.get_token(), role_data)
if result['error']:
return __response_handler(request, result['data'], url=None,
@@ -70,21 +84,53 @@
@login_required
def update(request, role_id=None):
user = osmutils.get_user(request)
+ client = Client()
+ payload = {
+ '_id': role_id,
+ 'name': request.POST['name'],
+ 'root': True if request.POST.get('root') else False
+ }
try:
- client = Client()
- payload = {}
- if request.POST.get('name') and request.POST.get('name') is not '':
- payload["name"] = request.POST.get('name')
- update_res = client.role_update(user.get_token(), role_id, payload)
+ if 'definition' in request.POST and request.POST.get('definition') != '':
+ role_definition = yaml.load(request.POST.get('definition'))
+
+ if not isinstance(role_definition, dict):
+ raise ValueError('Role definition should be provided in a key-value fashion')
+ for key, value in role_definition.items():
+ if not isinstance(value, bool):
+ raise ValueError('Value in a role definition should be boolean')
+ payload[key] = value
except Exception as e:
- log.exception(e)
- update_res = {'error': True, 'data': str(e)}
- if update_res['error']:
- return __response_handler(request, update_res['data'], url=None,
- status=update_res['data']['status'] if 'status' in update_res['data'] else 500)
+ return __response_handler(request, {'status': 400, 'code': 'BAD_REQUEST', 'detail': e.message} , url=None, status=400)
+ result = client.role_update(user.get_token(), role_id, payload)
+ if result['error']:
+ return __response_handler(request, result['data'], url=None,
+ status=result['data']['status'] if 'status' in result['data'] else 500)
else:
return __response_handler(request, {}, url=None, status=200)
+@login_required
+def get(request, role_id=None):
+ user = osmutils.get_user(request)
+ try:
+ client = Client()
+ get_res = client.role_get(user.get_token(), role_id)
+ except Exception as e:
+ log.exception(e)
+ get_res = {'error': True, 'data': str(e)}
+ if get_res['error']:
+ return __response_handler(request, get_res['data'], url=None,
+ status=get_res['data']['status'] if 'status' in get_res['data'] else 500)
+ else:
+ role = get_res['data']
+ result = {
+ '_id': role['_id'],
+ 'name': role['name'],
+ 'root': role['root'],
+ 'definition': { key:value for key, value in role.items() if key not in ['_id', 'name', 'root', '_admin'] }
+ }
+ return __response_handler(request, result, url=None, status=200)
+
def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')