check uniq value for a slave
authorEmmanuel Garette <egarette@cadoles.com>
Mon, 6 Mar 2017 21:35:32 +0000 (22:35 +0100)
committerEmmanuel Garette <egarette@cadoles.com>
Mon, 6 Mar 2017 21:35:32 +0000 (22:35 +0100)
test/test_option_consistency.py
tiramisu/option/baseoption.py

index 35d140d..ff5c3e8 100644 (file)
@@ -241,6 +241,13 @@ def test_consistency_not_equal_masterslave():
     c.a = [1]
     raises(ValueError, "c.b = [1]")
     c.b = [2]
+    del(c.a)
+    c.a.append(1)
+    c.make_dict()
+    c.b[0] = 3
+    c.a.append(2)
+    c.b[0] = 3
+    raises(ValueError, "c.b[1] = 3")
 
 
 def test_consistency_not_equal_masterslaves_default():
index 6137b9a..55021b3 100644 (file)
@@ -661,10 +661,16 @@ class Option(OnlyOption):
                     if err:
                         return err
             else:
-                if self.impl_is_unique() and value in multi:
-                    return ValueError(_('invalid value "{}", this value is already'
-                                        ' in "{}"').format(value,
-                                                           self.impl_get_display_name()))
+                if multi is not None and self.impl_is_unique() and value in multi:
+                    if not self.impl_is_submulti() and len(multi) - 1 >= force_index:
+                        lst = list(multi)
+                        lst.pop(force_index)
+                    else:
+                        lst = multi
+                    if value in lst:
+                        return ValueError(_('invalid value "{}", this value is already'
+                                            ' in "{}"').format(value,
+                                                               self.impl_get_display_name()))
                 return do_validation(value, force_index, force_submulti_index)
         elif not isinstance(value, list):
             return ValueError(_('invalid value "{0}" for "{1}" which '