diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py index 8adfff3711..84dcbfcd43 100644 --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -742,8 +742,8 @@ class O2MField(CharField): def state_set(self, record, states=('readonly', 'required', 'invisible')): self._set_default_value(record) super(O2MField, self).state_set(record, states=states) - if self.get_state_attrs(record).get('readonly', False): - record.value[self.name].readonly = True + record.value[self.name].readonly = self.get_state_attrs(record).get( + 'readonly', False) def get_removed_ids(self, record): return [x.id for x in record.value[self.name].record_removed] diff --git a/tryton/gui/window/view_form/model/group.py b/tryton/gui/window/view_form/model/group.py index fc5f34c843..46c0fe8626 100644 --- a/tryton/gui/window/view_form/model/group.py +++ b/tryton/gui/window/view_form/model/group.py @@ -35,17 +35,23 @@ class Group(SignalEvent, list): self.load(ids) self.record_deleted, self.record_removed = [], [] self.on_write = set() - if self._context.get('_datetime'): - self.readonly = True - elif not MODELACCESS[self.model_name]['write']: - self.readonly = True - else: - self.readonly = readonly + self.__readonly = None self.__id2record = {} self.__field_childs = None self.exclude_field = None self.pool = WeakSet() + @property + def readonly(self): + if (self._context.get('_datetime') + or not MODELACCESS[self.model_name]['write']): + return True + return self.__readonly + + @readonly.setter + def readonly(self, value): + self.__readonly = value + @property def domain(self): if self.parent and self.child_name: