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 diff --git a/seafileapi/client.py b/seafileapi/client.py index 9c245fd..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 get {}'.format(' or '.join(map(str, expected)), resp.status_code) + 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 diff --git a/seafileapi/groups.py b/seafileapi/groups.py index c91fd3f..c28adc9 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') @@ -106,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): @@ -121,13 +135,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/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', 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)