Skip to content

Commit 99bd4e1

Browse files
PJEstradaPJEstrada
andauthored
Permission V2 (#45)
* wip: roles management * wip: roles * API permissions v2 Co-authored-by: Pablo <[email protected]>
1 parent 02cb7de commit 99bd4e1

File tree

6 files changed

+198
-6
lines changed

6 files changed

+198
-6
lines changed

sdk/diffgram/brain/brain.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
try:
99
import cv2
1010
except:
11-
print("Could not import cv2")
11+
print("Warning: Could not import cv2. Some SDK functions may not be available.")
1212

1313
try:
1414
import tensorflow as tf
1515
except:
16-
print("Could not import tensorflow")
16+
print("Warning: Could not import tensorflow. Some SDK functions may not be available")
1717

1818
import numpy as np
1919
import requests

sdk/diffgram/core/core.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from diffgram.brain.brain import Brain
1313
from diffgram.file.file_constructor import FileConstructor
1414
from diffgram.file.file import File
15+
from diffgram.role.Role import Role
1516
from diffgram.brain.train import Train
1617
from diffgram.export.export import Export
1718
from diffgram.task.task import Task
@@ -64,7 +65,8 @@ def __init__(
6465
#self.train = Train(self)
6566
self.job = Job(self)
6667
self.guide = Guide(self)
67-
self.directory = Directory(self,
68+
self.roles = Role(self)
69+
self.directory = Directory(self,
6870
init_file_ids = False,
6971
validate_ids = False)
7072
self.export = Export(self)
@@ -93,6 +95,17 @@ def get_member_list(self):
9395
data = response.json()
9496
return data['project']['member_list']
9597

98+
def get_member(self, email):
99+
url = '/api/project/{}/view'.format(self.project_string_id)
100+
response = self.session.get(url = self.host + url)
101+
self.handle_errors(response)
102+
data = response.json()
103+
for member in data['project']['member_list']:
104+
if member['email'] == email:
105+
return member
106+
107+
return None
108+
96109
def get_label_schema_by_id(self, id):
97110
if self.label_schema_list is None or len(self.label_schema_list) == 0:
98111
self.label_schema_list = self.get_label_schema_list()

sdk/diffgram/core/directory.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ def to_tensorflow(self):
190190
)
191191
return diffgram_tensorflow_dataset
192192

193-
def new(self, name: str):
193+
def new(self, name: str, access_type = 'project'):
194194
"""
195195
Create a new directory and update directory list.
196196
@@ -210,8 +210,7 @@ def new(self, name: str):
210210
if dir.nickname == name), True) is not True:
211211
raise Exception(name, "Already exists")
212212

213-
packet = {'nickname': name}
214-
213+
packet = {'nickname': name, 'access_type': access_type}
215214
endpoint = "/api/v1/project/" + \
216215
self.client.project_string_id + "/directory/new"
217216

sdk/diffgram/member/__init__.py

Whitespace-only changes.

sdk/diffgram/role/Role.py

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
from diffgram.core.directory import Directory
2+
3+
4+
class Role:
5+
id: int
6+
name: int
7+
project_id: int
8+
permissions_list: list
9+
10+
def __init__(self,
11+
client,
12+
role_dict = None):
13+
14+
self.client = client
15+
16+
if self.client.project_string_id is None:
17+
raise Exception("\n No project string id in client.")
18+
19+
self.refresh_from_dict(
20+
role_dict = role_dict)
21+
22+
def refresh_from_dict(self, role_dict: dict = None):
23+
24+
if not role_dict:
25+
return
26+
27+
for key, value in role_dict.items():
28+
setattr(self, key, value)
29+
30+
def __repr__(self):
31+
return f'Role<{str(self.serialize())}>'
32+
33+
def serialize(self):
34+
35+
return {
36+
'id': self.id,
37+
'name': self.name,
38+
'project_id': self.project_id,
39+
'permissions_list': self.permissions_list,
40+
}
41+
42+
def new(self, name: str = None) -> 'Role':
43+
"""
44+
Creates a new Role
45+
:param name:
46+
:return:
47+
"""
48+
endpoint = "/api/v1/project/{}/roles/new".format(self.client.project_string_id)
49+
50+
response = self.client.session.post(
51+
self.client.host + endpoint,
52+
json = {'name': name})
53+
54+
self.client.handle_errors(response)
55+
56+
data = response.json()
57+
role = Role(client = self.client, role_dict = data)
58+
return role
59+
60+
def delete(self) -> 'Role':
61+
"""
62+
Creates a new Role
63+
:param name:
64+
:return:
65+
"""
66+
if not self.id:
67+
raise Exception('Role has no ID. Cannot be deleted.')
68+
69+
endpoint = f"/api/v1/project/{self.client.project_string_id}/roles/{self.id}/delete"
70+
71+
response = self.client.session.delete(
72+
self.client.host + endpoint, json = {})
73+
74+
self.client.handle_errors(response)
75+
76+
data = response.json()
77+
role = Role(client = self.client, role_dict = data)
78+
return role
79+
80+
def add_permission(self, perm: str, object_type: str):
81+
endpoint = f"/api/v1/project/{self.client.project_string_id}/roles/{self.id}/add-perm"
82+
83+
response = self.client.session.patch(
84+
self.client.host + endpoint, json = {
85+
'permission': perm,
86+
'object_type': object_type,
87+
})
88+
89+
self.client.handle_errors(response)
90+
91+
data = response.json()
92+
role = Role(client = self.client, role_dict = data)
93+
self.permissions_list = role.permissions_list
94+
return role
95+
96+
def remove_permission(self, perm: str, object_type: str):
97+
endpoint = f"/api/v1/project/{self.client.project_string_id}/roles/{self.id}/remove-perm"
98+
99+
response = self.client.session.patch(
100+
self.client.host + endpoint, json = {
101+
'permission': perm,
102+
'object_type': object_type,
103+
})
104+
105+
self.client.handle_errors(response)
106+
107+
data = response.json()
108+
role = Role(client = self.client, role_dict = data)
109+
self.permissions_list = role.permissions_list
110+
return role
111+
112+
def assign_to_member_in_object(self, member_id: int, object_id: int, object_type: str):
113+
endpoint = f"/api/v1/project/{self.client.project_string_id}/role-member-object"
114+
115+
if not self.id:
116+
raise Exception(f'Provide role ID')
117+
118+
response = self.client.session.patch(
119+
self.client.host + endpoint, json = {
120+
'member_id': member_id,
121+
'role_id': self.id,
122+
'object_type': object_type,
123+
'object_id': object_id,
124+
}
125+
)
126+
127+
self.client.handle_errors(response)
128+
role_member_object = response.json()
129+
return role_member_object
130+
131+
def remove_role_assignment(self, member_id: int, object_id: int, object_type: str):
132+
endpoint = f"/api/v1/project/{self.client.project_string_id}/role-member-object/remove"
133+
134+
if not self.id:
135+
raise Exception(f'Provide role ID')
136+
137+
response = self.client.session.patch(
138+
self.client.host + endpoint, json = {
139+
'member_id': member_id,
140+
'role_id': self.id,
141+
'object_type': object_type,
142+
'object_id': object_id,
143+
}
144+
)
145+
146+
self.client.handle_errors(response)
147+
role_member_object = response.json()
148+
return role_member_object
149+
150+
def get(self, name: str) -> list:
151+
152+
endpoint = f"/api/v1/project/{self.client.project_string_id}/roles"
153+
154+
response = self.client.session.get(self.client.host + endpoint)
155+
156+
self.client.handle_errors(response)
157+
roles = response.json()
158+
159+
result = None
160+
for r in roles:
161+
if r.get('name') == name:
162+
result = r
163+
break
164+
if result is None:
165+
raise Exception(f'Role {name} not found')
166+
role_obj = Role(client = self.client, role_dict = result)
167+
return role_obj
168+
169+
def list(self) -> list:
170+
171+
endpoint = f"/api/v1/project/{self.client.project_string_id}/roles"
172+
response = self.client.session.get(self.client.host + endpoint)
173+
174+
self.client.handle_errors(response)
175+
roles = response.json()
176+
result = []
177+
for r in roles:
178+
role_obj = Role(client = self.client, role_dict = r)
179+
result.append(role_obj)
180+
return result

sdk/diffgram/role/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)