job-scrapper/lib/qsqlmod.py

62 lines
2.4 KiB
Python
Raw Normal View History

2024-07-26 13:29:06 +00:00
#modifie the QSqlQueryModel to be editable and sets them to the database
from PySide6.QtSql import QSqlQueryModel, QSqlQuery
from PySide6.QtCore import Qt
2024-07-26 13:29:06 +00:00
#credits to :
#https://stackoverflow.com/questions/49752388/editable-qtableview-of-complex-sql-query
class SqlQueryModel_editable(QSqlQueryModel):
"""a subclass of QSqlQueryModel where individual columns can be defined as editable
"""
def __init__(self, editables):
"""editables should be a dict of format:
{INT editable_column_nr : (STR update query to be performed when changes are made on this column
INT model's column number for the filter-column (used in the where-clause),
)}
"""
super().__init__()
self.editables = editables
def flags(self, index):
fl = QSqlQueryModel.flags(self, index)
if index.column() in self.editables:
fl |= Qt.ItemIsEditable
return fl
def setData(self, index, value, role=Qt.EditRole):
if role == Qt.EditRole:
mycolumn = index.column()
if mycolumn in self.editables:
(query, filter_col) = self.editables[mycolumn]
filter_value = self.index(index.row(), filter_col).data()
q = QSqlQuery(query.format(value, filter_value))
result = q.exec_()
if result:
self.query().exec_()
# print("filter_value:",filter_value)
print("setdata query: ",query.format(value, filter_value))
print("index.row:",index.row(), "filter_col:",filter_col)
2024-07-26 13:29:06 +00:00
else:
print(self.query().lastError().text())
return result
return QSqlQueryModel.setData(self, index, value, role)
2024-07-26 13:56:30 +00:00
# view = QTableView()
#
# editables = {1 : ("UPDATE Manufacturers SET Country = '{}' WHERE Company = '{}'", 2)}
# model = SqlQueryModel_editable(editables)
# query = '''
# SELECT (comp.company || " " || cars.model) as Car,
# comp.Country,
# cars.company,
# (CASE WHEN cars.Year > 2000 THEN 'yes' ELSE 'no' END) as this_century
# from manufacturers comp left join cars
# on comp.company = cars.company
# '''
# q = QSqlQuery(query)
# model.setQuery(q)
# model.setFilter("cars.Company = 'VW'")
# view.setModel(model)
# view.hideColumn(2)