mirror of
https://github.com/openSUSE/osc.git
synced 2025-02-25 19:52:12 +01:00
- do_request(): added "--involved-projects" option to show all requests for project/packages where USER is involved
- code restructuring: * added new get_user_projpkgs_request_list() method * added new get_user_projpkgs() method
This commit is contained in:
parent
4dfaad4795
commit
88474d392d
@ -1043,6 +1043,8 @@ Please submit there instead, or use --nodevelproject to force direct submission.
|
|||||||
help='interactive review of request')
|
help='interactive review of request')
|
||||||
@cmdln.option('--exclude-target-project', action='append',
|
@cmdln.option('--exclude-target-project', action='append',
|
||||||
help='exclude target project from request list')
|
help='exclude target project from request list')
|
||||||
|
@cmdln.option('--involved-projects', action='store_true',
|
||||||
|
help='show all requests for project/packages where USER is involved in')
|
||||||
@cmdln.alias("rq")
|
@cmdln.alias("rq")
|
||||||
@cmdln.alias("review")
|
@cmdln.alias("review")
|
||||||
def do_request(self, subcmd, opts, *args):
|
def do_request(self, subcmd, opts, *args):
|
||||||
@ -1181,6 +1183,11 @@ Please submit there instead, or use --nodevelproject to force direct submission.
|
|||||||
if (self.options.debug):
|
if (self.options.debug):
|
||||||
print 'list: option --bugowner ignored: not impl.'
|
print 'list: option --bugowner ignored: not impl.'
|
||||||
|
|
||||||
|
if opts.involved_projects:
|
||||||
|
who = who or conf.get_apiurl_usr(apiurl)
|
||||||
|
results = get_user_projpkgs_request_list(apiurl, who, req_state=state_list,
|
||||||
|
req_type=opts.type, exclude_projects=opts.exclude_target_project or [])
|
||||||
|
else:
|
||||||
results = get_request_list(apiurl, project, package, who,
|
results = get_request_list(apiurl, project, package, who,
|
||||||
state_list, opts.type, opts.exclude_target_project or [])
|
state_list, opts.type, opts.exclude_target_project or [])
|
||||||
results.sort(reverse=True)
|
results.sort(reverse=True)
|
||||||
@ -3912,35 +3919,8 @@ Please submit there instead, or use --nodevelproject to force direct submission.
|
|||||||
if opts.all:
|
if opts.all:
|
||||||
role_filter = ''
|
role_filter = ''
|
||||||
|
|
||||||
xpath = 'person/@userid = \'%s\'' % user
|
res = get_user_projpkgs(conf.config['apiurl'], user, role_filter,
|
||||||
excl_prj = ''
|
exclude_projects, what.has_key('project'), what.has_key('package'))
|
||||||
excl_pkg = ''
|
|
||||||
for i in exclude_projects:
|
|
||||||
excl_prj = xpath_join(excl_prj, 'not(@name = \'%s\')' % i, op='and')
|
|
||||||
excl_pkg = xpath_join(excl_pkg, 'not(@project = \'%s\')' % i, op='and')
|
|
||||||
role_filter_xpath = xpath
|
|
||||||
if role_filter:
|
|
||||||
xpath = xpath_join(xpath, 'person/@role = \'%s\'' % role_filter, inner=True, op='and')
|
|
||||||
xpath_pkg = xpath_join(xpath, excl_pkg, op='and')
|
|
||||||
xpath_prj = xpath_join(xpath, excl_prj, op='and')
|
|
||||||
if what.has_key('package'):
|
|
||||||
what['package'] = xpath_pkg
|
|
||||||
if what.has_key('project'):
|
|
||||||
what['project'] = xpath_prj
|
|
||||||
try:
|
|
||||||
res = search(conf.config['apiurl'], **what)
|
|
||||||
except urllib2.HTTPError, e:
|
|
||||||
if e.code != 400 or not role_filter:
|
|
||||||
raise e
|
|
||||||
# backward compatibility: local role filtering
|
|
||||||
what = dict([[kind, role_filter_xpath] for kind in what.keys()])
|
|
||||||
if what.has_key('package'):
|
|
||||||
what['package'] = xpath_join(role_filter_xpath, excl_pkg, op='and')
|
|
||||||
if what.has_key('project'):
|
|
||||||
what['project'] = xpath_join(role_filter_xpath, excl_prj, op='and')
|
|
||||||
res = search(conf.config['apiurl'], **what)
|
|
||||||
filter_role(res, user, role_filter)
|
|
||||||
|
|
||||||
request_todo = {}
|
request_todo = {}
|
||||||
roles = {}
|
roles = {}
|
||||||
if len(what.keys()) == 2:
|
if len(what.keys()) == 2:
|
||||||
@ -3952,26 +3932,12 @@ Please submit there instead, or use --nodevelproject to force direct submission.
|
|||||||
if not i.get('project') in request_todo.keys():
|
if not i.get('project') in request_todo.keys():
|
||||||
request_todo.setdefault(i.get('project'), []).append(i.get('name'))
|
request_todo.setdefault(i.get('project'), []).append(i.get('name'))
|
||||||
else:
|
else:
|
||||||
request_todo = dict([[i.get('name'), []] for i in res['project'].findall('project')])
|
|
||||||
for i in res['project'].findall('project'):
|
for i in res['project'].findall('project'):
|
||||||
roles[i.get('name')] = [p.get('role') for p in i.findall('person') if p.get('userid') == user]
|
roles[i.get('name')] = [p.get('role') for p in i.findall('person') if p.get('userid') == user]
|
||||||
|
|
||||||
if list_requests:
|
if list_requests:
|
||||||
xpath = ''
|
requests = get_user_projpkgs_request_list(conf.config['apiurl'], user, projpkgs=request_todo)
|
||||||
for prj, pacs in request_todo.iteritems():
|
for r in requests:
|
||||||
if not len(pacs):
|
|
||||||
xpath = xpath_join(xpath, 'action/target/@project=\'%s\'' % prj, inner=True)
|
|
||||||
else:
|
|
||||||
xp = ''
|
|
||||||
for p in pacs:
|
|
||||||
xp = xpath_join(xp, 'action/target/@package=\'%s\'' % p, inner=True)
|
|
||||||
xp = xpath_join(xp, 'action/target/@project=\'%s\'' % prj, op='and')
|
|
||||||
xpath = xpath_join(xpath, xp, inner=True)
|
|
||||||
xpath = xpath_join(xpath, 'state/@name = \'new\'', op='and')
|
|
||||||
res = search(conf.config['apiurl'], request=xpath)
|
|
||||||
for root in res['request'].findall('request'):
|
|
||||||
r = Request()
|
|
||||||
r.read(root)
|
|
||||||
print r.list_view()
|
print r.list_view()
|
||||||
else:
|
else:
|
||||||
for i in sorted(roles.keys()):
|
for i in sorted(roles.keys()):
|
||||||
|
66
osc/core.py
66
osc/core.py
@ -2628,6 +2628,39 @@ def get_request_list(apiurl, project='', package='', req_who='', req_state=('new
|
|||||||
requests.append(r)
|
requests.append(r)
|
||||||
return requests
|
return requests
|
||||||
|
|
||||||
|
def get_user_projpkgs_request_list(apiurl, user, req_state=('new',), req_type=None, exclude_projects=[], projpkgs={}):
|
||||||
|
"""Return all new requests for all projects/packages where is user is involved"""
|
||||||
|
if not projpkgs:
|
||||||
|
res = get_user_projpkgs(apiurl, user, exclude_projects=exclude_projects)
|
||||||
|
for i in res['project'].findall('project'):
|
||||||
|
projpkgs[i.get('name')] = []
|
||||||
|
for i in res['package'].findall('package'):
|
||||||
|
if not i.get('project') in projpkgs.keys():
|
||||||
|
projpkgs.setdefault(i.get('project'), []).append(i.get('name'))
|
||||||
|
xpath = ''
|
||||||
|
for prj, pacs in projpkgs.iteritems():
|
||||||
|
if not len(pacs):
|
||||||
|
xpath = xpath_join(xpath, 'action/target/@project=\'%s\'' % prj, inner=True)
|
||||||
|
else:
|
||||||
|
xp = ''
|
||||||
|
for p in pacs:
|
||||||
|
xp = xpath_join(xp, 'action/target/@package=\'%s\'' % p, inner=True)
|
||||||
|
xp = xpath_join(xp, 'action/target/@project=\'%s\'' % prj, op='and')
|
||||||
|
xpath = xpath_join(xpath, xp, inner=True)
|
||||||
|
if req_type:
|
||||||
|
xpath = xpath_join(xpath, 'action/@type=\'%s\'' % req_type, op='and')
|
||||||
|
if not 'all' in req_state:
|
||||||
|
xp = ''
|
||||||
|
for state in req_state:
|
||||||
|
xp = xpath_join(xp, 'state/@name=\'%s\'' % state)
|
||||||
|
xpath = xpath_join(xpath, '(%s)' % xp, op='and')
|
||||||
|
res = search(apiurl, request=xpath)
|
||||||
|
result = []
|
||||||
|
for root in res['request'].findall('request'):
|
||||||
|
r = Request()
|
||||||
|
r.read(root)
|
||||||
|
result.append(r)
|
||||||
|
return result
|
||||||
|
|
||||||
def get_request_log(apiurl, reqid):
|
def get_request_log(apiurl, reqid):
|
||||||
r = get_request(conf.config['apiurl'], reqid)
|
r = get_request(conf.config['apiurl'], reqid)
|
||||||
@ -4635,6 +4668,39 @@ def request_interactive_review(apiurl, request):
|
|||||||
if tmpfile is not None:
|
if tmpfile is not None:
|
||||||
tmpfile.close()
|
tmpfile.close()
|
||||||
|
|
||||||
|
def get_user_projpkgs(apiurl, user, role=None, exclude_projects=[], proj=True, pkg=True):
|
||||||
|
"""Return all project/packages where user is involved."""
|
||||||
|
xpath = 'person/@userid = \'%s\'' % user
|
||||||
|
excl_prj = ''
|
||||||
|
excl_pkg = ''
|
||||||
|
for i in exclude_projects:
|
||||||
|
excl_prj = xpath_join(excl_prj, 'not(@name = \'%s\')' % i, op='and')
|
||||||
|
excl_pkg = xpath_join(excl_pkg, 'not(@project = \'%s\')' % i, op='and')
|
||||||
|
role_filter_xpath = xpath
|
||||||
|
if role:
|
||||||
|
xpath = xpath_join(xpath, 'person/@role = \'%s\'' % role, inner=True, op='and')
|
||||||
|
xpath_pkg = xpath_join(xpath, excl_pkg, op='and')
|
||||||
|
xpath_prj = xpath_join(xpath, excl_prj, op='and')
|
||||||
|
what = {}
|
||||||
|
if pkg:
|
||||||
|
what['package'] = xpath_pkg
|
||||||
|
if proj:
|
||||||
|
what['project'] = xpath_prj
|
||||||
|
try:
|
||||||
|
res = search(apiurl, **what)
|
||||||
|
except urllib2.HTTPError, e:
|
||||||
|
if e.code != 400 or not role_filter:
|
||||||
|
raise e
|
||||||
|
# backward compatibility: local role filtering
|
||||||
|
what = dict([[kind, role_filter_xpath] for kind in what.keys()])
|
||||||
|
if what.has_key('package'):
|
||||||
|
what['package'] = xpath_join(role_filter_xpath, excl_pkg, op='and')
|
||||||
|
if what.has_key('project'):
|
||||||
|
what['project'] = xpath_join(role_filter_xpath, excl_prj, op='and')
|
||||||
|
res = search(apiurl, **what)
|
||||||
|
filter_role(res, user, role)
|
||||||
|
return res
|
||||||
|
|
||||||
# backward compatibility: local role filtering
|
# backward compatibility: local role filtering
|
||||||
def filter_role(meta, user, role):
|
def filter_role(meta, user, role):
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user