From 812ff76f04613ec905e90901c15ee35e306b40d4 Mon Sep 17 00:00:00 2001 From: signedav Date: Mon, 24 Jun 2024 15:12:46 +0200 Subject: [PATCH 1/3] provide not null and unique constraint of t_ili_tid to the OID Manager (TIDModel) in LayerTIDsPanel. What would resolve #834 --- QgisModelBaker/gui/panel/layer_tids_panel.py | 63 ++++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/QgisModelBaker/gui/panel/layer_tids_panel.py b/QgisModelBaker/gui/panel/layer_tids_panel.py index 4fc11aa38..ee416e60a 100644 --- a/QgisModelBaker/gui/panel/layer_tids_panel.py +++ b/QgisModelBaker/gui/panel/layer_tids_panel.py @@ -49,7 +49,9 @@ class TIDModel(QAbstractTableModel): "oid_domain": "STANDARDOID", "interlis_topic" : "OIDMadness_V1", "default_value_expression": "uuid()", - "in_form": True + "in_form": True, + "not_null": True, + "unique": True, } [...] } @@ -66,6 +68,8 @@ class Columns(IntEnum): OID_DOMAIN = 1 DEFAULT_VALUE = 2 IN_FORM = 3 + NOTNULL = 4 + UNIQUE = 5 def __init__(self): super().__init__() @@ -78,7 +82,13 @@ def rowCount(self, parent): return len(self.oid_settings.keys()) def flags(self, index): - if index.column() == TIDModel.Columns.IN_FORM: + if index.column() == any( + [ + TIDModel.Columns.IN_FORM, + TIDModel.Columns.NOTNULL, + TIDModel.Columns.UNIQUE, + ] + ): return Qt.ItemIsEnabled if index.column() == TIDModel.Columns.DEFAULT_VALUE: return Qt.ItemIsEditable | Qt.ItemIsEnabled @@ -106,6 +116,10 @@ def headerData(self, section, orientation, role): return self.tr("Default Value Expression") if section == TIDModel.Columns.IN_FORM: return self.tr("Show") + if section == TIDModel.Columns.NOTNULL: + return self.tr("Not Null") + if section == TIDModel.Columns.UNIQUE: + return self.tr("Unique") def data(self, index, role): if role == int(Qt.DisplayRole) or role == int(Qt.EditRole): @@ -118,6 +132,10 @@ def data(self, index, role): return self.oid_settings[key]["default_value_expression"] if index.column() == TIDModel.Columns.IN_FORM: return self.oid_settings[key]["in_form"] + if index.column() == TIDModel.Columns.NOTNULL: + return self.oid_settings[key]["not_null"] + if index.column() == TIDModel.Columns.UNIQUE: + return self.oid_settings[key]["unique"] elif role == int(Qt.ToolTipRole): key = list(self.oid_settings.keys())[index.row()] if index.column() == TIDModel.Columns.NAME: @@ -159,6 +177,27 @@ def data(self, index, role): return self.oid_settings[key]["default_value_expression"] if index.column() == TIDModel.Columns.IN_FORM: return self.tr("Show t_ili_tid field (OID) in attribute form.") + if index.column() == TIDModel.Columns.NOTNULL: + oid_domain = self.oid_settings[key].get("oid_domain", None) + if oid_domain: + return self.tr( + "t_ili_tid fields based on defined OIDs usually have a not-null-constraint set." + ) + else: + return self.tr( + "t_ili_tid fields based on undefined OIDs usually have no constraints set. But feel free to change it." + ) + if index.column() == TIDModel.Columns.UNIQUE: + oid_domain = self.oid_settings[key].get("oid_domain", None) + if oid_domain: + return self.tr( + "t_ili_tid fields based on defined OIDs usually have a unique-constraint set." + ) + else: + return self.tr( + "t_ili_tid fields based on undefined OIDs usually have no constraints set. But feel free to change it." + ) + return self.tr("Show t_ili_tid field (OID) in attribute form.") elif role == int(TIDModel.Roles.LAYER): key = list(self.oid_settings.keys())[index.row()] return self.oid_settings[key]["layer"] @@ -174,6 +213,14 @@ def setData(self, index, data, role): key = list(self.oid_settings.keys())[index.row()] self.oid_settings[key]["in_form"] = data self.dataChanged.emit(index, index) + if index.column() == TIDModel.Columns.NOTNULL: + key = list(self.oid_settings.keys())[index.row()] + self.oid_settings[key]["not_null"] = data + self.dataChanged.emit(index, index) + if index.column() == TIDModel.Columns.UNIQUE: + key = list(self.oid_settings.keys())[index.row()] + self.oid_settings[key]["unique"] = data + self.dataChanged.emit(index, index) return True def load_tid_config(self, qgis_project=None): @@ -243,13 +290,21 @@ def __init__(self, parent=None): TIDModel.Columns.IN_FORM, QHeaderView.ResizeToContents ) + self.layer_tids_view.setItemDelegateForColumn( + TIDModel.Columns.DEFAULT_VALUE, + FieldExpressionDelegate(self), + ) self.layer_tids_view.setItemDelegateForColumn( TIDModel.Columns.IN_FORM, CheckDelegate(self, Qt.EditRole), ) self.layer_tids_view.setItemDelegateForColumn( - TIDModel.Columns.DEFAULT_VALUE, - FieldExpressionDelegate(self), + TIDModel.Columns.NOTNULL, + CheckDelegate(self, Qt.EditRole), + ) + self.layer_tids_view.setItemDelegateForColumn( + TIDModel.Columns.UNIQUE, + CheckDelegate(self, Qt.EditRole), ) self.layer_tids_view.setEditTriggers(QAbstractItemView.AllEditTriggers) From e8c312331399817654f02eee3603f5d07a80b0e2 Mon Sep 17 00:00:00 2001 From: signedav Date: Mon, 24 Jun 2024 15:52:23 +0200 Subject: [PATCH 2/3] Some GUI finetuning --- QgisModelBaker/gui/panel/layer_tids_panel.py | 6 ++++++ QgisModelBaker/ui/basket_panel.ui | 6 +++++- QgisModelBaker/ui/layer_tids_panel.ui | 10 ++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/QgisModelBaker/gui/panel/layer_tids_panel.py b/QgisModelBaker/gui/panel/layer_tids_panel.py index ee416e60a..2dbff8969 100644 --- a/QgisModelBaker/gui/panel/layer_tids_panel.py +++ b/QgisModelBaker/gui/panel/layer_tids_panel.py @@ -289,6 +289,12 @@ def __init__(self, parent=None): self.layer_tids_view.horizontalHeader().setSectionResizeMode( TIDModel.Columns.IN_FORM, QHeaderView.ResizeToContents ) + self.layer_tids_view.horizontalHeader().setSectionResizeMode( + TIDModel.Columns.NOTNULL, QHeaderView.ResizeToContents + ) + self.layer_tids_view.horizontalHeader().setSectionResizeMode( + TIDModel.Columns.UNIQUE, QHeaderView.ResizeToContents + ) self.layer_tids_view.setItemDelegateForColumn( TIDModel.Columns.DEFAULT_VALUE, diff --git a/QgisModelBaker/ui/basket_panel.ui b/QgisModelBaker/ui/basket_panel.ui index 0de501439..61a2c0ca8 100644 --- a/QgisModelBaker/ui/basket_panel.ui +++ b/QgisModelBaker/ui/basket_panel.ui @@ -27,7 +27,11 @@ 0 - + + + QAbstractItemView::NoSelection + + diff --git a/QgisModelBaker/ui/layer_tids_panel.ui b/QgisModelBaker/ui/layer_tids_panel.ui index 20e792118..03b818522 100644 --- a/QgisModelBaker/ui/layer_tids_panel.ui +++ b/QgisModelBaker/ui/layer_tids_panel.ui @@ -6,7 +6,7 @@ 0 0 - 800 + 1127 600 @@ -28,9 +28,15 @@ + + QAbstractItemView::NoSelection + - true + false + + false + From 93ed127e2eb73dfcc7b73cdcc11eed75dad34e25 Mon Sep 17 00:00:00 2001 From: signedav Date: Mon, 24 Jun 2024 16:29:44 +0200 Subject: [PATCH 3/3] remove print --- QgisModelBaker/gui/panel/layer_tids_panel.py | 1 - 1 file changed, 1 deletion(-) diff --git a/QgisModelBaker/gui/panel/layer_tids_panel.py b/QgisModelBaker/gui/panel/layer_tids_panel.py index 2dbff8969..97bf27a61 100644 --- a/QgisModelBaker/gui/panel/layer_tids_panel.py +++ b/QgisModelBaker/gui/panel/layer_tids_panel.py @@ -251,7 +251,6 @@ def setEditorData(self, editor, index): def setModelData(self, editor, model, index): value = editor.expression() - print(f"new exp{value}") model.setData(index, value, int(Qt.EditRole)) def updateEditorGeometry(self, editor, option, index):