mirror of
https://github.com/langgenius/dify.git
synced 2026-11-13 06:41:07 +08:00
refactor(models): pass session into WorkflowDraftVariable value decoding (#43112)
This commit is contained in:
1 parent
59986a52e7
commit
4e1c01bd2b
18 files changed
+883
-207
No files matched your search
@@ -7,12 +7,13 @@ from uuid import UUID
|
||||
from flask import Response
|
||||
from flask_restx import Resource
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.orm import Session, sessionmaker
|
||||
|
||||
from controllers.common.errors import InvalidArgumentError, NotFoundError
|
||||
from controllers.common.fields import SimpleResultResponse
|
||||
from controllers.common.rbac import PlainApp, RBACCheck
|
||||
from controllers.common.schema import query_params_from_model, register_response_schema_models, register_schema_models
|
||||
from controllers.common.session import with_session
|
||||
from controllers.console import console_ns
|
||||
from controllers.console.app.error import (
|
||||
DraftWorkflowNotExist,
|
||||
@@ -41,6 +42,8 @@ from fields.workflow_draft_variable_fields import (
|
||||
WorkflowDraftVariableListWithoutValueResponse,
|
||||
WorkflowDraftVariableResponse,
|
||||
WorkflowDraftVariableWithoutValueResponse,
|
||||
draft_variable_list_response_source,
|
||||
draft_variable_response_source,
|
||||
)
|
||||
from graphon.variables.types import SegmentType
|
||||
from libs.external_api import error_responses
|
||||
@@ -248,12 +251,12 @@ class WorkflowVariableCollectionApi(Resource):
|
||||
@console_ns.doc(description="Delete all draft workflow variables")
|
||||
@console_ns.response(204, "Workflow variables deleted successfully")
|
||||
@_api_prerequisite
|
||||
def delete(self, current_user: Account, app_model: App):
|
||||
@with_session
|
||||
def delete(self, session: Session, current_user: Account, app_model: App):
|
||||
draft_var_srv = WorkflowDraftVariableService(
|
||||
session=db.session(),
|
||||
session=session,
|
||||
)
|
||||
draft_var_srv.delete_user_workflow_variables(app_model.id, user_id=current_user.id)
|
||||
db.session.commit()
|
||||
return Response("", 204)
|
||||
|
||||
|
||||
@@ -286,25 +289,27 @@ class NodeVariableCollectionApi(Resource):
|
||||
)
|
||||
@_api_prerequisite
|
||||
@rbac_permission_required(RBACCheck(RBACPermission.APP_VIEW_LAYOUT, PlainApp()))
|
||||
def get(self, current_user: Account, app_model: App, node_id: str):
|
||||
@with_session(write=False)
|
||||
def get(self, session: Session, current_user: Account, app_model: App, node_id: str):
|
||||
validate_node_id(node_id)
|
||||
with sessionmaker(bind=db.engine, expire_on_commit=False).begin() as session:
|
||||
draft_var_srv = WorkflowDraftVariableService(
|
||||
session=session,
|
||||
)
|
||||
node_vars = draft_var_srv.list_node_variables(app_model.id, node_id, user_id=current_user.id)
|
||||
|
||||
return dump_response(WorkflowDraftVariableListResponse, node_vars)
|
||||
draft_var_srv = WorkflowDraftVariableService(
|
||||
session=session,
|
||||
)
|
||||
node_vars = draft_var_srv.list_node_variables(app_model.id, node_id, user_id=current_user.id)
|
||||
return dump_response(
|
||||
WorkflowDraftVariableListResponse,
|
||||
draft_variable_list_response_source(node_vars, session=session),
|
||||
)
|
||||
|
||||
@console_ns.doc("delete_node_variables")
|
||||
@console_ns.doc(description="Delete all variables for a specific node")
|
||||
@console_ns.response(204, "Node variables deleted successfully")
|
||||
@_api_prerequisite
|
||||
def delete(self, current_user: Account, app_model: App, node_id: str):
|
||||
@with_session
|
||||
def delete(self, session: Session, current_user: Account, app_model: App, node_id: str):
|
||||
validate_node_id(node_id)
|
||||
srv = WorkflowDraftVariableService(db.session())
|
||||
srv = WorkflowDraftVariableService(session)
|
||||
srv.delete_node_variables(app_model.id, node_id, user_id=current_user.id)
|
||||
db.session.commit()
|
||||
return Response("", 204)
|
||||
|
||||
|
||||
@@ -324,9 +329,10 @@ class VariableApi(Resource):
|
||||
@console_ns.response(404, "Variable not found")
|
||||
@_api_prerequisite
|
||||
@rbac_permission_required(RBACCheck(RBACPermission.APP_VIEW_LAYOUT, PlainApp()))
|
||||
def get(self, current_user: Account, app_model: App, variable_id: UUID):
|
||||
@with_session(write=False)
|
||||
def get(self, session: Session, current_user: Account, app_model: App, variable_id: UUID):
|
||||
draft_var_srv = WorkflowDraftVariableService(
|
||||
session=db.session(),
|
||||
session=session,
|
||||
)
|
||||
variable_id_str = str(variable_id)
|
||||
variable = ensure_variable_access(
|
||||
@@ -335,7 +341,7 @@ class VariableApi(Resource):
|
||||
variable_id=variable_id_str,
|
||||
current_user_id=current_user.id,
|
||||
)
|
||||
return dump_response(WorkflowDraftVariableResponse, variable)
|
||||
return dump_response(WorkflowDraftVariableResponse, draft_variable_response_source(variable, session=session))
|
||||
|
||||
@console_ns.doc("update_variable")
|
||||
@console_ns.doc(description="Update a workflow variable")
|
||||
@@ -348,8 +354,10 @@ class VariableApi(Resource):
|
||||
@console_ns.response(404, "Variable not found")
|
||||
@_api_prerequisite
|
||||
@model_validate(WorkflowDraftVariableUpdatePayload)
|
||||
@with_session
|
||||
def patch(
|
||||
self,
|
||||
session: Session,
|
||||
req_data: WorkflowDraftVariableUpdatePayload,
|
||||
current_user: Account,
|
||||
app_model: App,
|
||||
@@ -377,7 +385,7 @@ class VariableApi(Resource):
|
||||
# }
|
||||
|
||||
draft_var_srv = WorkflowDraftVariableService(
|
||||
session=db.session(),
|
||||
session=session,
|
||||
)
|
||||
|
||||
variable_id_str = str(variable_id)
|
||||
@@ -391,7 +399,9 @@ class VariableApi(Resource):
|
||||
new_name = req_data.name
|
||||
raw_value = req_data.value
|
||||
if new_name is None and raw_value is None:
|
||||
return dump_response(WorkflowDraftVariableResponse, variable)
|
||||
return dump_response(
|
||||
WorkflowDraftVariableResponse, draft_variable_response_source(variable, session=session)
|
||||
)
|
||||
|
||||
new_value = None
|
||||
if raw_value is not None:
|
||||
@@ -418,17 +428,17 @@ class VariableApi(Resource):
|
||||
pass
|
||||
new_value = build_segment_with_type(variable.value_type, raw_value)
|
||||
draft_var_srv.update_variable(variable, name=new_name, value=new_value)
|
||||
db.session.commit()
|
||||
return dump_response(WorkflowDraftVariableResponse, variable)
|
||||
return dump_response(WorkflowDraftVariableResponse, draft_variable_response_source(variable, session=session))
|
||||
|
||||
@console_ns.doc("delete_variable")
|
||||
@console_ns.doc(description="Delete a workflow variable")
|
||||
@console_ns.response(204, "Variable deleted successfully")
|
||||
@console_ns.response(404, "Variable not found")
|
||||
@_api_prerequisite
|
||||
def delete(self, current_user: Account, app_model: App, variable_id: UUID):
|
||||
@with_session
|
||||
def delete(self, session: Session, current_user: Account, app_model: App, variable_id: UUID):
|
||||
draft_var_srv = WorkflowDraftVariableService(
|
||||
session=db.session(),
|
||||
session=session,
|
||||
)
|
||||
variable_id_str = str(variable_id)
|
||||
variable = ensure_variable_access(
|
||||
@@ -438,7 +448,6 @@ class VariableApi(Resource):
|
||||
current_user_id=current_user.id,
|
||||
)
|
||||
draft_var_srv.delete_variable(variable)
|
||||
db.session.commit()
|
||||
return Response("", 204)
|
||||
|
||||
|
||||
@@ -455,13 +464,14 @@ class VariableResetApi(Resource):
|
||||
@console_ns.response(204, "Variable reset (no content)")
|
||||
@console_ns.response(404, "Variable not found")
|
||||
@_api_prerequisite
|
||||
def put(self, current_user: Account, app_model: App, variable_id: UUID):
|
||||
@with_session
|
||||
def put(self, session: Session, current_user: Account, app_model: App, variable_id: UUID):
|
||||
draft_var_srv = WorkflowDraftVariableService(
|
||||
session=db.session(),
|
||||
session=session,
|
||||
)
|
||||
|
||||
workflow_srv = WorkflowService()
|
||||
draft_workflow = workflow_srv.get_draft_workflow(app_model, session=db.session())
|
||||
draft_workflow = workflow_srv.get_draft_workflow(app_model, session=session)
|
||||
if draft_workflow is None:
|
||||
raise NotFoundError(
|
||||
f"Draft workflow not found, app_id={app_model.id}",
|
||||
@@ -475,27 +485,27 @@ class VariableResetApi(Resource):
|
||||
)
|
||||
|
||||
resetted = draft_var_srv.reset_variable(draft_workflow, variable)
|
||||
db.session.commit()
|
||||
if resetted is None:
|
||||
return Response("", 204)
|
||||
return dump_response(WorkflowDraftVariableResponse, resetted)
|
||||
return dump_response(WorkflowDraftVariableResponse, draft_variable_response_source(resetted, session=session))
|
||||
|
||||
|
||||
def _get_variable_list(app_model: App, node_id: str, current_user_id: str) -> WorkflowDraftVariableList:
|
||||
with sessionmaker(bind=db.engine, expire_on_commit=False).begin() as session:
|
||||
draft_var_srv = WorkflowDraftVariableService(
|
||||
session=session,
|
||||
def _get_variable_list(
|
||||
app_model: App, node_id: str, current_user_id: str, *, session: Session
|
||||
) -> WorkflowDraftVariableList:
|
||||
draft_var_srv = WorkflowDraftVariableService(
|
||||
session=session,
|
||||
)
|
||||
if node_id == CONVERSATION_VARIABLE_NODE_ID:
|
||||
draft_vars = draft_var_srv.list_conversation_variables(app_model.id, user_id=current_user_id)
|
||||
elif node_id == SYSTEM_VARIABLE_NODE_ID:
|
||||
draft_vars = draft_var_srv.list_system_variables(app_model.id, user_id=current_user_id)
|
||||
else:
|
||||
draft_vars = draft_var_srv.list_node_variables(
|
||||
app_id=app_model.id,
|
||||
node_id=node_id,
|
||||
user_id=current_user_id,
|
||||
)
|
||||
if node_id == CONVERSATION_VARIABLE_NODE_ID:
|
||||
draft_vars = draft_var_srv.list_conversation_variables(app_model.id, user_id=current_user_id)
|
||||
elif node_id == SYSTEM_VARIABLE_NODE_ID:
|
||||
draft_vars = draft_var_srv.list_system_variables(app_model.id, user_id=current_user_id)
|
||||
else:
|
||||
draft_vars = draft_var_srv.list_node_variables(
|
||||
app_id=app_model.id,
|
||||
node_id=node_id,
|
||||
user_id=current_user_id,
|
||||
)
|
||||
return draft_vars
|
||||
|
||||
|
||||
@@ -512,19 +522,22 @@ class ConversationVariableCollectionApi(Resource):
|
||||
@console_ns.response(404, "Draft workflow not found")
|
||||
@_api_prerequisite
|
||||
@rbac_permission_required(RBACCheck(RBACPermission.APP_VIEW_LAYOUT, PlainApp()))
|
||||
def get(self, current_user: Account, app_model: App):
|
||||
@with_session
|
||||
def get(self, session: Session, current_user: Account, app_model: App):
|
||||
# NOTE(QuantumGhost): Prefill conversation variables into the draft variables table
|
||||
# so their IDs can be returned to the caller.
|
||||
workflow_srv = WorkflowService()
|
||||
draft_workflow = workflow_srv.get_draft_workflow(app_model, session=db.session())
|
||||
draft_workflow = workflow_srv.get_draft_workflow(app_model, session=session)
|
||||
if draft_workflow is None:
|
||||
raise NotFoundError(description=f"draft workflow not found, id={app_model.id}")
|
||||
draft_var_srv = WorkflowDraftVariableService(db.session())
|
||||
draft_var_srv = WorkflowDraftVariableService(session)
|
||||
draft_var_srv.prefill_conversation_variable_default_values(draft_workflow, user_id=current_user.id)
|
||||
db.session.commit()
|
||||
return dump_response(
|
||||
WorkflowDraftVariableListResponse,
|
||||
_get_variable_list(app_model, CONVERSATION_VARIABLE_NODE_ID, current_user.id),
|
||||
draft_variable_list_response_source(
|
||||
_get_variable_list(app_model, CONVERSATION_VARIABLE_NODE_ID, current_user.id, session=session),
|
||||
session=session,
|
||||
),
|
||||
)
|
||||
|
||||
@console_ns.expect(console_ns.models[ConversationVariableUpdatePayload.__name__])
|
||||
@@ -576,10 +589,14 @@ class SystemVariableCollectionApi(Resource):
|
||||
)
|
||||
@_api_prerequisite
|
||||
@rbac_permission_required(RBACCheck(RBACPermission.APP_VIEW_LAYOUT, PlainApp()))
|
||||
def get(self, current_user: Account, app_model: App):
|
||||
@with_session(write=False)
|
||||
def get(self, session: Session, current_user: Account, app_model: App):
|
||||
return dump_response(
|
||||
WorkflowDraftVariableListResponse,
|
||||
_get_variable_list(app_model, SYSTEM_VARIABLE_NODE_ID, current_user.id),
|
||||
draft_variable_list_response_source(
|
||||
_get_variable_list(app_model, SYSTEM_VARIABLE_NODE_ID, current_user.id, session=session),
|
||||
session=session,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user