From 4e3d8b9ba84b86ad4356d9b22938c57975bc8d6c Mon Sep 17 00:00:00 2001 From: AlexCXC <1223408988@qq.com> Date: Wed, 8 Mar 2023 18:28:05 +0800 Subject: [PATCH 1/5] add comment apis --- seatable_api/main.py | 106 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/seatable_api/main.py b/seatable_api/main.py index b3adaaa..cdaa779 100644 --- a/seatable_api/main.py +++ b/seatable_api/main.py @@ -201,6 +201,42 @@ def _get_account_detail(self, account_name): data = parse_response(response) return data.get('account') + def _add_comment_url(self): + url = '%(server_url)s/api/v1/dtables/%(dtable_uuid)s/comments/' % { + 'server_url': self.dtable_server_url, + 'dtable_uuid': self.dtable_uuid + } + return url + + def _get_comments_url(self): + url = '%(server_url)s/api/v2.1/dtables/%(dtable_uuid)s/comments/' % { + 'server_url': self.server_url, + 'dtable_uuid': self.dtable_uuid + } + return url + + def _get_comments_count_url(self): + url = '%(server_url)s/api/v2.1/dtables/%(dtable_uuid)s/comments-count/' % { + 'server_url': self.server_url, + 'dtable_uuid': self.dtable_uuid + } + return url + + def _update_or_delete_comment_url(self, comment_id): + url = '%(server_url)s/api/v2.1/dtables/%(dtable_uuid)s/comments/%(comment_id)s/' % { + 'server_url': self.server_url, + 'dtable_uuid': self.dtable_uuid, + 'comment_id': comment_id + } + return url + + def _get_comments_within_days_url(self): + url = '%(server_url)s/api/v2.1/dtables/%(dtable_uuid)s/comments-within-days/' % { + 'server_url': self.dtable_server_url, + 'dtable_uuid': self.dtable_uuid + } + return url + def send_email(self, account_name, msg, **kwargs): msg_sender = self._get_msg_sender_by_account(account_name) if not msg_sender or msg_sender.msg_type != 'email': @@ -944,7 +980,6 @@ def add_workflow_task_with_existed_row(self, workflow_token, row_id, initiator=N response = requests.post(url, data={'row_id': row_id, 'initiator': initiator}, headers=headers) return parse_response(response)['task'] - def big_data_insert_rows(self, table_name, rows_data): url = self._dtable_db_insert_rows_url() json_data = { @@ -954,6 +989,75 @@ def big_data_insert_rows(self, table_name, rows_data): response = requests.post(url, json=json_data, headers=self.headers, timeout=self.timeout) return parse_response(response) + def add_comment(self, table_id, row_id, comment): + """ + :param table_id: str + :param row_id: str + :param comment: str + :return: success response dict {'success': True} + """ + url = self._add_comment_url() + params = {'table_id': table_id, 'row_id': row_id} + json_data = {'comment': str(comment)} + response = requests.post(url, params=params, json=json_data, headers=self.headers, timeout=self.timeout) + return parse_response(response) + + def get_comments_count(self, row_id): + """ + :param row_id: str + :return: int + """ + url = self._get_comments_count_url() + params = {'row_id': row_id} + response = requests.get(url, params=params, headers=self.headers, timeout=self.timeout) + return parse_response(response)['count'] + + def get_comments(self, row_id, page=1, per_page=25): + """ + :param row_id: str + :param page: str + :param per_page: str + :return: a dict of {'comments': , 'count': } + """ + url = self._get_comments_url() + params = { + 'row_id': row_id, + 'page': page, + 'per_page': per_page + } + response = requests.get(url, params=params, headers=self.headers, timeout=self.timeout) + return parse_response(response) + + def resolve_comment(self, comment_id, resolved=True): + """ + :param comment_id: str + :param resolved: bool + :return: success response dict {'success': True} + """ + url = self._update_or_delete_comment_url(comment_id) + options = {'resovled': 'true' if resolved else 'false'} + data = {'options': options} + response = requests.get(url, json=data, headers=self.headers, timeout=self.timeout) + return parse_response(response) + + def delete_comment(self, comment_id): + """ + :param comment_id: str + :return: success response dict {'success': True} + """ + url = self._update_or_delete_comment_url(comment_id) + response = requests.delete(url, headers=self.headers, timeout=self.timeout) + return parse_response(response) + + def get_comments_within_days(self, days=3): + """ + :param days: int + :return: list of comments + """ + url = self._get_comments_within_days_url() + params = {'days': days} + response = requests.get(url, params=params, headers=self.headers, timeout=self.timeout) + return parse_response(response)['comment_list'] class Account(object): From 89bb1cab405938b3aece000d59bae07d1d6e2fb9 Mon Sep 17 00:00:00 2001 From: Alex Happy <1223408988@qq.com> Date: Sat, 11 Mar 2023 00:31:19 +0800 Subject: [PATCH 2/5] add auth_as_user method --- seatable_api/exception.py | 5 +++++ seatable_api/main.py | 47 +++++++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/seatable_api/exception.py b/seatable_api/exception.py index 2987846..38953c3 100644 --- a/seatable_api/exception.py +++ b/seatable_api/exception.py @@ -4,3 +4,8 @@ class AuthExpiredError(ConnectionError): def __str__(self): return "The authorization has been expired" + +class UserAuthMissingError(Exception): + + def __str__(self): + return 'User authorization is missing' diff --git a/seatable_api/main.py b/seatable_api/main.py index cdaa779..b11627c 100644 --- a/seatable_api/main.py +++ b/seatable_api/main.py @@ -8,7 +8,7 @@ # https://requests.readthedocs.io import requests -from seatable_api.exception import AuthExpiredError +from seatable_api.exception import AuthExpiredError, UserAuthMissingError from seatable_api.message import get_sender_by_account from .constants import ROW_FILTER_KEYS, ColumnTypes from .constants import RENAME_COLUMN, RESIZE_COLUMN, FREEZE_COLUMN, MOVE_COLUMN, MODIFY_COLUMN_TYPE, DELETE_COLUMN @@ -64,8 +64,10 @@ def __init__(self, token, server_url): self.dtable_server_url = None self.dtable_db_url = None self.jwt_token = None + self.user_jwt_token = None self.jwt_exp = None self.headers = None + self.user_headers = None self.workspace_id = None self.dtable_uuid = None self.dtable_name = None @@ -118,6 +120,24 @@ def auth(self, with_socket_io=False): self.socketIO = SocketIO(base) self.socketIO._connect() + def auth_as_user(self, login, password): + """Auth to SeaTable as user + """ + self.jwt_exp = datetime.now() + timedelta(days=3) + url = self.server_url + '/api/v2.1/dtable/app-user-access-token/' + headers = parse_headers(self.token) + data = {'login': login, 'password': password} + response = requests.post(url, json=data, 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.user_jwt_token = data.get('access_token') + self.user_headers = parse_headers(self.user_jwt_token) + self.workspace_id = data.get('workspace_id') + self.dtable_uuid = data.get('dtable_uuid') + self.dtable_name = data.get('dtable_name') + def _metadata_server_url(self): return self.dtable_server_url + '/api/v1/dtables/' + self.dtable_uuid + '/metadata/' @@ -232,7 +252,7 @@ def _update_or_delete_comment_url(self, comment_id): def _get_comments_within_days_url(self): url = '%(server_url)s/api/v2.1/dtables/%(dtable_uuid)s/comments-within-days/' % { - 'server_url': self.dtable_server_url, + 'server_url': self.server_url, 'dtable_uuid': self.dtable_uuid } return url @@ -996,10 +1016,12 @@ def add_comment(self, table_id, row_id, comment): :param comment: str :return: success response dict {'success': True} """ + if not self.user_headers: + raise UserAuthMissingError('Please call Base.auth_as_user before call this method') url = self._add_comment_url() params = {'table_id': table_id, 'row_id': row_id} json_data = {'comment': str(comment)} - response = requests.post(url, params=params, json=json_data, headers=self.headers, timeout=self.timeout) + response = requests.post(url, params=params, json=json_data, headers=self.user_headers, timeout=self.timeout) return parse_response(response) def get_comments_count(self, row_id): @@ -1009,7 +1031,8 @@ def get_comments_count(self, row_id): """ url = self._get_comments_count_url() params = {'row_id': row_id} - response = requests.get(url, params=params, headers=self.headers, timeout=self.timeout) + headers = self.headers or self.user_headers or None + response = requests.get(url, params=params, headers=headers, timeout=self.timeout) return parse_response(response)['count'] def get_comments(self, row_id, page=1, per_page=25): @@ -1025,7 +1048,8 @@ def get_comments(self, row_id, page=1, per_page=25): 'page': page, 'per_page': per_page } - response = requests.get(url, params=params, headers=self.headers, timeout=self.timeout) + headers = self.headers or self.user_headers or None + response = requests.get(url, params=params, headers=headers, timeout=self.timeout) return parse_response(response) def resolve_comment(self, comment_id, resolved=True): @@ -1034,10 +1058,12 @@ def resolve_comment(self, comment_id, resolved=True): :param resolved: bool :return: success response dict {'success': True} """ + if not self.user_headers: + raise UserAuthMissingError('Please call Base.auth_as_user before call this method') url = self._update_or_delete_comment_url(comment_id) - options = {'resovled': 'true' if resolved else 'false'} + options = {'resolved': 'true' if resolved else 'false'} data = {'options': options} - response = requests.get(url, json=data, headers=self.headers, timeout=self.timeout) + response = requests.put(url, json=data, headers=self.user_headers, timeout=self.timeout) return parse_response(response) def delete_comment(self, comment_id): @@ -1045,8 +1071,10 @@ def delete_comment(self, comment_id): :param comment_id: str :return: success response dict {'success': True} """ + if not self.user_headers: + raise UserAuthMissingError('Please call Base.auth_as_user before call this method') url = self._update_or_delete_comment_url(comment_id) - response = requests.delete(url, headers=self.headers, timeout=self.timeout) + response = requests.delete(url, headers=self.user_headers, timeout=self.timeout) return parse_response(response) def get_comments_within_days(self, days=3): @@ -1056,7 +1084,8 @@ def get_comments_within_days(self, days=3): """ url = self._get_comments_within_days_url() params = {'days': days} - response = requests.get(url, params=params, headers=self.headers, timeout=self.timeout) + headers = self.headers or self.user_headers or None + response = requests.get(url, params=params, headers=headers, timeout=self.timeout) return parse_response(response)['comment_list'] From 270da4e32d22a4d3c03ba3285109596ca025f51b Mon Sep 17 00:00:00 2001 From: AlexCXC <1223408988@qq.com> Date: Mon, 13 Mar 2023 15:17:06 +0800 Subject: [PATCH 3/5] opt comment --- seatable_api/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seatable_api/main.py b/seatable_api/main.py index b11627c..3cb01b6 100644 --- a/seatable_api/main.py +++ b/seatable_api/main.py @@ -1040,7 +1040,7 @@ def get_comments(self, row_id, page=1, per_page=25): :param row_id: str :param page: str :param per_page: str - :return: a dict of {'comments': , 'count': } + :return: a dict of {'comment_list': , 'count': } """ url = self._get_comments_url() params = { From 9723584164134c72a66fb4f1db646fe0c255932f Mon Sep 17 00:00:00 2001 From: AlexCXC <1223408988@qq.com> Date: Mon, 3 Apr 2023 18:26:26 +0800 Subject: [PATCH 4/5] remove add/delete comment apis --- seatable_api/exception.py | 5 --- seatable_api/main.py | 70 ++++----------------------------------- 2 files changed, 6 insertions(+), 69 deletions(-) diff --git a/seatable_api/exception.py b/seatable_api/exception.py index 38953c3..2987846 100644 --- a/seatable_api/exception.py +++ b/seatable_api/exception.py @@ -4,8 +4,3 @@ class AuthExpiredError(ConnectionError): def __str__(self): return "The authorization has been expired" - -class UserAuthMissingError(Exception): - - def __str__(self): - return 'User authorization is missing' diff --git a/seatable_api/main.py b/seatable_api/main.py index 3cb01b6..6e49b1f 100644 --- a/seatable_api/main.py +++ b/seatable_api/main.py @@ -64,10 +64,8 @@ def __init__(self, token, server_url): self.dtable_server_url = None self.dtable_db_url = None self.jwt_token = None - self.user_jwt_token = None self.jwt_exp = None self.headers = None - self.user_headers = None self.workspace_id = None self.dtable_uuid = None self.dtable_name = None @@ -120,24 +118,6 @@ def auth(self, with_socket_io=False): self.socketIO = SocketIO(base) self.socketIO._connect() - def auth_as_user(self, login, password): - """Auth to SeaTable as user - """ - self.jwt_exp = datetime.now() + timedelta(days=3) - url = self.server_url + '/api/v2.1/dtable/app-user-access-token/' - headers = parse_headers(self.token) - data = {'login': login, 'password': password} - response = requests.post(url, json=data, 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.user_jwt_token = data.get('access_token') - self.user_headers = parse_headers(self.user_jwt_token) - self.workspace_id = data.get('workspace_id') - self.dtable_uuid = data.get('dtable_uuid') - self.dtable_name = data.get('dtable_name') - def _metadata_server_url(self): return self.dtable_server_url + '/api/v1/dtables/' + self.dtable_uuid + '/metadata/' @@ -221,13 +201,6 @@ def _get_account_detail(self, account_name): data = parse_response(response) return data.get('account') - def _add_comment_url(self): - url = '%(server_url)s/api/v1/dtables/%(dtable_uuid)s/comments/' % { - 'server_url': self.dtable_server_url, - 'dtable_uuid': self.dtable_uuid - } - return url - def _get_comments_url(self): url = '%(server_url)s/api/v2.1/dtables/%(dtable_uuid)s/comments/' % { 'server_url': self.server_url, @@ -242,7 +215,7 @@ def _get_comments_count_url(self): } return url - def _update_or_delete_comment_url(self, comment_id): + def _update_comment_url(self, comment_id): url = '%(server_url)s/api/v2.1/dtables/%(dtable_uuid)s/comments/%(comment_id)s/' % { 'server_url': self.server_url, 'dtable_uuid': self.dtable_uuid, @@ -1009,21 +982,6 @@ def big_data_insert_rows(self, table_name, rows_data): response = requests.post(url, json=json_data, headers=self.headers, timeout=self.timeout) return parse_response(response) - def add_comment(self, table_id, row_id, comment): - """ - :param table_id: str - :param row_id: str - :param comment: str - :return: success response dict {'success': True} - """ - if not self.user_headers: - raise UserAuthMissingError('Please call Base.auth_as_user before call this method') - url = self._add_comment_url() - params = {'table_id': table_id, 'row_id': row_id} - json_data = {'comment': str(comment)} - response = requests.post(url, params=params, json=json_data, headers=self.user_headers, timeout=self.timeout) - return parse_response(response) - def get_comments_count(self, row_id): """ :param row_id: str @@ -1031,8 +989,7 @@ def get_comments_count(self, row_id): """ url = self._get_comments_count_url() params = {'row_id': row_id} - headers = self.headers or self.user_headers or None - response = requests.get(url, params=params, headers=headers, timeout=self.timeout) + response = requests.get(url, params=params, headers=self.headers, timeout=self.timeout) return parse_response(response)['count'] def get_comments(self, row_id, page=1, per_page=25): @@ -1048,8 +1005,7 @@ def get_comments(self, row_id, page=1, per_page=25): 'page': page, 'per_page': per_page } - headers = self.headers or self.user_headers or None - response = requests.get(url, params=params, headers=headers, timeout=self.timeout) + response = requests.get(url, params=params, headers=self.headers, timeout=self.timeout) return parse_response(response) def resolve_comment(self, comment_id, resolved=True): @@ -1058,23 +1014,10 @@ def resolve_comment(self, comment_id, resolved=True): :param resolved: bool :return: success response dict {'success': True} """ - if not self.user_headers: - raise UserAuthMissingError('Please call Base.auth_as_user before call this method') - url = self._update_or_delete_comment_url(comment_id) + url = self._update_comment_url(comment_id) options = {'resolved': 'true' if resolved else 'false'} data = {'options': options} - response = requests.put(url, json=data, headers=self.user_headers, timeout=self.timeout) - return parse_response(response) - - def delete_comment(self, comment_id): - """ - :param comment_id: str - :return: success response dict {'success': True} - """ - if not self.user_headers: - raise UserAuthMissingError('Please call Base.auth_as_user before call this method') - url = self._update_or_delete_comment_url(comment_id) - response = requests.delete(url, headers=self.user_headers, timeout=self.timeout) + response = requests.put(url, json=data, headers=self.headers, timeout=self.timeout) return parse_response(response) def get_comments_within_days(self, days=3): @@ -1084,8 +1027,7 @@ def get_comments_within_days(self, days=3): """ url = self._get_comments_within_days_url() params = {'days': days} - headers = self.headers or self.user_headers or None - response = requests.get(url, params=params, headers=headers, timeout=self.timeout) + response = requests.get(url, params=params, headers=self.headers, timeout=self.timeout) return parse_response(response)['comment_list'] From 2fd098fa82d9ffccc2f6086fc546d8b423ed5fac Mon Sep 17 00:00:00 2001 From: Alex Happy <1223408988@qq.com> Date: Sun, 9 Apr 2023 00:56:54 +0800 Subject: [PATCH 5/5] remove useless code --- seatable_api/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seatable_api/main.py b/seatable_api/main.py index 6e49b1f..e6d61ed 100644 --- a/seatable_api/main.py +++ b/seatable_api/main.py @@ -8,7 +8,7 @@ # https://requests.readthedocs.io import requests -from seatable_api.exception import AuthExpiredError, UserAuthMissingError +from seatable_api.exception import AuthExpiredError from seatable_api.message import get_sender_by_account from .constants import ROW_FILTER_KEYS, ColumnTypes from .constants import RENAME_COLUMN, RESIZE_COLUMN, FREEZE_COLUMN, MOVE_COLUMN, MODIFY_COLUMN_TYPE, DELETE_COLUMN