From 4630f9c746187ac7c8b67657437a09644343a9f0 Mon Sep 17 00:00:00 2001 From: takatost Date: Sun, 10 Mar 2024 20:02:10 +0800 Subject: [PATCH] add workflow_app_log codes --- .../apps/workflow/generate_task_pipeline.py | 40 ++++++++++++++++--- api/models/workflow.py | 23 +++++++++++ 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/api/core/app/apps/workflow/generate_task_pipeline.py b/api/core/app/apps/workflow/generate_task_pipeline.py index 8516feb87d..7a244151f2 100644 --- a/api/core/app/apps/workflow/generate_task_pipeline.py +++ b/api/core/app/apps/workflow/generate_task_pipeline.py @@ -32,7 +32,15 @@ from core.workflow.entities.node_entities import NodeRunMetadataKey, SystemVaria from extensions.ext_database import db from models.account import Account from models.model import EndUser -from models.workflow import Workflow, WorkflowNodeExecution, WorkflowRun, WorkflowRunStatus, WorkflowRunTriggeredFrom +from models.workflow import ( + Workflow, + WorkflowAppLog, + WorkflowAppLogCreatedFrom, + WorkflowNodeExecution, + WorkflowRun, + WorkflowRunStatus, + WorkflowRunTriggeredFrom, +) logger = logging.getLogger(__name__) @@ -142,7 +150,7 @@ class WorkflowAppGenerateTaskPipeline(WorkflowBasedGenerateTaskPipeline): ) # save workflow app log - self._save_workflow_app_log() + self._save_workflow_app_log(workflow_run) response = { 'task_id': self._application_generate_entity.task_id, @@ -261,7 +269,7 @@ class WorkflowAppGenerateTaskPipeline(WorkflowBasedGenerateTaskPipeline): yield self._yield_response(replace_response) # save workflow app log - self._save_workflow_app_log() + self._save_workflow_app_log(workflow_run) workflow_run_response = { 'event': 'workflow_finished', @@ -448,12 +456,34 @@ class WorkflowAppGenerateTaskPipeline(WorkflowBasedGenerateTaskPipeline): return workflow_run - def _save_workflow_app_log(self) -> None: + def _save_workflow_app_log(self, workflow_run: WorkflowRun) -> None: """ Save workflow app log. :return: """ - pass # todo + invoke_from = self._application_generate_entity.invoke_from + if invoke_from == InvokeFrom.SERVICE_API: + created_from = WorkflowAppLogCreatedFrom.SERVICE_API + elif invoke_from == InvokeFrom.EXPLORE: + created_from = WorkflowAppLogCreatedFrom.INSTALLED_APP + elif invoke_from == InvokeFrom.WEB_APP: + created_from = WorkflowAppLogCreatedFrom.WEB_APP + else: + # not save log for debugging + return + + workflow_app_log = WorkflowAppLog( + tenant_id=workflow_run.tenant_id, + app_id=workflow_run.app_id, + workflow_id=workflow_run.workflow_id, + workflow_run_id=workflow_run.id, + created_from=created_from.value, + created_by_role=('account' if isinstance(self._user, Account) else 'end_user'), + created_by=self._user.id, + ) + db.session.add(workflow_app_log) + db.session.commit() + db.session.close() def _handle_chunk(self, text: str) -> dict: """ diff --git a/api/models/workflow.py b/api/models/workflow.py index 9768c364dd..5a3cdcf83c 100644 --- a/api/models/workflow.py +++ b/api/models/workflow.py @@ -433,6 +433,29 @@ class WorkflowNodeExecution(db.Model): def execution_metadata_dict(self): return self.execution_metadata if not self.execution_metadata else json.loads(self.execution_metadata) + +class WorkflowAppLogCreatedFrom(Enum): + """ + Workflow App Log Created From Enum + """ + SERVICE_API = 'service-api' + WEB_APP = 'web-app' + INSTALLED_APP = 'installed-app' + + @classmethod + def value_of(cls, value: str) -> 'WorkflowAppLogCreatedFrom': + """ + Get value of given mode. + + :param value: mode value + :return: mode + """ + for mode in cls: + if mode.value == value: + return mode + raise ValueError(f'invalid workflow app log created from value {value}') + + class WorkflowAppLog(db.Model): """ Workflow App execution log, excluding workflow debugging records.