Skip to content

Commit e969b76

Browse files
committed
Project folder API: refactor to reduce API calls, add project.get_project_folder() and project.move_to_folder()
1 parent 4f29587 commit e969b76

File tree

3 files changed

+80
-39
lines changed

3 files changed

+80
-39
lines changed

dataikuapi/dss/project.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,38 @@ def __init__(self, client, project_key):
3131
self.client = client
3232
self.project_key = project_key
3333

34+
35+
def get_project_folder(self):
36+
"""
37+
Returns the :class:`dataikuapi.dss.projectfolder.DSSProjectFolder` containing this project
38+
:rtype: :class:`dataikuapi.dss.projectfolder.DSSProjectFolder`
39+
"""
40+
root = self.client.get_root_project_folder()
41+
42+
def rec(pf):
43+
if self.project_key in pf.list_project_keys():
44+
return pf
45+
else:
46+
for spf in pf.list_child_folders():
47+
found_in_child = rec(spf)
48+
if found_in_child:
49+
return found_in_child
50+
return None
51+
52+
found_in = rec(root)
53+
if found_in:
54+
return found_in
55+
else:
56+
return root
57+
58+
def move_to_folder(self, folder):
59+
"""
60+
Moves this project to a project folder
61+
:param folder :class:`dataikuapi.dss.projectfolder.DSSProjectFolder
62+
"""
63+
current_folder = self.get_project_folder()
64+
current_folder.move_project_to(self.project_key, folder)
65+
3466
########################################################
3567
# Project deletion
3668
########################################################

dataikuapi/dss/projectfolder.py

Lines changed: 45 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,45 @@ class DSSProjectFolder(object):
66
77
Do not create this class directly, instead use :meth:`dataikuapi.DSSClient.get_project_folder` or :meth:`dataikuapi.DSSClient.get_root_project_folder`
88
"""
9-
def __init__(self, client, project_folder_id):
9+
def __init__(self, client, data):
1010
self.client = client
11-
self.project_folder_id = project_folder_id
11+
self._data = data
1212

1313
########################################################
1414
# Project folder basics
1515
########################################################
16-
def get_name(self):
16+
17+
@property
18+
def id(self):
1719
"""
18-
Get this project folder's name or None if it is the root project folder
20+
Get this project folder's id
21+
:returns str: the id of this project folder
22+
"""
23+
return self._data["id"]
1924

25+
@property
26+
def name(self):
27+
"""
28+
Get this project folder's name or None if it is the root project folder
2029
:returns str: the name of this project folders or None for the root project folder
2130
"""
22-
return self.client._perform_json("GET", "/project-folders/%s" % self.project_folder_id).get("name", None)
31+
return self._data.get("name", None)
2332

24-
def get_path(self):
33+
def get_name(self):
34+
"""
35+
See name
2536
"""
26-
Get this project fodler's path based on the root project folder
37+
return self.name
2738

28-
:returns str: the path of this project folder
39+
def get_path(self):
40+
"""
41+
Get this project folder's path from the orot, in the form of /name/name/name
42+
:return str: the path of this project folder
2943
"""
30-
definition = self.client._perform_json("GET", "/project-folders/%s" % self.project_folder_id)
31-
parent_id = definition.get("parentId", None)
32-
if parent_id is not None:
33-
parent = DSSProjectFolder(self.client, parent_id)
44+
parent = self.get_parent()
45+
if parent is not None:
3446
path = parent.get_path()
35-
return ("" if path == "/" else path) + "/" + definition.get("name", "")
47+
return ("" if path == "/" else path) + "/" + self.name
3648
else:
3749
return "/"
3850

@@ -42,37 +54,32 @@ def get_parent(self):
4254
4355
:returns: A :class:`dataikuapi.dss.projectfolders.DSSProjectFolder` to interact with its parent or None for the root project folder
4456
"""
45-
parent_id = self.client._perform_json("GET", "/project-folders/%s" % self.project_folder_id).get("parentId", None)
57+
parent_id = self._data.get("parentId", None)
4658
if parent_id is None:
4759
return None
4860
else:
49-
return DSSProjectFolder(self.client, parent_id)
61+
return self.client.get_project_folder(parent_id)
5062

5163
def list_child_folders(self):
5264
"""
5365
List the child project folders inside this project folder
54-
5566
:returns list: A list of :class:`dataikuapi.dss.projectfolders.DSSProjectFolder` to interact with its sub-folders
5667
"""
57-
children = self.client._perform_json("GET", "/project-folders/%s" % self.project_folder_id).get("childrenIds", [])
58-
return [DSSProjectFolder(self.client, child) for child in children]
68+
return [self.client.get_project_folder(child_id) for child_id in self._data["childrenIds"]]
5969

6070
def list_project_keys(self):
6171
"""
6272
List the project keys of the projects that are stored in this project folder
63-
6473
:returns list: A list of project keys
6574
"""
66-
return self.client._perform_json("GET", "/project-folders/%s" % self.project_folder_id).get("projectKeys", [])
75+
return self._data["projectKeys"]
6776

6877
def list_projects(self):
6978
"""
7079
List the projects that are stored in this project folder
71-
7280
:returns list: A list of :class:`dataikuapi.dss.project.DSSProject` to interact with its projects
7381
"""
74-
project_keys = self.client._perform_json("GET", "/project-folders/%s" % self.project_folder_id).get("projectKeys", [])
75-
return [DSSProject(self.client, pkey) for pkey in project_keys]
82+
return [self.client.get_project(pkey) for pkey in self.list_project_keys()]
7683

7784
########################################################
7885
# Project folder deletion
@@ -84,8 +91,7 @@ def delete(self):
8491
8592
This call requires an API key with admin rights
8693
"""
87-
return self.client._perform_empty(
88-
"DELETE", "/project-folders/%s" % self.project_folder_id)
94+
return self.client._perform_empty("DELETE", "/project-folders/%s" % self.id)
8995

9096
########################################################
9197
# Project folder settings
@@ -94,8 +100,8 @@ def get_settings(self):
94100
"""
95101
:returns: A :class:`dataikuapi.dss.projectfolder.DSSProjectFolderSettings` to interact with this project folder settings
96102
"""
97-
settings = self.client._perform_json("GET", "/project-folders/%s/settings" % self.project_folder_id)
98-
return DSSProjectFolderSettings(self.client, self.project_folder_id, settings)
103+
settings = self.client._perform_json("GET", "/project-folders/%s/settings" % self.id)
104+
return DSSProjectFolderSettings(self.client, self.id, settings)
99105

100106
########################################################
101107
# Project folder sub-folder creation
@@ -110,8 +116,8 @@ def create_sub_folder(self, name):
110116
params = {
111117
"name": name
112118
}
113-
pf = self.client._perform_json("POST", "/project-folders/%s/children" % self.project_folder_id, params=params)
114-
return DSSProjectFolder(self.client, pf["id"])
119+
pf = self.client._perform_json("POST", "/project-folders/%s/children" % self.id, params=params)
120+
return DSSProjectFolder(self.client, pf)
115121

116122
########################################################
117123
# Project creation
@@ -130,7 +136,7 @@ def create_project(self, project_key, name, owner, description=None, settings=No
130136
131137
:returns: A class:`dataikuapi.dss.project.DSSProject` project handle to interact with this project
132138
"""
133-
return self.client.create_project(project_key, name, owner, description=description, settings=settings, project_folder_id=self.project_folder_id)
139+
return self.client.create_project(project_key, name, owner, description=description, settings=settings, project_folder_id=self.id)
134140

135141
########################################################
136142
# Project folder move
@@ -143,9 +149,9 @@ def move_to(self, destination):
143149
:type destination: A :class:`dataikuapi.dss.projectfolders.DSSProjectFolder`
144150
"""
145151
params = {
146-
"destination": destination.project_folder_id
152+
"destination": destination.id
147153
}
148-
self.client._perform_empty("POST", "/project-folders/%s/move" % self.project_folder_id, params=params)
154+
self.client._perform_empty("POST", "/project-folders/%s/move" % self.id, params=params)
149155

150156
########################################################
151157
# Project move
@@ -158,10 +164,13 @@ def move_project_to(self, project_key, destination):
158164
:param destination: the project folder to put this project into
159165
:type destination: A :class:`dataikuapi.dss.projectfolders.DSSProjectFolder`
160166
"""
167+
# Be nice with what people pass
168+
if isinstance(project_key, DSSProject):
169+
project_key = project_key.project_key
161170
params = {
162-
"destination": destination.project_folder_id
171+
"destination": destination.id
163172
}
164-
self.client._perform_empty("POST", "/project-folders/%s/projects/%s/move" % (self.project_folder_id, project_key), params=params)
173+
self.client._perform_empty("POST", "/project-folders/%s/projects/%s/move" % (self.id, project_key), params=params)
165174

166175
class DSSProjectFolderSettings(object):
167176
"""
@@ -171,7 +180,7 @@ class DSSProjectFolderSettings(object):
171180
"""
172181
def __init__(self, client, project_folder_id, settings):
173182
self.client = client
174-
self.project_folder_id = project_folder_id
183+
self.id = project_folder_id
175184
self.settings = settings
176185

177186
def get_raw(self):
@@ -220,5 +229,5 @@ def get_permissions(self):
220229

221230
def save(self):
222231
"""Saves back the settings to the project folder"""
223-
self.client._perform_empty("PUT", "/project-folders/%s/settings" % (self.project_folder_id), body = self.settings)
232+
self.client._perform_empty("PUT", "/project-folders/%s/settings" % (self.id), body = self.settings)
224233

dataikuapi/dssclient.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ def get_root_project_folder(self):
114114
115115
:returns: A :class:`dataikuapi.dss.projectfolder.DSSProjectFolder`to interact with this project folder
116116
"""
117-
project_folder_id = self._perform_json("GET", "/project-folders/")["id"]
118-
return DSSProjectFolder(self, project_folder_id)
117+
return self.get_project_folder("ROOT")
119118

120119
def get_project_folder(self, project_folder_id):
121120
"""
@@ -124,7 +123,8 @@ def get_project_folder(self, project_folder_id):
124123
:param str project_folder_id: the project folder ID of the desired project folder
125124
:returns: A :class:`dataikuapi.dss.projectfolder.DSSProjectFolder`to interact with this project folder
126125
"""
127-
return DSSProjectFolder(self, project_folder_id)
126+
data = self._perform_json("GET", "/project-folders/%s" % project_folder_id)
127+
return DSSProjectFolder(self, data)
128128

129129
########################################################
130130
# Projects

0 commit comments

Comments
 (0)