Table sortable #55
@@ -1,5 +1,5 @@
|
|||||||
from PySide6.QtCore import Signal, QSortFilterProxyModel
|
from PySide6.QtCore import Signal, QSortFilterProxyModel
|
||||||
from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QTabWidget, QMenu, QTableView, QMdiSubWindow
|
from PySide6.QtWidgets import QWidget, QVBoxLayout, QTabWidget, QTableView, QMdiSubWindow, QHeaderView
|
||||||
|
|
||||||
from gui.model_config import KontorModelConfig
|
from gui.model_config import KontorModelConfig
|
||||||
from gui.table_model import KontorTableModel
|
from gui.table_model import KontorTableModel
|
||||||
@@ -56,7 +56,8 @@ class ComicWindow(QMdiSubWindow):
|
|||||||
proxy_model = QSortFilterProxyModel()
|
proxy_model = QSortFilterProxyModel()
|
||||||
proxy_model.setSourceModel(model)
|
proxy_model.setSourceModel(model)
|
||||||
table_view.setSortingEnabled(True)
|
table_view.setSortingEnabled(True)
|
||||||
#table_view.setModel(model)
|
header = table_view.horizontalHeader()
|
||||||
|
header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
|
||||||
table_view.setModel(proxy_model)
|
table_view.setModel(proxy_model)
|
||||||
layout.addLayout(table_config.get_filter_layout())
|
layout.addLayout(table_config.get_filter_layout())
|
||||||
layout.addWidget(table_view)
|
layout.addWidget(table_view)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from PySide6.QtCore import Signal, QSortFilterProxyModel
|
from PySide6.QtCore import Signal, QSortFilterProxyModel
|
||||||
from PySide6.QtWidgets import QMdiSubWindow, QWidget, QVBoxLayout, QTabWidget, QTableView
|
from PySide6.QtWidgets import QMdiSubWindow, QWidget, QVBoxLayout, QTabWidget, QTableView, QHeaderView
|
||||||
|
|
||||||
from gui.model_config import KontorModelConfig
|
from gui.model_config import KontorModelConfig
|
||||||
from gui.table_model import KontorTableModel
|
from gui.table_model import KontorTableModel
|
||||||
@@ -57,6 +57,8 @@ class MediaWindow(QMdiSubWindow):
|
|||||||
proxy_model = QSortFilterProxyModel()
|
proxy_model = QSortFilterProxyModel()
|
||||||
proxy_model.setSourceModel(model)
|
proxy_model.setSourceModel(model)
|
||||||
table_view.setSortingEnabled(True)
|
table_view.setSortingEnabled(True)
|
||||||
|
# header = table_view.horizontalHeader()
|
||||||
|
# header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
|
||||||
#table_view.setModel(model)
|
#table_view.setModel(model)
|
||||||
table_view.setModel(proxy_model)
|
table_view.setModel(proxy_model)
|
||||||
layout.addLayout(table_config.get_filter_layout())
|
layout.addLayout(table_config.get_filter_layout())
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from PySide6.QtCore import Signal, QSortFilterProxyModel
|
from PySide6.QtCore import Signal, QSortFilterProxyModel
|
||||||
from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QTabWidget, QMenu, QTableView, QMdiSubWindow
|
from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QTabWidget, QMenu, QTableView, QMdiSubWindow, \
|
||||||
|
QHeaderView
|
||||||
|
|
||||||
from gui.model_config import KontorModelConfig
|
from gui.model_config import KontorModelConfig
|
||||||
from gui.table_model import KontorTableModel
|
from gui.table_model import KontorTableModel
|
||||||
@@ -47,18 +48,19 @@ class MetaDataWindow(QMdiSubWindow):
|
|||||||
|
|
||||||
def generate_data_tab(self, table_name):
|
def generate_data_tab(self, table_name):
|
||||||
data_tab = QWidget()
|
data_tab = QWidget()
|
||||||
|
|
||||||
table_config = KontorModelConfig(self._main_window.kontor_db, self, table_name)
|
table_config = KontorModelConfig(self._main_window.kontor_db, self, table_name)
|
||||||
model = KontorTableModel(table_config)
|
model = KontorTableModel(table_config)
|
||||||
layout = QVBoxLayout()
|
layout = QVBoxLayout()
|
||||||
self.data_views.append(model)
|
self.data_views.append(model)
|
||||||
data_tab.setLayout(layout)
|
data_tab.setLayout(layout)
|
||||||
table_view = QTableView()
|
table_view = QTableView()
|
||||||
proxy_model = QSortFilterProxyModel()
|
# proxy_model = QSortFilterProxyModel()
|
||||||
proxy_model.setSourceModel(model)
|
# proxy_model.setSourceModel(model)
|
||||||
table_view.setSortingEnabled(True)
|
table_view.setSortingEnabled(True)
|
||||||
#table_view.setModel(model)
|
header = table_view.horizontalHeader()
|
||||||
table_view.setModel(proxy_model)
|
header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
|
||||||
|
# table_view.setModel(proxy_model)
|
||||||
|
table_view.setModel(model)
|
||||||
layout.addLayout(table_config.get_filter_layout())
|
layout.addLayout(table_config.get_filter_layout())
|
||||||
layout.addWidget(table_view)
|
layout.addWidget(table_view)
|
||||||
model.refresh()
|
model.refresh()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from PySide6.QtWidgets import QHBoxLayout, QCheckBox, QMdiSubWindow
|
from PySide6.QtWidgets import QHBoxLayout, QCheckBox, QMdiSubWindow
|
||||||
from kontor_schema import KontorDB
|
from kontor_schema import KontorDB, ColumnEntry
|
||||||
|
|
||||||
|
|
||||||
class KontorModelConfig:
|
class KontorModelConfig:
|
||||||
@@ -29,7 +29,7 @@ class KontorModelConfig:
|
|||||||
# print(self.filter["download"].isChecked())
|
# print(self.filter["download"].isChecked())
|
||||||
for column, filter_info in self.filter.items():
|
for column, filter_info in self.filter.items():
|
||||||
# print(column, filter_info)
|
# print(column, filter_info)
|
||||||
if filter_info['widget'].isChecked():
|
if filter_info[ColumnEntry.COLUMN_WIDGET].isChecked():
|
||||||
_filters[column] = True
|
_filters[column] = True
|
||||||
# print(f"{filter_rule=}")
|
# print(f"{filter_rule=}")
|
||||||
# self.log.info("filters -> %s", _filters)
|
# self.log.info("filters -> %s", _filters)
|
||||||
@@ -46,9 +46,9 @@ class KontorModelConfig:
|
|||||||
filter_layout = QHBoxLayout()
|
filter_layout = QHBoxLayout()
|
||||||
for column, filter_info in self.filter.items():
|
for column, filter_info in self.filter.items():
|
||||||
filter_checkbox = QCheckBox()
|
filter_checkbox = QCheckBox()
|
||||||
filter_checkbox.setText(filter_info['label'])
|
filter_checkbox.setText(filter_info[ColumnEntry.COLUMN_LABEL])
|
||||||
filter_checkbox.checkStateChanged.connect(self.main_window.refresh)
|
filter_checkbox.checkStateChanged.connect(self.main_window.refresh)
|
||||||
self.filter[column]['widget'] = filter_checkbox
|
self.filter[column][ColumnEntry.COLUMN_WIDGET] = filter_checkbox
|
||||||
filter_layout.addWidget(filter_checkbox)
|
filter_layout.addWidget(filter_checkbox)
|
||||||
filter_layout.addStretch()
|
filter_layout.addStretch()
|
||||||
# self.log.info("get_filter_layout: %s", self.filter)
|
# self.log.info("get_filter_layout: %s", self.filter)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from datetime import datetime
|
|||||||
|
|
||||||
from PySide6.QtCore import QAbstractTableModel, QModelIndex
|
from PySide6.QtCore import QAbstractTableModel, QModelIndex
|
||||||
from PySide6.QtGui import Qt
|
from PySide6.QtGui import Qt
|
||||||
|
from kontor_schema import ColumnEntry
|
||||||
|
|
||||||
from .model_config import KontorModelConfig
|
from .model_config import KontorModelConfig
|
||||||
|
|
||||||
@@ -42,8 +43,9 @@ class KontorTableModel(QAbstractTableModel):
|
|||||||
return len(self._data)
|
return len(self._data)
|
||||||
|
|
||||||
def headerData(self, col, orientation, role=Qt.ItemDataRole.DisplayRole):
|
def headerData(self, col, orientation, role=Qt.ItemDataRole.DisplayRole):
|
||||||
|
# self.log.info(f"{self._config.header[col]}")
|
||||||
if orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole:
|
if orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole:
|
||||||
return self._config.header[col]['label']
|
return self._config.header[col][ColumnEntry.COLUMN_LABEL]
|
||||||
if orientation == Qt.Orientation.Vertical and role == Qt.ItemDataRole.DisplayRole:
|
if orientation == Qt.Orientation.Vertical and role == Qt.ItemDataRole.DisplayRole:
|
||||||
return str(col+1)
|
return str(col+1)
|
||||||
|
|
||||||
@@ -52,11 +54,12 @@ class KontorTableModel(QAbstractTableModel):
|
|||||||
return None
|
return None
|
||||||
value = self._data[index.row()][index.column()]
|
value = self._data[index.row()][index.column()]
|
||||||
# print('{}:: {}:: {}: {}'.format(index, role, value, type(value)))
|
# print('{}:: {}:: {}: {}'.format(index, role, value, type(value)))
|
||||||
|
row = index.row()
|
||||||
|
column = index.column()
|
||||||
|
column_type = self._config.header[column][ColumnEntry.COLUMN_TYPE]
|
||||||
|
# self.log.info(f"{row}-{column}: {column_type}")
|
||||||
if role == Qt.ItemDataRole.DisplayRole or role == Qt.ItemDataRole.EditRole:
|
if role == Qt.ItemDataRole.DisplayRole or role == Qt.ItemDataRole.EditRole:
|
||||||
if isinstance(value, datetime):
|
if column_type == "BOOLEAN":
|
||||||
return value.strftime("%Y-%m-%d %M:%M:%S")
|
|
||||||
if isinstance(value, str):
|
|
||||||
return value
|
|
||||||
if isinstance(value, bytes):
|
if isinstance(value, bytes):
|
||||||
if value == b'\x01':
|
if value == b'\x01':
|
||||||
return self._config.main_window.tick
|
return self._config.main_window.tick
|
||||||
@@ -73,6 +76,10 @@ class KontorTableModel(QAbstractTableModel):
|
|||||||
return self._config.main_window.tick
|
return self._config.main_window.tick
|
||||||
else:
|
else:
|
||||||
return self._config.main_window.cross
|
return self._config.main_window.cross
|
||||||
|
if isinstance(value, datetime):
|
||||||
|
return value.strftime("%Y-%m-%d %M:%M:%S")
|
||||||
|
if isinstance(value, str):
|
||||||
|
return value
|
||||||
return str(value)
|
return str(value)
|
||||||
if role == Qt.ItemDataRole.DecorationRole:
|
if role == Qt.ItemDataRole.DecorationRole:
|
||||||
if isinstance(value, bytes):
|
if isinstance(value, bytes):
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
import uuid
|
import uuid
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from enum import Enum
|
||||||
from logging import Logger
|
from logging import Logger
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
@@ -17,6 +18,15 @@ from .tysc import Card, CardSet, Sport, Team, FieldPosition, Rooster, Player, Ve
|
|||||||
from .media import MediaFile, MediaArticle, MediaVideo
|
from .media import MediaFile, MediaArticle, MediaVideo
|
||||||
|
|
||||||
|
|
||||||
|
class ColumnEntry(Enum):
|
||||||
|
COLUMN_NAME = "column"
|
||||||
|
COLUMN_LABEL = 'label'
|
||||||
|
COLUMN_ORDER = 'order'
|
||||||
|
COLUMN_REF_COLUMN = 'ref_column'
|
||||||
|
COLUMN_TYPE = "type"
|
||||||
|
COLUMN_WIDGET = 'widget'
|
||||||
|
|
||||||
|
|
||||||
class KontorDB:
|
class KontorDB:
|
||||||
|
|
||||||
def __init__(self, db_engine: Engine, log: Logger):
|
def __init__(self, db_engine: Engine, log: Logger):
|
||||||
@@ -81,17 +91,23 @@ class KontorDB:
|
|||||||
filter(MetaDataTable.table_name == table_name).
|
filter(MetaDataTable.table_name == table_name).
|
||||||
filter(MetaDataColumn.is_shown == 1).all()):
|
filter(MetaDataColumn.is_shown == 1).all()):
|
||||||
# self.log.info("get_column_meta_data: %s %s %d", column.column_name, column.column_label, column.column_order)
|
# self.log.info("get_column_meta_data: %s %s %d", column.column_name, column.column_label, column.column_order)
|
||||||
meta_data[order] = {'column': column.column_name, 'label': column.column_label,
|
meta_data[order] = {
|
||||||
'order': column.column_order, 'ref_column': column.ref_column}
|
ColumnEntry.COLUMN_NAME: column.column_name,
|
||||||
|
ColumnEntry.COLUMN_LABEL: column.column_label,
|
||||||
|
ColumnEntry.COLUMN_ORDER: column.column_order,
|
||||||
|
ColumnEntry.COLUMN_REF_COLUMN: column.ref_column,
|
||||||
|
ColumnEntry.COLUMN_TYPE: column.column_type
|
||||||
|
}
|
||||||
order += 1
|
order += 1
|
||||||
else:
|
else:
|
||||||
for (_, column) in (session.query(MetaDataTable, MetaDataColumn).
|
for (_, column) in (session.query(MetaDataTable, MetaDataColumn).
|
||||||
filter(MetaDataTable.id == MetaDataColumn.table_id).
|
filter(MetaDataTable.id == MetaDataColumn.table_id).
|
||||||
filter(MetaDataTable.table_name == table_name).all()):
|
filter(MetaDataTable.table_name == table_name).all()):
|
||||||
meta_data[order] = {
|
meta_data[order] = {
|
||||||
'column': column.column_name,
|
ColumnEntry.COLUMN_NAME: column.column_name,
|
||||||
'order': column.column_order,
|
ColumnEntry.COLUMN_ORDER: column.column_order,
|
||||||
'ref_column': column.ref_column
|
ColumnEntry.COLUMN_REF_COLUMN: column.ref_column,
|
||||||
|
ColumnEntry.COLUMN_TYPE: column.column_type
|
||||||
}
|
}
|
||||||
order += 1
|
order += 1
|
||||||
# self.log.info("get_column_meta_data: %s", meta_data)
|
# self.log.info("get_column_meta_data: %s", meta_data)
|
||||||
@@ -99,13 +115,15 @@ class KontorDB:
|
|||||||
|
|
||||||
def get_columns(self, table_name: str) -> dict:
|
def get_columns(self, table_name: str) -> dict:
|
||||||
columns = {}
|
columns = {}
|
||||||
order = 0
|
|
||||||
__session__ = sessionmaker(self.engine)
|
__session__ = sessionmaker(self.engine)
|
||||||
with __session__() as session:
|
with __session__() as session:
|
||||||
for (_, column) in (session.query(MetaDataTable, MetaDataColumn).
|
for (_, column) in (session.query(MetaDataTable, MetaDataColumn).
|
||||||
filter(MetaDataTable.id == MetaDataColumn.table_id).
|
filter(MetaDataTable.id == MetaDataColumn.table_id).
|
||||||
filter(MetaDataTable.table_name == table_name).all()):
|
filter(MetaDataTable.table_name == table_name).all()):
|
||||||
columns[column.column_name] = {"order": column.column_order, "type": column.column_type}
|
columns[column.column_name] = {
|
||||||
|
ColumnEntry.COLUMN_ORDER: column.column_order,
|
||||||
|
ColumnEntry.COLUMN_TYPE: column.column_type
|
||||||
|
}
|
||||||
return columns
|
return columns
|
||||||
|
|
||||||
def get_filters(self, table_name: str) -> dict:
|
def get_filters(self, table_name: str) -> dict:
|
||||||
@@ -116,7 +134,10 @@ class KontorDB:
|
|||||||
filter(MetaDataTable.id == MetaDataColumn.table_id).
|
filter(MetaDataTable.id == MetaDataColumn.table_id).
|
||||||
filter(MetaDataTable.table_name == table_name).
|
filter(MetaDataTable.table_name == table_name).
|
||||||
filter(MetaDataColumn.show_filter == 1).all()):
|
filter(MetaDataColumn.show_filter == 1).all()):
|
||||||
_filter_map[column.column_name] = {'label': column.filter_label, 'widget': None}
|
_filter_map[column.column_name] = {
|
||||||
|
ColumnEntry.COLUMN_LABEL: column.filter_label,
|
||||||
|
ColumnEntry.COLUMN_WIDGET: None
|
||||||
|
}
|
||||||
return _filter_map
|
return _filter_map
|
||||||
|
|
||||||
def data(self, table_name: str, columns: dict, filters: dict) -> list:
|
def data(self, table_name: str, columns: dict, filters: dict) -> list:
|
||||||
@@ -133,8 +154,8 @@ class KontorDB:
|
|||||||
# self.log.info("data: %s", entry)
|
# self.log.info("data: %s", entry)
|
||||||
row = []
|
row = []
|
||||||
for order in columns.keys():
|
for order in columns.keys():
|
||||||
column_name = columns[order]['column']
|
column_name = columns[order][ColumnEntry.COLUMN_NAME]
|
||||||
ref_column = columns[order]['ref_column']
|
ref_column = columns[order][ColumnEntry.COLUMN_REF_COLUMN]
|
||||||
if str(column_name).endswith("_id"):
|
if str(column_name).endswith("_id"):
|
||||||
ref_table = column_name[:-3]
|
ref_table = column_name[:-3]
|
||||||
ref = getattr(entry, ref_table)
|
ref = getattr(entry, ref_table)
|
||||||
@@ -166,7 +187,7 @@ class KontorDB:
|
|||||||
entry = {}
|
entry = {}
|
||||||
for order in columns:
|
for order in columns:
|
||||||
# print(columns[order])
|
# print(columns[order])
|
||||||
column_name = columns[order]['column']
|
column_name = columns[order][ColumnEntry.COLUMN_NAME]
|
||||||
# print(f"get value {column_name} from {row} of table {table}")
|
# print(f"get value {column_name} from {row} of table {table}")
|
||||||
try:
|
try:
|
||||||
value = getattr(row, column_name)
|
value = getattr(row, column_name)
|
||||||
|
|||||||
Reference in New Issue
Block a user