mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-13 02:59:04 +08:00
Feature/self host notion import (#397)
This commit is contained in:
parent
402b0b81d2
commit
226f28edcb
@ -190,6 +190,9 @@ class Config:
|
|||||||
# notion import setting
|
# notion import setting
|
||||||
self.NOTION_CLIENT_ID = get_env('NOTION_CLIENT_ID')
|
self.NOTION_CLIENT_ID = get_env('NOTION_CLIENT_ID')
|
||||||
self.NOTION_CLIENT_SECRET = get_env('NOTION_CLIENT_SECRET')
|
self.NOTION_CLIENT_SECRET = get_env('NOTION_CLIENT_SECRET')
|
||||||
|
self.NOTION_INTEGRATION_TYPE = get_env('NOTION_INTEGRATION_TYPE')
|
||||||
|
self.NOTION_INTERNAL_SECRET = get_env('NOTION_INTERNAL_SECRET')
|
||||||
|
|
||||||
|
|
||||||
class CloudEditionConfig(Config):
|
class CloudEditionConfig(Config):
|
||||||
|
|
||||||
|
@ -39,11 +39,17 @@ class OAuthDataSource(Resource):
|
|||||||
print(vars(oauth_provider))
|
print(vars(oauth_provider))
|
||||||
if not oauth_provider:
|
if not oauth_provider:
|
||||||
return {'error': 'Invalid provider'}, 400
|
return {'error': 'Invalid provider'}, 400
|
||||||
|
if current_app.config.get('NOTION_INTEGRATION_TYPE') == 'internal':
|
||||||
|
internal_secret = current_app.config.get('NOTION_INTERNAL_SECRET')
|
||||||
|
oauth_provider.save_internal_access_token(internal_secret)
|
||||||
|
return redirect(f'{current_app.config.get("CONSOLE_URL")}?oauth_data_source=success')
|
||||||
|
else:
|
||||||
auth_url = oauth_provider.get_authorization_url()
|
auth_url = oauth_provider.get_authorization_url()
|
||||||
return redirect(auth_url)
|
return redirect(auth_url)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class OAuthDataSourceCallback(Resource):
|
class OAuthDataSourceCallback(Resource):
|
||||||
def get(self, provider: str):
|
def get(self, provider: str):
|
||||||
OAUTH_DATASOURCE_PROVIDERS = get_oauth_providers()
|
OAUTH_DATASOURCE_PROVIDERS = get_oauth_providers()
|
||||||
|
@ -84,7 +84,8 @@ class NotionPageReader(BaseReader):
|
|||||||
heading = text
|
heading = text
|
||||||
result_block_id = result["id"]
|
result_block_id = result["id"]
|
||||||
has_children = result["has_children"]
|
has_children = result["has_children"]
|
||||||
if has_children:
|
block_type = result["type"]
|
||||||
|
if has_children and block_type != 'child_page':
|
||||||
children_text = self._read_block(
|
children_text = self._read_block(
|
||||||
result_block_id, num_tabs=num_tabs + 1
|
result_block_id, num_tabs=num_tabs + 1
|
||||||
)
|
)
|
||||||
@ -184,7 +185,8 @@ class NotionPageReader(BaseReader):
|
|||||||
|
|
||||||
result_block_id = result["id"]
|
result_block_id = result["id"]
|
||||||
has_children = result["has_children"]
|
has_children = result["has_children"]
|
||||||
if has_children:
|
block_type = result["type"]
|
||||||
|
if has_children and block_type != 'child_page':
|
||||||
children_text = self._read_block(
|
children_text = self._read_block(
|
||||||
result_block_id, num_tabs=num_tabs + 1
|
result_block_id, num_tabs=num_tabs + 1
|
||||||
)
|
)
|
||||||
|
@ -26,6 +26,7 @@ class NotionOAuth(OAuthDataSource):
|
|||||||
_TOKEN_URL = 'https://api.notion.com/v1/oauth/token'
|
_TOKEN_URL = 'https://api.notion.com/v1/oauth/token'
|
||||||
_NOTION_PAGE_SEARCH = "https://api.notion.com/v1/search"
|
_NOTION_PAGE_SEARCH = "https://api.notion.com/v1/search"
|
||||||
_NOTION_BLOCK_SEARCH = "https://api.notion.com/v1/blocks"
|
_NOTION_BLOCK_SEARCH = "https://api.notion.com/v1/blocks"
|
||||||
|
_NOTION_BOT_USER = "https://api.notion.com/v1/users/me"
|
||||||
|
|
||||||
def get_authorization_url(self):
|
def get_authorization_url(self):
|
||||||
params = {
|
params = {
|
||||||
@ -84,6 +85,41 @@ class NotionOAuth(OAuthDataSource):
|
|||||||
db.session.add(new_data_source_binding)
|
db.session.add(new_data_source_binding)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
def save_internal_access_token(self, access_token: str):
|
||||||
|
workspace_name = self.notion_workspace_name(access_token)
|
||||||
|
workspace_icon = None
|
||||||
|
workspace_id = current_user.current_tenant_id
|
||||||
|
# get all authorized pages
|
||||||
|
pages = self.get_authorized_pages(access_token)
|
||||||
|
source_info = {
|
||||||
|
'workspace_name': workspace_name,
|
||||||
|
'workspace_icon': workspace_icon,
|
||||||
|
'workspace_id': workspace_id,
|
||||||
|
'pages': pages,
|
||||||
|
'total': len(pages)
|
||||||
|
}
|
||||||
|
# save data source binding
|
||||||
|
data_source_binding = DataSourceBinding.query.filter(
|
||||||
|
db.and_(
|
||||||
|
DataSourceBinding.tenant_id == current_user.current_tenant_id,
|
||||||
|
DataSourceBinding.provider == 'notion',
|
||||||
|
DataSourceBinding.access_token == access_token
|
||||||
|
)
|
||||||
|
).first()
|
||||||
|
if data_source_binding:
|
||||||
|
data_source_binding.source_info = source_info
|
||||||
|
data_source_binding.disabled = False
|
||||||
|
db.session.commit()
|
||||||
|
else:
|
||||||
|
new_data_source_binding = DataSourceBinding(
|
||||||
|
tenant_id=current_user.current_tenant_id,
|
||||||
|
access_token=access_token,
|
||||||
|
source_info=source_info,
|
||||||
|
provider='notion'
|
||||||
|
)
|
||||||
|
db.session.add(new_data_source_binding)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
def sync_data_source(self, binding_id: str):
|
def sync_data_source(self, binding_id: str):
|
||||||
# save data source binding
|
# save data source binding
|
||||||
data_source_binding = DataSourceBinding.query.filter(
|
data_source_binding = DataSourceBinding.query.filter(
|
||||||
@ -222,7 +258,10 @@ class NotionOAuth(OAuthDataSource):
|
|||||||
}
|
}
|
||||||
response = requests.post(url=self._NOTION_PAGE_SEARCH, json=data, headers=headers)
|
response = requests.post(url=self._NOTION_PAGE_SEARCH, json=data, headers=headers)
|
||||||
response_json = response.json()
|
response_json = response.json()
|
||||||
|
if 'results' in response_json:
|
||||||
results = response_json['results']
|
results = response_json['results']
|
||||||
|
else:
|
||||||
|
results = []
|
||||||
return results
|
return results
|
||||||
|
|
||||||
def notion_block_parent_page_id(self, access_token: str, block_id: str):
|
def notion_block_parent_page_id(self, access_token: str, block_id: str):
|
||||||
@ -238,6 +277,20 @@ class NotionOAuth(OAuthDataSource):
|
|||||||
return self.notion_block_parent_page_id(access_token, parent[parent_type])
|
return self.notion_block_parent_page_id(access_token, parent[parent_type])
|
||||||
return parent[parent_type]
|
return parent[parent_type]
|
||||||
|
|
||||||
|
def notion_workspace_name(self, access_token: str):
|
||||||
|
headers = {
|
||||||
|
'Authorization': f"Bearer {access_token}",
|
||||||
|
'Notion-Version': '2022-06-28',
|
||||||
|
}
|
||||||
|
response = requests.get(url=self._NOTION_BOT_USER, headers=headers)
|
||||||
|
response_json = response.json()
|
||||||
|
if 'object' in response_json and response_json['object'] == 'user':
|
||||||
|
user_type = response_json['type']
|
||||||
|
user_info = response_json[user_type]
|
||||||
|
if 'workspace_name' in user_info:
|
||||||
|
return user_info['workspace_name']
|
||||||
|
return 'workspace'
|
||||||
|
|
||||||
def notion_database_search(self, access_token: str):
|
def notion_database_search(self, access_token: str):
|
||||||
data = {
|
data = {
|
||||||
'filter': {
|
'filter': {
|
||||||
@ -252,5 +305,8 @@ class NotionOAuth(OAuthDataSource):
|
|||||||
}
|
}
|
||||||
response = requests.post(url=self._NOTION_PAGE_SEARCH, json=data, headers=headers)
|
response = requests.post(url=self._NOTION_PAGE_SEARCH, json=data, headers=headers)
|
||||||
response_json = response.json()
|
response_json = response.json()
|
||||||
|
if 'results' in response_json:
|
||||||
results = response_json['results']
|
results = response_json['results']
|
||||||
|
else:
|
||||||
|
results = []
|
||||||
return results
|
return results
|
||||||
|
Loading…
x
Reference in New Issue
Block a user