mirror of
https://github.com/langgenius/dify.git
synced 2026-09-08 11:04:27 +08:00
refactor: use sessionmaker().begin() in console datasets controllers (#34283)
This commit is contained in:
parent
b818cc0766
commit
d9a0665b2c
@ -6,7 +6,7 @@ from flask import request
|
|||||||
from flask_restx import Resource, fields, marshal_with
|
from flask_restx import Resource, fields, marshal_with
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
from sqlalchemy import select
|
from sqlalchemy import select
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import sessionmaker
|
||||||
from werkzeug.exceptions import NotFound
|
from werkzeug.exceptions import NotFound
|
||||||
|
|
||||||
from controllers.common.schema import get_or_create_model, register_schema_model
|
from controllers.common.schema import get_or_create_model, register_schema_model
|
||||||
@ -159,7 +159,7 @@ class DataSourceApi(Resource):
|
|||||||
@account_initialization_required
|
@account_initialization_required
|
||||||
def patch(self, binding_id, action: Literal["enable", "disable"]):
|
def patch(self, binding_id, action: Literal["enable", "disable"]):
|
||||||
binding_id = str(binding_id)
|
binding_id = str(binding_id)
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine, expire_on_commit=False).begin() as session:
|
||||||
data_source_binding = session.execute(
|
data_source_binding = session.execute(
|
||||||
select(DataSourceOauthBinding).filter_by(id=binding_id)
|
select(DataSourceOauthBinding).filter_by(id=binding_id)
|
||||||
).scalar_one_or_none()
|
).scalar_one_or_none()
|
||||||
@ -211,7 +211,7 @@ class DataSourceNotionListApi(Resource):
|
|||||||
if not credential:
|
if not credential:
|
||||||
raise NotFound("Credential not found.")
|
raise NotFound("Credential not found.")
|
||||||
exist_page_ids = []
|
exist_page_ids = []
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine).begin() as session:
|
||||||
# import notion in the exist dataset
|
# import notion in the exist dataset
|
||||||
if query.dataset_id:
|
if query.dataset_id:
|
||||||
dataset = DatasetService.get_dataset(query.dataset_id)
|
dataset = DatasetService.get_dataset(query.dataset_id)
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import logging
|
|||||||
from flask import request
|
from flask import request
|
||||||
from flask_restx import Resource
|
from flask_restx import Resource
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import sessionmaker
|
||||||
|
|
||||||
from controllers.common.schema import register_schema_models
|
from controllers.common.schema import register_schema_models
|
||||||
from controllers.console import console_ns
|
from controllers.console import console_ns
|
||||||
@ -85,7 +85,7 @@ class CustomizedPipelineTemplateApi(Resource):
|
|||||||
@account_initialization_required
|
@account_initialization_required
|
||||||
@enterprise_license_required
|
@enterprise_license_required
|
||||||
def post(self, template_id: str):
|
def post(self, template_id: str):
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine, expire_on_commit=False).begin() as session:
|
||||||
template = (
|
template = (
|
||||||
session.query(PipelineCustomizedTemplate).where(PipelineCustomizedTemplate.id == template_id).first()
|
session.query(PipelineCustomizedTemplate).where(PipelineCustomizedTemplate.id == template_id).first()
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
from flask_restx import Resource, marshal
|
from flask_restx import Resource, marshal
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import sessionmaker
|
||||||
from werkzeug.exceptions import Forbidden
|
from werkzeug.exceptions import Forbidden
|
||||||
|
|
||||||
import services
|
import services
|
||||||
@ -54,7 +54,7 @@ class CreateRagPipelineDatasetApi(Resource):
|
|||||||
yaml_content=payload.yaml_content,
|
yaml_content=payload.yaml_content,
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine).begin() as session:
|
||||||
rag_pipeline_dsl_service = RagPipelineDslService(session)
|
rag_pipeline_dsl_service = RagPipelineDslService(session)
|
||||||
import_info = rag_pipeline_dsl_service.create_rag_pipeline_dataset(
|
import_info = rag_pipeline_dsl_service.create_rag_pipeline_dataset(
|
||||||
tenant_id=current_tenant_id,
|
tenant_id=current_tenant_id,
|
||||||
|
|||||||
@ -5,7 +5,7 @@ from flask import Response, request
|
|||||||
from flask_restx import Resource, marshal, marshal_with
|
from flask_restx import Resource, marshal, marshal_with
|
||||||
from graphon.variables.types import SegmentType
|
from graphon.variables.types import SegmentType
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import sessionmaker
|
||||||
from werkzeug.exceptions import Forbidden
|
from werkzeug.exceptions import Forbidden
|
||||||
|
|
||||||
from controllers.common.schema import register_schema_models
|
from controllers.common.schema import register_schema_models
|
||||||
@ -96,7 +96,7 @@ class RagPipelineVariableCollectionApi(Resource):
|
|||||||
raise DraftWorkflowNotExist()
|
raise DraftWorkflowNotExist()
|
||||||
|
|
||||||
# fetch draft workflow by app_model
|
# fetch draft workflow by app_model
|
||||||
with Session(bind=db.engine, expire_on_commit=False) as session:
|
with sessionmaker(bind=db.engine, expire_on_commit=False).begin() as session:
|
||||||
draft_var_srv = WorkflowDraftVariableService(
|
draft_var_srv = WorkflowDraftVariableService(
|
||||||
session=session,
|
session=session,
|
||||||
)
|
)
|
||||||
@ -143,7 +143,7 @@ class RagPipelineNodeVariableCollectionApi(Resource):
|
|||||||
@marshal_with(workflow_draft_variable_list_model)
|
@marshal_with(workflow_draft_variable_list_model)
|
||||||
def get(self, pipeline: Pipeline, node_id: str):
|
def get(self, pipeline: Pipeline, node_id: str):
|
||||||
validate_node_id(node_id)
|
validate_node_id(node_id)
|
||||||
with Session(bind=db.engine, expire_on_commit=False) as session:
|
with sessionmaker(bind=db.engine, expire_on_commit=False).begin() as session:
|
||||||
draft_var_srv = WorkflowDraftVariableService(
|
draft_var_srv = WorkflowDraftVariableService(
|
||||||
session=session,
|
session=session,
|
||||||
)
|
)
|
||||||
@ -289,7 +289,7 @@ class RagPipelineVariableResetApi(Resource):
|
|||||||
|
|
||||||
|
|
||||||
def _get_variable_list(pipeline: Pipeline, node_id) -> WorkflowDraftVariableList:
|
def _get_variable_list(pipeline: Pipeline, node_id) -> WorkflowDraftVariableList:
|
||||||
with Session(bind=db.engine, expire_on_commit=False) as session:
|
with sessionmaker(bind=db.engine, expire_on_commit=False).begin() as session:
|
||||||
draft_var_srv = WorkflowDraftVariableService(
|
draft_var_srv = WorkflowDraftVariableService(
|
||||||
session=session,
|
session=session,
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from flask import request
|
from flask import request
|
||||||
from flask_restx import Resource, fields, marshal_with # type: ignore
|
from flask_restx import Resource, fields, marshal_with # type: ignore
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import sessionmaker
|
||||||
|
|
||||||
from controllers.common.schema import get_or_create_model, register_schema_models
|
from controllers.common.schema import get_or_create_model, register_schema_models
|
||||||
from controllers.console import console_ns
|
from controllers.console import console_ns
|
||||||
@ -68,7 +68,7 @@ class RagPipelineImportApi(Resource):
|
|||||||
payload = RagPipelineImportPayload.model_validate(console_ns.payload or {})
|
payload = RagPipelineImportPayload.model_validate(console_ns.payload or {})
|
||||||
|
|
||||||
# Create service with session
|
# Create service with session
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine).begin() as session:
|
||||||
import_service = RagPipelineDslService(session)
|
import_service = RagPipelineDslService(session)
|
||||||
# Import app
|
# Import app
|
||||||
account = current_user
|
account = current_user
|
||||||
@ -80,7 +80,6 @@ class RagPipelineImportApi(Resource):
|
|||||||
pipeline_id=payload.pipeline_id,
|
pipeline_id=payload.pipeline_id,
|
||||||
dataset_name=payload.name,
|
dataset_name=payload.name,
|
||||||
)
|
)
|
||||||
session.commit()
|
|
||||||
|
|
||||||
# Return appropriate status code based on result
|
# Return appropriate status code based on result
|
||||||
status = result.status
|
status = result.status
|
||||||
@ -102,12 +101,11 @@ class RagPipelineImportConfirmApi(Resource):
|
|||||||
current_user, _ = current_account_with_tenant()
|
current_user, _ = current_account_with_tenant()
|
||||||
|
|
||||||
# Create service with session
|
# Create service with session
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine).begin() as session:
|
||||||
import_service = RagPipelineDslService(session)
|
import_service = RagPipelineDslService(session)
|
||||||
# Confirm import
|
# Confirm import
|
||||||
account = current_user
|
account = current_user
|
||||||
result = import_service.confirm_import(import_id=import_id, account=account)
|
result = import_service.confirm_import(import_id=import_id, account=account)
|
||||||
session.commit()
|
|
||||||
|
|
||||||
# Return appropriate status code based on result
|
# Return appropriate status code based on result
|
||||||
if result.status == ImportStatus.FAILED:
|
if result.status == ImportStatus.FAILED:
|
||||||
@ -124,7 +122,7 @@ class RagPipelineImportCheckDependenciesApi(Resource):
|
|||||||
@edit_permission_required
|
@edit_permission_required
|
||||||
@marshal_with(pipeline_import_check_dependencies_model)
|
@marshal_with(pipeline_import_check_dependencies_model)
|
||||||
def get(self, pipeline: Pipeline):
|
def get(self, pipeline: Pipeline):
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine).begin() as session:
|
||||||
import_service = RagPipelineDslService(session)
|
import_service = RagPipelineDslService(session)
|
||||||
result = import_service.check_dependencies(pipeline=pipeline)
|
result = import_service.check_dependencies(pipeline=pipeline)
|
||||||
|
|
||||||
@ -142,7 +140,7 @@ class RagPipelineExportApi(Resource):
|
|||||||
# Add include_secret params
|
# Add include_secret params
|
||||||
query = IncludeSecretQuery.model_validate(request.args.to_dict())
|
query = IncludeSecretQuery.model_validate(request.args.to_dict())
|
||||||
|
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine).begin() as session:
|
||||||
export_service = RagPipelineDslService(session)
|
export_service = RagPipelineDslService(session)
|
||||||
result = export_service.export_rag_pipeline_dsl(
|
result = export_service.export_rag_pipeline_dsl(
|
||||||
pipeline=pipeline, include_secret=query.include_secret == "true"
|
pipeline=pipeline, include_secret=query.include_secret == "true"
|
||||||
|
|||||||
@ -6,7 +6,7 @@ from flask import abort, request
|
|||||||
from flask_restx import Resource, marshal_with # type: ignore
|
from flask_restx import Resource, marshal_with # type: ignore
|
||||||
from graphon.model_runtime.utils.encoders import jsonable_encoder
|
from graphon.model_runtime.utils.encoders import jsonable_encoder
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import sessionmaker
|
||||||
from werkzeug.exceptions import BadRequest, Forbidden, InternalServerError, NotFound
|
from werkzeug.exceptions import BadRequest, Forbidden, InternalServerError, NotFound
|
||||||
|
|
||||||
import services
|
import services
|
||||||
@ -608,7 +608,7 @@ class PublishedRagPipelineApi(Resource):
|
|||||||
# The role of the current user in the ta table must be admin, owner, or editor
|
# The role of the current user in the ta table must be admin, owner, or editor
|
||||||
current_user, _ = current_account_with_tenant()
|
current_user, _ = current_account_with_tenant()
|
||||||
rag_pipeline_service = RagPipelineService()
|
rag_pipeline_service = RagPipelineService()
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine).begin() as session:
|
||||||
pipeline = session.merge(pipeline)
|
pipeline = session.merge(pipeline)
|
||||||
workflow = rag_pipeline_service.publish_workflow(
|
workflow = rag_pipeline_service.publish_workflow(
|
||||||
session=session,
|
session=session,
|
||||||
@ -620,8 +620,6 @@ class PublishedRagPipelineApi(Resource):
|
|||||||
session.add(pipeline)
|
session.add(pipeline)
|
||||||
workflow_created_at = TimestampField().format(workflow.created_at)
|
workflow_created_at = TimestampField().format(workflow.created_at)
|
||||||
|
|
||||||
session.commit()
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"result": "success",
|
"result": "success",
|
||||||
"created_at": workflow_created_at,
|
"created_at": workflow_created_at,
|
||||||
@ -695,7 +693,7 @@ class PublishedAllRagPipelineApi(Resource):
|
|||||||
raise Forbidden()
|
raise Forbidden()
|
||||||
|
|
||||||
rag_pipeline_service = RagPipelineService()
|
rag_pipeline_service = RagPipelineService()
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine).begin() as session:
|
||||||
workflows, has_more = rag_pipeline_service.get_all_published_workflow(
|
workflows, has_more = rag_pipeline_service.get_all_published_workflow(
|
||||||
session=session,
|
session=session,
|
||||||
pipeline=pipeline,
|
pipeline=pipeline,
|
||||||
@ -767,7 +765,7 @@ class RagPipelineByIdApi(Resource):
|
|||||||
rag_pipeline_service = RagPipelineService()
|
rag_pipeline_service = RagPipelineService()
|
||||||
|
|
||||||
# Create a session and manage the transaction
|
# Create a session and manage the transaction
|
||||||
with Session(db.engine, expire_on_commit=False) as session:
|
with sessionmaker(db.engine, expire_on_commit=False).begin() as session:
|
||||||
workflow = rag_pipeline_service.update_workflow(
|
workflow = rag_pipeline_service.update_workflow(
|
||||||
session=session,
|
session=session,
|
||||||
workflow_id=workflow_id,
|
workflow_id=workflow_id,
|
||||||
@ -779,9 +777,6 @@ class RagPipelineByIdApi(Resource):
|
|||||||
if not workflow:
|
if not workflow:
|
||||||
raise NotFound("Workflow not found")
|
raise NotFound("Workflow not found")
|
||||||
|
|
||||||
# Commit the transaction in the controller
|
|
||||||
session.commit()
|
|
||||||
|
|
||||||
return workflow
|
return workflow
|
||||||
|
|
||||||
@setup_required
|
@setup_required
|
||||||
@ -798,14 +793,13 @@ class RagPipelineByIdApi(Resource):
|
|||||||
|
|
||||||
workflow_service = WorkflowService()
|
workflow_service = WorkflowService()
|
||||||
|
|
||||||
with Session(db.engine) as session:
|
with sessionmaker(db.engine).begin() as session:
|
||||||
try:
|
try:
|
||||||
workflow_service.delete_workflow(
|
workflow_service.delete_workflow(
|
||||||
session=session,
|
session=session,
|
||||||
workflow_id=workflow_id,
|
workflow_id=workflow_id,
|
||||||
tenant_id=pipeline.tenant_id,
|
tenant_id=pipeline.tenant_id,
|
||||||
)
|
)
|
||||||
session.commit()
|
|
||||||
except WorkflowInUseError as e:
|
except WorkflowInUseError as e:
|
||||||
abort(400, description=str(e))
|
abort(400, description=str(e))
|
||||||
except DraftWorkflowDeletionError as e:
|
except DraftWorkflowDeletionError as e:
|
||||||
|
|||||||
@ -102,12 +102,12 @@ class TestDataSourceApi:
|
|||||||
|
|
||||||
with (
|
with (
|
||||||
app.test_request_context("/"),
|
app.test_request_context("/"),
|
||||||
patch("controllers.console.datasets.data_source.Session") as mock_session_class,
|
patch("controllers.console.datasets.data_source.sessionmaker") as mock_session_class,
|
||||||
patch("controllers.console.datasets.data_source.db.session.add"),
|
patch("controllers.console.datasets.data_source.db.session.add"),
|
||||||
patch("controllers.console.datasets.data_source.db.session.commit"),
|
patch("controllers.console.datasets.data_source.db.session.commit"),
|
||||||
):
|
):
|
||||||
mock_session = MagicMock()
|
mock_session = MagicMock()
|
||||||
mock_session_class.return_value.__enter__.return_value = mock_session
|
mock_session_class.return_value.begin.return_value.__enter__.return_value = mock_session
|
||||||
mock_session.execute.return_value.scalar_one_or_none.return_value = binding
|
mock_session.execute.return_value.scalar_one_or_none.return_value = binding
|
||||||
|
|
||||||
response, status = method(api, "b1", "enable")
|
response, status = method(api, "b1", "enable")
|
||||||
@ -123,12 +123,12 @@ class TestDataSourceApi:
|
|||||||
|
|
||||||
with (
|
with (
|
||||||
app.test_request_context("/"),
|
app.test_request_context("/"),
|
||||||
patch("controllers.console.datasets.data_source.Session") as mock_session_class,
|
patch("controllers.console.datasets.data_source.sessionmaker") as mock_session_class,
|
||||||
patch("controllers.console.datasets.data_source.db.session.add"),
|
patch("controllers.console.datasets.data_source.db.session.add"),
|
||||||
patch("controllers.console.datasets.data_source.db.session.commit"),
|
patch("controllers.console.datasets.data_source.db.session.commit"),
|
||||||
):
|
):
|
||||||
mock_session = MagicMock()
|
mock_session = MagicMock()
|
||||||
mock_session_class.return_value.__enter__.return_value = mock_session
|
mock_session_class.return_value.begin.return_value.__enter__.return_value = mock_session
|
||||||
mock_session.execute.return_value.scalar_one_or_none.return_value = binding
|
mock_session.execute.return_value.scalar_one_or_none.return_value = binding
|
||||||
|
|
||||||
response, status = method(api, "b1", "disable")
|
response, status = method(api, "b1", "disable")
|
||||||
@ -142,10 +142,10 @@ class TestDataSourceApi:
|
|||||||
|
|
||||||
with (
|
with (
|
||||||
app.test_request_context("/"),
|
app.test_request_context("/"),
|
||||||
patch("controllers.console.datasets.data_source.Session") as mock_session_class,
|
patch("controllers.console.datasets.data_source.sessionmaker") as mock_session_class,
|
||||||
):
|
):
|
||||||
mock_session = MagicMock()
|
mock_session = MagicMock()
|
||||||
mock_session_class.return_value.__enter__.return_value = mock_session
|
mock_session_class.return_value.begin.return_value.__enter__.return_value = mock_session
|
||||||
mock_session.execute.return_value.scalar_one_or_none.return_value = None
|
mock_session.execute.return_value.scalar_one_or_none.return_value = None
|
||||||
|
|
||||||
with pytest.raises(NotFound):
|
with pytest.raises(NotFound):
|
||||||
@ -159,10 +159,10 @@ class TestDataSourceApi:
|
|||||||
|
|
||||||
with (
|
with (
|
||||||
app.test_request_context("/"),
|
app.test_request_context("/"),
|
||||||
patch("controllers.console.datasets.data_source.Session") as mock_session_class,
|
patch("controllers.console.datasets.data_source.sessionmaker") as mock_session_class,
|
||||||
):
|
):
|
||||||
mock_session = MagicMock()
|
mock_session = MagicMock()
|
||||||
mock_session_class.return_value.__enter__.return_value = mock_session
|
mock_session_class.return_value.begin.return_value.__enter__.return_value = mock_session
|
||||||
mock_session.execute.return_value.scalar_one_or_none.return_value = binding
|
mock_session.execute.return_value.scalar_one_or_none.return_value = binding
|
||||||
|
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
@ -176,10 +176,10 @@ class TestDataSourceApi:
|
|||||||
|
|
||||||
with (
|
with (
|
||||||
app.test_request_context("/"),
|
app.test_request_context("/"),
|
||||||
patch("controllers.console.datasets.data_source.Session") as mock_session_class,
|
patch("controllers.console.datasets.data_source.sessionmaker") as mock_session_class,
|
||||||
):
|
):
|
||||||
mock_session = MagicMock()
|
mock_session = MagicMock()
|
||||||
mock_session_class.return_value.__enter__.return_value = mock_session
|
mock_session_class.return_value.begin.return_value.__enter__.return_value = mock_session
|
||||||
mock_session.execute.return_value.scalar_one_or_none.return_value = binding
|
mock_session.execute.return_value.scalar_one_or_none.return_value = binding
|
||||||
|
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
@ -282,7 +282,7 @@ class TestDataSourceNotionListApi:
|
|||||||
"controllers.console.datasets.data_source.DatasetService.get_dataset",
|
"controllers.console.datasets.data_source.DatasetService.get_dataset",
|
||||||
return_value=dataset,
|
return_value=dataset,
|
||||||
),
|
),
|
||||||
patch("controllers.console.datasets.data_source.Session") as mock_session_class,
|
patch("controllers.console.datasets.data_source.sessionmaker") as mock_session_class,
|
||||||
patch(
|
patch(
|
||||||
"core.datasource.datasource_manager.DatasourceManager.get_datasource_runtime",
|
"core.datasource.datasource_manager.DatasourceManager.get_datasource_runtime",
|
||||||
return_value=MagicMock(
|
return_value=MagicMock(
|
||||||
@ -292,7 +292,7 @@ class TestDataSourceNotionListApi:
|
|||||||
),
|
),
|
||||||
):
|
):
|
||||||
mock_session = MagicMock()
|
mock_session = MagicMock()
|
||||||
mock_session_class.return_value.__enter__.return_value = mock_session
|
mock_session_class.return_value.begin.return_value.__enter__.return_value = mock_session
|
||||||
mock_session.scalars.return_value.all.return_value = [document]
|
mock_session.scalars.return_value.all.return_value = [document]
|
||||||
|
|
||||||
response, status = method(api)
|
response, status = method(api)
|
||||||
@ -315,7 +315,7 @@ class TestDataSourceNotionListApi:
|
|||||||
"controllers.console.datasets.data_source.DatasetService.get_dataset",
|
"controllers.console.datasets.data_source.DatasetService.get_dataset",
|
||||||
return_value=dataset,
|
return_value=dataset,
|
||||||
),
|
),
|
||||||
patch("controllers.console.datasets.data_source.Session"),
|
patch("controllers.console.datasets.data_source.sessionmaker"),
|
||||||
):
|
):
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
method(api)
|
method(api)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user