Explicitly set value of parent field

issue3819
review5061002
This commit is contained in:
Cédric Krier committed 2014-05-06 22:55:49 +02:00
1 parent 0d117b11e0
commit d5cf57b1e1
4 files changed
+28 -42

No files matched your search

+2
View File
@@ -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
+11 -39
View File
@@ -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):
+9 -1
View File
@@ -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'):
+6 -2
View File
@@ -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