mirror of
https://github.com/odoo/runbot.git
synced 2025-03-27 13:25:47 +07:00
[IMP] runbot_merge: support for merging partners w/ github_login
The logic of the partner merge wizard is to collect all relevant data from source partners, write them to a destination partner, then remove the sources. This... doesn't work when the field in question has a UNIQUE constraint (like github_login), because it's going to copy the value from a source onto a dest which will blow the constraint, and so the copy fails. In that case the user first has to *move over* the unique field's value then they can use the wizard. Just fix for the github login: take all sources, remove (and store) their github logins, then write the login onto the dst. An alternative would have been to *defer* the constraint, however: * it only works on unique constraints, not unique indexes * it requires the constraint to be declared DEFERRABLE Closes #301
This commit is contained in:
parent
1440aec251
commit
5f8ad6a626
@ -1063,6 +1063,10 @@ class Model:
|
|||||||
|
|
||||||
return val
|
return val
|
||||||
|
|
||||||
|
# because it's difficult to discriminate between methods and fields
|
||||||
|
def _call(self, name, *args, **kwargs):
|
||||||
|
return self._env(self._model, name, self._ids, *args, **kwargs)
|
||||||
|
|
||||||
def __setattr__(self, fieldname, value):
|
def __setattr__(self, fieldname, value):
|
||||||
assert self._fields[fieldname]['type'] not in ('many2one', 'one2many', 'many2many')
|
assert self._fields[fieldname]['type'] not in ('many2one', 'one2many', 'many2many')
|
||||||
self._env(self._model, 'write', self._ids, {fieldname: value})
|
self._env(self._model, 'write', self._ids, {fieldname: value})
|
||||||
|
@ -31,6 +31,22 @@ class Partner(models.Model):
|
|||||||
email = ''
|
email = ''
|
||||||
partner.formatted_email = '%s <%s>' % (partner.name, email)
|
partner.formatted_email = '%s <%s>' % (partner.name, email)
|
||||||
|
|
||||||
|
class PartnerMerge(models.TransientModel):
|
||||||
|
_inherit = 'base.partner.merge.automatic.wizard'
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _update_values(self, src_partners, dst_partner):
|
||||||
|
# sift down through src partners, removing all github_login and keeping
|
||||||
|
# the last one
|
||||||
|
new_login = None
|
||||||
|
for p in src_partners:
|
||||||
|
new_login = p.github_login or new_login
|
||||||
|
if new_login:
|
||||||
|
src_partners.write({'github_login': False})
|
||||||
|
if new_login and not dst_partner.github_login:
|
||||||
|
dst_partner.github_login = new_login
|
||||||
|
super()._update_values(src_partners, dst_partner)
|
||||||
|
|
||||||
class ReviewRights(models.Model):
|
class ReviewRights(models.Model):
|
||||||
_name = 'res.partner.review'
|
_name = 'res.partner.review'
|
||||||
_description = "mapping of review rights between partners and repos"
|
_description = "mapping of review rights between partners and repos"
|
||||||
|
22
runbot_merge/tests/test_oddities.py
Normal file
22
runbot_merge/tests/test_oddities.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
def test_partner_merge(env):
|
||||||
|
p_src = env['res.partner'].create({
|
||||||
|
'name': 'kfhsf',
|
||||||
|
'github_login': 'tyu'
|
||||||
|
}) | env['res.partner'].create({
|
||||||
|
'name': "xxx",
|
||||||
|
'github_login': 'xxx'
|
||||||
|
})
|
||||||
|
# proper login with useful info
|
||||||
|
p_dest = env['res.partner'].create({
|
||||||
|
'name': 'Partner P. Partnersson',
|
||||||
|
'github_login': ''
|
||||||
|
})
|
||||||
|
|
||||||
|
env['base.partner.merge.automatic.wizard'].create({
|
||||||
|
'state': 'selection',
|
||||||
|
'partner_ids': (p_src + p_dest).ids,
|
||||||
|
'dst_partner_id': p_dest.id,
|
||||||
|
})._call('action_merge')
|
||||||
|
assert not p_src.exists()
|
||||||
|
assert p_dest.name == 'Partner P. Partnersson'
|
||||||
|
assert p_dest.github_login == 'xxx'
|
Loading…
Reference in New Issue
Block a user