summaryrefslogtreecommitdiff
path: root/obsapi/core.py
diff options
context:
space:
mode:
Diffstat (limited to 'obsapi/core.py')
-rw-r--r--obsapi/core.py66
1 files changed, 66 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))