123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import click
- import flask
- from flask.cli import AppGroup
- from pycs import app
- from pycs.database.Project import Project
- 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:
- project_files = [
- dict(**f.serialize(),
- results=[
- dict(**r.serialize(), label=r.label.serialize() if r.label is not None else None)
- for r in f.results.all()
- ])
- for f in project.files.all() if f.results.count() != 0
- ]
- results.append(dict(
- project_id=project.id,
- files=project_files,
- labels=[lab.serialize() for lab in project.labels.all()],
- ))
- 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)
|