blob: 25371754c2d132742a7883dd1589748ebd928d69 [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()
45 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):
53 raise ValueError('Role permissions should be provided in a key-value fashion')
54 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:
59 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
83@login_required
84def update(request, role_id=None):
85 user = osmutils.get_user(request)
lombardofr55d48e72019-06-21 19:35:14 +020086 client = Client()
87 payload = {
lombardofr55d48e72019-06-21 19:35:14 +020088 'name': request.POST['name'],
lombardofr55d48e72019-06-21 19:35:14 +020089 }
lombardofr8da23132019-06-02 17:18:48 +020090 try:
lombardofr5bc5ebb2019-08-19 09:33:56 +020091 if 'permissions' in request.POST and request.POST.get('permissions') != '':
92 role_permissions = yaml.load(request.POST.get('permissions'))
lombardofr55d48e72019-06-21 19:35:14 +020093
lombardofr5bc5ebb2019-08-19 09:33:56 +020094 if not isinstance(role_permissions, dict):
95 raise ValueError('Role permissions should be provided in a key-value fashion')
96 for key, value in role_permissions.items():
lombardofr55d48e72019-06-21 19:35:14 +020097 if not isinstance(value, bool):
lombardofr5bc5ebb2019-08-19 09:33:56 +020098 raise ValueError('Value in a role permissions should be boolean')
lombardofr55d48e72019-06-21 19:35:14 +020099 payload[key] = value
lombardofr8da23132019-06-02 17:18:48 +0200100 except Exception as e:
lombardofr55d48e72019-06-21 19:35:14 +0200101 return __response_handler(request, {'status': 400, 'code': 'BAD_REQUEST', 'detail': e.message} , url=None, status=400)
102 result = client.role_update(user.get_token(), role_id, payload)
103 if result['error']:
104 return __response_handler(request, result['data'], url=None,
105 status=result['data']['status'] if 'status' in result['data'] else 500)
lombardofr8da23132019-06-02 17:18:48 +0200106 else:
107 return __response_handler(request, {}, url=None, status=200)
108
lombardofr55d48e72019-06-21 19:35:14 +0200109@login_required
110def get(request, role_id=None):
111 user = osmutils.get_user(request)
112 try:
113 client = Client()
114 get_res = client.role_get(user.get_token(), role_id)
115 except Exception as e:
116 log.exception(e)
117 get_res = {'error': True, 'data': str(e)}
118 if get_res['error']:
119 return __response_handler(request, get_res['data'], url=None,
120 status=get_res['data']['status'] if 'status' in get_res['data'] else 500)
121 else:
122 role = get_res['data']
123 result = {
124 '_id': role['_id'],
125 'name': role['name'],
lombardofr5bc5ebb2019-08-19 09:33:56 +0200126 'permissions': { key:value for key, value in role['permissions'].items() if key not in ['_id', 'name', 'root', '_admin'] }
lombardofr55d48e72019-06-21 19:35:14 +0200127 }
128 return __response_handler(request, result, url=None, status=200)
129
lombardofr8da23132019-06-02 17:18:48 +0200130
131def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
132 raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
133 if 'application/json' in raw_content_types or url is None:
134 return HttpResponse(json.dumps(data_res), content_type="application/json", *args, **kwargs)
135 elif to_redirect:
136 return redirect(url, *args, **kwargs)
137 else:
138 return render(request, url, data_res)