mirror of
https://github.com/odoo/runbot.git
synced 2025-03-15 15:35:46 +07:00
Merge pull request #25 from odoo/master-fixes-and-optimizations-ged
[FIX] runbot: fix build search, optimize query for main repo view, update github status for duplicate builds
This commit is contained in:
commit
f39ced30d3
@ -133,6 +133,9 @@ def decode_utf(field):
|
||||
except UnicodeDecodeError:
|
||||
return ''
|
||||
|
||||
def uniq_list(l):
|
||||
return OrderedDict.fromkeys(l).keys()
|
||||
|
||||
#----------------------------------------------------------
|
||||
# RunBot Models
|
||||
#----------------------------------------------------------
|
||||
@ -478,6 +481,8 @@ class runbot_build(osv.osv):
|
||||
if len(duplicate_ids):
|
||||
extra_info.update({'state': 'duplicate', 'duplicate_id': duplicate_ids[0]})
|
||||
self.write(cr, uid, [duplicate_ids[0]], {'duplicate_id': build_id})
|
||||
if self.browse(cr, uid, duplicate_ids[0]).state != 'pending':
|
||||
self.github_status(cr, uid, [build_id])
|
||||
self.write(cr, uid, [build_id], extra_info, context=context)
|
||||
|
||||
def reset(self, cr, uid, ids, context=None):
|
||||
@ -916,20 +921,50 @@ class RunbotController(http.Controller):
|
||||
domain = [('repo_id','=',repo.id)]
|
||||
domain += [('state', '!=', key) for key, value in filters.iteritems() if value == '0']
|
||||
if search:
|
||||
domain += [('dest','ilike',search)]
|
||||
domain += ['|', ('dest', 'ilike', search), ('subject', 'ilike', search)]
|
||||
|
||||
non_sticky_builds = build_obj.search(cr, uid, domain + [('branch_id.sticky','=',False)], limit=int(limit))
|
||||
branch_ids = branch_obj.search(cr, uid, domain + [('sticky', '=', True)])
|
||||
if non_sticky_builds:
|
||||
q = """
|
||||
build_ids = build_obj.search(cr, uid, domain, limit=int(limit))
|
||||
branch_ids, build_by_branch_ids = [], {}
|
||||
|
||||
if build_ids:
|
||||
branch_query = """
|
||||
SELECT br.id FROM runbot_branch br INNER JOIN runbot_build bu ON br.id=bu.branch_id WHERE bu.id in %s
|
||||
ORDER BY bu.sequence DESC
|
||||
"""
|
||||
cr.execute(q, (tuple(non_sticky_builds),))
|
||||
branch_ids += OrderedDict.fromkeys(br[0] for br in cr.fetchall()).keys()
|
||||
sticky_dom = [('repo_id','=',repo.id), ('sticky', '=', True)]
|
||||
sticky_branch_ids = [] if search else branch_obj.search(cr, uid, sticky_dom)
|
||||
cr.execute(branch_query, (tuple(build_ids),))
|
||||
branch_ids = uniq_list(sticky_branch_ids + [br[0] for br in cr.fetchall()])
|
||||
|
||||
build_query = """
|
||||
SELECT
|
||||
branch_id,
|
||||
max(case when br_bu.row = 1 then br_bu.build_id end),
|
||||
max(case when br_bu.row = 2 then br_bu.build_id end),
|
||||
max(case when br_bu.row = 3 then br_bu.build_id end),
|
||||
max(case when br_bu.row = 4 then br_bu.build_id end)
|
||||
FROM (
|
||||
SELECT
|
||||
br.id AS branch_id,
|
||||
bu.id AS build_id,
|
||||
row_number() OVER (PARTITION BY branch_id) AS row
|
||||
FROM
|
||||
runbot_branch br INNER JOIN runbot_build bu ON br.id=bu.branch_id
|
||||
WHERE
|
||||
br.id in %s
|
||||
GROUP BY br.id, bu.id
|
||||
ORDER BY br.id, bu.id DESC
|
||||
) AS br_bu
|
||||
WHERE
|
||||
row <= 4
|
||||
GROUP BY br_bu.branch_id;
|
||||
"""
|
||||
cr.execute(build_query, (tuple(branch_ids),))
|
||||
build_by_branch_ids = {
|
||||
rec[0]: [r for r in rec[1:] if r is not None] for rec in cr.fetchall()
|
||||
}
|
||||
|
||||
branches = branch_obj.browse(cr, uid, branch_ids, context=request.context)
|
||||
build_by_branch_ids = {b: build_obj.search(cr, uid, [('branch_id','=',b)], limit=4) for b in branch_ids}
|
||||
build_ids = flatten(build_by_branch_ids.values())
|
||||
build_dict = {build.id: build for build in build_obj.browse(cr, uid, build_ids, context=request.context) }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user