diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py index 4151d7fd07..7d7ca3fa44 100644 --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -779,11 +779,13 @@ class ReferenceField(CharField): return None def set_client(self, record, value, force_change=False): - ref_model, ref_id = value - if isinstance(ref_id, (tuple, list)): - ref_id, rec_name = ref_id - record.value[self.name + '.rec_name'] = rec_name - super(ReferenceField, self).set_client(record, (ref_model, ref_id), + if value: + ref_model, ref_id = value + if isinstance(ref_id, (tuple, list)): + ref_id, rec_name = ref_id + record.value[self.name + '.rec_name'] = rec_name + value = (ref_model, ref_id) + super(ReferenceField, self).set_client(record, value, force_change=force_change) def set(self, record, value, modified=False): @@ -795,7 +797,10 @@ class ReferenceField(CharField): if not ref_id: ref_id = None else: - ref_id = int(ref_id) + try: + ref_id = int(ref_id) + except ValueError: + pass else: ref_model, ref_id = value rec_name = record.value.get(self.name + '.rec_name') or '' @@ -811,7 +816,7 @@ class ReferenceField(CharField): return rec_name = result['rec_name'] else: - rec_name = '' + rec_name = ref_id record.value[self.name] = ref_model, ref_id record.value[self.name + '.rec_name'] = rec_name if modified: diff --git a/tryton/gui/window/view_form/view/form_gtk/reference.py b/tryton/gui/window/view_form/view/form_gtk/reference.py index f9a2df1933..84a8855791 100644 --- a/tryton/gui/window/view_form/view/form_gtk/reference.py +++ b/tryton/gui/window/view_form/view/form_gtk/reference.py @@ -82,8 +82,8 @@ class Reference(Many2One): if self.record and self.field: try: model, name = self.field.get_client(self.record) - except ValueError: - model, name = None + except (ValueError, TypeError): + model, name = '', '' return (model != self.get_model() or name != self.wid_text.get_text()) return False @@ -95,7 +95,10 @@ class Reference(Many2One): if not value: value = None else: - value = int(value) + try: + value = int(value) + except ValueError: + value = None result = model == self.get_model() and value >= 0 return result @@ -116,8 +119,17 @@ class Reference(Many2One): self.wid_text.set_position(0) self.field.set_client(self.record, (self.get_model(), (-1, ''))) + def set_value(self, record, field): + if not self.get_model(): + value = self.wid_text.get_text() + return field.set_client(record, ('', value)) + return super(Reference, self).set_value(record, field) + def set_text(self, value): - model, value = value + if value: + model, value = value + else: + model, value = None, None super(Reference, self).set_text(value) child = self.widget_combo.get_child() if model: