"""Module containing Galaxy workflow report generator plugins.
"""
from abc import (
ABCMeta,
abstractmethod,
)
from galaxy.managers import workflows
from galaxy.managers.markdown_util import (
internal_galaxy_markdown_to_pdf,
ready_galaxy_markdown_for_export,
resolve_invocation_markdown,
)
from galaxy.model import WorkflowInvocation
from galaxy.schema import PdfDocumentType
[docs]class WorkflowReportGeneratorPlugin(metaclass=ABCMeta):
""" """
@property
@abstractmethod
def plugin_type(self):
"""Short string labelling this plugin."""
[docs] @abstractmethod
def generate_report_json(self, trans, invocation, runtime_report_config_json=None):
""" """
[docs] @abstractmethod
def generate_report_pdf(self, trans, invocation, runtime_report_config_json=None):
""" """
[docs]class WorkflowMarkdownGeneratorPlugin(WorkflowReportGeneratorPlugin, metaclass=ABCMeta):
"""WorkflowReportGeneratorPlugin that generates markdown as base report."""
[docs] def generate_report_json(self, trans, invocation: WorkflowInvocation, runtime_report_config_json=None):
""" """
workflow_manager = workflows.WorkflowsManager(trans.app)
workflow_encoded_id = trans.app.security.encode_id(invocation.workflow_id)
workflow = workflow_manager.get_stored_accessible_workflow(trans, workflow_encoded_id, by_stored_id=False)
internal_markdown = self._generate_internal_markdown(
trans, invocation, runtime_report_config_json=runtime_report_config_json
)
export_markdown, extra_rendering_data = ready_galaxy_markdown_for_export(trans, internal_markdown)
# Invocations can only be run on history, and user must exist, so this should always work
username = invocation.history and invocation.history.user and invocation.history.user.username
rval = {
"render_format": "markdown", # Presumably the frontend could render things other ways.
"markdown": export_markdown,
"invocation_markdown": export_markdown,
"model_class": "Report",
"id": trans.app.security.encode_id(invocation.workflow_id),
"username": username,
"title": workflow.name,
}
rval.update(extra_rendering_data)
return rval
[docs] def generate_report_pdf(self, trans, invocation, runtime_report_config_json=None):
internal_markdown = self._generate_internal_markdown(
trans, invocation, runtime_report_config_json=runtime_report_config_json
)
return internal_galaxy_markdown_to_pdf(trans, internal_markdown, PdfDocumentType.invocation_report)
@abstractmethod
def _generate_report_markdown(self, trans, invocation, runtime_report_config_json=None):
""" """
def _generate_internal_markdown(self, trans, invocation, runtime_report_config_json=None):
workflow_markdown = self._generate_report_markdown(
trans, invocation, runtime_report_config_json=runtime_report_config_json
)
internal_markdown = resolve_invocation_markdown(trans, invocation, workflow_markdown)
return internal_markdown