From f0ac170d2ff5d5a5208adc2214229a4e90783efb Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 11 Aug 2025 15:38:31 +0200 Subject: [PATCH] Pamhyr: Fix tests and update adists obj id management. --- .../BoundaryConditionAdisTS.py | 17 +++++--------- src/Model/D90AdisTS/D90AdisTS.py | 19 +++++----------- src/Model/DIFAdisTS/DIFAdisTS.py | 18 +++++---------- .../InitialConditionsAdisTS.py | 19 +++++----------- .../LateralContributionAdisTS.py | 17 +++++--------- .../LateralContributionsAdisTSList.py | 2 +- src/Model/OutputRKAdists/OutputRKAdists.py | 21 ++++++------------ src/Model/Pollutants/Pollutants.py | 13 +++++------ src/Model/Study.py | 2 ++ src/Model/test_Model.py | 6 ++++- tests_cases/Enlargement/Enlargement.pamhyr | Bin 237568 -> 139264 bytes 11 files changed, 50 insertions(+), 84 deletions(-) diff --git a/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py b/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py index 1752d1ff..8c02d2b7 100644 --- a/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py +++ b/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py @@ -33,19 +33,17 @@ logger = logging.getLogger() class BoundaryConditionAdisTS(SQLSubModel): _sub_classes = [] - _id_cnt = 0 def __init__(self, id: int = -1, - pollutant: int = -1, status=None): - super(BoundaryConditionAdisTS, self).__init__() + pollutant: int = -1, status=None, + owner_scenario=-1): + super(BoundaryConditionAdisTS, self).__init__( + id=id, status=status, + owner_scenario=owner_scenario + ) self._status = status - if id == -1: - self.id = BoundaryConditionAdisTS._id_cnt - else: - self.id = id - self._type = "" self._node = None self._pollutant = pollutant @@ -53,9 +51,6 @@ class BoundaryConditionAdisTS(SQLSubModel): self._header = [] self._types = [self.time_convert, float] - BoundaryConditionAdisTS._id_cnt = max( - BoundaryConditionAdisTS._id_cnt + 1, self.id) - @classmethod def _db_create(cls, execute): execute(""" diff --git a/src/Model/D90AdisTS/D90AdisTS.py b/src/Model/D90AdisTS/D90AdisTS.py index 728673a9..9a47e952 100644 --- a/src/Model/D90AdisTS/D90AdisTS.py +++ b/src/Model/D90AdisTS/D90AdisTS.py @@ -33,29 +33,22 @@ class D90AdisTS(SQLSubModel): _sub_classes = [ D90AdisTSSpec, ] - _id_cnt = 0 def __init__(self, id: int = -1, name: str = "default", - status=None): - super(D90AdisTS, self).__init__() + status=None, + owner_scenario=-1): + super(D90AdisTS, self).__init__( + id=id, status=status, + owner_scenario=owner_scenario + ) self._status = status - if id == -1: - self.id = D90AdisTS._id_cnt - else: - self.id = id - self._name = name self._d90 = None self._enabled = True self._data = [] - D90AdisTS._id_cnt = max( - D90AdisTS._id_cnt + 1, - self.id - ) - @classmethod def _db_create(cls, execute): execute(""" diff --git a/src/Model/DIFAdisTS/DIFAdisTS.py b/src/Model/DIFAdisTS/DIFAdisTS.py index 30224b0a..287427f2 100644 --- a/src/Model/DIFAdisTS/DIFAdisTS.py +++ b/src/Model/DIFAdisTS/DIFAdisTS.py @@ -33,19 +33,16 @@ class DIFAdisTS(SQLSubModel): _sub_classes = [ DIFAdisTSSpec, ] - _id_cnt = 0 def __init__(self, id: int = -1, name: str = "default", - status=None): - super(DIFAdisTS, self).__init__() + status=None, owner_scenario=-1): + super(DIFAdisTS, self).__init__( + id=id, status=status, + owner_scenario=owner_scenario + ) self._status = status - if id == -1: - self.id = DIFAdisTS._id_cnt - else: - self.id = id - self._name = name self._method = None self._dif = None @@ -55,11 +52,6 @@ class DIFAdisTS(SQLSubModel): self._types = ["iwasa", "fisher", "elder", "constante", "generique"] self._data = [] - DIFAdisTS._id_cnt = max( - DIFAdisTS._id_cnt + 1, - self.id - ) - @classmethod def _db_create(cls, execute): execute(""" diff --git a/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTS.py b/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTS.py index d312f99c..4299463b 100644 --- a/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTS.py +++ b/src/Model/InitialConditionsAdisTS/InitialConditionsAdisTS.py @@ -34,19 +34,17 @@ class InitialConditionsAdisTS(SQLSubModel): _sub_classes = [ ICAdisTSSpec, ] - _id_cnt = 0 def __init__(self, id: int = -1, name: str = "default", - pollutant: int = -1, status=None): - super(InitialConditionsAdisTS, self).__init__() + pollutant: int = -1, status=None, + owner_scenario=-1): + super(InitialConditionsAdisTS, self).__init__( + id=id, status=status, + owner_scenario=owner_scenario + ) self._status = status - if id == -1: - self.id = InitialConditionsAdisTS._id_cnt - else: - self.id = id - self._name = name self._pollutant = pollutant self._concentration = None @@ -56,11 +54,6 @@ class InitialConditionsAdisTS(SQLSubModel): self._enabled = True self._data = [] - InitialConditionsAdisTS._id_cnt = max( - InitialConditionsAdisTS._id_cnt + 1, - self.id - ) - @classmethod def _db_create(cls, execute): execute(""" diff --git a/src/Model/LateralContributionsAdisTS/LateralContributionAdisTS.py b/src/Model/LateralContributionsAdisTS/LateralContributionAdisTS.py index 5f80f140..91e156c2 100644 --- a/src/Model/LateralContributionsAdisTS/LateralContributionAdisTS.py +++ b/src/Model/LateralContributionsAdisTS/LateralContributionAdisTS.py @@ -33,19 +33,17 @@ logger = logging.getLogger() class LateralContributionAdisTS(SQLSubModel): _sub_classes = [] - _id_cnt = 0 def __init__(self, id: int = -1, pollutant: int = -1, - name: str = "", status=None): - super(LateralContributionAdisTS, self).__init__() + name: str = "", status=None, + owner_scenario=-1): + super(LateralContributionAdisTS, self).__init__( + id=id, status=status, + owner_scenario=owner_scenario + ) self._status = status - if id == -1: - self.id = LateralContributionAdisTS._id_cnt - else: - self.id = id - self._pollutant = pollutant self._edge = None self._begin_rk = 0.0 @@ -54,9 +52,6 @@ class LateralContributionAdisTS(SQLSubModel): self._header = ["time", "rate"] self._types = [self.time_convert, float] - LateralContributionAdisTS._id_cnt = max( - LateralContributionAdisTS._id_cnt + 1, self.id) - @classmethod def _db_create(cls, execute): execute(""" diff --git a/src/Model/LateralContributionsAdisTS/LateralContributionsAdisTSList.py b/src/Model/LateralContributionsAdisTS/LateralContributionsAdisTSList.py index 00c4c981..7e4cf189 100644 --- a/src/Model/LateralContributionsAdisTS/LateralContributionsAdisTSList.py +++ b/src/Model/LateralContributionsAdisTS/LateralContributionsAdisTSList.py @@ -46,7 +46,7 @@ class LateralContributionsAdisTSList(PamhyrModelList): def _db_save(self, execute, data=None): execute("DELETE FROM lateral_contribution_adists") - execute("DELETE FROM lateral_condition_data_adists") + execute("DELETE FROM lateral_contribution_data_adists") if data is None: data = {} diff --git a/src/Model/OutputRKAdists/OutputRKAdists.py b/src/Model/OutputRKAdists/OutputRKAdists.py index ea385e3f..1b14cdf7 100644 --- a/src/Model/OutputRKAdists/OutputRKAdists.py +++ b/src/Model/OutputRKAdists/OutputRKAdists.py @@ -33,27 +33,22 @@ logger = logging.getLogger() class OutputRKAdists(SQLSubModel): _sub_classes = [] - _id_cnt = 0 def __init__(self, id: int = -1, reach=None, - rk=None, title: str = "", status=None): - super(OutputRKAdists, self).__init__() + rk=None, title: str = "", status=None, + owner_scenario=-1): + super(OutputRKAdists, self).__init__( + id=id, status=status, + owner_scenario=owner_scenario + ) self._status = status - if id == -1: - self.id = OutputRKAdists._id_cnt - else: - self.id = id - self._reach = reach self._rk = rk self._title = str(title) self._enabled = True - OutputRKAdists._id_cnt = max( - OutputRKAdists._id_cnt + 1, self.id) - @property def reach(self): return self._reach @@ -83,7 +78,7 @@ class OutputRKAdists(SQLSubModel): @classmethod def _db_create(cls, execute): - sql = ( + execute( "CREATE TABLE OutputRKAdists(" + "id INTEGER NOT NULL PRIMARY KEY, " + "reach INTEGER NOT NULL, " + @@ -93,8 +88,6 @@ class OutputRKAdists(SQLSubModel): ")" ) - execute(sql) - return cls._create_submodel(execute) @classmethod diff --git a/src/Model/Pollutants/Pollutants.py b/src/Model/Pollutants/Pollutants.py index 3cad65f5..afd237f0 100644 --- a/src/Model/Pollutants/Pollutants.py +++ b/src/Model/Pollutants/Pollutants.py @@ -35,16 +35,15 @@ class Pollutants(SQLSubModel): _sub_classes = [] _id_cnt = 0 - def __init__(self, id: int = -1, name: str = "", status=None): - super(Pollutants, self).__init__() + def __init__(self, id: int = -1, name: str = "", + status=None, + owner_scenario=-1): + super(Pollutants, self).__init__( + id=id, status=status, + owner_scenario=owner_scenario) self._status = status - if id == -1: - self.id = Pollutants._id_cnt - else: - self.id = id - if name is None or name == "": self.name = f"pol{self.id}" else: diff --git a/src/Model/Study.py b/src/Model/Study.py index 2c50b853..b9b33c6c 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -300,6 +300,8 @@ class Study(SQLModel): self.execute( f"UPDATE info SET value='{self._version}' WHERE key='version'" ) + logger.info("Update database done.") + return True logger.info("Update failed!") diff --git a/src/Model/test_Model.py b/src/Model/test_Model.py index cc1dc589..0ef33e8a 100644 --- a/src/Model/test_Model.py +++ b/src/Model/test_Model.py @@ -32,7 +32,11 @@ class StudyTestCase(unittest.TestCase): self.assertEqual(study.description, "bar") def test_open_study(self): - study = Study.open("../tests_cases/Enlargement/Enlargement.pamhyr") + study = Study.open( + os.path.join( + "..", "tests_cases", "Enlargement", "Enlargement.pamhyr" + ) + ) self.assertNotEqual(study, None) self.assertEqual(study.name, "Enlargement") diff --git a/tests_cases/Enlargement/Enlargement.pamhyr b/tests_cases/Enlargement/Enlargement.pamhyr index 92b931d2b11fa20988bcd7a1af3b8906e2293812..12b3751da32b437e218fa5932fe18c75df6d416f 100644 GIT binary patch delta 18708 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 S$fUIdlhzVUT1(7Sy#EiCx^}$) delta 24743 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