summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Bahling <sbahling@suse.de>2018-08-24 20:55:11 +0200
committerScott Bahling <sbahling@suse.de>2018-08-24 20:55:11 +0200
commit1bc18d6abdbe553105f8528d141f9d7745f682af (patch)
tree3c425d72228392605163585e265d1b220f916221
parent3a8daa2b7989e8e248fe45265aa5af8007927b31 (diff)
downloadobsapi-1bc18d6abdbe553105f8528d141f9d7745f682af.tar.gz
obsapi-1bc18d6abdbe553105f8528d141f9d7745f682af.tar.xz
obsapi-1bc18d6abdbe553105f8528d141f9d7745f682af.zip
Initial user and group methods for ObsApi class
-rw-r--r--obsapi/core.py66
-rw-r--r--test/test_api.py12
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 == []