33from typing import Any , cast
44
55from flask import request
6- from flask_restx import Resource , marshal_with
6+ from flask_restx import Resource , fields , marshal_with
77from pydantic import BaseModel , Field
88from sqlalchemy import select
99from sqlalchemy .orm import Session
1010from werkzeug .exceptions import NotFound
1111
12- from controllers .common .schema import register_schema_model
12+ from controllers .common .schema import get_or_create_model , register_schema_model
1313from core .datasource .entities .datasource_entities import DatasourceProviderType , OnlineDocumentPagesMessage
1414from core .datasource .online_document .online_document_plugin import OnlineDocumentDatasourcePlugin
1515from core .indexing_runner import IndexingRunner
1616from core .rag .extractor .entity .datasource_type import DatasourceType
1717from core .rag .extractor .entity .extract_setting import ExtractSetting , NotionInfo
1818from core .rag .extractor .notion_extractor import NotionExtractor
1919from extensions .ext_database import db
20- from fields .data_source_fields import integrate_list_fields , integrate_notion_info_list_fields
20+ from fields .data_source_fields import (
21+ integrate_fields ,
22+ integrate_icon_fields ,
23+ integrate_list_fields ,
24+ integrate_notion_info_list_fields ,
25+ integrate_page_fields ,
26+ integrate_workspace_fields ,
27+ )
2128from libs .datetime_utils import naive_utc_now
2229from libs .login import current_account_with_tenant , login_required
2330from models import DataSourceOauthBinding , Document
@@ -49,6 +56,49 @@ class DataSourceNotionPreviewQuery(BaseModel):
4956register_schema_model (console_ns , NotionEstimatePayload )
5057
5158
59+ integrate_icon_model = get_or_create_model ("DataSourceIntegrateIcon" , integrate_icon_fields )
60+
61+ integrate_page_fields_copy = integrate_page_fields .copy ()
62+ integrate_page_fields_copy ["page_icon" ] = fields .Nested (integrate_icon_model , allow_null = True )
63+ integrate_page_model = get_or_create_model ("DataSourceIntegratePage" , integrate_page_fields_copy )
64+
65+ integrate_workspace_fields_copy = integrate_workspace_fields .copy ()
66+ integrate_workspace_fields_copy ["pages" ] = fields .List (fields .Nested (integrate_page_model ))
67+ integrate_workspace_model = get_or_create_model ("DataSourceIntegrateWorkspace" , integrate_workspace_fields_copy )
68+
69+ integrate_fields_copy = integrate_fields .copy ()
70+ integrate_fields_copy ["source_info" ] = fields .Nested (integrate_workspace_model )
71+ integrate_model = get_or_create_model ("DataSourceIntegrate" , integrate_fields_copy )
72+
73+ integrate_list_fields_copy = integrate_list_fields .copy ()
74+ integrate_list_fields_copy ["data" ] = fields .List (fields .Nested (integrate_model ))
75+ integrate_list_model = get_or_create_model ("DataSourceIntegrateList" , integrate_list_fields_copy )
76+
77+ notion_page_fields = {
78+ "page_name" : fields .String ,
79+ "page_id" : fields .String ,
80+ "page_icon" : fields .Nested (integrate_icon_model , allow_null = True ),
81+ "is_bound" : fields .Boolean ,
82+ "parent_id" : fields .String ,
83+ "type" : fields .String ,
84+ }
85+ notion_page_model = get_or_create_model ("NotionIntegratePage" , notion_page_fields )
86+
87+ notion_workspace_fields = {
88+ "workspace_name" : fields .String ,
89+ "workspace_id" : fields .String ,
90+ "workspace_icon" : fields .String ,
91+ "pages" : fields .List (fields .Nested (notion_page_model )),
92+ }
93+ notion_workspace_model = get_or_create_model ("NotionIntegrateWorkspace" , notion_workspace_fields )
94+
95+ integrate_notion_info_list_fields_copy = integrate_notion_info_list_fields .copy ()
96+ integrate_notion_info_list_fields_copy ["notion_info" ] = fields .List (fields .Nested (notion_workspace_model ))
97+ integrate_notion_info_list_model = get_or_create_model (
98+ "NotionIntegrateInfoList" , integrate_notion_info_list_fields_copy
99+ )
100+
101+
52102@console_ns .route (
53103 "/data-source/integrates" ,
54104 "/data-source/integrates/<uuid:binding_id>/<string:action>" ,
@@ -57,7 +107,7 @@ class DataSourceApi(Resource):
57107 @setup_required
58108 @login_required
59109 @account_initialization_required
60- @marshal_with (integrate_list_fields )
110+ @marshal_with (integrate_list_model )
61111 def get (self ):
62112 _ , current_tenant_id = current_account_with_tenant ()
63113
@@ -142,7 +192,7 @@ class DataSourceNotionListApi(Resource):
142192 @setup_required
143193 @login_required
144194 @account_initialization_required
145- @marshal_with (integrate_notion_info_list_fields )
195+ @marshal_with (integrate_notion_info_list_model )
146196 def get (self ):
147197 current_user , current_tenant_id = current_account_with_tenant ()
148198
0 commit comments