From 1a7da0ab9f2ed890b719ec0028d8a375242f19f5 Mon Sep 17 00:00:00 2001 From: Thomas Peetz Date: Tue, 7 Jan 2025 01:48:03 +0100 Subject: [PATCH] add column header info --- .gitignore | 1 + .gitlab-ci.yml | 36 ++ gui/model_config.py | 72 ++-- gui/table_model.py | 11 +- .../kontor/admin/SetupModuleAdmin.java | 358 +++++++++--------- .../kontor/admin/data/MetaDataColumn.java | 6 + .../admin/services/MetaDataService.java | 20 +- .../kontor/admin/views/MetaDataForm.java | 8 +- .../kontor/admin/views/MetaDataView.java | 2 +- 9 files changed, 289 insertions(+), 225 deletions(-) create mode 100644 .gitlab-ci.yml diff --git a/.gitignore b/.gitignore index 575904a..2330d74 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__/ bonus/ icons/ icons-shadowless/ +.vscode/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..7231f34 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,36 @@ +image: gradle:8.6-jdk21-alpine + +stages: + - build + - test + - publish + +# Disable the Gradle daemon for Continuous Integration servers as correctness +# is usually a priority over speed in CI environments. Using a fresh +# runtime for each build is more reliable since the runtime is completely +# isolated from any previous builds. +variables: + GRADLE_OPTS: "-Dorg.gradle.daemon=false" + +before_script: + - GRADLE_USER_HOME="$(pwd)/.gradle" + - export GRADLE_USER_HOME + +build: + stage: build + script: + - cd springboot + - gradle assemble --no-daemon + +test: + stage: test + script: + - cd springboot + - gradle check --no-daemon + +publish: + stage: publish + script: + - cd springboot + - gradle --no-daemon publish -PgitlabPackageRegistryUsername=gitlab-ci-token -PgitlabPackageRegistryPassword="$CI_JOB_TOKEN" + diff --git a/gui/model_config.py b/gui/model_config.py index 1bea8a5..a9c6702 100644 --- a/gui/model_config.py +++ b/gui/model_config.py @@ -5,10 +5,11 @@ from PySide6.QtWidgets import QHBoxLayout, QCheckBox class KontorModelConfig: def __init__(self, db_config, main_window, table_name: str): - self.header = [] + self.header = {} self.filter = {} self.main_window = main_window self._table = table_name + self._table_id = None self.db_conn = mariadb.connect( host=db_config['mariadb']['host'], port=db_config['mariadb']['port'], @@ -19,64 +20,65 @@ class KontorModelConfig: self.get_table_config() def get_table_id(self): + if self._table_id is not None: + return cursor = self.db_conn.cursor() cursor.execute("SELECT id, created_date, last_modified_date FROM meta_data_table WHERE table_name=?", (self._table, )) rows = cursor.fetchall() if len(rows) == 1: - return rows[0][0] - return None + self._table_id = rows[0][0] def get_table_config(self): - table_id = self.get_table_id() + if self._table_id is None: + self.get_table_id() cursor = self.db_conn.cursor() - cursor.execute("SELECT id, column_name, column_order FROM meta_data_column WHERE table_id=? AND is_shown is true", (table_id, )) + cursor.execute("SELECT column_name, column_order, column_label FROM meta_data_column WHERE table_id=? AND is_shown is true ORDER bY column_order", (self._table_id, )) rows = cursor.fetchall() self.header.clear() - for (column_id, column_name, column_order) in rows: - self.header.insert(column_order-1, column_name) - print(f"retrieved {len(rows)} columns, set {len(self.header)} headers") - - def get_header(self) -> list: - self.get_table_config() - return self.header + order = 0 + for (column_name, column_order, column_label) in rows: + self.header[order] = { 'column': column_name, 'label': column_label, 'order': column_order} + order += 1 + # print(f"retrieved {len(rows)} columns, set {len(self.header)} headers") + cursor.execute("SELECT column_name, filter_label from meta_data_column WHERE table_id=? AND show_filter is true", (self._table_id, )) + rows = cursor.fetchall() + for row in rows: + self.filter[row[0]] = {'label': row[1], 'widget': None} + # print(f"retrieved {len(rows)} filters: {self.filter}") def get_filter(self) -> str: filter_rule = "" # print(self.filter["download"].isChecked()) - if self.filter["download"].isChecked(): - # print(self.filter["download"].isChecked()) - filter_rule = "WHERE should_download is true" - if self.filter["review"].isChecked(): - if len(filter_rule) > 0: - filter_rule += " AND " - else: - filter_rule += "WHERE " - filter_rule += "review is true" - print(f"{filter_rule=}") + for column, filter_info in self.filter.items(): + # print(column, filter_info) + if filter_info['widget'].isChecked(): + # print(column, filter_info, filter_rule, len(filter_rule)) + if len(filter_rule) < 1: + filter_rule += "WHERE " + if len(filter_rule) > 8: + filter_rule += " AND " + filter_rule += f"{column} is true" + # print(f"{filter_rule=}") return filter_rule def get_statement(self) -> str: filter_rule = self.get_filter() - self.get_table_config() + # self.get_table_config() columns = "" - for index in range(len(self.header)): + for index, column in self.header.items(): if index > 0: columns += ", " - columns += self.header[index] + columns += column['column'] statement = f"SELECT {columns} FROM media_file {filter_rule}" return statement def get_filter_layout(self) -> QHBoxLayout: filter_layout = QHBoxLayout() - download_checkbox = QCheckBox() - download_checkbox.setText("Download") - download_checkbox.checkStateChanged.connect(self.main_window.refresh) - self.filter["download"] = download_checkbox - review_checkbox = QCheckBox() - review_checkbox.setText("Review") - review_checkbox.checkStateChanged.connect(self.main_window.refresh) - self.filter["review"] = review_checkbox - filter_layout.addWidget(review_checkbox) - filter_layout.addWidget(download_checkbox) + for column, filter_info in self.filter.items(): + filter_checkbox = QCheckBox() + filter_checkbox.setText(filter_info['label']) + filter_checkbox.checkStateChanged.connect(self.main_window.refresh) + self.filter[column]['widget'] = filter_checkbox + filter_layout.addWidget(filter_checkbox) filter_layout.addStretch() return filter_layout diff --git a/gui/table_model.py b/gui/table_model.py index 5fc5dc9..81eec89 100644 --- a/gui/table_model.py +++ b/gui/table_model.py @@ -19,7 +19,7 @@ class KontorTableModel(QAbstractTableModel): cursor = self._config.db_conn.cursor() cursor.execute(self._config.get_statement()) rows = cursor.fetchall() - print(len(rows)) + # print(len(rows)) if len(rows) > 0: self.beginResetModel() for row in rows: @@ -39,7 +39,7 @@ class KontorTableModel(QAbstractTableModel): def headerData(self, col, orientation, role=Qt.ItemDataRole.DisplayRole): if orientation == Qt.Orientation.Horizontal and role == Qt.ItemDataRole.DisplayRole: - return self._config.header[col] + return self._config.header[col]['column'] if orientation == Qt.Orientation.Vertical and role == Qt.ItemDataRole.DisplayRole: return str(col+1) @@ -48,6 +48,7 @@ class KontorTableModel(QAbstractTableModel): return None value = self._data[index.row()][index.column()] if role == Qt.ItemDataRole.DisplayRole: + # print('{}: {}'.format(value, type(value))) if isinstance(value, datetime): return value.strftime("%Y-%m-%d %M:%M:%S") if isinstance(value, str): @@ -57,7 +58,7 @@ class KontorTableModel(QAbstractTableModel): return self._main_window.tick else: return self._main_window.cross - return value + return str(value) if role == Qt.ItemDataRole.DecorationRole: if isinstance(value, bytes): # print('{}: {}'.format(value, type(value))) @@ -69,8 +70,8 @@ class KontorTableModel(QAbstractTableModel): 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) - print(f"Header count: {len(self._config.get_header())}") - return len(self._config.get_header()) + # print(f"Header count: {len(self._config.get_header())}") + return len(self._config.header) def setData(self, index, value, role=Qt.ItemDataRole.EditRole): if role == Qt.ItemDataRole.EditRole: diff --git a/springboot/src/main/java/de/thpeetz/kontor/admin/SetupModuleAdmin.java b/springboot/src/main/java/de/thpeetz/kontor/admin/SetupModuleAdmin.java index 419c519..de81e3b 100644 --- a/springboot/src/main/java/de/thpeetz/kontor/admin/SetupModuleAdmin.java +++ b/springboot/src/main/java/de/thpeetz/kontor/admin/SetupModuleAdmin.java @@ -128,209 +128,209 @@ public class SetupModuleAdmin implements ApplicationListener column.getColumnName().equals(columnName))) { log.info("Column {} with name {} of table {} found, check Values", columnOrder, columnName, table.getTableName()); MetaDataColumn column = table.getTableColumns().get(columnOrder.intValue()-1); @@ -54,9 +54,21 @@ public class MetaDataService { log.debug("columnModifier has to be changed to {}", columnModifier); column.setColumnModifier(columnModifier); } - if (column.getIsShown() == null) { - log.debug("isShown set to false"); - column.setIsShown(Boolean.FALSE); + if (!column.getIsShown().equals(isShown)) { + log.debug("isShown has to be change to {}}", isShown); + column.setIsShown(isShown); + } + if (columnLabel != null && !columnLabel.equals(column.getColumnLabel())) { + log.debug("columnLabel has to be change to {}}", columnLabel); + column.setColumnLabel(columnLabel); + } + if (showFilter != null &&!showFilter.equals(column.getShowFilter())) { + log.debug("showFilter has to be change to {}}", showFilter); + column.setShowFilter(showFilter); + } + if (filterLabel != null && !filterLabel.equals(column.getFilterLabel())) { + log.debug("filterLabel has to be change to {}}", filterLabel); + column.setFilterLabel(filterLabel); } metaDataColumnRepository.save(column); } else { diff --git a/springboot/src/main/java/de/thpeetz/kontor/admin/views/MetaDataForm.java b/springboot/src/main/java/de/thpeetz/kontor/admin/views/MetaDataForm.java index f70c161..19d4459 100644 --- a/springboot/src/main/java/de/thpeetz/kontor/admin/views/MetaDataForm.java +++ b/springboot/src/main/java/de/thpeetz/kontor/admin/views/MetaDataForm.java @@ -26,6 +26,7 @@ public class MetaDataForm extends FormLayout { TextField columnModifier = new TextField("Column Modifier"); IntegerField columnOrder = new IntegerField("Column Order"); Checkbox isShown = new Checkbox("Is Shown"); + Checkbox showFilter = new Checkbox("Show Filter"); Button save = new com.vaadin.flow.component.button.Button("Save"); Button delete = new com.vaadin.flow.component.button.Button("Delete"); @@ -39,7 +40,12 @@ public class MetaDataForm extends FormLayout { table.setItems(tables); table.setItemLabelGenerator(MetaDataTable::getTableName); - add(table, columnName, columnSyncName, columnModifier, columnOrder, isShown, createButtonsLayout()); + add(table, 2); + add(columnName, 2); + add(columnSyncName, 2); + add(columnModifier, 2); + add(columnOrder, 2); + add(isShown, showFilter, createButtonsLayout()); } private HorizontalLayout createButtonsLayout() { diff --git a/springboot/src/main/java/de/thpeetz/kontor/admin/views/MetaDataView.java b/springboot/src/main/java/de/thpeetz/kontor/admin/views/MetaDataView.java index 661d4a3..f3b2509 100644 --- a/springboot/src/main/java/de/thpeetz/kontor/admin/views/MetaDataView.java +++ b/springboot/src/main/java/de/thpeetz/kontor/admin/views/MetaDataView.java @@ -42,7 +42,7 @@ public class MetaDataView extends VerticalLayout { private void configureGrid() { grid.addClassName("metadata-grid"); grid.setSizeFull(); - grid.setColumns("table.tableName", "columnName", "columnSyncName", "columnModifier", "columnOrder", "isShown"); + grid.setColumns("table.tableName", "columnName", "columnSyncName", "columnModifier", "columnOrder", "isShown", "showFilter"); grid.getColumns().forEach(col -> col.setAutoWidth(true)); grid.asSingleSelect().addValueChangeListener(event -> editMetaData(event.getValue())); }