Reviewers: ,


Please review this at http://codereview.tryton.org/692002/

Affected files:
  M tryton/gui/window/view_form/model/field.py


Index: tryton/gui/window/view_form/model/field.py
===================================================================

--- a/tryton/gui/window/view_form/model/field.py
+++ b/tryton/gui/window/view_form/model/field.py
@@ -569,43 +569,13 @@
                     record2.get_on_change_value())
         return result

-    def set(self, record, value):
-        from group import Group
-        group = record.value.get(self.name)
-        fields = {}
-        if group is not None:
-            fields = group.fields.copy()
-            # Unconnect to prevent infinite loop
-            group.signal_unconnect(group)
-            group.destroy()
-        elif record.model_name == self.attrs['relation']:
-            fields = record.group.fields
-        parent_name = self.attrs.get('relation_field', '')
-        group = Group(self.attrs['relation'], {},
-                parent=record, parent_name=parent_name,
-                child_name=self.name,
-                context=self.context,
-                parent_datetime_field=self.attrs.get('datetime_field'))
-        group.fields = fields
-        record.value[self.name] = group
-        group.load(value)
-        group.signal_connect(group, 'group-changed', self._group_changed)
-        group.signal_connect(group, 'group-list-changed',
-            self._group_list_changed)
-        group.signal_connect(group, 'group-cleared', self._group_cleared)
- group.signal_connect(group, 'record-modified', self._record_modified)
-
-    def set_client(self, record, value, force_change=False):
-        pass
-
-    def set_default(self, record, value):
+    def _set_value(self, record, value, default=False):
         from group import Group

-        # value is a list of id
-        if value and len(value) and isinstance(value[0], (int, long)):
-            self.set(record, value)
-            record.modified_fields.setdefault(self.name)
-            return
+        if not value or (len(value) and isinstance(value[0], (int, long))):
+            mode = 'list ids'
+        else:
+            mode = 'list values'

         group = record.value.get(self.name)
         fields = {}
@@ -619,7 +589,7 @@
         if fields:
             fields = dict((fname, field.attrs)
                 for fname, field in fields.iteritems())
-        if value and len(value):
+        if mode == 'list values' and len(value):
             context = self.context_get(record)
field_names = set(f for v in value for f in v if f not in fields)
             if field_names:
@@ -628,34 +598,53 @@
                             'fields_get', list(field_names),
                             main_iteration=False, context=context))
                 except RPCException:
-                    return False
+                    return

         parent_name = self.attrs.get('relation_field', '')
         group = Group(self.attrs['relation'], fields,
- parent=record, parent_name=parent_name, child_name=self.name,
-                context=self.context,
-                parent_datetime_field=self.attrs.get('datetime_field'))
-        if record.value.get(self.name):
-            group.record_deleted.extend(x for x in record.value[self.name]
-                if x.id >= 0)
- group.record_deleted.extend(record.value[self.name].record_deleted) - group.record_removed.extend(record.value[self.name].record_removed)
+            parent=record, parent_name=parent_name,
+            child_name=self.name,
+            context=self.context,
+            parent_datetime_field=self.attrs.get('datetime_field'))
         record.value[self.name] = group
-        for vals in (value or []):
-            new_record = record.value[self.name].new(default=False)
-            new_record.set_default(vals)
-            group.add(new_record)
+        if mode == 'list ids':
+            group.load(value)
+        else:
+            for vals in value:
+                new_record = record.value[self.name].new(default=False)
+                if default:
+                    new_record.set_default(vals)
+                    group.add(new_record)
+                else:
+                    new_record.id *= -1  # Don't consider record as unsaved
+                    new_record.set(vals)
+                    group.append(new_record)
         group.signal_connect(group, 'group-changed', self._group_changed)
         group.signal_connect(group, 'group-list-changed',
             self._group_list_changed)
         group.signal_connect(group, 'group-cleared', self._group_cleared)
group.signal_connect(group, 'record-modified', self._record_modified)
-        return True
+        return group
+
+    def set(self, record, value):
+        self._set_value(record, value, default=False)
+
+    def set_client(self, record, value, force_change=False):
+        pass
+
+    def set_default(self, record, value):
+        previous_group = record.value.get(self.name)
+        group = self._set_value(record, value, default=True)
+        if previous_group:
+ group.record_deleted.extend(x for x in previous_group if x.id
= 0)
+            group.record_deleted.extend(previous_group.record_deleted)
+            group.record_removed.extend(previous_group.record_removed)
+        record.modified_fields.setdefault(self.name)

     def set_on_change(self, record, value):
         self._set_default_value(record)
         if isinstance(value, (list, tuple)):
-            self.set(record, value)
+            self._set_value(record, value)
             record.modified_fields.setdefault(self.name)
             record.signal('record-modified')
             return True



--
--
[email protected] mailing list

--- You received this message because you are subscribed to the Google Groups "tryton-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to