def set(self, record, value): from group import Group group = record.value.get(self.name) fields = {} if group is not None: fields = group.fields.copy() # Unconnect to prevent infinite loop group.signal_unconnect(group) group.destroy() elif record.model_name == self.attrs['relation']: fields = record.group.fields parent_name = self.attrs.get('relation_field', '') group = Group(self.attrs['relation'], {}, parent=record, parent_name=parent_name, child_name=self.name, context=self.context, parent_datetime_field=self.attrs.get('datetime_field')) if record.value.get(self.name): group.record_removed.extend(record.value[self.name]) group.record_deleted.extend(record.value[self.name].record_deleted) group.record_removed.extend(record.value[self.name].record_removed) record.value[self.name] = group group.fields = fields group.load(value) group.signal_connect(group, 'group-changed', self._group_changed) group.signal_connect(group, 'group-list-changed', self._group_list_changed) group.signal_connect(group, 'group-cleared', self._group_cleared) group.signal_connect(group, 'record-modified', self._record_modified)
def _set_value(self, record, value, default=False): from group import Group if not value or (len(value) and isinstance(value[0], (int, long))): mode = 'list ids' else: mode = 'list values' group = record.value.get(self.name) fields = {} if group is not None: fields = group.fields.copy() # Unconnect to prevent infinite loop group.signal_unconnect(group) group.destroy() elif record.model_name == self.attrs['relation']: fields = record.group.fields if fields: fields = dict((fname, field.attrs) for fname, field in fields.iteritems()) if mode == 'list values' and len(value): context = self.context_get(record) field_names = set(f for v in value for f in v if f not in fields) if field_names: try: fields.update(RPCExecute('model', self.attrs['relation'], 'fields_get', list(field_names), main_iteration=False, context=context)) except RPCException: return parent_name = self.attrs.get('relation_field', '') group = Group(self.attrs['relation'], fields, parent=record, parent_name=parent_name, child_name=self.name, context=self.context, parent_datetime_field=self.attrs.get('datetime_field')) record.value[self.name] = group if mode == 'list ids': group.load(value) else: for vals in value: new_record = record.value[self.name].new(default=False) if default: new_record.set_default(vals) group.add(new_record) else: new_record.id *= -1 # Don't consider record as unsaved new_record.set(vals) group.append(new_record) group.signal_connect(group, 'group-changed', self._group_changed) group.signal_connect(group, 'group-list-changed', self._group_list_changed) group.signal_connect(group, 'group-cleared', self._group_cleared) group.signal_connect(group, 'record-modified', self._record_modified) return group
def set_default(self, record, value, modified=False): from group import Group # value is a list of id if value and len(value) and isinstance(value[0], (int, long)): return self.set(record, value, modified=modified) group = record.value.get(self.name) fields = {} if group is not None: fields = group.fields.copy() # Unconnect to prevent infinite loop group.signal_unconnect(group) group.destroy() elif record.model_name == self.attrs['relation']: fields = record.group.fields if fields: fields = dict((fname, field.attrs) for fname, field in fields.iteritems()) if value and len(value): context = self.context_get(record) field_names = [] for val in value: for fieldname in val.keys(): if (fieldname not in field_names and fieldname not in fields): field_names.append(fieldname) if field_names: try: fields.update(RPCExecute('model', self.attrs['relation'], 'fields_get', field_names, context=context)) except RPCException: return False parent_name = self.attrs.get('relation_field', '') group = Group(self.attrs['relation'], fields, parent=record, parent_name=parent_name, child_name=self.name, context=self.context, parent_datetime_field=self.attrs.get('datetime_field')) if record.value.get(self.name): group.record_deleted.extend(x for x in record.value[self.name] if x.id >= 0) group.record_deleted.extend(record.value[self.name].record_deleted) group.record_removed.extend(record.value[self.name].record_removed) record.value[self.name] = group for vals in (value or []): new_record = record.value[self.name].new(default=False) new_record.set_default(vals, modified=modified) group.add(new_record) group.signal_connect(group, 'group-changed', self._group_changed) group.signal_connect(group, 'group-list-changed', self._group_list_changed) group.signal_connect(group, 'group-cleared', self._group_cleared) group.signal_connect(group, 'record-modified', self._record_modified) return True
def _set_default_value(self, record): if record.value.get(self.name) is not None: return from group import Group parent_name = self.attrs.get('relation_field', '') group = Group(self.attrs['relation'], {}, parent=record, parent_name=parent_name, child_name=self.name, context=self.context, parent_datetime_field=self.attrs.get('datetime_field')) if record.model_name == self.attrs['relation']: group.fields = record.group.fields group.signal_connect(group, 'group-changed', self._group_changed) group.signal_connect(group, 'group-list-changed', self._group_list_changed) group.signal_connect(group, 'group-cleared', self._group_cleared) group.signal_connect(group, 'record-modified', self._record_modified) record.value[self.name] = group