diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f578135..7cf7cda 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 with: - python-version: "3.9" + python-version: "3.12" - name: pip install run: | diff --git a/seatable_api/main.py b/seatable_api/main.py index e5f4ce0..68fa2ad 100644 --- a/seatable_api/main.py +++ b/seatable_api/main.py @@ -89,25 +89,20 @@ def _get_msg_sender_by_account(self, account_name): msg_sender = None return msg_sender - def auth(self, with_socket_io=False): - """Auth to SeaTable - """ + def _auth(self, workspace_id, dtable_name, dtable_uuid, access_token, dtable_server_url, dtable_db_url, use_api_gateway, with_socket_io=False): self.jwt_exp = datetime.now() + timedelta(days=3) - url = self.server_url + '/api/v2.1/dtable/app-access-token/' - headers = parse_headers(self.token) - response = requests.get(url, headers=headers, timeout=self.timeout) - data = parse_response(response) - self.dtable_server_url = parse_server_url(data.get('dtable_server')) - self.dtable_db_url = parse_server_url(data.get('dtable_db', '')) - self.jwt_token = data.get('access_token') + self.dtable_server_url = parse_server_url(dtable_server_url) + self.dtable_db_url = parse_server_url(dtable_db_url) + + self.jwt_token = access_token self.headers = parse_headers(self.jwt_token) - self.workspace_id = data.get('workspace_id') - self.dtable_uuid = data.get('dtable_uuid') - self.dtable_name = data.get('dtable_name') - # api gateway entry - self.use_api_gateway = data.get('use_api_gateway') + self.workspace_id = workspace_id + self.dtable_name = dtable_name + self.dtable_uuid = dtable_uuid + + self.use_api_gateway = use_api_gateway if self.use_api_gateway: self.api_gateway = APIGateway( token = self.token, @@ -116,13 +111,34 @@ def auth(self, with_socket_io=False): headers=self.headers, dtable_uuid=self.dtable_uuid ) + self.dtable_server_url = parse_server_url(self.server_url + '/api-gateway') + + self.is_authed = True if with_socket_io is True: base = self._clone() self.socketIO = SocketIO(base) self.socketIO._connect() - self.is_authed = True + def auth(self, with_socket_io=False): + """Auth to SeaTable + """ + self.jwt_exp = datetime.now() + timedelta(days=3) + url = self.server_url + '/api/v2.1/dtable/app-access-token/' + headers = parse_headers(self.token) + response = requests.get(url, headers=headers, timeout=self.timeout) + data = parse_response(response) + + self._auth( + data.get('workspace_id'), + data.get('dtable_name'), + data.get('dtable_uuid'), + data.get('access_token'), + data.get('dtable_server', ''), + data.get('dtable_db', ''), + data.get('use_api_gateway'), + with_socket_io=with_socket_io + ) def _metadata_server_url(self): return self.dtable_server_url + '/api/v1/dtables/' + self.dtable_uuid + '/metadata/' @@ -219,7 +235,7 @@ def _get_account_detail(self, account_name): params = { 'account_name': account_name } - headers = parse_headers(self.token) + headers = self.headers response = requests.get(url, params=params, headers=headers, timeout=self.timeout) data = parse_response(response) @@ -601,7 +617,7 @@ def get_file_download_link(self, path): """ url = self._app_download_link_url() params = {'path': path} - headers = parse_headers(self.token) + headers = self.headers response = requests.get(url, params=params, headers=headers, timeout=self.timeout) data = parse_response(response) return data.get('download_link') @@ -612,7 +628,7 @@ def get_file_upload_link(self): :return: dict """ url = self._app_upload_link_url() - headers = parse_headers(self.token) + headers = self.headers response = requests.get(url, headers=headers, timeout=self.timeout) data = parse_response(response) return data @@ -1231,7 +1247,7 @@ def get_custom_file_download_link(self, path): """ url = self._app_custom_download_link_url() params = {'path': path} - headers = parse_headers(self.token) + headers = self.headers response = requests.get(url, params=params, headers=headers, timeout=self.timeout) data = parse_response(response) return data.get('download_link') @@ -1240,7 +1256,7 @@ def get_custom_file_download_link(self, path): def get_custom_file_upload_link(self, path): url = self._app_custom_upload_link_url() params = {'path': path} - headers = parse_headers(self.token) + headers = self.headers response = requests.get(url, params=params, headers=headers, timeout=self.timeout) data = parse_response(response) return data @@ -1282,7 +1298,7 @@ def upload_local_file_to_custom_folder(self, local_path, custom_folder_path = No def get_custom_file_info(self, path, name): url = self._app_custom_asset_file_url() params = {'path': path, 'name': name} - headers = parse_headers(self.token) + headers = self.headers response = requests.get(url, params=params, headers=headers, timeout=self.timeout) data = parse_response(response) d = data['dirent'] @@ -1301,7 +1317,7 @@ def get_custom_file_info(self, path, name): def list_custom_assets(self, path): url = self._app_custom_asset_dir_url() params = {'path': path} - headers = parse_headers(self.token) + headers = self.headers response = requests.get(url, params=params, headers=headers, timeout=self.timeout) data = parse_response(response) return data @@ -1310,7 +1326,7 @@ def list_custom_assets(self, path): def get_user_info(self, username): url = self._app_user_info_url() params = {'username': username} - headers = parse_headers(self.token) + headers = self.headers response = requests.get(url, params=params, headers=headers, timeout=self.timeout) data = parse_response(response) return data @@ -1351,6 +1367,13 @@ def _get_temp_api_token_url(self, workspace_id, name): 'name': name } + def _get_base_access_token_url(self, workspace_id, name): + return '%(server_url)s/api/v2.1/workspace/%(workspace_id)s/dtable/%(name)s/access-token/' % { + 'server_url': self.server_url, + 'workspace_id': workspace_id, + 'name': name + } + @property def token_headers(self): return { @@ -1407,9 +1430,21 @@ def copy_base(self, src_workspace_id, base_name, dst_workspace_id): return parse_response(response).get('dtable') def get_base(self, workspace_id, base_name, with_socket_io=False): - response = requests.get(self._get_temp_api_token_url(workspace_id, base_name), - headers=self.token_headers, timeout=self.timeout) - api_token = parse_response(response).get('api_token') - base = SeaTableAPI(api_token, self.server_url) - base.auth(with_socket_io=with_socket_io) + response = requests.get(self._get_base_access_token_url(workspace_id, base_name), + headers=self.token_headers, + timeout=self.timeout) + resp_json = response.json() + access_token = resp_json['access_token'] + dtable_uuid = resp_json['dtable_uuid'] + base = SeaTableAPI('', self.server_url) + base._auth( + workspace_id, + base_name, + dtable_uuid, + access_token, + '', + '', + True, + with_socket_io=with_socket_io + ) return base