diff options
| -rw-r--r-- | obsapi/core.py | 66 | ||||
| -rw-r--r-- | test/test_api.py | 12 |
2 files changed, 78 insertions, 0 deletions
diff --git a/obsapi/core.py b/obsapi/core.py index 49382d1..58ffb79 100644 --- a/obsapi/core.py +++ b/obsapi/core.py @@ -13,7 +13,10 @@ LSItem = namedtuple('LSItem', 'name md5 size mtime') Directory = namedtuple('Directory', 'name rev vrev srcmd5') SourceInfo = namedtuple('SourceInfo', 'package rev vrev srcmd5 verifymd5') Binary = namedtuple('Binary', 'filename size mtime') +User = namedtuple('User', 'userid role') +Group = namedtuple('Group', 'groupid role') +REGEX_NS = "http://exslt.org/regular-expressions" DEFAULTAPIURL = 'https://api.opensuse.org' emptyxml = '<empty></empty>' @@ -323,3 +326,66 @@ class ObsApi(object): comment = comment or "Unlock" self.source.post(prj, pkg, cmd="unlock", comment="Unlock") + + def get_users(self, prj, pkg=None, role=None): + xml = self.get_meta(prj, pkg) + if xml is None: + return None + + if role is None: + role = '.*' # regex to match all + + meta = self.__xml2etree(xml) + persons = meta.xpath('.//person[re:test(@role, role)]', namespaces={'re': REGEX_NS}) + return [User(userid=p.get('userid'), role=p.get('role')) for p in persons] + + def get_groups(self, prj, pkg=None, role=None): + xml = self.get_meta(prj, pkg) + if xml is None: + return None + + if role is None: + role = '.*' # regex to match all + + meta = self.__xml2etree(xml) + groups = meta.xpath('.//group[re:test(@role, role)]', namespaces={'re': REGEX_NS}) + return [Group(groupid=g.get('groupid'), role=g.get('role')) for g in groups] + + def add_user(self, user, prj, pkg=None): + try: + userid = user.userid + except Exception as e: + raise Exception(e) + + try: + role = user.role + except Exception as e: + raise Exception(e) + + xml = self.get_meta(prj, pkg) + if xml is None: + raise Exception('unable to retrieve project meta') + + meta = self.__xml2etree(xml) + etree.SubElement(meta, 'person', userid=userid, role=role) + return self.put_meta(prj, pkg, etree.tostring(meta)) + + def add_group(self, group, prj, pkg=None): + try: + groupid = group.groupid + except Exception as e: + raise Exception(e) + + try: + role = group.role + except Exception as e: + raise Exception(e) + + xml = self.get_meta(prj, pkg) + if xml is None: + raise Exception('unable to retrieve project meta') + + meta = self.__xml2etree(xml) + + etree.SubElement(meta, 'group', groupid=groupid, role=role) + return self.put_meta(prj, pkg, etree.tostring(meta)) diff --git a/test/test_api.py b/test/test_api.py index 61ddae0..e5a82df 100644 --- a/test/test_api.py +++ b/test/test_api.py @@ -108,3 +108,15 @@ def test_project_locked(): assert api.locked(prj) is True api.unlock(prj) assert api.locked(prj) is False + + +def test_get_users(): + users = api.get_users(prj) + print users + assert len(users) > 0 + + +def test_get_groups(): + groups = api.get_groups(prj) + print groups + assert groups == [] |
