diff --git a/src/Model/Study.py b/src/Model/Study.py index d29910bba1564282de30dc8d2eeb1a086aa18e37..18d986eabef858e1b033046392da16e98c75ae2b 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -86,7 +86,7 @@ class Study(SQLModel): def is_saved(self): return self.status.is_saved() - def save(self): + def save(self, progress=None): # Save a copy of database fdir, fname = os.path.split(self.filename) @@ -110,7 +110,7 @@ class Study(SQLModel): # Save self.last_save_date = datetime.now() - self._save() + self._save(progress=progress) self.status.save() @property @@ -266,38 +266,53 @@ class Study(SQLModel): return new - def _save(self): + def _save(self, progress=lambda: None): self.execute( f"UPDATE info SET " + f"value='{self._db_format(self.name)}' WHERE key='name'" ) + progress() self.execute( f"UPDATE info SET " + f"value='{self._db_format(self.description)}' " + "WHERE key='description'" ) + progress() self.execute( f"UPDATE info SET " + f"value='{self._time_system}' WHERE key='time_system'" ) + progress() self.execute( f"UPDATE info SET " + f"value='{timestamp(self._date)}' WHERE key='date'" ) + progress() self.execute( f"UPDATE info SET " + f"value='{timestamp(self.creation_date)}' " + "WHERE key='creation_date'" ) + progress() self.execute( f"UPDATE info SET " + f"value='{timestamp(self.last_save_date)}' " + "WHERE key='last_save_date'" ) + progress() - self._save_submodel([self._river]) + self._save_submodel([self._river], data=progress) self.commit() + + def sql_save_request_count(self): + return self._count() + + def _count(self): + cnt = self._save_count([self._river]) + logger.debug(cnt) + return cnt + 6 + def close(self): """Close db connection diff --git a/src/Model/Tools/PamhyrDB.py b/src/Model/Tools/PamhyrDB.py index 8ee134fc97f7c725e0cbe1ebdc6fedb94ecb942f..1f0be1495877691419384344fbb44b2246bacb0e 100644 --- a/src/Model/Tools/PamhyrDB.py +++ b/src/Model/Tools/PamhyrDB.py @@ -21,6 +21,7 @@ import sqlite3 import logging from pathlib import Path +from functools import reduce from tools import SQL from Model.Except import NotImplementedMethodeError @@ -87,11 +88,18 @@ class SQLModel(SQL): raise NotImplementedMethodeError(self, self._update) def _save_submodel(self, objs, data=None): - def fn(sql): return self.execute( - sql, - fetch_one=False, - commit=False - ) + progress = lambda: None + if data is not None: + progress = data + + def fn(sql): + res = self.execute( + sql, + fetch_one=False, + commit=False + ) + progress() + return res ok = True for obj in objs: @@ -100,9 +108,43 @@ class SQLModel(SQL): self.commit() return ok - def _save(self): + def _save(self, progress=None): raise NotImplementedMethodeError(self, self._save) + def _count(self): + raise NotImplementedMethodeError(self, self._count) + + def _save_count(self, objs, data=None): + counter = { + "insert" : 0, + "update" : 0, + "delete" : 0, + "other" : 0, + } + + def fn(sql): + if "insert" in sql.lower(): + counter["insert"] = counter["insert"] + 1 + elif "update" in sql.lower(): + counter["update"] = counter["update"] + 1 + elif "delete" in sql.lower(): + counter["delete"] = counter["delete"] + 1 + else: + counter["other"] = counter["other"] + 1 + return [] + + ok = True + for obj in objs: + ok &= obj._db_save(fn) + + logger.debug(counter) + + return reduce( + lambda acc, k: acc + counter[k], + counter, + 0 + ) + @classmethod def _load(cls, filename=None): raise NotImplementedMethodeError(cls, cls._load) diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py index 89df56f38c4f315ab16667a667182313ddfeedde..e8a2d847828630caf39e0e60233a979777c57cb8 100644 --- a/src/View/MainWindow.py +++ b/src/View/MainWindow.py @@ -28,12 +28,12 @@ from PyQt5.QtGui import ( ) from PyQt5.QtCore import ( - QTranslator, QEvent, QUrl, + Qt, QTranslator, QEvent, QUrl, ) from PyQt5.QtWidgets import ( QMainWindow, QApplication, QAction, QFileDialog, QShortcut, QMenu, QToolBar, - QMessageBox, + QMessageBox, QProgressDialog, ) from PyQt5.uic import loadUi @@ -406,8 +406,21 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): if self._study.is_saved: return + sql_request_count = self._study.sql_save_request_count() + progress = QProgressDialog( + "Saving...", "Cancel", + 0, sql_request_count, + parent=self + ) + progress.setWindowModality(Qt.WindowModal) + + progress.setValue(0) + logger.info("Save...") - self._study.save() + self._study.save( + progress=lambda: progress.setValue(progress.value() + 1) + ) + logger.info("Done") def save_as_study(self): """Save current study as new file