mirror of
https://github.com/Skyvern-AI/skyvern.git
synced 2026-04-28 03:30:10 +00:00
[SKY-7600] BE (#5312)
This commit is contained in:
parent
c7b8bc0fd2
commit
43c1a75263
8 changed files with 52 additions and 26 deletions
|
|
@ -426,7 +426,7 @@ export type WorkflowRunApiResponse = {
|
|||
finished_at: string | null; // ISO 8601
|
||||
modified_at: string;
|
||||
proxy_location: ProxyLocation | null;
|
||||
script_run: boolean | null;
|
||||
script_run: { ai_fallback_triggered: boolean } | null;
|
||||
status: Status;
|
||||
title?: string;
|
||||
trigger_type?: TriggerType | null;
|
||||
|
|
|
|||
|
|
@ -23,9 +23,11 @@ function useRunsQuery({
|
|||
statusFilters,
|
||||
triggerTypeFilters,
|
||||
search,
|
||||
...queryOptions
|
||||
}: Props) {
|
||||
const credentialGetter = useCredentialGetter();
|
||||
return useQuery<Array<Task | WorkflowRunApiResponse>>({
|
||||
...queryOptions,
|
||||
queryKey: [
|
||||
"runs",
|
||||
{ statusFilters, triggerTypeFilters },
|
||||
|
|
|
|||
|
|
@ -279,7 +279,7 @@ function RunHistory() {
|
|||
const workflowTitle = (
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="truncate">{run.workflow_title ?? ""}</span>
|
||||
{run.script_run === true && (
|
||||
{run.script_run != null && (
|
||||
<Tip content="Ran with code">
|
||||
<LightningBoltIcon className="text-[gold]" />
|
||||
</Tip>
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ function WorkflowPage() {
|
|||
) : (
|
||||
workflowRuns?.map((workflowRun) => {
|
||||
const workflowRunId =
|
||||
workflowRun.script_run === true ? (
|
||||
workflowRun.script_run != null ? (
|
||||
<div className="flex items-center gap-2">
|
||||
<Tip content="Ran with code">
|
||||
<LightningBoltIcon className="text-[gold]" />
|
||||
|
|
|
|||
|
|
@ -298,6 +298,7 @@ class WorkflowRunsMixin:
|
|||
page: int = 1,
|
||||
page_size: int = 10,
|
||||
status: list[WorkflowRunStatus] | None = None,
|
||||
trigger_type: list[WorkflowRunTriggerType] | None = None,
|
||||
include_debugger_runs: bool = False,
|
||||
search_key: str | None = None,
|
||||
) -> list[WorkflowRun | Task]:
|
||||
|
|
@ -357,6 +358,10 @@ class WorkflowRunsMixin:
|
|||
|
||||
if status:
|
||||
workflow_run_query = workflow_run_query.filter(WorkflowRunModel.status.in_(status))
|
||||
if trigger_type:
|
||||
workflow_run_query = workflow_run_query.filter(
|
||||
WorkflowRunModel.trigger_type.in_([t.value for t in trigger_type])
|
||||
)
|
||||
workflow_run_query = workflow_run_query.order_by(WorkflowRunModel.created_at.desc()).limit(limit)
|
||||
workflow_run_query_result = (await session.execute(workflow_run_query)).all()
|
||||
workflow_runs = [
|
||||
|
|
@ -364,16 +369,20 @@ class WorkflowRunsMixin:
|
|||
for run, title in workflow_run_query_result
|
||||
]
|
||||
|
||||
task_query = (
|
||||
select(TaskModel)
|
||||
.filter(TaskModel.organization_id == organization_id)
|
||||
.filter(TaskModel.workflow_run_id.is_(None))
|
||||
)
|
||||
if status:
|
||||
task_query = task_query.filter(TaskModel.status.in_(status))
|
||||
task_query = task_query.order_by(TaskModel.created_at.desc()).limit(limit)
|
||||
task_query_result = (await session.scalars(task_query)).all()
|
||||
tasks = [convert_to_task(task, debug_enabled=self.debug_enabled) for task in task_query_result]
|
||||
# Tasks don't have trigger_type — skip them when filtering by trigger type
|
||||
if trigger_type:
|
||||
tasks: list[Task] = []
|
||||
else:
|
||||
task_query = (
|
||||
select(TaskModel)
|
||||
.filter(TaskModel.organization_id == organization_id)
|
||||
.filter(TaskModel.workflow_run_id.is_(None))
|
||||
)
|
||||
if status:
|
||||
task_query = task_query.filter(TaskModel.status.in_(status))
|
||||
task_query = task_query.order_by(TaskModel.created_at.desc()).limit(limit)
|
||||
task_query_result = (await session.scalars(task_query)).all()
|
||||
tasks = [convert_to_task(task, debug_enabled=self.debug_enabled) for task in task_query_result]
|
||||
|
||||
runs = workflow_runs + tasks
|
||||
|
||||
|
|
|
|||
|
|
@ -307,6 +307,7 @@ class WorkflowRunsRepository(BaseRepository):
|
|||
page: int = 1,
|
||||
page_size: int = 10,
|
||||
status: list[WorkflowRunStatus] | None = None,
|
||||
trigger_type: list[WorkflowRunTriggerType] | None = None,
|
||||
include_debugger_runs: bool = False,
|
||||
search_key: str | None = None,
|
||||
) -> list[WorkflowRun | Task]:
|
||||
|
|
@ -366,6 +367,10 @@ class WorkflowRunsRepository(BaseRepository):
|
|||
|
||||
if status:
|
||||
workflow_run_query = workflow_run_query.filter(WorkflowRunModel.status.in_(status))
|
||||
if trigger_type:
|
||||
workflow_run_query = workflow_run_query.filter(
|
||||
WorkflowRunModel.trigger_type.in_([t.value for t in trigger_type])
|
||||
)
|
||||
workflow_run_query = workflow_run_query.order_by(WorkflowRunModel.created_at.desc()).limit(limit)
|
||||
workflow_run_query_result = (await session.execute(workflow_run_query)).all()
|
||||
workflow_runs = [
|
||||
|
|
@ -373,16 +378,20 @@ class WorkflowRunsRepository(BaseRepository):
|
|||
for run, title in workflow_run_query_result
|
||||
]
|
||||
|
||||
task_query = (
|
||||
select(TaskModel)
|
||||
.filter(TaskModel.organization_id == organization_id)
|
||||
.filter(TaskModel.workflow_run_id.is_(None))
|
||||
)
|
||||
if status:
|
||||
task_query = task_query.filter(TaskModel.status.in_(status))
|
||||
task_query = task_query.order_by(TaskModel.created_at.desc()).limit(limit)
|
||||
task_query_result = (await session.scalars(task_query)).all()
|
||||
tasks = [convert_to_task(task, debug_enabled=self.debug_enabled) for task in task_query_result]
|
||||
# Tasks don't have trigger_type — skip them when filtering by trigger type
|
||||
if trigger_type:
|
||||
tasks: list[Task] = []
|
||||
else:
|
||||
task_query = (
|
||||
select(TaskModel)
|
||||
.filter(TaskModel.organization_id == organization_id)
|
||||
.filter(TaskModel.workflow_run_id.is_(None))
|
||||
)
|
||||
if status:
|
||||
task_query = task_query.filter(TaskModel.status.in_(status))
|
||||
task_query = task_query.order_by(TaskModel.created_at.desc()).limit(limit)
|
||||
task_query_result = (await session.scalars(task_query)).all()
|
||||
tasks = [convert_to_task(task, debug_enabled=self.debug_enabled) for task in task_query_result]
|
||||
|
||||
runs = workflow_runs + tasks
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ from skyvern.forge.sdk.core import skyvern_context
|
|||
from skyvern.forge.sdk.core.curl_converter import curl_to_http_request_block_params
|
||||
from skyvern.forge.sdk.core.permissions.permission_checker_factory import PermissionCheckerFactory
|
||||
from skyvern.forge.sdk.core.security import generate_skyvern_signature
|
||||
from skyvern.forge.sdk.db.enums import OrganizationAuthTokenType
|
||||
from skyvern.forge.sdk.db.enums import OrganizationAuthTokenType, WorkflowRunTriggerType
|
||||
from skyvern.forge.sdk.executor.factory import AsyncExecutorFactory
|
||||
from skyvern.forge.sdk.models import Step
|
||||
from skyvern.forge.sdk.routes.code_samples import (
|
||||
|
|
@ -2120,6 +2120,7 @@ async def get_runs(
|
|||
page: int = Query(1, ge=1),
|
||||
page_size: int = Query(10, ge=1),
|
||||
status: Annotated[list[WorkflowRunStatus] | None, Query()] = None,
|
||||
trigger_type: Annotated[list[WorkflowRunTriggerType] | None, Query()] = None,
|
||||
search_key: str | None = Query(
|
||||
None,
|
||||
description=(
|
||||
|
|
@ -2138,7 +2139,12 @@ async def get_runs(
|
|||
return []
|
||||
|
||||
runs = await app.DATABASE.get_all_runs(
|
||||
current_org.organization_id, page=page, page_size=page_size, status=status, search_key=search_key
|
||||
current_org.organization_id,
|
||||
page=page,
|
||||
page_size=page_size,
|
||||
status=status,
|
||||
trigger_type=trigger_type,
|
||||
search_key=search_key,
|
||||
)
|
||||
return ORJSONResponse([run.model_dump() for run in runs])
|
||||
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ def _load_task_runs_sync_activity_module(monkeypatch: pytest.MonkeyPatch):
|
|||
monkeypatch.setitem(sys.modules, "temporalio", temporalio_module)
|
||||
monkeypatch.setitem(sys.modules, "structlog", structlog_module)
|
||||
|
||||
module_path = _repo_root() / "workers" / "cron_worker" / "task_runs_sync_activity.py"
|
||||
module_path = _SOURCE_FILE
|
||||
spec = importlib.util.spec_from_file_location("test_task_runs_sync_activity_module", module_path)
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
assert spec is not None and spec.loader is not None
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue