浏览代码

Resolve "integrate jobs into project objects"

Eric Tröbs 4 年之前
父节点
当前提交
9c8a9ef662

+ 1 - 6
app.py

@@ -1,7 +1,6 @@
 from pycs.ApplicationStatus import ApplicationStatus
 from pycs.ApplicationStatus import ApplicationStatus
 from pycs.frontend.WebServer import WebServer
 from pycs.frontend.WebServer import WebServer
 from pycs.models.ModelManager import ModelManager
 from pycs.models.ModelManager import ModelManager
-from pycs.pipeline.PipelineManager import PipelineManager
 from pycs.projects.ProjectManager import ProjectManager
 from pycs.projects.ProjectManager import ProjectManager
 
 
 if __name__ == '__main__':
 if __name__ == '__main__':
@@ -13,14 +12,10 @@ if __name__ == '__main__':
     print('- load model manager')
     print('- load model manager')
     model_manager = ModelManager(app_status)
     model_manager = ModelManager(app_status)
 
 
-    # load pipeline manager
-    print('- load pipeline manager')
-    pipeline_manager = PipelineManager(app_status)
-
     # load project manager
     # load project manager
     print('- load project manager')
     print('- load project manager')
     project_manager = ProjectManager(app_status)
     project_manager = ProjectManager(app_status)
 
 
     # start web server
     # start web server
     print('- start web server')
     print('- start web server')
-    web_server = WebServer(app_status, pipeline_manager)
+    web_server = WebServer(app_status)

+ 1 - 2
pycs/ApplicationStatus.py

@@ -21,8 +21,7 @@ class ApplicationStatus(ObservableDict):
         super().__init__({
         super().__init__({
             'settings': settings,
             'settings': settings,
             'models': {},
             'models': {},
-            'projects': {},
-            'jobs': []
+            'projects': {}
         })
         })
 
 
         # subscribe to settings change to write it to file
         # subscribe to settings change to write it to file

+ 3 - 4
pycs/frontend/WebServer.py

@@ -2,7 +2,6 @@ from glob import glob
 from os import path, mkdir, getcwd
 from os import path, mkdir, getcwd
 from os.path import exists
 from os.path import exists
 from time import time
 from time import time
-from uuid import uuid1
 
 
 import eventlet
 import eventlet
 import socketio
 import socketio
@@ -10,7 +9,6 @@ from flask import Flask, make_response, send_from_directory, request
 from werkzeug import formparser
 from werkzeug import formparser
 
 
 from pycs.ApplicationStatus import ApplicationStatus
 from pycs.ApplicationStatus import ApplicationStatus
-from pycs.pipeline.PipelineManager import PipelineManager
 from pycs.util.GenericWrapper import GenericWrapper
 from pycs.util.GenericWrapper import GenericWrapper
 from pycs.util.ProgressFileWriter import ProgressFileWriter
 from pycs.util.ProgressFileWriter import ProgressFileWriter
 from pycs.util.RecursiveDictionary import set_recursive
 from pycs.util.RecursiveDictionary import set_recursive
@@ -106,14 +104,15 @@ class WebServer:
                 file_path = path.join(upload_path, f'{file_uuid}{file_extension.value}')
                 file_path = path.join(upload_path, f'{file_uuid}{file_extension.value}')
 
 
                 # add job to app status
                 # add job to app status
-                job.value = app_status['jobs'].append({
+                project['jobs'][file_uuid] = {
                     'id': file_uuid,
                     'id': file_uuid,
                     'type': 'upload',
                     'type': 'upload',
                     'progress': 0,
                     'progress': 0,
                     'filename': filename,
                     'filename': filename,
                     'created': int(time()),
                     'created': int(time()),
                     'finished': None
                     'finished': None
-                })
+                }
+                job.value = project['jobs'][file_uuid]
 
 
                 # create upload path if not exists
                 # create upload path if not exists
                 if not path.exists(upload_path):
                 if not path.exists(upload_path):

+ 2 - 2
pycs/observable/Observable.py

@@ -25,9 +25,9 @@ class Observable:
         if immediate:
         if immediate:
             handler(self)
             handler(self)
 
 
-    def _notify(self):
+    def notify(self):
         for s in self.subscriptions:
         for s in self.subscriptions:
             s(self)
             s(self)
 
 
         if self.parent is not None:
         if self.parent is not None:
-            self.parent._notify()
+            self.parent.notify()

+ 16 - 3
pycs/observable/ObservableDict.py

@@ -1,4 +1,4 @@
-from .Observable import Observable
+from . import Observable
 
 
 
 
 class ObservableDict(dict, Observable):
 class ObservableDict(dict, Observable):
@@ -11,8 +11,21 @@ class ObservableDict(dict, Observable):
 
 
     def __setitem__(self, key, value):
     def __setitem__(self, key, value):
         dict.__setitem__(self, key, Observable.create(value, self))
         dict.__setitem__(self, key, Observable.create(value, self))
-        Observable._notify(self)
+        Observable.notify(self)
 
 
     def __delitem__(self, key):
     def __delitem__(self, key):
         super().__delitem__(key)
         super().__delitem__(key)
-        Observable._notify(self)
+        Observable.notify(self)
+
+    def copy(self):
+        result = {}
+        for key in self.keys():
+            if type(self[key]) == ObservableDict or type(self[key]) == ObservableList:
+                result[key] = self[key].copy()
+            else:
+                result[key] = self[key]
+
+        return result
+
+
+from . import ObservableList

+ 16 - 4
pycs/observable/ObservableList.py

@@ -1,4 +1,4 @@
-from .Observable import Observable
+from . import Observable
 
 
 
 
 class ObservableList(list, Observable):
 class ObservableList(list, Observable):
@@ -14,16 +14,28 @@ class ObservableList(list, Observable):
 
 
     def __setitem__(self, key, value):
     def __setitem__(self, key, value):
         super().__setitem__(key, Observable.create(value, self))
         super().__setitem__(key, Observable.create(value, self))
-        Observable._notify(self)
+        Observable.notify(self)
 
 
     def __delitem__(self, key):
     def __delitem__(self, key):
         super().__delitem__(key)
         super().__delitem__(key)
-        Observable._notify(self)
+        Observable.notify(self)
 
 
     def append(self, value):
     def append(self, value):
         obs = Observable.create(value, self)
         obs = Observable.create(value, self)
 
 
         super().append(obs)
         super().append(obs)
-        Observable._notify(self)
+        Observable.notify(self)
 
 
         return obs
         return obs
+
+    def __copy__(self):
+        def c(e):
+            if isinstance(e, (ObservableDict, ObservableList)):
+                return e.copy()
+            else:
+                return e
+
+        return list(map(c, self))
+
+
+from . import ObservableDict

+ 0 - 1
pycs/pipeline/PipelineManager.py

@@ -3,7 +3,6 @@ from os import path
 
 
 from eventlet import tpool
 from eventlet import tpool
 
 
-from pycs.ApplicationStatus import ApplicationStatus
 from pycs.pipeline.Job import Job
 from pycs.pipeline.Job import Job
 from pycs.pipeline.tf1.pipeline import Pipeline as TF1Pipeline
 from pycs.pipeline.tf1.pipeline import Pipeline as TF1Pipeline
 from pycs.projects.Project import Project
 from pycs.projects.Project import Project

+ 7 - 2
pycs/projects/ProjectManager.py

@@ -26,11 +26,15 @@ class ProjectManager(ObservableDict):
             # load project.json
             # load project.json
             with open(path.join(folder, 'project.json'), 'r') as file:
             with open(path.join(folder, 'project.json'), 'r') as file:
                 project = Project(load(file), self)
                 project = Project(load(file), self)
+                project['jobs'] = {}
                 self[project['id']] = project
                 self[project['id']] = project
 
 
     def __write_project(self, uuid):
     def __write_project(self, uuid):
         with open(path.join('projects', uuid, 'project.json'), 'w') as file:
         with open(path.join('projects', uuid, 'project.json'), 'w') as file:
-            dump(self[uuid], file, indent=4)
+            copy = self[uuid].copy()
+            del copy['jobs']
+
+            dump(copy, file, indent=4)
 
 
     def create_project(self, name, description, model):
     def create_project(self, name, description, model):
         # create dict representation
         # create dict representation
@@ -43,7 +47,8 @@ class ProjectManager(ObservableDict):
             'pipeline': {
             'pipeline': {
                 'model-distribution': model
                 'model-distribution': model
             },
             },
-            'data': {}
+            'data': {},
+            'jobs': {}
         }, self)
         }, self)
 
 
         # create project directory
         # create project directory

+ 2 - 4
test/test_application_status.py

@@ -9,8 +9,7 @@ class TestApplicationStatus(unittest.TestCase):
         self.assertEqual({
         self.assertEqual({
             'settings': {},
             'settings': {},
             'models': {},
             'models': {},
-            'projects': {},
-            'jobs': []
+            'projects': {}
         }, aso)
         }, aso)
 
 
     def test_load_from_object(self):
     def test_load_from_object(self):
@@ -23,8 +22,7 @@ class TestApplicationStatus(unittest.TestCase):
         self.assertEqual({
         self.assertEqual({
             'settings': settings,
             'settings': settings,
             'models': {},
             'models': {},
-            'projects': {},
-            'jobs': []
+            'projects': {}
         }, aso)
         }, aso)
 
 
 
 

+ 0 - 1
webui/src/App.vue

@@ -31,7 +31,6 @@
 
 
         <project-data-add-window v-if="window.content === 'add_data'"
         <project-data-add-window v-if="window.content === 'add_data'"
                                  :current-project="currentProject"
                                  :current-project="currentProject"
-                                 :status="status"
                                  :socket="socket"/>
                                  :socket="socket"/>
 
 
         <project-data-view-window v-if="window.content === 'view_data'"
         <project-data-view-window v-if="window.content === 'view_data'"

+ 5 - 3
webui/src/components/projects/project-data-add-window.vue

@@ -23,11 +23,13 @@ import ProgressBar from "@/components/base/progress-bar";
 export default {
 export default {
   name: "project-data-add-window",
   name: "project-data-add-window",
   components: {ProgressBar, FileInput},
   components: {ProgressBar, FileInput},
-  props: ['status', 'socket', 'currentProject'],
+  props: ['socket', 'currentProject'],
   computed: {
   computed: {
     uploads: function() {
     uploads: function() {
-      // TODO filter current project
-      const filtered = this.status.jobs.filter(x => x.type === 'upload');
+      const filtered = Object.keys(this.currentProject.jobs)
+          .map(e => this.currentProject.jobs[e])
+          .filter(e => e.type === 'upload');
+
       filtered.sort(this.sortUploads);
       filtered.sort(this.sortUploads);
       return filtered;
       return filtered;
     }
     }