diff options
Diffstat (limited to 'obsapi')
| -rw-r--r-- | obsapi/core.py | 66 |
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)) |
