diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py index b7dcc86600..b139b90b2e 100644 --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -383,7 +383,7 @@ class O2MField(CharField): def set(self, model, value, modified=False): from group import ModelRecordGroup mod = ModelRecordGroup(self.attrs['relation'], {}, model.window, - parent=model) + parent=model, parent_name=self.attrs.get('relation_field', '')) mod.signal_connect(mod, 'model-changed', self._model_changed) model.value[self.name] = mod #self.internal.signal_connect(self.internal, 'model-changed', diff --git a/tryton/gui/window/view_form/model/group.py b/tryton/gui/window/view_form/model/group.py index 7eef9adb42..b9eeb16ea4 100644 --- a/tryton/gui/window/view_form/model/group.py +++ b/tryton/gui/window/view_form/model/group.py @@ -71,11 +71,12 @@ class ModelList(list): class ModelRecordGroup(SignalEvent): - def __init__(self, resource, fields, window, ids=None, parent=None, context=None, - readonly=False): + def __init__(self, resource, fields, window, ids=None, parent=None, + parent_name='', context=None, readonly=False): super(ModelRecordGroup, self).__init__() self.window = window self.parent = parent + self.parent_name = parent_name self._context = context or {} self.resource = resource self.rpc = RPCProxy(resource) @@ -156,7 +157,7 @@ class ModelRecordGroup(SignalEvent): newmods = [] for id in ids: newmod = ModelRecord(self.resource, id, self.window, - parent=self.parent, group=self) + parent=self.parent, parent_name=self.parent_name, group=self) self.models.append(newmod) newmods.append(newmod) newmod.signal_connect(self, 'record-changed', self._record_changed) @@ -221,6 +222,7 @@ class ModelRecordGroup(SignalEvent): self.models.insert(position, model) self.current_idx = position model.parent = self.parent + model.parent_name = self.parent_name model.window = self.window if modified: model.modified = True @@ -245,7 +247,7 @@ class ModelRecordGroup(SignalEvent): def model_new(self, default=True, domain=None, context=None): newmod = ModelRecord(self.resource, None, self.window, group=self, - parent=self.parent, new=True) + parent=self.parent, parent_name=self.parent_name, new=True) newmod.signal_connect(self, 'record-changed', self._record_changed) newmod.signal_connect(self, 'record-modified', self._record_modified) if default: diff --git a/tryton/gui/window/view_form/model/record.py b/tryton/gui/window/view_form/model/record.py index ae87ea2711..372cdd3b0b 100644 --- a/tryton/gui/window/view_form/model/record.py +++ b/tryton/gui/window/view_form/model/record.py @@ -17,7 +17,7 @@ class EvalEnvironment(object): self.check_load = check_load def __getattr__(self, item): - if item == 'parent' and self.parent.parent: + if item == '_parent_' + self.parent.parent_name and self.parent.parent: return EvalEnvironment(self.parent.parent) return self.parent.get_eval(check_load=self.check_load)[item] @@ -27,7 +27,8 @@ class ModelRecord(SignalEvent): id = -1 - def __init__(self, resource, obj_id, window, group=None, parent=None, new=False ): + def __init__(self, resource, obj_id, window, group=None, parent=None, + parent_name='', new=False): global ID_COUNT super(ModelRecord, self).__init__() self.window = window @@ -38,6 +39,7 @@ class ModelRecord(SignalEvent): ModelRecord.id -= 1 self._loaded = False self.parent = parent + self.parent_name = parent_name self.mgroup = group self.value = {} self.state_attrs = {} @@ -296,8 +298,9 @@ class ModelRecord(SignalEvent): ctx['time'] = time ctx['context'] = self.context_get() ctx['active_id'] = self.id - if self.parent: - ctx['parent'] = EvalEnvironment(self.parent, check_load) + if self.parent and self.parent_name: + ctx['_parent_' + self.parent_name] = EvalEnvironment(self.parent, + check_load) val = eval(dom, ctx) return val diff --git a/tryton/gui/window/view_form/screen/screen.py b/tryton/gui/window/view_form/screen/screen.py index b1f5b80964..4d93c88750 100644 --- a/tryton/gui/window/view_form/screen/screen.py +++ b/tryton/gui/window/view_form/screen/screen.py @@ -16,9 +16,9 @@ class Screen(SignalEvent): "Screen" def __init__(self, model_name, window, view_ids=None, view_type=None, - parent=None, context=None, views_preload=None, tree_saves=True, - domain=None, create_new=False, row_activate=None, hastoolbar=False, - default_get=None, show_search=False, limit=None, + parent=None, parent_name='', context=None, views_preload=None, + tree_saves=True, domain=None, create_new=False, row_activate=None, + hastoolbar=False, default_get=None, show_search=False, limit=None, readonly=False, form=None, exclude_field=None, sort=None, search_value=None): if view_ids is None: @@ -58,9 +58,10 @@ class Screen(SignalEvent): self.view_ids = view_ids self.models = None self.parent = parent + self.parent_name = parent_name self.window = window models = ModelRecordGroup(model_name, self.fields, self.window, - parent=self.parent, context=self.context, + parent=self.parent, parent_name=parent_name, context=self.context, readonly=readonly) self.models_set(models) self.current_model = None @@ -164,6 +165,7 @@ class Screen(SignalEvent): self.models.signal_unconnect(self.models) self.models = models self.parent = models.parent + self.parent_name = models.parent_name if len(models.models): self.current_model = models.models[0] else: @@ -326,7 +328,6 @@ class Screen(SignalEvent): else: self.models.add_fields(fields, self.models, context=context) - self.set_domain() self.fields = self.models.fields parser = WidgetParse(parent=self.parent, window=self.window) @@ -340,23 +341,6 @@ class Screen(SignalEvent): self.screen_container.set(view.widget) return view - def set_domain(self): - fields = self.models.fields - for dom in self.domain: - #XXX to improve for new domain structure - if not isinstance(dom, tuple): - continue - if dom[0] in fields: - field_dom = str(fields[dom[0]].setdefault('domain',[])) - if dom[1] == 'child_of': - fields[dom[0]]['domain'] = field_dom[:1] + \ - str((dom[0], dom[1], dom[2])) + ',' + field_dom[1:] - else: - fields[dom[0]]['domain'] = field_dom[:1] + \ - str(('id', dom[1], dom[2])) + ',' + field_dom[1:] - if dom[1] == '=': - fields[dom[0]]['readonly'] = True - def editable_get(self): if hasattr(self.current_view, 'widget_tree'): if hasattr(self.current_view.widget_tree, 'editable'): diff --git a/tryton/gui/window/view_form/view/form_gtk/one2many.py b/tryton/gui/window/view_form/view/form_gtk/one2many.py index 6ba58e645c..88aaf368f1 100644 --- a/tryton/gui/window/view_form/view/form_gtk/one2many.py +++ b/tryton/gui/window/view_form/view/form_gtk/one2many.py @@ -200,6 +200,7 @@ class Dialog(object): self.dia.show() self.screen = Screen(model_name, self.dia, view_type=[], parent=parent, + parent_name=attrs.get('relation_field'), exclude_field=attrs.get('relation_field', None), readonly=readonly, domain=domain) self.screen.models._context.update(model_ctx) @@ -460,7 +461,8 @@ class One2Many(WidgetInterface): self.screen = Screen(attrs['relation'], self._window, view_type=attrs.get('mode','tree,form').split(','), - parent=self.parent, views_preload=attrs.get('views', {}), + parent=self.parent, parent_name=attrs.get('relation_field'), + views_preload=attrs.get('views', {}), tree_saves=attrs.get('saves', False), create_new=True, row_activate=self._on_activate, default_get=attrs.get('default_get', {}),