6
0
فهرست منبع

refactored management module and added management command to export results

Dimitri Korsch 3 سال پیش
والد
کامیت
f0d9fde894
4فایلهای تغییر یافته به همراه69 افزوده شده و 9 حذف شده
  1. 3 1
      pycs/interfaces/MediaImageLabel.py
  2. 7 0
      pycs/management/__init__.py
  3. 6 8
      pycs/management/project.py
  4. 53 0
      pycs/management/result.py

+ 3 - 1
pycs/interfaces/MediaImageLabel.py

@@ -9,7 +9,9 @@ class MediaImageLabel:
 
     def __init__(self, result: Result):
         self.label = result.label
-        self.frame = result.data['frame'] if 'frame' in result.data else None
+        self.frame = None
+        if result.data is not None and 'frame' in result.data:
+            self.frame = result.data['frame']
 
     def serialize(self) -> dict:
         """

+ 7 - 0
pycs/management/__init__.py

@@ -0,0 +1,7 @@
+from pycs.management.project import project_cli
+from pycs.management.result import result_cli
+
+def setup_commands(app):
+    """ adds commands to app's CLI """
+    app.cli.add_command(project_cli)
+    app.cli.add_command(result_cli)

+ 6 - 8
pycs/management.py → pycs/management/project.py

@@ -1,21 +1,20 @@
 import click
 from tabulate import tabulate
 
+from flask.cli import AppGroup
+
 from pycs import app
 from pycs.database.Project import Project
 from pycs.util import FileOperations
 
-from flask.cli import AppGroup
-from flask.cli import with_appcontext
-
-def setup_commands(app):
-    app.cli.add_command(project_cli)
 
-project_cli = AppGroup("project")
+project_cli = AppGroup("project", short_help="Project operations")
 
 @project_cli.command()
 @click.argument("project_id")
 def generate_thumbnails(project_id):
+    """ Generates thumbnails for a specific project or all project """
+
     if project_id == "all":
         projects = Project.query.all()
         app.logger.info(f"Generating thumbnails for all projects ({len(projects)})!")
@@ -32,6 +31,7 @@ def generate_thumbnails(project_id):
 
 @project_cli.command("list")
 def list_projects():
+    """ List information about existing projects """
     projects = Project.query.all()
 
     print(f"Got {len(projects)} projects")
@@ -41,5 +41,3 @@ def list_projects():
         headers=["id", "name", "description"],
         tablefmt="fancy_grid"
     ))
-
-

+ 53 - 0
pycs/management/result.py

@@ -0,0 +1,53 @@
+import click
+import flask
+
+from flask.cli import AppGroup
+
+from pycs import app
+from pycs.database.Project import Project
+from pycs.interfaces.MediaStorage import MediaStorage
+
+result_cli = AppGroup("result", short_help="Result operations")
+
+
+
+@result_cli.command("export")
+@click.argument("project_id")
+@click.argument("indent", required=False)
+@click.argument("output", required=False)
+def export(project_id, output, indent):
+    """ Export results for a specific project or for all projects """
+    if project_id == "all":
+        projects = Project.query.all()
+        app.logger.info(f"Exporting results for all projects ({len(projects)})!")
+        if output is None:
+            output = "output.json"
+
+    else:
+        project = Project.query.get(project_id)
+        if project is None:
+            app.logger.error(f"Could not find project with ID {project_id}!")
+            return
+        app.logger.info(f"Exporting results for project {project}!")
+        projects = [project]
+        if output is None:
+            output = f"output_project_{int(project_id):04d}.json"
+
+    app.logger.info(f"Exporting to {output}")
+
+    results = []
+
+    for project in projects:
+        storage = MediaStorage(project.id, None)
+        project_files = [f.serialize() for f in storage.files().iter() if len(f.results()) != 0]
+        results.append(dict(
+            project_id=project.id,
+            files=project_files,
+        ))
+
+
+    if indent is not None:
+        indent = int(indent)
+
+    with open(output, "w", encoding="utf-8") as out_f:
+        flask.json.dump(results, out_f, app=app, indent=indent)