From 61cf9dd7ecc0b1d0308d282411cc2608ae74a90e Mon Sep 17 00:00:00 2001 From: Florian Buchmeier Date: Fri, 23 Oct 2020 17:43:01 +0200 Subject: [PATCH 1/7] Added 'Bulk Add Group Members' and implemented 'Delete a Group Member' --- seafileapi/groups.py | 16 ++++++++++++++-- tests/test_groups.py | 5 +++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/seafileapi/groups.py b/seafileapi/groups.py index c91fd3f..f9db9e2 100644 --- a/seafileapi/groups.py +++ b/seafileapi/groups.py @@ -40,6 +40,7 @@ class Group: """ GROUPS_URL = '/api/v2.1/groups/{}/' GROUP_MEMBERS_URL = '/api/v2.1/groups/{}/members/{}' + GROUP_MEMBERS_BULK_URL = '/api/v2.1/groups/{}/members/{}/bulk' GROUP_MESSAGES_URL = '/api2/groups/{}/discussions/{}' __slots__ = ('client', 'id', 'name', 'owner', 'created_at', 'admins', 'avatar_url', 'wiki_enabled') @@ -121,13 +122,24 @@ def add_member(self, email): res = self.client.post(self.GROUP_MEMBERS_URL.format(self.id, ''), data={'email': email}).json() return self.get_member(res['email']) - def add_members(self): + def add_members(self, emails): + """ + + :param emails: + :return: + """ + res = self.client.post(self.GROUP_MEMBERS_BULK_URL.format(self.id, ''), data={'emails': ','.join(emails)}).json() + # TODO Return 'failed' members as well? + return [self.get_member(member['email']) for member in res['success']] + + def delete_member(self, email): """ :param email: :return: """ - raise NotImplemented + res = self.client.delete(self.GROUP_MEMBERS_URL.format(self.id, email)).json() + return bool(res['success']) def list_messages(self): """ diff --git a/tests/test_groups.py b/tests/test_groups.py index 911a03f..5e24017 100644 --- a/tests/test_groups.py +++ b/tests/test_groups.py @@ -27,6 +27,11 @@ def test_members(group, test_account1, test_account2): member2.delete() assert member2 not in group.list_members() + member1.delete() + member2.delete() + members = group.add_members([test_account1.email, test_account2.email]) + assert member1 in group.list_members() and member2 in group.list_members() + def test_messages(group, test_account1, test_account2): member1 = group.add_member(test_account1.email) From a982c06668225ffdd1704e604836be715b6032fa Mon Sep 17 00:00:00 2001 From: Florian Buchmeier Date: Fri, 30 Oct 2020 11:07:01 +0100 Subject: [PATCH 2/7] added build output to ignore list --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 7d59b58..40ae560 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ htmlcov/ .coverage .cache .idea/ +build +dist +*.egg-info \ No newline at end of file From ee1a9104e5b735a790583a708b785da4a64f09ca Mon Sep 17 00:00:00 2001 From: Florian Buchmeier Date: Fri, 30 Oct 2020 11:08:05 +0100 Subject: [PATCH 3/7] added 'error_msg' to exception output to simplify debugging --- seafileapi/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seafileapi/client.py b/seafileapi/client.py index 9c245fd..bce868c 100644 --- a/seafileapi/client.py +++ b/seafileapi/client.py @@ -96,7 +96,7 @@ def _send_request(self, method, url, *args, **kwargs): expected = (expected,) resp = requests.request(method, url, **kwargs) if resp.status_code not in expected: - msg = 'Expected {}, but get {}'.format(' or '.join(map(str, expected)), resp.status_code) + msg = 'Expected {}, but got {}. Error Message: {}'.format(' or '.join(map(str, expected)), resp.status_code, resp.json().get('error_msg', 'None')) raise ClientHttpError(resp.status_code, msg) return resp From d2596972b4afab8bd4a2bf378cbd55fa76a86f94 Mon Sep 17 00:00:00 2001 From: Florian Buchmeier Date: Fri, 30 Oct 2020 12:29:18 +0100 Subject: [PATCH 4/7] added check if any json data is included in the response before extracting the error_msg --- seafileapi/client.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/seafileapi/client.py b/seafileapi/client.py index bce868c..5b4134e 100644 --- a/seafileapi/client.py +++ b/seafileapi/client.py @@ -1,4 +1,5 @@ import requests +from json.decoder import JSONDecodeError from seafileapi.utils import urljoin from seafileapi.exceptions import ClientHttpError from seafileapi.repos import Repos @@ -96,7 +97,11 @@ def _send_request(self, method, url, *args, **kwargs): expected = (expected,) resp = requests.request(method, url, **kwargs) if resp.status_code not in expected: - msg = 'Expected {}, but got {}. Error Message: {}'.format(' or '.join(map(str, expected)), resp.status_code, resp.json().get('error_msg', 'None')) + try: + err = resp.json().get('error_msg', 'Unknown') + except JSONDecodeError: + err = 'Unknown' + msg = 'Expected {}, but got {}. Error Message: {}'.format(' or '.join(map(str, expected)), resp.status_code, err ) raise ClientHttpError(resp.status_code, msg) return resp From c0868d3afe6cef3e39484f219730a24c3ba6ea45 Mon Sep 17 00:00:00 2001 From: Florian Buchmeier Date: Fri, 30 Oct 2020 12:53:06 +0100 Subject: [PATCH 5/7] removed empty placeholder --- seafileapi/groups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seafileapi/groups.py b/seafileapi/groups.py index f9db9e2..f77a7a0 100644 --- a/seafileapi/groups.py +++ b/seafileapi/groups.py @@ -40,7 +40,7 @@ class Group: """ GROUPS_URL = '/api/v2.1/groups/{}/' GROUP_MEMBERS_URL = '/api/v2.1/groups/{}/members/{}' - GROUP_MEMBERS_BULK_URL = '/api/v2.1/groups/{}/members/{}/bulk' + GROUP_MEMBERS_BULK_URL = '/api/v2.1/groups/{}/members/bulk' GROUP_MESSAGES_URL = '/api2/groups/{}/discussions/{}' __slots__ = ('client', 'id', 'name', 'owner', 'created_at', 'admins', 'avatar_url', 'wiki_enabled') From 872aaeb5df76fdec9830cfcbdfbc786f002cef15 Mon Sep 17 00:00:00 2001 From: Florian Buchmeier Date: Tue, 31 Aug 2021 16:07:40 +0200 Subject: [PATCH 6/7] added paging to list_members --- seafileapi/groups.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/seafileapi/groups.py b/seafileapi/groups.py index f77a7a0..c28adc9 100644 --- a/seafileapi/groups.py +++ b/seafileapi/groups.py @@ -107,10 +107,23 @@ def get_member(self, email): def list_members(self): """ + Get all members from a group + + Note: Endpoint uses paging + Ref: https://github.com/haiwen/seahub/blob/master/seahub/api2/endpoints/group_members.py#L56 :return: """ - members = self.client.get(self.GROUP_MEMBERS_URL.format(self.id, '')).json() + page=1 + per_page=100 + members = [] + while True: + res = self.client.get(self.GROUP_MEMBERS_URL.format( + self.id, ''), params={"page": page, "per_page": per_page}).json() + members += res + page += 1 + if len(res) < per_page: + break return [Member(self.client, **member) for member in members] if members else [] def add_member(self, email): From 99fd0c1d6db132590f0a0525b9f30b90f92d4227 Mon Sep 17 00:00:00 2001 From: Florian Buchmeier Date: Tue, 7 Sep 2021 09:42:41 +0200 Subject: [PATCH 7/7] bumped pkg version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b75405d..85f8523 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import setup, find_packages -__version__ = '0.1.2' +__version__ = '0.1.3' setup(name='seafileapi',