Skip to content
Snippets Groups Projects
Commit ddae0df7 authored by Lan Dam's avatar Lan Dam
Browse files

db_config_dialog.py: add_row():modify to accept nextline in description,...

db_config_dialog.py: add_row():modify to accept nextline in description, return text for next field checking, set placeholdertext as hint for ValueColors; check changes before clicking on 'CLOSE'
parent aed8579d
No related branches found
No related tags found
1 merge request!70DB config dialogs
from PySide2 import QtWidgets, QtGui, QtCore from PySide2 import QtWidgets, QtGui, QtCore
from typing import Set, Dict
from sohstationviewer.database.process_db import execute_db from sohstationviewer.database.process_db import execute_db
...@@ -73,6 +74,10 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -73,6 +74,10 @@ class UiDBInfoDialog(QtWidgets.QWidget):
self.col_name = col_name self.col_name = col_name
self.table_name = table_name self.table_name = table_name
self.check_fk = check_fk self.check_fk = check_fk
"""
changes_by_rowid: dict of changes by row ids
"""
self.changes_by_rowid: Dict[int, Set[int]] = {}
super(UiDBInfoDialog, self).__init__() super(UiDBInfoDialog, self).__init__()
# =========================== pre-define ============================ # =========================== pre-define ============================
""" """
...@@ -103,7 +108,8 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -103,7 +108,8 @@ class UiDBInfoDialog(QtWidgets.QWidget):
main_layout.addWidget(QtWidgets.QLabel(instruction)) main_layout.addWidget(QtWidgets.QLabel(instruction))
def add_widget(self, data_list, row_idx, col_idx, foreign_key=False, def add_widget(self, data_list, row_idx, col_idx, foreign_key=False,
choices=None, range_values=None, field_name=''): choices=None, range_values=None, field_name='',
place_holder_text='') -> str:
""" """
Add a cell widget at a given row and column in the data_table_widget. Add a cell widget at a given row and column in the data_table_widget.
...@@ -122,6 +128,9 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -122,6 +128,9 @@ class UiDBInfoDialog(QtWidgets.QWidget):
:param field_name: name of the column in database. If field_name= :param field_name: name of the column in database. If field_name=
'convertFactor', add validator to limit precision to 6 decimal 'convertFactor', add validator to limit precision to 6 decimal
points points
:param place_holder_text: the text displayed in QTextEdit as a hint
for user
:return text: value of the current field in string
""" """
if data_list is None: if data_list is None:
text = str(row_idx) # row number text = str(row_idx) # row number
...@@ -131,7 +140,16 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -131,7 +140,16 @@ class UiDBInfoDialog(QtWidgets.QWidget):
if data_list is None: if data_list is None:
widget = QtWidgets.QPushButton(text) widget = QtWidgets.QPushButton(text)
elif choices is None and range_values is None: elif choices is None and range_values is None:
widget = QtWidgets.QLineEdit(text) if field_name == 'description':
widget = QtWidgets.QTextEdit()
height = 12
for line in text.split('\n'):
widget.append(line)
height += 16
widget.setFixedHeight(height)
else:
widget = QtWidgets.QLineEdit(text)
widget.setPlaceholderText(place_holder_text)
if field_name == 'convertFactor': if field_name == 'convertFactor':
# precision=6 # precision=6
validator = QtGui.QDoubleValidator(0.0, 5.0, 6) validator = QtGui.QDoubleValidator(0.0, 5.0, 6)
...@@ -175,6 +193,9 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -175,6 +193,9 @@ class UiDBInfoDialog(QtWidgets.QWidget):
lambda changed_text: lambda changed_text:
self.cell_input_change(changed_text, row_idx, col_idx)) self.cell_input_change(changed_text, row_idx, col_idx))
self.data_table_widget.setCellWidget(row_idx, col_idx, widget) self.data_table_widget.setCellWidget(row_idx, col_idx, widget)
if field_name == 'description':
self.data_table_widget.resizeRowToContents(row_idx)
return text
@QtCore.Slot() @QtCore.Slot()
def row_number_clicked(self, widget): def row_number_clicked(self, widget):
...@@ -217,10 +238,26 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -217,10 +238,26 @@ class UiDBInfoDialog(QtWidgets.QWidget):
self.close_btn = QtWidgets.QPushButton(self, text='CLOSE') self.close_btn = QtWidgets.QPushButton(self, text='CLOSE')
self.close_btn.setFixedWidth(300) self.close_btn.setFixedWidth(300)
self.close_btn.clicked.connect(self.close) self.close_btn.clicked.connect(self.on_close)
h_layout.addWidget(self.close_btn) h_layout.addWidget(self.close_btn)
return h_layout return h_layout
def on_close(self):
if len(self.changes_by_rowid) != 0:
msg = ("Some changes may have been created on the table.\n"
"Please click on Cancel to go back save those changes to "
"database.\n"
"OR click on Continue to close the dialog.")
msgbox = QtWidgets.QMessageBox()
msgbox.setWindowTitle('Do you want to continue?')
msgbox.setText(msg)
msgbox.addButton(QtWidgets.QMessageBox.Cancel)
msgbox.addButton('Continue', QtWidgets.QMessageBox.YesRole)
result = msgbox.exec_()
if result == QtWidgets.QMessageBox.Cancel:
return
self.close()
def create_data_table_widget(self): def create_data_table_widget(self):
""" """
Create self.data_table_widget based on self.total_col, self.column Create self.data_table_widget based on self.total_col, self.column
...@@ -304,6 +341,17 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -304,6 +341,17 @@ class UiDBInfoDialog(QtWidgets.QWidget):
changed = True changed = True
cell_widget = self.data_table_widget.cellWidget(row_idx, col_idx) cell_widget = self.data_table_widget.cellWidget(row_idx, col_idx)
set_widget_color(cell_widget, changed=changed) set_widget_color(cell_widget, changed=changed)
else:
changed = True
if changed:
if row_idx not in self.changes_by_rowid:
self.changes_by_rowid[row_idx] = set()
self.changes_by_rowid[row_idx].add(col_idx - 1) # skip order col
else:
try:
self.changes_by_rowid[row_idx].remove(col_idx - 1)
except KeyError:
pass
def check_data_foreign_key(self, val): def check_data_foreign_key(self, val):
""" """
...@@ -394,6 +442,11 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -394,6 +442,11 @@ class UiDBInfoDialog(QtWidgets.QWidget):
row_count = self.data_table_widget.rowCount() row_count = self.data_table_widget.rowCount()
for i in range(row_count): for i in range(row_count):
widget_idx = i - (row_count - self.data_table_widget.rowCount()) widget_idx = i - (row_count - self.data_table_widget.rowCount())
if widget_idx != i and i in self.changes_by_rowid:
# row id may not be consistent with widget_idx due to
# row row removed or inserted.
self.changes_by_rowid.remove(i)
self.changes_by_rowid.add(widget_idx)
list_idx = (i - self.remove_count list_idx = (i - self.remove_count
+ self.insert_count - self.skip_count) + self.insert_count - self.skip_count)
try: try:
...@@ -405,6 +458,11 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -405,6 +458,11 @@ class UiDBInfoDialog(QtWidgets.QWidget):
reset = self.update_data(row_inputs, widget_idx, list_idx) reset = self.update_data(row_inputs, widget_idx, list_idx)
if reset > -1: if reset > -1:
self.reset_row_inputs(reset, widget_idx, list_idx) self.reset_row_inputs(reset, widget_idx, list_idx)
try:
if len(self.changes_by_rowid[widget_idx]) == 0:
del self.changes_by_rowid[widget_idx]
except KeyError:
pass
def update_data(self, row, widget_idx, list_idx, insert_sql, update_sql, def update_data(self, row, widget_idx, list_idx, insert_sql, update_sql,
del_sql_add=None): del_sql_add=None):
...@@ -444,6 +502,7 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -444,6 +502,7 @@ class UiDBInfoDialog(QtWidgets.QWidget):
) )
cell_widget.setText(org_row[0]) cell_widget.setText(org_row[0])
row[0] = org_row[0] row[0] = org_row[0]
self.changes_by_rowid[widget_idx].remove(0)
self.update_data(row, widget_idx, list_idx) self.update_data(row, widget_idx, list_idx)
else: else:
sql = (f"DELETE FROM {self.table_name} " sql = (f"DELETE FROM {self.table_name} "
...@@ -451,6 +510,7 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -451,6 +510,7 @@ class UiDBInfoDialog(QtWidgets.QWidget):
if del_sql_add is not None: if del_sql_add is not None:
sql += sql sql += sql
execute_db(sql) execute_db(sql)
del self.changes_by_rowid[widget_idx]
self.data_list.remove(org_row) self.data_list.remove(org_row)
self.remove_row(widget_idx) self.remove_row(widget_idx)
self.remove_count += 1 self.remove_count += 1
...@@ -470,6 +530,7 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -470,6 +530,7 @@ class UiDBInfoDialog(QtWidgets.QWidget):
1) 1)
cell_widget.setText(org_row[0]) cell_widget.setText(org_row[0])
row[0] = org_row[0] row[0] = org_row[0]
self.changes_by_rowid[widget_idx].remove(0)
self.update_data(row, widget_idx, list_idx) self.update_data(row, widget_idx, list_idx)
else: else:
msg = (f"Row {widget_idx}: {org_row} has " msg = (f"Row {widget_idx}: {org_row} has "
...@@ -483,6 +544,7 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -483,6 +544,7 @@ class UiDBInfoDialog(QtWidgets.QWidget):
else: else:
execute_db(update_sql % org_row[0]) execute_db(update_sql % org_row[0])
self.data_list[list_idx] = row self.data_list[list_idx] = row
del self.changes_by_rowid[widget_idx]
return 0 return 0
if row[0] == "": if row[0] == "":
...@@ -490,6 +552,7 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -490,6 +552,7 @@ class UiDBInfoDialog(QtWidgets.QWidget):
f"It will be removed.") f"It will be removed.")
QtWidgets.QMessageBox.information(self, "Error", msg) QtWidgets.QMessageBox.information(self, "Error", msg)
self.remove_row(widget_idx) self.remove_row(widget_idx)
del self.changes_by_rowid[widget_idx]
return -1 return -1
blank_required_columns = [self.required_columns[i] blank_required_columns = [self.required_columns[i]
for i in self.required_columns.keys() for i in self.required_columns.keys()
...@@ -507,8 +570,10 @@ class UiDBInfoDialog(QtWidgets.QWidget): ...@@ -507,8 +570,10 @@ class UiDBInfoDialog(QtWidgets.QWidget):
f"Row {widget_idx} will be removed.") f"Row {widget_idx} will be removed.")
QtWidgets.QMessageBox.information(self, "Error", msg) QtWidgets.QMessageBox.information(self, "Error", msg)
self.remove_row(widget_idx) self.remove_row(widget_idx)
del self.changes_by_rowid[widget_idx]
return -1 return -1
execute_db(insert_sql) execute_db(insert_sql)
self.data_list.append(row) self.data_list.append(row)
self.insert_count += 1 self.insert_count += 1
del self.changes_by_rowid[widget_idx]
return 0 return 0
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment