From 6f3e1e31f0e1a5d2372f41caabf36689e22479a4 Mon Sep 17 00:00:00 2001 From: Youcef AOUAD <youcef.aouad@inrae.fr> Date: Tue, 11 Jun 2024 11:43:04 +0200 Subject: [PATCH] INI table db --- .../InitialConditionsAdisTS.py | 20 +- .../InitialConditionsAdisTSList.py | 1 + src/Model/River.py | 1 + src/View/InitialConditions/UndoCommand.py | 2 - .../InitialConditionsAdisTS/TableDefault.py | 43 +--- .../InitialConditionsAdisTS/UndoCommand.py | 187 ++++-------------- src/View/InitialConditionsAdisTS/Window.py | 6 +- src/View/Pollutants/Window.py | 1 + tests_cases/Enlargement/Enlargement.pamhyr | Bin 184320 -> 192512 bytes 9 files changed, 55 insertions(+), 206 deletions(-) diff --git a/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTS.py b/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTS.py index d8bab326..f21d1591 100644 --- a/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTS.py +++ b/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTS.py @@ -62,7 +62,7 @@ class InitialConditionsAdisTS(SQLSubModel): @classmethod def _db_create(cls, execute): execute(""" - CREATE TABLE initial_conditions( + CREATE TABLE initial_conditions_adists( id INTEGER NOT NULL PRIMARY KEY, pollutant INTEGER NOT NULL, name TEXT NOT NULL, @@ -93,9 +93,11 @@ class InitialConditionsAdisTS(SQLSubModel): table = execute( "SELECT id, pollutant, name, concentration, eg, em, ed, " + "enabled " + - "FROM initial_conditions" + "FROM initial_conditions_adists" ) + print("db load ic adists : ", table) + if table is not None: for row in table: IC_id = row[0] @@ -113,6 +115,7 @@ class InitialConditionsAdisTS(SQLSubModel): status=data['status'] ) + IC.pollutant = pollutant IC.concentration = concentration IC.eg = eg IC.em = em @@ -127,31 +130,31 @@ class InitialConditionsAdisTS(SQLSubModel): return new def _db_save(self, execute, data=None): - execute(f"DELETE FROM initial_conditions WHERE id = {self.id}") + execute(f"DELETE FROM initial_conditions_adists WHERE id = {self.id}") pollutant = -1 if self.pollutant is not None: pollutant = self.pollutant - concentration = -1 + concentration = -1. if self.concentration is not None: concentration = self.concentration - eg = -1 + eg = -1. if self.eg is not None: eg = self.eg - em = -1 + em = -1. if self.em is not None: em = self.em - ed = -1 + ed = -1. if self.ed is not None: ed = self.ed sql = ( "INSERT INTO " + - "initial_conditions(" + + "initial_conditions_adists(" + "id, pollutant, name, concentration, " + "eg, em, ed, enabled" + ") " + @@ -160,6 +163,7 @@ class InitialConditionsAdisTS(SQLSubModel): f"{concentration}, {eg}, {em}, {ed}, {self._enabled}" + ")" ) + execute(sql) data['ic_default_id'] = self.id diff --git a/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTSList.py b/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTSList.py index e45aba04..6430f738 100644 --- a/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTSList.py +++ b/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTSList.py @@ -41,6 +41,7 @@ class InitialConditionsAdisTSList(PamhyrModelList): return new def _db_save(self, execute, data=None): + print("db save ic adists") execute("DELETE FROM initial_conditions") if data is None: diff --git a/src/Model/River.py b/src/Model/River.py index 420a8c70..96dfb6b0 100644 --- a/src/Model/River.py +++ b/src/Model/River.py @@ -234,6 +234,7 @@ class River(Graph, SQLSubModel): REPLineList, OutputKpAdistsList, PollutantsList, + InitialConditionsAdisTSList, ] def __init__(self, status=None): diff --git a/src/View/InitialConditions/UndoCommand.py b/src/View/InitialConditions/UndoCommand.py index fecb6c6d..4a87c879 100644 --- a/src/View/InitialConditions/UndoCommand.py +++ b/src/View/InitialConditions/UndoCommand.py @@ -138,7 +138,6 @@ class MoveCommand(QUndoCommand): else: self._ics.move_down(self._i) - class InsertCommand(QUndoCommand): def __init__(self, ics, row, ic): QUndoCommand.__init__(self) @@ -155,7 +154,6 @@ class InsertCommand(QUndoCommand): for ic in self._ic: self._ics.insert(self._row, ic) - class DuplicateCommand(QUndoCommand): def __init__(self, ics, rows, ic): QUndoCommand.__init__(self) diff --git a/src/View/InitialConditionsAdisTS/TableDefault.py b/src/View/InitialConditionsAdisTS/TableDefault.py index 03c90b09..67363647 100644 --- a/src/View/InitialConditionsAdisTS/TableDefault.py +++ b/src/View/InitialConditionsAdisTS/TableDefault.py @@ -36,9 +36,7 @@ from PyQt5.QtWidgets import ( from View.Tools.PamhyrTable import PamhyrTableModel from View.InitialConditionsAdisTS.UndoCommand import ( - SetCommand, AddCommand, DelCommand, - SortCommand, MoveCommand, InsertCommand, - DuplicateCommand, GenerateCommand, + SetCommand, ) logger = logging.getLogger() @@ -92,7 +90,7 @@ class InitialConditionTableDefaultModel(PamhyrTableModel): if self._headers[column] is not None: self._undo.push( SetCommand( - self._lst, row, self._headers[column], value + self._data, row, self._headers[column], value ) ) except Exception as e: @@ -102,36 +100,6 @@ class InitialConditionTableDefaultModel(PamhyrTableModel): self.dataChanged.emit(index, index) return True - def paste(self, index, header, data): - if len(header) != 0: - logger.error("Unexpected header in IC past data") - return - - if len(data) == 0: - logger.error("Empty data") - return - - if len(data[0]) != 3: - logger.error(f"Unexpected data size: [{data[0]}, ...]") - return - - self.layoutAboutToBeChanged.emit() - - self._undo.push( - InsertCommand( - self._lst, index, - list( - map( - lambda d: self._lst.new_from_data(*d), - data - ) - ) - ) - ) - - self.layoutAboutToBeChanged.emit() - self.layoutChanged.emit() - def undo(self): self._undo.undo() self.layoutChanged.emit() @@ -140,10 +108,3 @@ class InitialConditionTableDefaultModel(PamhyrTableModel): self._undo.redo() self.layoutChanged.emit() - def generate(self, generator, param): - self._undo.push( - GenerateCommand( - self._lst, generator, param - ) - ) - self.layoutChanged.emit() diff --git a/src/View/InitialConditionsAdisTS/UndoCommand.py b/src/View/InitialConditionsAdisTS/UndoCommand.py index fecb6c6d..444a1995 100644 --- a/src/View/InitialConditionsAdisTS/UndoCommand.py +++ b/src/View/InitialConditionsAdisTS/UndoCommand.py @@ -23,170 +23,57 @@ from PyQt5.QtWidgets import ( QMessageBox, QUndoCommand, QUndoStack, ) -from Model.InitialConditions.InitialConditions import InitialConditions -from Model.InitialConditions.InitialConditionsDict import InitialConditionsDict +from Model.InitialConditionsAdisTS.InitialConditionsAdisTS import InitialConditionsAdisTS +from Model.InitialConditionsAdisTS.InitialConditionsAdisTSList import InitialConditionsAdisTSList class SetCommand(QUndoCommand): - def __init__(self, ics, row, column, new_value): + def __init__(self, data, row, column, new_value): QUndoCommand.__init__(self) - self._ics = ics + self._data = data self._row = row self._column = column - self._old = self._ics.get(self._row)[column] + + if self._column == "name": + self._old = self._data[self._row].name + elif self._column == "concentration": + print(self._column, self._data[self._row].concentration, new_value) + self._old = self._data[self._row].concentration + elif self._column == "eg": + self._old = self._data[self._row].eg + elif self._column == "em": + self._old = self._data[self._row].em + elif self._column == "ed": + self._old = self._data[self._row].ed _type = float - if column == "name" or column == "comment": + if column == "name": _type = str self._new = _type(new_value) def undo(self): - self._ics.get(self._row)[self._column] = self._old - - def redo(self): - self._ics.get(self._row)[self._column] = self._new - - -class AddCommand(QUndoCommand): - def __init__(self, ics, index): - QUndoCommand.__init__(self) - - self._ics = ics - self._index = index - self._new = None - - def undo(self): - self._ics.delete_i([self._index]) - - def redo(self): - if self._new is None: - self._new = self._ics.new(self._index) - else: - self._ics.insert(self._index, self._new) - - -class DelCommand(QUndoCommand): - def __init__(self, ics, rows): - QUndoCommand.__init__(self) - - self._ics = ics - self._rows = rows - - self._ic = [] - for row in rows: - self._ic.append((row, self._ics.get(row))) - self._ic.sort() - - def undo(self): - for row, el in self._ic: - self._ics.insert(row, el) + if self._column == "name": + self._data[self._row].name = self._old + elif self._column == "concentration": + self._data[self._row].concentration = self._old + elif self._column == "eg": + self._data[self._row].eg = self._old + elif self._column == "em": + self._data[self._row].em = self._old + elif self._column == "ed": + self._data[self._row].ed = self._old def redo(self): - self._ics.delete_i(self._rows) - - -class SortCommand(QUndoCommand): - def __init__(self, ics, _reverse): - QUndoCommand.__init__(self) - - self._ics = ics - self._reverse = _reverse - - self._old = self._ics.data - self._indexes = None - - def undo(self): - ll = self._ics.data - self._ics.sort( - key=lambda x: self._indexes[ll.index(x)] - ) - - def redo(self): - self._ics.sort( - reverse=self._reverse, - key=lambda x: x["kp"] - ) - if self._indexes is None: - self._indexes = list( - map( - lambda p: self._old.index(p), - self._ics.data - ) - ) - self._old = None - - -class MoveCommand(QUndoCommand): - def __init__(self, ics, up, i): - QUndoCommand.__init__(self) + if self._column == "name": + self._data[self._row].name = self._new + elif self._column == "concentration": + self._data[self._row].concentration = self._new + elif self._column == "eg": + self._data[self._row].eg = self._new + elif self._column == "em": + self._data[self._row].em = self._new + elif self._column == "ed": + self._data[self._row].ed = self._new - self._ics = ics - self._up = up == "up" - self._i = i - - def undo(self): - if self._up: - self._ics.move_up(self._i) - else: - self._ics.move_down(self._i) - - def redo(self): - if self._up: - self._ics.move_up(self._i) - else: - self._ics.move_down(self._i) - - -class InsertCommand(QUndoCommand): - def __init__(self, ics, row, ic): - QUndoCommand.__init__(self) - - self._ics = ics - self._row = row - self._ic = deepcopy(ic) - self._ic.reverse() - - def undo(self): - self._ics.delete(self._ic) - - def redo(self): - for ic in self._ic: - self._ics.insert(self._row, ic) - - -class DuplicateCommand(QUndoCommand): - def __init__(self, ics, rows, ic): - QUndoCommand.__init__(self) - - self._ics = ics - self._rows = rows - self._ic = deepcopy(ic) - self._ic.reverse() - - def undo(self): - self._ics.delete(self._ic) - - def redo(self): - for ic in self._ics: - self._ics.insert(self._rows[0], ic) - - -class GenerateCommand(QUndoCommand): - def __init__(self, ics, generator, param): - QUndoCommand.__init__(self) - - self._ics = ics - self._param = param - self._copy = self._ics.data - self._generator = generator - - def undo(self): - self._ics.data = self._copy - - def redo(self): - if self._generator == "growing": - self._ics.generate_growing_constante_height(self._param) - elif self._generator == "discharge": - self._ics.generate_discharge(self._param) diff --git a/src/View/InitialConditionsAdisTS/Window.py b/src/View/InitialConditionsAdisTS/Window.py index 93630c45..2880915a 100644 --- a/src/View/InitialConditionsAdisTS/Window.py +++ b/src/View/InitialConditionsAdisTS/Window.py @@ -43,9 +43,7 @@ from PyQt5.QtWidgets import ( from Modules import Modules from View.InitialConditionsAdisTS.UndoCommand import ( - SetCommand, AddCommand, DelCommand, - SortCommand, MoveCommand, InsertCommand, - DuplicateCommand, + SetCommand, ) from View.InitialConditionsAdisTS.TableDefault import ( @@ -68,7 +66,6 @@ class InitialConditionsAdisTSWindow(PamhyrWindow): def __init__(self, data=None, study=None, config=None, parent=None): self._data = [] self._data.append(data) - #print(self._data.name, self._data.concentration, self._data.eg, self._data.em, self._data.ed) trad = IcAdisTSTranslate() name = ( @@ -108,7 +105,6 @@ class InitialConditionsAdisTSWindow(PamhyrWindow): table.setModel(self._table) table.setSelectionBehavior(QAbstractItemView.SelectRows) table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) - #table.verticalHeader() table.setAlternatingRowColors(True) def index_selected_row(self): diff --git a/src/View/Pollutants/Window.py b/src/View/Pollutants/Window.py index 8ad0deb1..93b09147 100644 --- a/src/View/Pollutants/Window.py +++ b/src/View/Pollutants/Window.py @@ -194,6 +194,7 @@ class PollutantsWindow(PamhyrWindow): for row in rows: pollutant_id = self._pollutants_lst.get(row).id + ics_adists = next(filter(lambda x: x.pollutant == pollutant_id, self._study.river.initial_conditions_adists.lst)) diff --git a/tests_cases/Enlargement/Enlargement.pamhyr b/tests_cases/Enlargement/Enlargement.pamhyr index 8a4f35c6a2cdb182b55fbfeb16d26ec8cf662e67..23c74b0ec7ff7612c35329d1b7d396a763c65546 100644 GIT binary patch delta 795 zcmZozz}@hGdxAW#J_7<sZ`6sF=eD%4Ffr9LG&3<b-#kga(t%NbGf%<>{vf^1VxUsp zPCg*1)1eF`wcBlhq*hxHkko8V2a+1Cj6hPoMH)z|HERJ$)g~7psnQq;B$bPKfh05k zRtEkT{HOW1ZWc6H&Mzjy%&f~;oS##cS`=T9Sd^HXT9R6%(R{jo`{{Z{O9v@#h9Cw$ zNuF)o23#tfS{xzlH5}rs?#${8K@%HI>{^55*u|}_8M~}Y5|eULGxIV_G81#+lk@XZ zfUNwy;`ri%)MOmON|PV{kmm-g(BM)4g2@SAEcrl;%;fl#)U?FXoRZ0kujD81e5*2< z^^FE6NUFFbv8ZJ7g6Hy+XFgXG1c?AGOHR!zDM|!cIJxn;3>!!^H66jsMKDu9Om>h0 zp!&%RKgmv?d6H3UvgHc_V}zxe3PG-Ju0gJT&aS}<n2y)TOwrVVIN0!o<>csJ-0mO) zHCtq5*~RVc8QVQ^1x8{@W^qX|rit+o2}MwV2tqlKAORT+3YO^t#~BSKZ+)vF3K9VU z3~z&71d@Sx9l-^AAHf9&!Styo8TBTcz7U!2bDU8h9I_y-n%muvGVbMKW#s?Pz`r^0 z;TNWj6MpdsvNJL>h?b-lmv8}75F`H&hRq5O^cXizIK(H!&Me9ak^!YHM*dF>{GT=p wZg{~j!NbVIzySlC5ZPA@{I50(Iy?ZTItES#PH9FU;DkmrD>D<zvJZ?80JUH4od5s; delta 247 zcmZp8z}>KbdxAW#E&~EcZq$jE=Qc7iGd0#TH8L|a**r<U(t%NTGf%<>{t%tcVxUs( zPCg*1)u9X|HQQ~0q()m1kW_C?2a;;7j6hPgMH)z|G;0A#<t7&(sni$=Bo&K!fg}t6 zTn7FZ{HOUh^UvKZXwb{AC&I$4%UGPBQ<hp3UyxXon44OXTBISy%xuV*nU`6TnV1uw zoS&BhWaZ}-t2Cdk-+sED(b7STlhvJpPm*UFw*i+5rxr&Ddku#;tNX@AUDoaHM;Z5W YZD!f<ho6yaGvfwkh3zZ~On=S;05eoQ9RL6T -- GitLab