diff --git a/CHANGELOG b/CHANGELOG index 4df6535dd9..fa5e39fcb5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +* Explicitly set value of parent field + Version 3.2.0 - 2014-04-21 * Bug fixes (see mercurial logs for details) * Add option to show revisions diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py index 95d698e557..231701bdd3 100644 --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -377,13 +377,6 @@ class M2OField(Field): _default = None - def get(self, record): - value = record.value.get(self.name) - if (record.parent_name == self.name - and self.attrs['relation'] == record.group.parent.model_name): - value = record.parent.id if record.parent else None - return value - def get_client(self, record): rec_name = record.value.get(self.name + '.rec_name') if rec_name is None: @@ -407,14 +400,6 @@ class M2OField(Field): rec_name = record.value.get(self.name + '.rec_name') or '' if value is False: value = None - if (record.parent_name == self.name - and self.attrs['relation'] == record.group.parent.model_name): - if record.parent: - value = record.parent.id - if 'rec_name' in record.parent.value: - rec_name = record.parent.value['rec_name'] or '' - else: - value = None if not rec_name and value >= 0: try: result, = RPCExecute('model', self.attrs['relation'], 'read', @@ -424,11 +409,6 @@ class M2OField(Field): rec_name = result['rec_name'] or '' record.value[self.name + '.rec_name'] = rec_name record.value[self.name] = value - if (record.parent_name == self.name - and self.attrs['relation'] == record.group.parent.model_name): - if record.parent: - if 'rec_name' not in record.parent.value: - record.parent.value['rec_name'] = rec_name def context_get(self, record): context = super(M2OField, self).context_get(record) @@ -446,13 +426,11 @@ class M2OField(Field): return concat(localize_domain(inverse_leaf(screen_domain), self.name), attr_domain) - def get_state_attrs(self, record): - result = super(M2OField, self).get_state_attrs(record) - if (record.parent_name == self.name - and self.attrs['relation'] == record.group.parent.model_name): - result = result.copy() - result['readonly'] = True - return result + def get_on_change_value(self, record): + if record.parent_name == self.name and record.parent: + return record.parent.get_on_change_value( + skip={self.attrs.get('relation_field')}) + return super(M2OField, self).get_on_change_value(record) class O2OField(M2OField): @@ -776,12 +754,6 @@ class ReferenceField(Field): return None def get(self, record): - if record.parent_name == self.name: - if record.parent: - return '%s,%s' % (record.group.parent.model_name, - record.parent.id) - else: - return None if (record.value.get(self.name) and record.value[self.name][0] and record.value[self.name][1] >= -1): @@ -811,12 +783,6 @@ class ReferenceField(Field): force_change=force_change) def set(self, record, value): - if record.parent_name == self.name: - if record.parent: - value = '%s,%s' % (record.group.parent.model_name, - record.parent.id) - else: - value = None if not value: record.value[self.name] = self._default return @@ -847,6 +813,12 @@ class ReferenceField(Field): record.value[self.name] = ref_model, ref_id record.value[self.name + '.rec_name'] = rec_name + def get_on_change_value(self, record): + if record.parent_name == self.name and record.parent: + return record.parent.get_on_change_value( + skip={self.attrs.get('relation_field')}) + return super(ReferenceField, self).get_on_change_value(record) + class BinaryField(Field): diff --git a/tryton/gui/window/view_form/model/group.py b/tryton/gui/window/view_form/model/group.py index cea94f5eac..734e16faf1 100644 --- a/tryton/gui/window/view_form/model/group.py +++ b/tryton/gui/window/view_form/model/group.py @@ -3,7 +3,7 @@ from weakref import WeakSet from record import Record -from field import Field, O2MField +from field import Field, O2MField, M2OField, ReferenceField from tryton.signal_event import SignalEvent from tryton.common.domain_inversion import is_leaf from tryton.common import RPCExecute, RPCException, MODELACCESS @@ -282,6 +282,14 @@ class Group(SignalEvent, list): record.modified_fields.setdefault('id') record.signal('record-modified') self.signal('group-changed', record) + # Set parent field to trigger on_change + if self.parent and self.parent_name in self.fields: + field = self.fields[self.parent_name] + if isinstance(field, (M2OField, ReferenceField)): + value = self.parent.id, '' + if isinstance(field, ReferenceField): + value = self.parent.model_name, value + field.set_client(record, value) return record def set_sequence(self, field='sequence'): diff --git a/tryton/gui/window/view_form/model/record.py b/tryton/gui/window/view_form/model/record.py index fa6843ef66..587aaff785 100644 --- a/tryton/gui/window/view_form/model/record.py +++ b/tryton/gui/window/view_form/model/record.py @@ -264,10 +264,14 @@ class Record(SignalEvent): value['id'] = self.id return value - def get_on_change_value(self): + def get_on_change_value(self, skip=None): value = {} for name, field in self.group.fields.iteritems(): - if name not in self._loaded and self.id >= 0: + if skip and name in skip: + continue + if (self.id >= 0 + and (name not in self._loaded + or name not in self.modified_fields)): continue value[name] = field.get_on_change_value(self) value['id'] = self.id