from datetime import datetime import mariadb from PySide6.QtCore import QAbstractTableModel, QModelIndex, Qt from PySide6.QtGui import QColor class MediaFileTableModel(QAbstractTableModel): def __init__(self, db_config, main_window): super().__init__() self.main_window = main_window self._data = [] self.mariadb_conn = mariadb.connect( host=db_config['mariadb']['host'], port=db_config['mariadb']['port'], user=db_config['mariadb']['user'], password=db_config['mariadb']['password'], database=db_config['mariadb']['database'] ) self.refresh() def refresh(self): data = [] cursor = self.mariadb_conn.cursor() filter_rule = "" print(self.main_window.filter["download"].isChecked()) if self.main_window.filter["download"].isChecked(): print(self.main_window.filter["download"].isChecked()) filter_rule = "WHERE should_download is true" if self.main_window.filter["review"].isChecked(): if len(filter_rule) > 0: filter_rule += " AND " else: filter_rule += "WHERE " filter_rule += "review is true" print(f"{filter_rule=}") try: cursor.execute(f"SELECT id, url, review, should_download, file_name, cloud_link FROM media_file {filter_rule}") except mariadb.Error as error: print(error) rows = cursor.fetchall() print(len(rows)) if len(rows) > 0: self.beginResetModel() for row in rows: data.append(list(row)) self._data = data self.endResetModel() else: self._data = None try: self.layoutChanged.emit() except: self.main_window.statusBar.showMessage(f"{len(rows)} Einträge geladen", 3000) def rowCount(self, parent=QModelIndex()): # The length of the outer list. return len(self._data) def headerData(self, col, orientation, role=Qt.ItemDataRole.DisplayRole): if orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole: match col: case 0: return "ID" case 1: return "URL" case 2: return "Review" case 3: return "Download" case 4: return "Filename" case 5: return "Cloud Link" if orientation == Qt.Orientation.Vertical and role == Qt.ItemDataRole.DisplayRole: return str(col+1) def data(self, index, role=Qt.ItemDataRole.DisplayRole): value = self._data[index.row()][index.column()] if role == Qt.ItemDataRole.DisplayRole: if isinstance(value, datetime): return value.strftime("%Y-%m-%d %M:%M:%S") if isinstance(value, str): return value if isinstance(value, bytes): if value == b'\x01': return self.main_window.tick else: return self.main_window.cross return value if role == Qt.ItemDataRole.DecorationRole: if isinstance(value, bytes): # print('{}: {}'.format(value, type(value))) if value == b'\x01': return self.main_window.tick else: return self.main_window.cross def columnCount(self, index=QModelIndex()): # The following takes the first sub-list, and returns # the length (only works if all rows are an equal length) return len(self._data[0]) def setData(self, index, value, role=Qt.ItemDataRole.EditRole): if role == Qt.ItemDataRole.EditRole: self._data[index.row()][index.column()] = value if role == Qt.ItemDataRole.CheckStateRole: checked = value == Qt.CheckState.Checked self._data[index.row()][index.column()] = checked return True def flags(self, index): return Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsEditable | Qt.ItemFlag.ItemIsUserTristate