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.