blob: dba444d99682285bba46ec0f7ba43a0edfe6fc80 [file] [log] [blame]
lombardofr8da23132019-06-02 17:18:48 +02001#
2# Copyright 2019 EveryUP Srl
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16
17from django.shortcuts import render, redirect
18from sf_t3d.decorators import login_required
19from django.http import HttpResponse
lombardofr55d48e72019-06-21 19:35:14 +020020import yaml
lombardofr8da23132019-06-02 17:18:48 +020021import json
22import logging
23import authosm.utils as osmutils
24from lib.osm.osmclient.clientv2 import Client
25
26logging.basicConfig(level=logging.DEBUG)
27log = logging.getLogger(__name__)
28
29
30@login_required
31def role_list(request):
32 user = osmutils.get_user(request)
33 client = Client()
34 result = client.role_list(user.get_token())
35 result = {
36 'roles': result['data'] if result and result['error'] is False else []
37 }
38 return __response_handler(request, result, 'role_list.html')
39
40
41@login_required
42def create(request):
43 user = osmutils.get_user(request)
44 client = Client()
lombardofr158d8732019-11-24 21:45:41 +010045 role_data = {
lombardofr55d48e72019-06-21 19:35:14 +020046 'name': request.POST['name'],
lombardofr8da23132019-06-02 17:18:48 +020047 }
lombardofr55d48e72019-06-21 19:35:14 +020048 try:
lombardofr5bc5ebb2019-08-19 09:33:56 +020049 if 'permissions' in request.POST and request.POST.get('permissions') != '':
50 role_permissions = yaml.load(request.POST.get('permissions'))
lombardofr55d48e72019-06-21 19:35:14 +020051
lombardofr5bc5ebb2019-08-19 09:33:56 +020052 if not isinstance(role_permissions, dict):
lombardofr158d8732019-11-24 21:45:41 +010053 raise ValueError('Role permissions should be provided in a key-value fashion')
lombardofr5bc5ebb2019-08-19 09:33:56 +020054 for key, value in role_permissions.items():
lombardofr55d48e72019-06-21 19:35:14 +020055 if not isinstance(value, bool):
lombardofr5bc5ebb2019-08-19 09:33:56 +020056 raise ValueError("Value of '{}' in a role permissionss should be boolean".format(key))
lombardofr55d48e72019-06-21 19:35:14 +020057 role_data[key] = value
58 except Exception as e:
lombardofr158d8732019-11-24 21:45:41 +010059 return __response_handler(request, {'status': 400, 'code': 'BAD_REQUEST', 'detail': e.message}, url=None, status=400)
lombardofr8da23132019-06-02 17:18:48 +020060 result = client.role_create(user.get_token(), role_data)
61 if result['error']:
62 return __response_handler(request, result['data'], url=None,
63 status=result['data']['status'] if 'status' in result['data'] else 500)
64 else:
65 return __response_handler(request, {}, url=None, status=200)
66
67
68@login_required
69def delete(request, role_id=None):
70 user = osmutils.get_user(request)
71 try:
72 client = Client()
73 result = client.role_delete(user.get_token(), role_id)
74 except Exception as e:
75 log.exception(e)
76 result = {'error': True, 'data': str(e)}
77 if result['error']:
78 return __response_handler(request, result['data'], url=None,
79 status=result['data']['status'] if 'status' in result['data'] else 500)
80 else:
81 return __response_handler(request, {}, url=None, status=200)
82
lombardofr158d8732019-11-24 21:45:41 +010083
lombardofr8da23132019-06-02 17:18:48 +020084@login_required
85def update(request, role_id=None):
86 user = osmutils.get_user(request)
lombardofr55d48e72019-06-21 19:35:14 +020087 client = Client()
88 payload = {
lombardofr55d48e72019-06-21 19:35:14 +020089 'name': request.POST['name'],
lombardofr158d8732019-11-24 21:45:41 +010090 'permissions': {}
lombardofr55d48e72019-06-21 19:35:14 +020091 }
lombardofr8da23132019-06-02 17:18:48 +020092 try:
lombardofr5bc5ebb2019-08-19 09:33:56 +020093 if 'permissions' in request.POST and request.POST.get('permissions') != '':
94 role_permissions = yaml.load(request.POST.get('permissions'))
lombardofr55d48e72019-06-21 19:35:14 +020095
lombardofr5bc5ebb2019-08-19 09:33:56 +020096 if not isinstance(role_permissions, dict):
97 raise ValueError('Role permissions should be provided in a key-value fashion')
98 for key, value in role_permissions.items():
lombardofr55d48e72019-06-21 19:35:14 +020099 if not isinstance(value, bool):
lombardofr5bc5ebb2019-08-19 09:33:56 +0200100 raise ValueError('Value in a role permissions should be boolean')
lombardofr158d8732019-11-24 21:45:41 +0100101 payload['permissions'][key] = value
lombardofr8da23132019-06-02 17:18:48 +0200102 except Exception as e:
lombardofr158d8732019-11-24 21:45:41 +0100103 return __response_handler(request, {'status': 400, 'code': 'BAD_REQUEST', 'detail': e.message}, url=None, status=400)
lombardofr55d48e72019-06-21 19:35:14 +0200104 result = client.role_update(user.get_token(), role_id, payload)
105 if result['error']:
106 return __response_handler(request, result['data'], url=None,
107 status=result['data']['status'] if 'status' in result['data'] else 500)
lombardofr8da23132019-06-02 17:18:48 +0200108 else:
109 return __response_handler(request, {}, url=None, status=200)
110
lombardofr158d8732019-11-24 21:45:41 +0100111
lombardofr55d48e72019-06-21 19:35:14 +0200112@login_required
113def get(request, role_id=None):
114 user = osmutils.get_user(request)
115 try:
116 client = Client()
117 get_res = client.role_get(user.get_token(), role_id)
118 except Exception as e:
119 log.exception(e)
120 get_res = {'error': True, 'data': str(e)}
121 if get_res['error']:
122 return __response_handler(request, get_res['data'], url=None,
123 status=get_res['data']['status'] if 'status' in get_res['data'] else 500)
124 else:
125 role = get_res['data']
126 result = {
127 '_id': role['_id'],
128 'name': role['name'],
lombardofr158d8732019-11-24 21:45:41 +0100129 'permissions': {key: value for key, value in role['permissions'].items() if key not in ['_id', 'name', 'root', '_admin'] }
lombardofr55d48e72019-06-21 19:35:14 +0200130 }
131 return __response_handler(request, result, url=None, status=200)
132
lombardofr8da23132019-06-02 17:18:48 +0200133
134def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
135 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
136 if 'application/json' in raw_content_types or url is None:
137 return HttpResponse(json.dumps(data_res), content_type="application/json", *args, **kwargs)
138 elif to_redirect:
139 return redirect(url, *args, **kwargs)
140 else:
141 return render(request, url, data_res)