Reviewers: ,


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

Affected files:
  M tryton/gui/window/view_form/model/record.py
  M tryton/gui/window/view_form/screen/screen.py
  M tryton/gui/window/view_form/view/form.py
  M tryton/gui/window/view_form/view/interface.py
  M tryton/gui/window/view_form/view/list.py
  M tryton/gui/window/view_form/view/widget_parse.py


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

--- a/tryton/gui/window/view_form/model/record.py
+++ b/tryton/gui/window/view_form/model/record.py
@@ -148,7 +148,7 @@
         if value:
             self.signal('record-modified')

-    def children_group(self, field_name):
+    def children_group(self, field_name, children_definitions):
         if not field_name:
             return []
         self._check_load([field_name])
@@ -156,12 +156,16 @@
         if group is None:
             return None

-        if id(group.fields) != id(self.group.fields):
-            self.group.fields.update(group.fields)
-            group.fields = self.group.fields
-        group.on_write = self.group.on_write
-        group.readonly = self.group.readonly
-        group._context.update(self.group._context)
+        if group.model_name == self.group.model_name:
+            if id(group.fields) != id(self.group.fields):
+                self.group.fields.update(group.fields)
+                group.fields = self.group.fields
+            group.on_write = self.group.on_write
+            group.readonly = self.group.readonly
+            group._context.update(self.group._context)
+        else:
+            group.fields = children_definitions[group.model_name].copy()
+            group.load_fields(group.fields)
         return group

     def get_path(self, group):

Index: tryton/gui/window/view_form/screen/screen.py
===================================================================

--- a/tryton/gui/window/view_form/screen/screen.py
+++ b/tryton/gui/window/view_form/screen/screen.py
@@ -401,13 +401,15 @@
                     self.group.fields[field].attrs['loading']

         children_field = view.get('field_childs')
+        children_definitions = view.get('children_definitions')

from tryton.gui.window.view_form.view.widget_parse import WidgetParse
         self.group.add_fields(fields)

         parser = WidgetParse(parent=self.parent)
         view = parser.parse(self, xml_dom, self.group.fields,
-                children_field=children_field)
+            children_field=children_field,
+            children_definitions=children_definitions)

         self.views.append(view)


Index: tryton/gui/window/view_form/view/form.py
===================================================================

--- a/tryton/gui/window/view_form/view/form.py
+++ b/tryton/gui/window/view_form/view/form.py
@@ -12,9 +12,10 @@
 class ViewForm(ParserView):

     def __init__(self, screen, widget, children=None, state_widgets=None,
-            notebooks=None, cursor_widget='', children_field=None):
+            notebooks=None, cursor_widget='', children_field=None,
+            children_definitions=None):
super(ViewForm, self).__init__(screen, widget, children, state_widgets,
-            notebooks, cursor_widget, children_field)
+            notebooks, cursor_widget, children_field, children_definitions)
         self.view_type = 'form'

         for widget in self.state_widgets:

Index: tryton/gui/window/view_form/view/interface.py
===================================================================

--- a/tryton/gui/window/view_form/view/interface.py
+++ b/tryton/gui/window/view_form/view/interface.py
@@ -18,7 +18,8 @@
 class ParserView(object):

     def __init__(self, screen, widget, children=None, state_widgets=None,
-            notebooks=None, cursor_widget=None, children_field=None):
+            notebooks=None, cursor_widget=None, children_field=None,
+            children_definitions=None):
         self.screen = screen
         self.widget = widget
         self.children = children
@@ -30,6 +31,7 @@
         self.notebooks = notebooks
         self.cursor_widget = cursor_widget
         self.children_field = children_field
+        self.children_definitions = children_definitions

     def get_fields(self):
         return self.children.keys()

Index: tryton/gui/window/view_form/view/list.py
===================================================================

--- a/tryton/gui/window/view_form/view/list.py
+++ b/tryton/gui/window/view_form/view/list.py
@@ -31,7 +31,8 @@
         current_id = id_path.pop(0)
         try:
             record = group.get(current_id)
-            group = record.children_group(model.children_field)
+            group = record.children_group(model.children_field,
+                model.children_definitions)
         except (KeyError, AttributeError):
             return None
     return model.on_get_path(record)
@@ -39,13 +40,14 @@

 class AdaptModelGroup(gtk.GenericTreeModel):

-    def __init__(self, group, children_field=None):
+ def __init__(self, group, children_field=None, children_definitions=None):
         super(AdaptModelGroup, self).__init__()
         self.group = group
         self.last_sort = None
         self.sort_asc = True
         self.set_property('leak_references', False)
         self.children_field = children_field
+        self.children_definitions = children_definitions
self.__removed = None # XXX dirty hack to allow update of has_child

     def added(self, group, record):
@@ -55,7 +57,8 @@
             path = self.on_get_path(record)
             iter_ = self.get_iter(path)
             self.row_inserted(path, iter_)
-            if record.children_group(self.children_field):
+            if record.children_group(self.children_field,
+                    self.children_definitions):
                 self.row_has_child_toggled(path, iter_)
             if (record.parent and
                     record.group is not self.group):
@@ -113,7 +116,8 @@
     def move_into(self, record, path):
         iter_ = self.get_iter(path)
         parent = self.get_value(iter_, 0)
-        group = parent.children_group(self.children_field)
+        group = parent.children_group(self.children_field,
+            self.children_definitions)
         if group is not record.group:
             record.group.remove(record, remove=True, force_remove=True)
             # Don't remove record from previous group
@@ -194,7 +198,8 @@
             record = group[i]
             if not self.children_field:
                 break
-            group = record.children_group(self.children_field)
+            group = record.children_group(self.children_field,
+                self.children_definitions)
         return record

     def on_get_value(self, record, column):
@@ -208,7 +213,12 @@
     def on_iter_has_child(self, record):
         if record is None or not self.children_field:
             return False
-        children = record.children_group(self.children_field)
+        if (record.model_name not in self.children_definitions
+                or self.children_field not in
+                self.children_definitions[record.model_name]):
+            return False
+        children = record.children_group(self.children_field,
+            self.children_definitions)
         if children is None:
             return True
         length = len(children)
@@ -220,7 +230,8 @@
         if record is None:
             return None
         if self.children_field:
-            children = record.children_group(self.children_field)
+            children = record.children_group(self.children_field,
+                self.children_definitions)
             if children:
                 return children[0]
         return None
@@ -228,15 +239,18 @@
     def on_iter_n_children(self, record):
         if record is None or not self.children_field:
             return len(self.group)
-        return len(record.children_group(self.children_field))
+        return len(record.children_group(self.children_field,
+            self.children_definitions))

     def on_iter_nth_child(self, record, nth):
         if record is None or not self.children_field:
             if nth < len(self.group):
                 return self.group[nth]
             return None
-        if nth < len(record.children_group(self.children_field)):
-            return record.children_group(self.children_field)[nth]
+        if nth < len(record.children_group(self.children_field,
+                    self.children_definitions)):
+            return record.children_group(self.children_field,
+                self.children_definitions)[nth]
         return None

     def on_iter_parent(self, record):
@@ -248,9 +262,10 @@
 class ViewList(ParserView):

     def __init__(self, screen, widget, children=None, state_widgets=None,
-            notebooks=None, cursor_widget=None, children_field=None):
+            notebooks=None, cursor_widget=None, children_field=None,
+            children_definitions=None):
super(ViewList, self).__init__(screen, widget, children, state_widgets,
-            notebooks, cursor_widget, children_field)
+            notebooks, cursor_widget, children_field, children_definitions)
         self.store = None
         self.view_type = 'tree'

@@ -297,7 +312,7 @@
         dnd = False
         if self.children_field:
children_field = self.widget_tree.cells.get(self.children_field)
-            if children_field:
+            if children_field and len(self.children_definitions) > 1:
                 parent_name = children_field.attrs.get('relation_field')
                 dnd = parent_name in self.widget_tree.cells
         elif self.widget_tree.sequence:
@@ -804,7 +819,7 @@
                     or self.screen.group != \
                         self.widget_tree.get_model().group:
             self.store = AdaptModelGroup(self.screen.group,
-                    self.children_field)
+                self.children_field, self.children_definitions)
             self.widget_tree.set_model(self.store)
         self.reload = False
         if not self.screen.current_record:

Index: tryton/gui/window/view_form/view/widget_parse.py
===================================================================

--- a/tryton/gui/window/view_form/view/widget_parse.py
+++ b/tryton/gui/window/view_form/view/widget_parse.py
@@ -28,7 +28,8 @@

 class WidgetParse(ParserInterface):

-    def parse(self, screen, root_node, fields, children_field=None):
+    def parse(self, screen, root_node, fields, children_field=None,
+            children_definitions=None):
         widget = None
         for node in root_node.childNodes:
             if not node.nodeType == node.ELEMENT_NODE:
@@ -41,7 +42,8 @@
                         fields)
                 screen.set_on_write(on_write)
                 res = PARSERS2[node.localName](screen, wid, child,
- state_widgets, notebooks, cursor_widget, children_field) + state_widgets, notebooks, cursor_widget, children_field,
+                    children_definitions)
                 res.title = widget.title
                 widget = res
                 break



--
--
[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