2
2
3
3
from labml_db import Model , Key , Index
4
4
5
- from . import run
5
+ from . import run , folder
6
6
from . import session
7
7
from ..logger import logger
8
8
@@ -14,6 +14,7 @@ class Project(Model['Project']):
14
14
runs : Dict [str , Key ['run.Run' ]]
15
15
sessions : Dict [str , Key ['session.Session' ]]
16
16
is_run_added : bool
17
+ folders : Dict [str , Key ['folder.Folder' ]]
17
18
18
19
@classmethod
19
20
def defaults (cls ):
@@ -23,6 +24,7 @@ def defaults(cls):
23
24
runs = {},
24
25
sessions = {},
25
26
is_run_added = False ,
27
+ folders = {},
26
28
)
27
29
28
30
def is_project_run (self , run_uuid : str ) -> bool :
@@ -31,10 +33,15 @@ def is_project_run(self, run_uuid: str) -> bool:
31
33
def is_project_session (self , session_uuid : str ) -> bool :
32
34
return session_uuid in self .sessions
33
35
34
- def get_runs (self ) -> List ['run.Run' ]:
36
+ def get_runs (self , folder_name : str = "Default" ) -> List ['run.Run' ]:
35
37
res = []
36
38
likely_deleted = []
37
- for run_uuid , run_key in self .runs .items ():
39
+ run_uuids = self .runs .keys ()
40
+ if folder_name in self .folders :
41
+ f = self .folders [folder_name ].load ()
42
+ if f :
43
+ run_uuids = f .run_uuids
44
+ for run_uuid in run_uuids :
38
45
try :
39
46
r = run .get (run_uuid )
40
47
if r :
@@ -71,6 +78,7 @@ def delete_runs(self, run_uuids: List[str], project_owner: str) -> None:
71
78
r = run .get (run_uuid )
72
79
if r and r .owner == project_owner :
73
80
try :
81
+ self .delete_from_folder (r )
74
82
run .delete (run_uuid )
75
83
except TypeError :
76
84
logger .error (f'error while deleting the run { run_uuid } ' )
@@ -95,9 +103,24 @@ def add_run(self, run_uuid: str) -> None:
95
103
96
104
if r :
97
105
self .runs [run_uuid ] = r .key
106
+ self .add_to_folder (folder .DefaultFolders .DEFAULT .value , r )
98
107
99
108
self .save ()
100
109
110
+ def add_run_with_model (self , r : run .Run ) -> None :
111
+ self .runs [r .run_uuid ] = r .key
112
+ self .is_run_added = True
113
+
114
+ self .add_to_folder (folder .DefaultFolders .DEFAULT .value , r )
115
+
116
+ self .save ()
117
+
118
+ def get_run (self , run_uuid : str ) -> Optional ['run.Run' ]:
119
+ if run_uuid in self .runs :
120
+ return self .runs [run_uuid ].load ()
121
+ else :
122
+ return None
123
+
101
124
def add_session (self , session_uuid : str ) -> None :
102
125
s = session .get (session_uuid )
103
126
@@ -106,6 +129,62 @@ def add_session(self, session_uuid: str) -> None:
106
129
107
130
self .save ()
108
131
132
+ def add_to_folder (self , folder_name : str , r : run .Run ) -> None :
133
+ if folder_name not in self .folders :
134
+ f = folder .Folder (name = folder_name )
135
+ self .folders [folder_name ] = f .key
136
+ else :
137
+ f = self .folders [folder_name ].load ()
138
+
139
+ f .add_run (r .run_uuid )
140
+ f .save ()
141
+
142
+ r .parent_folder = f .name
143
+ r .save ()
144
+
145
+ def remove_from_folder (self , folder_name : str , r : run .Run ) -> None :
146
+ if folder_name not in self .folders :
147
+ f = folder .Folder (name = folder_name )
148
+ self .folders [folder_name ] = f .key
149
+ else :
150
+ f = self .folders [folder_name ].load ()
151
+
152
+ f .remove_run (r .run_uuid )
153
+ f .save ()
154
+
155
+ r .parent_folder = ''
156
+ r .save ()
157
+
158
+ def archive_runs (self , run_uuids : List [str ]) -> None :
159
+ for run_uuid in run_uuids :
160
+ if run_uuid in self .runs :
161
+ r = self .runs [run_uuid ].load ()
162
+ if r :
163
+ self .remove_from_folder (folder .DefaultFolders .DEFAULT .value , r )
164
+ self .add_to_folder (folder .DefaultFolders .ARCHIVE .value , r )
165
+
166
+ self .save ()
167
+
168
+ def un_archive_runs (self , run_uuids : List [str ]) -> None :
169
+ for run_uuid in run_uuids :
170
+ if run_uuid in self .runs :
171
+ r = self .runs [run_uuid ].load ()
172
+ if r :
173
+ self .remove_from_folder (folder .DefaultFolders .ARCHIVE .value , r )
174
+ self .add_to_folder (folder .DefaultFolders .DEFAULT .value , r )
175
+
176
+ self .save ()
177
+
178
+ def delete_from_folder (self , r : run .Run ) -> None :
179
+ folder_name = r .parent_folder
180
+ if folder_name in self .folders :
181
+ return
182
+ parent_folder = self .folders [folder_name ].load ()
183
+ if parent_folder is None :
184
+ return
185
+ parent_folder .remove_run (r .run_uuid )
186
+ parent_folder .save ()
187
+
109
188
110
189
class ProjectIndex (Index ['Project' ]):
111
190
pass
@@ -123,8 +202,8 @@ def get_project(labml_token: str) -> Union[None, Project]:
123
202
def get_run (run_uuid : str , labml_token : str = '' ) -> Optional ['run.Run' ]:
124
203
p = get_project (labml_token )
125
204
126
- if run_uuid in p . runs :
127
- return p .runs [ run_uuid ]. load ( )
205
+ if p . is_project_run ( run_uuid ) :
206
+ return p .get_run ( run_uuid )
128
207
else :
129
208
return None
130
209
0 commit comments