fix bug 823; fix bug 800
[osm/LW-UI.git] / rolehandler / views.py
1 #
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
17 from django.shortcuts import render, redirect
18 from sf_t3d.decorators import login_required
19 from django.http import HttpResponse
20 import yaml
21 import json
22 import logging
23 import authosm.utils as osmutils
24 from lib.osm.osmclient.clientv2 import Client
25
26 logging.basicConfig(level=logging.DEBUG)
27 log = logging.getLogger(__name__)
28
29
30 @login_required
31 def 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
42 def create(request):
43 user = osmutils.get_user(request)
44 client = Client()
45 role_data ={
46 'name': request.POST['name'],
47 }
48 try:
49 if 'permissions' in request.POST and request.POST.get('permissions') != '':
50 role_permissions = yaml.load(request.POST.get('permissions'))
51
52 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():
55 if not isinstance(value, bool):
56 raise ValueError("Value of '{}' in a role permissionss should be boolean".format(key))
57 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)
60 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
69 def 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
84 def update(request, role_id=None):
85 user = osmutils.get_user(request)
86 client = Client()
87 payload = {
88 'name': request.POST['name'],
89 }
90 try:
91 if 'permissions' in request.POST and request.POST.get('permissions') != '':
92 role_permissions = yaml.load(request.POST.get('permissions'))
93
94 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():
97 if not isinstance(value, bool):
98 raise ValueError('Value in a role permissions should be boolean')
99 payload[key] = value
100 except Exception as e:
101 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)
106 else:
107 return __response_handler(request, {}, url=None, status=200)
108
109 @login_required
110 def 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'],
126 'permissions': { key:value for key, value in role['permissions'].items() if key not in ['_id', 'name', 'root', '_admin'] }
127 }
128 return __response_handler(request, result, url=None, status=200)
129
130
131 def __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)