From 83656053c831766c881cd2af90d90038c85a5bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 28 Sep 2017 23:44:48 +0200 Subject: [PATCH] Order operation on relational field to avoid constraints The order on which the operations are applied can trigger constraints. So it is safer to first delete then write and finally create. issue6790 review43511002 --- trytond/model/fields/many2many.py | 9 +++++---- trytond/model/fields/one2many.py | 9 +++++---- trytond/model/fields/one2one.py | 1 + 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/trytond/model/fields/many2many.py b/trytond/model/fields/many2many.py index 09195c6784..d8369f36e4 100644 --- a/trytond/model/fields/many2many.py +++ b/trytond/model/fields/many2many.py @@ -233,14 +233,15 @@ class Many2Many(Field): action = value[0] args = value[1:] actions[action](ids, *args) - if relation_to_create: - Relation.create(relation_to_create) + # Ordered operations to avoid uniqueness/overlapping constraints if relation_to_delete: Relation.delete(relation_to_delete) - if target_to_write: - Target.write(*target_to_write) if target_to_delete: Target.delete(target_to_delete) + if target_to_write: + Target.write(*target_to_write) + if relation_to_create: + Relation.create(relation_to_create) def get_target(self): 'Return the target model' diff --git a/trytond/model/fields/one2many.py b/trytond/model/fields/one2many.py index 39ac0e8dcc..605ffadbb7 100644 --- a/trytond/model/fields/one2many.py +++ b/trytond/model/fields/one2many.py @@ -213,12 +213,13 @@ class One2Many(Field): action = value[0] args = value[1:] actions[action](ids, *args) - if to_create: - Target.create(to_create) - if to_write: - Target.write(*to_write) + # Ordered operations to avoid uniqueness/overlapping constraints if to_delete: Target.delete(to_delete) + if to_write: + Target.write(*to_write) + if to_create: + Target.create(to_create) def get_target(self): 'Return the target Model' diff --git a/trytond/model/fields/one2one.py b/trytond/model/fields/one2one.py index 3b9e322f5a..c32ffb0c8a 100644 --- a/trytond/model/fields/one2one.py +++ b/trytond/model/fields/one2one.py @@ -47,6 +47,7 @@ class One2One(Many2Many): self.origin: record_id, self.target: value, }) + # Ordered operations to avoid uniqueness/overlapping constraints if to_delete: Relation.delete(to_delete) if to_create: