def _updateText(self): text = self.text() if text: if not self.hasFocus() or self.isReadOnly(): text, converted = numberWithFraction(text) if not converted: try: if self._decimals: text = locale.format("%%.%df" % self._decimals, float(text), grouping=True) # Strip empty fraction dp = locale.localeconv()['decimal_point'] text = text.rstrip('0').rstrip(dp) else: text = locale.format("%d", int(text), grouping=True) except ValueError: return else: ts = locale.localeconv()['thousands_sep'] if ts == '.': text = text.replace('.', ',') if QLineEdit.text(self) != text: QLineEdit.setText(self, text)
def clickGenerateTitle(self): titleParts = [] for key in ('value', 'unit', 'year', 'subjectshort', 'mintmark', 'variety'): value = self.items[key].value() if not isinstance(value, str): value = str(value) titlePart = value.strip() if titlePart: if key == 'unit': titlePart = titlePart.lower() elif key == 'value': titlePart, _ = numberWithFraction(titlePart, self.settings['convert_fraction']) elif key == 'subjectshort': if len(titlePart.split()) > 1: titlePart = '"%s"' % titlePart titleParts.append(titlePart) title = ' '.join(titleParts) self.items['title'].setValue(title)
def modelChanged(self): self.chartLayout.removeWidget(self.chart) chart = self.chartSelector.currentData() if chart == 'geochart': self.chart = GeoChartCanvas(self) elif chart == 'barh': self.chart = BarHCanvas(self) elif chart == 'pie': self.chart = PieCanvas(self) elif chart == 'stacked': self.chart = StackedBarCanvas(self) elif chart == 'progress': self.chart = ProgressCanvas(self) else: self.chart = BarCanvas(self) self.chart.setMulticolor(self.colorCheck.checkState() == Qt.Checked) self.chartLayout.addWidget(self.chart) fieldId = self.fieldSelector.currentData() field = self.model.fields.field(fieldId).name if field == 'fineness': field = 'material,fineness' elif field == 'unit': field = 'value,unit' filter_ = self.model.filter() if filter_: sql_filter = "WHERE %s" % filter_ else: sql_filter = "" if chart == 'geochart': sql = "SELECT count(*), country FROM coins %s GROUP BY country" % sql_filter query = QSqlQuery(self.model.database()) query.exec_(sql) xx = [] yy = [] while query.next(): record = query.record() count = record.value(0) val = str(record.value(1)) xx.append(val) yy.append(count) self.chart.setData(xx, yy, self.regionSelector.currentData()) elif chart == 'stacked': subfieldId = self.subfieldSelector.currentData() subfield = self.model.fields.field(subfieldId).name sql = "SELECT count(%s), %s, %s FROM coins %s GROUP BY %s, %s" % ( subfield, subfield, field, sql_filter, field, subfield) query = QSqlQuery(self.model.database()) query.exec_(sql) xx = [] yy = [] zz = [] vv = {} while query.next(): record = query.record() count = record.value(0) val = str(record.value(2)) if field == 'status': val = Statuses[val] elif field == 'value,unit': val = numberWithFraction(val)[0] + ' ' + str(record.value(3)) elif ',' in field: val += ' ' + str(record.value(3)) subval = str(record.value(1)) if subfield == 'status': subval = Statuses[subval] if val not in xx: xx.append(val) if subval not in zz: zz.append(subval) if val not in vv: vv[val] = {} vv[val][subval] = count for _ in range(len(zz)): yy.append([0] * len(xx)) xx = xx[::-1] for i, val in enumerate(xx): for j, subval in enumerate(zz): try: yy[j][i] = vv[val][subval] except KeyError: pass self.chart.setData(xx, yy, zz) self.chart.setLabelY(self.fieldSelector.currentText()) self.chart.setLabelZ(self.subfieldSelector.currentText()) elif chart == 'progress': items = self.itemsSelector.currentData() if items == 'price': sql_field = 'sum(payprice)' self.chart.setLabel(self.tr("Paid")) elif items == 'totalprice': sql_field = 'sum(totalpayprice)' self.chart.setLabel(self.tr("Total paid")) elif items == 'count': sql_field = 'count(*)' self.chart.setLabel(self.tr("Number of coins")) else: sql_field = 'count(*)' self.chart.setLabel(self.tr("Number of coins")) period = self.periodSelector.currentData() if items == 'created': if period == 'month': sql_filters = ["createdat >= datetime('now', 'start of month', '-11 months')"] elif period == 'week': sql_filters = ["createdat > datetime('now', '-11 months')"] elif period == 'day': sql_filters = ["createdat > datetime('now', '-1 month')"] else: # year sql_filters = ["1=1"] else: sql_filters = ["status IN ('owned', 'ordered', 'sale', 'missing')"] if period == 'month': sql_filters.append("paydate >= datetime('now', 'start of month', '-11 months')") elif period == 'week': sql_filters.append("paydate > datetime('now', '-11 months')") elif period == 'day': sql_filters.append("paydate > datetime('now', '-1 month')") if period == 'month': date_format = '%m' elif period == 'week': date_format = '%W' elif period == 'day': date_format = '%d' else: date_format = '%Y' if filter_: sql_filters.append(filter_) if items == 'created': sql = "SELECT %s, strftime('%s', createdat) FROM coins"\ " WHERE %s"\ " GROUP BY strftime('%s', createdat) ORDER BY createdat" % ( sql_field, date_format, ' AND '.join(sql_filters), date_format) else: sql = "SELECT %s, strftime('%s', paydate) FROM coins"\ " WHERE %s"\ " GROUP BY strftime('%s', paydate) ORDER BY paydate" % ( sql_field, date_format, ' AND '.join(sql_filters), date_format) query = QSqlQuery(self.model.database()) query.exec_(sql) xx = [] yy = [] while query.next(): record = query.record() count = record.value(0) val = str(record.value(1)) xx.append(val) yy.append(count) self.chart.setData(xx, yy) self.chart.setLabelY(self.periodSelector.currentText()) else: sql = "SELECT count(*), %s FROM coins %s GROUP BY %s" % ( field, sql_filter, field) query = QSqlQuery(self.model.database()) query.exec_(sql) xx = [] yy = [] while query.next(): record = query.record() count = record.value(0) val = str(record.value(1)) if field == 'status': val = Statuses[val] elif field == 'value,unit': val = numberWithFraction(val)[0] + ' ' + str(record.value(2)) elif ',' in field: val += ' ' + str(record.value(2)) xx.append(val) yy.append(count) self.chart.setData(xx, yy) self.chart.setLabelY(self.fieldSelector.currentText())
def __updateChilds(self, item, paramIndex=0, filters=''): fields = self.treeParam.fieldNames(paramIndex) if not fields: return sql = "SELECT DISTINCT %s FROM coins" % ','.join(fields) if filters: sql += " WHERE " + filters query = QtSql.QSqlQuery(sql, self.db) hasEmpty = False while query.next(): record = query.record() data = [] orig_data = [] filterSql = [] for i in range(record.count()): if record.isNull(i): hasEmpty = True continue orig_data.append(record.value(i)) text = str(record.value(i)) if text: if fields[i] == 'status': data.append(Statuses[text]) elif fields[i] == 'year': label = text try: year = int(text) if year < 0: label = "%d BC" % -year except ValueError: pass data.append(label) elif fields[i] == 'value': label, _ = numberWithFraction(text, self.convert_fraction) data.append(label) else: data.append(text) escapedText = text.replace("'", "''") filterSql.append("%s='%s'" % (fields[i], escapedText)) else: hasEmpty = True if data: if len(data) > 1: newFilters = ' AND '.join(filterSql) text = ' '.join(data) child = TreeWidgetItem([ text, ]) child.setData(0, self.SortDataRole, orig_data) else: newFilters = filterSql[0] child = TreeWidgetItem(data) child.setData(0, self.SortDataRole, orig_data) if filters: newFilters = filters + ' AND ' + newFilters child.setData(0, self.ParamRole, paramIndex) child.setData(0, self.FiltersRole, newFilters) child.setData(0, self.FieldsRole, fields) if self.show_tree_icons: icon = self.reference.getIcon(fields[0], data[0]) if icon: child.setIcon(0, icon) item.addChild(child) # Restore selection if newFilters == self.model.extFilter: self.currentItemChanged.disconnect(self.itemActivatedEvent) self.setCurrentItem(child) self.currentItemChanged.connect(self.itemActivatedEvent) item.sortChildren(0, Qt.AscendingOrder) if hasEmpty and len(fields) == 1 and item.childCount() > 0: text = self.tr("Other") newFilters = "ifnull(%s,'')=''" % fields[0] if filters: newFilters = filters + ' AND ' + newFilters child = QTreeWidgetItem([ text, ]) child.setData(0, self.ParamRole, paramIndex) child.setData(0, self.FiltersRole, newFilters) child.setData(0, self.FieldsRole, fields) item.addChild(child) # Restore selection if newFilters == self.model.extFilter: self.currentItemChanged.disconnect(self.itemActivatedEvent) self.setCurrentItem(child) self.currentItemChanged.connect(self.itemActivatedEvent) # Recursion for next field if nothing selected if item.childCount() == 0: self.__updateChilds(item, paramIndex + 1, filters)
def prepareMenu(self): self.listWidget = QListWidget(self) filters = self.filters.copy() appliedValues = [] columnFilters = None revert = False if self.fieldid in filters.keys(): columnFilters = filters.pop(self.fieldid) for filter_ in columnFilters.filters(): if filter_.isRevert(): revert = True appliedValues.append(filter_.value) hasBlanks = False columnType = self.model.columnType(self.fieldid) if self.model.columnName(self.fieldid) == 'year': filtersSql = self.filtersToSql(filters.values()) if filtersSql: filtersSql = 'WHERE ' + filtersSql sql = "SELECT DISTINCT %s FROM coins %s" % (self.columnName, filtersSql) query = QSqlQuery(sql, self.db) while query.next(): icon = None if query.record().isNull(0): data = None else: orig_data = query.record().value(0) data = str(orig_data) label = data try: year = int(orig_data) if year < 0: label = "%d BC" % -year except ValueError: pass if not data: hasBlanks = True continue item = CustomSortListWidgetItem() item.setData(Qt.DisplayRole, label) item.setData(Qt.UserRole, data) item.setData(Qt.UserRole + 1, orig_data) if data in appliedValues: if revert: item.setCheckState(Qt.Checked) else: item.setCheckState(Qt.Unchecked) else: if revert: item.setCheckState(Qt.Unchecked) else: item.setCheckState(Qt.Checked) self.listWidget.addItem(item) self.listWidget.sortItems() elif columnType == Type.Text or columnType in Type.ImageTypes: dataFilter = BlankFilter(self.columnName).toSql() blanksFilter = DataFilter(self.columnName).toSql() filtersSql = self.filtersToSql(filters.values()) sql = "SELECT 1 FROM coins WHERE " + filtersSql if filtersSql: sql += ' AND ' # Get blank row count blank_sql = sql + blanksFilter + " LIMIT 1" query = QSqlQuery(blank_sql, self.db) if query.first(): hasBlanks = True # Get not blank row count not_blank_sql = sql + dataFilter + " LIMIT 1" query = QSqlQuery(not_blank_sql, self.db) if query.first(): if columnType in Type.ImageTypes: label = self.tr("(Images)") elif columnType == Type.Text: label = self.tr("(Text)") else: label = self.tr("(Data)") item = QListWidgetItem(label, type=FilterMenuButton.DataType) item.setData(Qt.UserRole, label) item.setCheckState(Qt.Checked) if columnFilters and columnFilters.hasData(): item.setCheckState(Qt.Unchecked) self.listWidget.addItem(item) elif columnType == Type.Status: filtersSql = self.filtersToSql(filters.values()) if filtersSql: filtersSql = 'WHERE ' + filtersSql sql = "SELECT DISTINCT %s FROM coins %s ORDER BY %s ASC" % ( self.columnName, filtersSql, self.columnName) query = QSqlQuery(sql, self.db) while query.next(): value = query.record().value(0) label = Statuses[value] item = StatusSortListWidgetItem(label) item.setData(Qt.UserRole, value) if self.settings['show_filter_icons']: icon = statusIcon(value) item.setIcon(icon) if value in appliedValues: if revert: item.setCheckState(Qt.Checked) else: item.setCheckState(Qt.Unchecked) else: if revert: item.setCheckState(Qt.Unchecked) else: item.setCheckState(Qt.Checked) self.listWidget.addItem(item) self.listWidget.sortItems() elif columnType == Type.Denomination: filtersSql = self.filtersToSql(filters.values()) if filtersSql: filtersSql = 'WHERE ' + filtersSql sql = "SELECT DISTINCT %s FROM coins %s" % (self.columnName, filtersSql) query = QSqlQuery(sql, self.db) while query.next(): icon = None if query.record().isNull(0): data = None else: orig_data = query.record().value(0) data = str(orig_data) label, _ = numberWithFraction(data, self.settings['convert_fraction']) if not data: hasBlanks = True continue item = CustomSortListWidgetItem() item.setData(Qt.DisplayRole, label) item.setData(Qt.UserRole, data) item.setData(Qt.UserRole + 1, orig_data) if data in appliedValues: if revert: item.setCheckState(Qt.Checked) else: item.setCheckState(Qt.Unchecked) else: if revert: item.setCheckState(Qt.Unchecked) else: item.setCheckState(Qt.Checked) self.listWidget.addItem(item) self.listWidget.sortItems() else: filtersSql = self.filtersToSql(filters.values()) if filtersSql: filtersSql = 'WHERE ' + filtersSql sql = "SELECT DISTINCT %s FROM coins %s" % (self.columnName, filtersSql) query = QSqlQuery(sql, self.db) while query.next(): icon = None if query.record().isNull(0): data = None else: orig_data = query.record().value(0) data = str(orig_data) if self.settings['show_filter_icons']: icon = self.reference.getIcon(self.columnName, data) if not data: hasBlanks = True continue item = QListWidgetItem() item.setData(Qt.DisplayRole, orig_data) item.setData(Qt.UserRole, data) if icon: item.setIcon(icon) if data in appliedValues: if revert: item.setCheckState(Qt.Checked) else: item.setCheckState(Qt.Unchecked) else: if revert: item.setCheckState(Qt.Unchecked) else: item.setCheckState(Qt.Checked) self.listWidget.addItem(item) self.listWidget.sortItems() item = QListWidgetItem(self.tr("(Select all)"), type=FilterMenuButton.SelectAllType) item.setData(Qt.UserRole, self.tr("(Select all)")) item.setCheckState(Qt.Checked) self.listWidget.insertItem(0, item) if hasBlanks: item = QListWidgetItem(self.tr("(Blanks)"), type=FilterMenuButton.BlanksType) item.setData(Qt.UserRole, self.tr("(Blanks)")) item.setCheckState(Qt.Checked) if revert: if columnFilters and not columnFilters.hasBlank(): item.setCheckState(Qt.Unchecked) else: if columnFilters and columnFilters.hasBlank(): item.setCheckState(Qt.Unchecked) self.listWidget.addItem(item) self.listWidget.itemChanged.connect(self.itemChanged) self.searchBox = QLineEdit(self) self.searchBox.setPlaceholderText(self.tr("Filter")) self.searchBox.textChanged.connect(self.applySearch) self.buttonBox = QDialogButtonBox(Qt.Horizontal) self.buttonBox.addButton(QDialogButtonBox.Ok) self.buttonBox.addButton(QDialogButtonBox.Cancel) self.buttonBox.accepted.connect(self.apply) self.buttonBox.rejected.connect(self.menu().hide) layout = QVBoxLayout() layout.addWidget(self.searchBox) layout.addWidget(self.listWidget) layout.addWidget(self.buttonBox) widget = QWidget(self) widget.setLayout(layout) widgetAction = QWidgetAction(self) widgetAction.setDefaultWidget(widget) self.menu().clear() self.menu().addAction(widgetAction) # Fill items if self.listWidget.count() > 1: self.itemChanged(self.listWidget.item(1))
def modelChanged(self): self.chartLayout.removeWidget(self.chart) chart = self.chartSelector.currentData() if chart == 'geochart': self.chart = GeoChartCanvas(self) elif chart == 'barh': self.chart = BarHCanvas(self) elif chart == 'pie': self.chart = PieCanvas(self) elif chart == 'stacked': self.chart = StackedBarCanvas(self) elif chart == 'progress': self.chart = ProgressCanvas(self) else: self.chart = BarCanvas(self) self.chart.setMulticolor(self.colorCheck.checkState() == Qt.Checked) self.chartLayout.addWidget(self.chart) fieldId = self.fieldSelector.currentData() field = self.model.fields.field(fieldId).name if field == 'fineness': field = 'material,fineness' elif field == 'unit': field = 'value,unit' filter_ = self.model.filter() if filter_: sql_filter = "WHERE %s" % filter_ else: sql_filter = "" if chart == 'geochart': sql = "SELECT count(*), country FROM coins %s GROUP BY country" % sql_filter query = QSqlQuery(self.model.database()) query.exec_(sql) xx = [] yy = [] while query.next(): record = query.record() count = record.value(0) val = str(record.value(1)) xx.append(val) yy.append(count) self.chart.setData(xx, yy, self.regionSelector.currentData()) elif chart == 'stacked': subfieldId = self.subfieldSelector.currentData() subfield = self.model.fields.field(subfieldId).name sql = "SELECT count(%s), %s, %s FROM coins %s GROUP BY %s, %s" % ( subfield, subfield, field, sql_filter, field, subfield) query = QSqlQuery(self.model.database()) query.exec_(sql) xx = [] yy = [] zz = [] vv = {} while query.next(): record = query.record() count = record.value(0) val = str(record.value(2)) if field == 'status': val = Statuses[val] elif field == 'value,unit': val = numberWithFraction(val)[0] + ' ' + str( record.value(3)) elif ',' in field: val += ' ' + str(record.value(3)) subval = str(record.value(1)) if subfield == 'status': subval = Statuses[subval] if val not in xx: xx.append(val) if subval not in zz: zz.append(subval) if val not in vv: vv[val] = {} vv[val][subval] = count for _ in range(len(zz)): yy.append([0] * len(xx)) xx = xx[::-1] for i, val in enumerate(xx): for j, subval in enumerate(zz): try: yy[j][i] = vv[val][subval] except KeyError: pass self.chart.setData(xx, yy, zz) self.chart.setLabelY(self.fieldSelector.currentText()) self.chart.setLabelZ(self.subfieldSelector.currentText()) elif chart == 'progress': items = self.itemsSelector.currentData() if items == 'price': sql_field = 'sum(payprice)' self.chart.setLabel(self.tr("Paid")) elif items == 'totalprice': sql_field = 'sum(totalpayprice)' self.chart.setLabel(self.tr("Total paid")) elif items == 'count': sql_field = 'count(*)' self.chart.setLabel(self.tr("Number of coins")) else: sql_field = 'count(*)' self.chart.setLabel(self.tr("Number of coins")) period = self.periodSelector.currentData() if items == 'created': if period == 'month': sql_filters = [ "createdat >= datetime('now', 'start of month', '-11 months')" ] elif period == 'week': sql_filters = ["createdat > datetime('now', '-11 months')"] elif period == 'day': sql_filters = ["createdat > datetime('now', '-1 month')"] else: # year sql_filters = ["1=1"] else: sql_filters = [ "status IN ('owned', 'ordered', 'sale', 'missing')" ] if period == 'month': sql_filters.append( "paydate >= datetime('now', 'start of month', '-11 months')" ) elif period == 'week': sql_filters.append( "paydate > datetime('now', '-11 months')") elif period == 'day': sql_filters.append("paydate > datetime('now', '-1 month')") if period == 'month': date_format = '%m' elif period == 'week': date_format = '%W' elif period == 'day': date_format = '%d' else: date_format = '%Y' if filter_: sql_filters.append(filter_) if items == 'created': sql = "SELECT %s, strftime('%s', createdat) FROM coins"\ " WHERE %s"\ " GROUP BY strftime('%s', createdat) ORDER BY createdat" % ( sql_field, date_format, ' AND '.join(sql_filters), date_format) else: sql = "SELECT %s, strftime('%s', paydate) FROM coins"\ " WHERE %s"\ " GROUP BY strftime('%s', paydate) ORDER BY paydate" % ( sql_field, date_format, ' AND '.join(sql_filters), date_format) query = QSqlQuery(self.model.database()) query.exec_(sql) xx = [] yy = [] while query.next(): record = query.record() count = record.value(0) val = str(record.value(1)) xx.append(val) yy.append(count) self.chart.setData(xx, yy) self.chart.setLabelY(self.periodSelector.currentText()) else: sql = "SELECT count(*), %s FROM coins %s GROUP BY %s" % ( field, sql_filter, field) query = QSqlQuery(self.model.database()) query.exec_(sql) xx = [] yy = [] while query.next(): record = query.record() count = record.value(0) val = str(record.value(1)) if field == 'status': val = Statuses[val] elif field == 'value,unit': val = numberWithFraction(val)[0] + ' ' + str( record.value(2)) elif ',' in field: val += ' ' + str(record.value(2)) xx.append(val) yy.append(count) self.chart.setData(xx, yy) self.chart.setLabelY(self.fieldSelector.currentText())