mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-10-14 01:04:13 +02:00
Add read-only enforcement, preview, import/export to custom SQL reports
Refs discussion #886: a saved-report manager built on custom SQL and nomenclature.json. Most of what was asked for already existed -- Projet > Exporter au format CSV already builds/saves/reuses named SELECT queries via ElementQueryWidget and nomenclature.json, and Projet > Ajouter une nomenclature already inserts one into a folio. This fills the three real gaps. - projectDataBase::isReadOnlySelect() rejects anything that isn't a single SELECT/WITH statement. Checked in newQuery() itself, the one choke point every query path already goes through -- including a query loaded from a saved nomenclature/summary table's <query> element on project open, not just the dialog's own custom-SQL box. ElementQueryWidget shows the same check live as you type, and BOMExportDialog surfaces it before running or exporting anything. - BOMExportDialog gains a Preview button + table (QSqlQueryModel), so a report can be checked on screen before committing to a CSV file. - ElementQueryWidget gains Importer.../Exporter... buttons that read/write nomenclature.json's saved reports as a JSON file, so a report can be handed to a colleague or another install. Import asks before overwriting a locally-saved report of the same name. Verified: Qt 6.10.2, builds clean, ctest 8/8. Drove the real dialog through Xvfb: typed "DROP TABLE element" into the custom-SQL box and got the inline warning immediately, then confirmed Preview also refuses it with a "Requête refusée" dialog rather than running it. Preview against the real default query returned live column headers and a row. Export opens a save dialog without crashing. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QSqlError>
|
||||
#include <QSqlQueryModel>
|
||||
#include <QSqlRecord>
|
||||
|
||||
/**
|
||||
@@ -44,6 +45,9 @@ BOMExportDialog::BOMExportDialog(QETProject *project, QWidget *parent) :
|
||||
ui->m_main_layout->insertWidget(0, m_query_widget);
|
||||
m_query_widget->setQuery(BomExport::defaultQuery());
|
||||
on_m_format_as_bom_clicked(false);
|
||||
|
||||
m_preview_model = new QSqlQueryModel(this);
|
||||
ui->m_preview_table->setModel(m_preview_model);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -89,7 +93,15 @@ QByteArray BOMExportDialog::getBom(QString *error)
|
||||
error->clear();
|
||||
}
|
||||
m_project->dataBase()->updateDB();
|
||||
auto query_ = m_project->dataBase()->newQuery(m_query_widget->queryStr());
|
||||
QString rejection;
|
||||
auto query_ = m_project->dataBase()->newQuery(m_query_widget->queryStr(), &rejection);
|
||||
|
||||
if (!rejection.isEmpty()) {
|
||||
if (error) {
|
||||
*error = rejection;
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
if (!query_.exec()) {
|
||||
qDebug() << "BOMExportDialog::getBom : query errir : " << query_.lastError();
|
||||
@@ -130,3 +142,39 @@ void BOMExportDialog::on_m_format_as_bom_clicked(bool checked) {
|
||||
m_query_widget->setGroupBy("designation", checked);
|
||||
m_query_widget->setCount("COUNT(*) AS designation_qty", checked);
|
||||
}
|
||||
|
||||
/**
|
||||
@brief BOMExportDialog::on_m_preview_pb_clicked
|
||||
Run the current query and show its result live, without going through
|
||||
the CSV round-trip -- lets a report be checked and adjusted before
|
||||
committing to a file (qelectrotech-source-mirror#886).
|
||||
*/
|
||||
void BOMExportDialog::on_m_preview_pb_clicked()
|
||||
{
|
||||
m_project->dataBase()->updateDB();
|
||||
QString rejection;
|
||||
auto query_ = m_project->dataBase()->newQuery(m_query_widget->queryStr(), &rejection);
|
||||
|
||||
if (!rejection.isEmpty()) {
|
||||
QMessageBox::warning(this, tr("Requête refusée"), rejection);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!query_.exec()) {
|
||||
QMessageBox::warning(
|
||||
this, tr("Erreur"),
|
||||
tr("Erreur dans la requête :\n%1").arg(query_.lastError().text()));
|
||||
return;
|
||||
}
|
||||
|
||||
m_preview_model->setQuery(std::move(query_));
|
||||
for (int i = 0; i < m_preview_model->columnCount(); ++i)
|
||||
{
|
||||
const auto field_name = m_preview_model->record().fieldName(i);
|
||||
const auto translated = QETInformation::translatedInfoKey(field_name);
|
||||
if (!translated.isEmpty()) {
|
||||
m_preview_model->setHeaderData(i, Qt::Horizontal, translated);
|
||||
}
|
||||
}
|
||||
ui->m_preview_table->resizeColumnsToContents();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user