def setData(self, index, value, role=Qt.EditRole): """ Custom reimplementation of the method setData. It is necessary to work with value map and value relation. index: column index to be set value: value to be set role: role used """ column = self.headerData(index.column(), Qt.Horizontal) newValue = value if column in self.dict: if isinstance(self.dict[column], dict): valueMap = self.dict[column] if value in valueMap: newValue = int(valueMap[value]) else: newValue = value elif isinstance(self.dict[column], tuple): tupla = self.dict[column] valueMap = self.makeValueRelationDict(tupla[0], tupla[1]) code_names = value[1:-1].split(',') codes = [] for code_name in code_names: code = valueMap[code_name] codes.append(code) if len(codes) > 0: newValue = '{%s}' % ','.join(map(str, codes)) return QSqlTableModel.setData(self, index, newValue, role)
def fill_table(self, dialog, table_view, set_edit_triggers=QTableView.NoEditTriggers, update=False): """ Set a model with selected filter and attach it to selected table @setEditStrategy: 0: OnFieldChange, 1: OnRowChange, 2: OnManualSubmit """ if self.schema_name not in table_view: table_view = self.schema_name + "." + table_view # Set model model = QSqlTableModel() model.setTable(table_view) model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.setSort(2, 0) model.select() dialog.selected_rows.setEditTriggers(set_edit_triggers) # Check for errors if model.lastError().isValid(): self.controller.show_warning(model.lastError().text()) # Create expresion expr = f" mu_name ILIKE '%{dialog.txt_selected_filter.text()}%'" if self.selected_camp is not None: expr += f" AND campaign_id = '{self.campaign_id}'" if update: expr += f" OR campaign_id = '{self.selected_camp}'" # Attach model to table or view dialog.selected_rows.setModel(model) dialog.selected_rows.model().setFilter(expr) # Set year to plan to all rows in list for x in range(0, model.rowCount()): i = int(dialog.selected_rows.model().fieldIndex('campaign_id')) index = dialog.selected_rows.model().index(x, i) model.setData(index, self.campaign_id) self.calculate_total_price(dialog, self.campaign_id)