Skip to content

Commit

Permalink
Permission V2 (#45)
Browse files Browse the repository at this point in the history
* wip: roles management

* wip: roles

* API permissions v2

Co-authored-by: Pablo <pjestradac@gmail.com>
  • Loading branch information
PJEstrada and PJEstrada committed Sep 14, 2022
1 parent 02cb7de commit 99bd4e1
Show file tree
Hide file tree
Showing 6 changed files with 198 additions and 6 deletions.
4 changes: 2 additions & 2 deletions sdk/diffgram/brain/brain.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
try:
import cv2
except:
print("Could not import cv2")
print("Warning: Could not import cv2. Some SDK functions may not be available.")

try:
import tensorflow as tf
except:
print("Could not import tensorflow")
print("Warning: Could not import tensorflow. Some SDK functions may not be available")

import numpy as np
import requests
Expand Down
15 changes: 14 additions & 1 deletion sdk/diffgram/core/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from diffgram.brain.brain import Brain
from diffgram.file.file_constructor import FileConstructor
from diffgram.file.file import File
from diffgram.role.Role import Role
from diffgram.brain.train import Train
from diffgram.export.export import Export
from diffgram.task.task import Task
Expand Down Expand Up @@ -64,7 +65,8 @@ def __init__(
#self.train = Train(self)
self.job = Job(self)
self.guide = Guide(self)
self.directory = Directory(self,
self.roles = Role(self)
self.directory = Directory(self,
init_file_ids = False,
validate_ids = False)
self.export = Export(self)
Expand Down Expand Up @@ -93,6 +95,17 @@ def get_member_list(self):
data = response.json()
return data['project']['member_list']

def get_member(self, email):
url = '/api/project/{}/view'.format(self.project_string_id)
response = self.session.get(url = self.host + url)
self.handle_errors(response)
data = response.json()
for member in data['project']['member_list']:
if member['email'] == email:
return member

return None

def get_label_schema_by_id(self, id):
if self.label_schema_list is None or len(self.label_schema_list) == 0:
self.label_schema_list = self.get_label_schema_list()
Expand Down
5 changes: 2 additions & 3 deletions sdk/diffgram/core/directory.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ def to_tensorflow(self):
)
return diffgram_tensorflow_dataset

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

packet = {'nickname': name}

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

Expand Down
Empty file added sdk/diffgram/member/__init__.py
Empty file.
180 changes: 180 additions & 0 deletions sdk/diffgram/role/Role.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
from diffgram.core.directory import Directory


class Role:
id: int
name: int
project_id: int
permissions_list: list

def __init__(self,
client,
role_dict = None):

self.client = client

if self.client.project_string_id is None:
raise Exception("\n No project string id in client.")

self.refresh_from_dict(
role_dict = role_dict)

def refresh_from_dict(self, role_dict: dict = None):

if not role_dict:
return

for key, value in role_dict.items():
setattr(self, key, value)

def __repr__(self):
return f'Role<{str(self.serialize())}>'

def serialize(self):

return {
'id': self.id,
'name': self.name,
'project_id': self.project_id,
'permissions_list': self.permissions_list,
}

def new(self, name: str = None) -> 'Role':
"""
Creates a new Role
:param name:
:return:
"""
endpoint = "/api/v1/project/{}/roles/new".format(self.client.project_string_id)

response = self.client.session.post(
self.client.host + endpoint,
json = {'name': name})

self.client.handle_errors(response)

data = response.json()
role = Role(client = self.client, role_dict = data)
return role

def delete(self) -> 'Role':
"""
Creates a new Role
:param name:
:return:
"""
if not self.id:
raise Exception('Role has no ID. Cannot be deleted.')

endpoint = f"/api/v1/project/{self.client.project_string_id}/roles/{self.id}/delete"

response = self.client.session.delete(
self.client.host + endpoint, json = {})

self.client.handle_errors(response)

data = response.json()
role = Role(client = self.client, role_dict = data)
return role

def add_permission(self, perm: str, object_type: str):
endpoint = f"/api/v1/project/{self.client.project_string_id}/roles/{self.id}/add-perm"

response = self.client.session.patch(
self.client.host + endpoint, json = {
'permission': perm,
'object_type': object_type,
})

self.client.handle_errors(response)

data = response.json()
role = Role(client = self.client, role_dict = data)
self.permissions_list = role.permissions_list
return role

def remove_permission(self, perm: str, object_type: str):
endpoint = f"/api/v1/project/{self.client.project_string_id}/roles/{self.id}/remove-perm"

response = self.client.session.patch(
self.client.host + endpoint, json = {
'permission': perm,
'object_type': object_type,
})

self.client.handle_errors(response)

data = response.json()
role = Role(client = self.client, role_dict = data)
self.permissions_list = role.permissions_list
return role

def assign_to_member_in_object(self, member_id: int, object_id: int, object_type: str):
endpoint = f"/api/v1/project/{self.client.project_string_id}/role-member-object"

if not self.id:
raise Exception(f'Provide role ID')

response = self.client.session.patch(
self.client.host + endpoint, json = {
'member_id': member_id,
'role_id': self.id,
'object_type': object_type,
'object_id': object_id,
}
)

self.client.handle_errors(response)
role_member_object = response.json()
return role_member_object

def remove_role_assignment(self, member_id: int, object_id: int, object_type: str):
endpoint = f"/api/v1/project/{self.client.project_string_id}/role-member-object/remove"

if not self.id:
raise Exception(f'Provide role ID')

response = self.client.session.patch(
self.client.host + endpoint, json = {
'member_id': member_id,
'role_id': self.id,
'object_type': object_type,
'object_id': object_id,
}
)

self.client.handle_errors(response)
role_member_object = response.json()
return role_member_object

def get(self, name: str) -> list:

endpoint = f"/api/v1/project/{self.client.project_string_id}/roles"

response = self.client.session.get(self.client.host + endpoint)

self.client.handle_errors(response)
roles = response.json()

result = None
for r in roles:
if r.get('name') == name:
result = r
break
if result is None:
raise Exception(f'Role {name} not found')
role_obj = Role(client = self.client, role_dict = result)
return role_obj

def list(self) -> list:

endpoint = f"/api/v1/project/{self.client.project_string_id}/roles"
response = self.client.session.get(self.client.host + endpoint)

self.client.handle_errors(response)
roles = response.json()
result = []
for r in roles:
role_obj = Role(client = self.client, role_dict = r)
result.append(role_obj)
return result
Empty file added sdk/diffgram/role/__init__.py
Empty file.

0 comments on commit 99bd4e1

Please sign in to comment.