[IMP] runbot_merge: add name_search override to PRs

Should allow filtering PRs by source or parent.

Fixes #458
This commit is contained in:
Xavier Morel 2021-03-01 14:42:20 +01:00
parent 0b1e33da7c
commit 4e4e4303f6
2 changed files with 60 additions and 0 deletions

View File

@ -21,6 +21,7 @@ from werkzeug.datastructures import Headers
from odoo import api, fields, models, tools from odoo import api, fields, models, tools
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
from odoo.osv import expression
from odoo.tools import OrderedSet from odoo.tools import OrderedSet
from .. import github, exceptions, controllers, utils from .. import github, exceptions, controllers, utils
@ -721,6 +722,25 @@ class PullRequests(models.Model):
for p in self for p in self
] ]
@api.model
def name_search(self, name='', args=None, operator='ilike', limit=100):
print(f'name_search({name!r}, {args!r}, {operator!r})', flush=True)
if not name or operator != 'ilike':
return super().name_search(name, args=args, operator=operator, limit=limit)
bits = [[('label', 'ilike', name)]]
if name.isdigit():
bits.append([('number', '=', name)])
if re.match(r'\w+#\d+$', name):
repo, num = name.rsplit('#', 1)
bits.append(['&', ('repository.name', 'ilike', repo), ('number', '=', int(num))])
else:
bits.append([('repository.name', 'ilike', name)])
domain = expression.OR(bits)
if args:
domain = expression.AND([args, domain])
print('=>', domain, flush=True)
return self.search(domain, limit=limit).sudo().name_get()
@property @property
def _approved(self): def _approved(self):
return self.state in ('approved', 'ready') or any( return self.state in ('approved', 'ready') or any(

View File

@ -20,3 +20,43 @@ def test_partner_merge(env):
assert not p_src.exists() assert not p_src.exists()
assert p_dest.name == 'Partner P. Partnersson' assert p_dest.name == 'Partner P. Partnersson'
assert p_dest.github_login == 'xxx' assert p_dest.github_login == 'xxx'
def test_name_search(env):
""" PRs should be findable by:
* number
* display_name (`repository#number`)
* label
This way we can find parents or sources by these informations.
"""
p = env['runbot_merge.project'].create({
'name': 'proj',
'github_token': 'no',
})
b = env['runbot_merge.branch'].create({
'name': 'target',
'project_id': p.id
})
r = env['runbot_merge.repository'].create({
'name': 'repo',
'project_id': p.id,
})
baseline = {'target': b.id, 'repository': r.id}
PRs = env['runbot_merge.pull_requests']
prs = PRs.create({**baseline, 'number': 1964, 'label': 'victor:thump', 'head': 'a', 'message': 'x'})\
| PRs.create({**baseline, 'number': 1959, 'label': 'marcus:frankenstein', 'head': 'b', 'message': 'y'})\
| PRs.create({**baseline, 'number': 1969, 'label': 'victor:patch-1', 'head': 'c', 'message': 'z'})
pr0, pr1, pr2 = prs.name_get()
assert PRs.name_search('1964') == [pr0]
assert PRs.name_search('1969') == [pr2]
assert PRs.name_search('frank') == [pr1]
assert PRs.name_search('victor') == [pr2, pr0]
assert PRs.name_search('thump') == [pr0]
assert PRs.name_search('repo') == [pr2, pr0, pr1]
assert PRs.name_search('repo#1959') == [pr1]