From 98790946613ea0aab862fb34b474473dd4c5ac25 Mon Sep 17 00:00:00 2001 From: Dylan Jeannin Date: Tue, 15 Sep 2026 11:33:04 +0200 Subject: [PATCH] Time/date format: back to relative timestamps storage --- src/Model/Study.py | 3 +-- src/View/BoundaryCondition/Edit/Table.py | 8 ++++---- src/View/BoundaryCondition/Edit/Window.py | 9 ++++++++- .../BoundaryConditionsAdisTS/Edit/Table.py | 9 +++++---- .../BoundaryConditionsAdisTS/Edit/Window.py | 9 ++++++++- .../Edit/Table.py | 9 +++++---- .../Edit/Window.py | 9 ++++++++- src/View/LateralContribution/Edit/Table.py | 9 +++++---- src/View/LateralContribution/Edit/Window.py | 9 ++++++++- .../LateralContributionsAdisTS/Edit/Table.py | 9 +++++---- .../LateralContributionsAdisTS/Edit/Window.py | 9 ++++++++- src/View/Tools/PamhyrTable.py | 18 +++++++++++++----- src/View/WeatherParameters/Edit/Table.py | 9 +++++---- src/View/WeatherParameters/Edit/Window.py | 9 ++++++++- src/tools.py | 2 ++ 15 files changed, 93 insertions(+), 37 deletions(-) diff --git a/src/Model/Study.py b/src/Model/Study.py index 22f04c66..491a26fb 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -217,8 +217,7 @@ class Study(SQLModel): me.name = name me.description = description if date is not None: - me.use_date() - me.date = date + me.use_date(date) return me @classmethod diff --git a/src/View/BoundaryCondition/Edit/Table.py b/src/View/BoundaryCondition/Edit/Table.py index fa38587f..b4699dbd 100644 --- a/src/View/BoundaryCondition/Edit/Table.py +++ b/src/View/BoundaryCondition/Edit/Table.py @@ -94,11 +94,11 @@ class TableModel(PamhyrTableModel): v = v.replace(',', '.') value = f"{float(v):.4f}" elif self._data.header[column] == "time": - if self._opt_data == "time": + if self.time_system == "time": value = timestamp_to_old_pamhyr_date(int(v)) else: value = format_datetime( - datetime(1970, 1, 1) + timedelta(seconds=float(v)) + parse_datetime(self.start_date) + timedelta(seconds=float(v)) ) else: value = f"{v}" @@ -117,8 +117,8 @@ class TableModel(PamhyrTableModel): try: if (self._data.header[column] == "time" - and self._opt_data == "date"): - value = self.date_to_timestamp(value) + and self.time_system == "date"): + value = self.date_to_elapsed_seconds(value) row = self.get_true_data_row(row) diff --git a/src/View/BoundaryCondition/Edit/Window.py b/src/View/BoundaryCondition/Edit/Window.py index 788b1203..1a53049d 100644 --- a/src/View/BoundaryCondition/Edit/Window.py +++ b/src/View/BoundaryCondition/Edit/Window.py @@ -18,6 +18,8 @@ import logging +from Modules import Modules + from tools import timer, trace from numpy import sqrt @@ -174,7 +176,7 @@ class EditBoundaryConditionWindow(PamhyrWindow): data=self._data, undo=self._undo_stack, opt_data=self._study.time_system, - start_date=self._study.date + study=self._study ) table.setModel(self._table) @@ -262,6 +264,11 @@ class EditBoundaryConditionWindow(PamhyrWindow): self._d50sigma.set_d50(self._data.d50) self._d50sigma.set_sigma(self._data.sigma) + def _propagated_update(self, key=Modules(0)): + if Modules.STUDY in key: + self._table.layoutChanged.emit() + self.plot.update() + def update(self): self.plot.update() diff --git a/src/View/BoundaryConditionsAdisTS/Edit/Table.py b/src/View/BoundaryConditionsAdisTS/Edit/Table.py index 3788b624..ea843f3b 100644 --- a/src/View/BoundaryConditionsAdisTS/Edit/Table.py +++ b/src/View/BoundaryConditionsAdisTS/Edit/Table.py @@ -21,6 +21,7 @@ import traceback from datetime import date, time, datetime, timedelta +from tools import parse_datetime from tools import ( trace, timer, timestamp_to_old_pamhyr_date, @@ -84,11 +85,11 @@ class TableModel(PamhyrTableModel): if self._data._types[column] == float: value = f"{v:.4f}" elif self._data.header[column] == "time": - if self._opt_data == "time": + if self.time_system == "time": value = timestamp_to_old_pamhyr_date(int(v)) else: value = format_datetime( - datetime(1970, 1, 1) + timedelta(seconds=float(v)) + parse_datetime(self.start_date) + timedelta(seconds=float(v)) ) else: value = f"{v}" @@ -107,8 +108,8 @@ class TableModel(PamhyrTableModel): try: if (self._data.header[column] == "time" - and self._opt_data == "date"): - value = self.date_to_timestamp(value) + and self.time_system == "date"): + value = self.date_to_elapsed_seconds(value) row = self.get_true_data_row(row) diff --git a/src/View/BoundaryConditionsAdisTS/Edit/Window.py b/src/View/BoundaryConditionsAdisTS/Edit/Window.py index dbe56bb2..9d07de28 100644 --- a/src/View/BoundaryConditionsAdisTS/Edit/Window.py +++ b/src/View/BoundaryConditionsAdisTS/Edit/Window.py @@ -18,6 +18,8 @@ import logging +from Modules import Modules + from tools import timer, trace from View.Tools.PamhyrWindow import PamhyrWindow @@ -129,7 +131,7 @@ class EditBoundaryConditionWindow(PamhyrWindow): data=self._data, undo=self._undo_stack, opt_data=self._study.time_system, - start_date=self._study.date + study=self._study ) table.setModel(self._table) @@ -162,6 +164,11 @@ class EditBoundaryConditionWindow(PamhyrWindow): self.find(QAction, "action_sort").triggered.connect(self.sort) self._table.dataChanged.connect(self.update) + def _propagated_update(self, key=Modules(0)): + if Modules.STUDY in key: + self._table.layoutChanged.emit() + self.plot.update() + def update(self): self.plot.update() self.plot.fit_to_data() diff --git a/src/View/BoundaryConditionsTemperature/Edit/Table.py b/src/View/BoundaryConditionsTemperature/Edit/Table.py index 9b729507..135ae6e9 100644 --- a/src/View/BoundaryConditionsTemperature/Edit/Table.py +++ b/src/View/BoundaryConditionsTemperature/Edit/Table.py @@ -21,6 +21,7 @@ import traceback from datetime import date, time, datetime, timedelta +from tools import parse_datetime from tools import ( trace, timer, timestamp_to_old_pamhyr_date, @@ -84,11 +85,11 @@ class TableModel(PamhyrTableModel): if self._data._types[column] == float: value = f"{v:.2f}" elif self._data.header[column] == "time": - if self._opt_data == "time": + if self.time_system == "time": value = timestamp_to_old_pamhyr_date(int(v)) else: value = format_datetime( - datetime(1970, 1, 1) + timedelta(seconds=float(v)) + parse_datetime(self.start_date) + timedelta(seconds=float(v)) ) else: value = f"{v}" @@ -107,8 +108,8 @@ class TableModel(PamhyrTableModel): try: if (self._data.header[column] == "time" - and self._opt_data == "date"): - value = self.date_to_timestamp(value) + and self.time_system == "date"): + value = self.date_to_elapsed_seconds(value) row = self.get_true_data_row(row) diff --git a/src/View/BoundaryConditionsTemperature/Edit/Window.py b/src/View/BoundaryConditionsTemperature/Edit/Window.py index 0c7306a4..72bc4000 100644 --- a/src/View/BoundaryConditionsTemperature/Edit/Window.py +++ b/src/View/BoundaryConditionsTemperature/Edit/Window.py @@ -18,6 +18,8 @@ import logging +from Modules import Modules + from tools import timer, trace from View.Tools.PamhyrWindow import PamhyrWindow @@ -118,7 +120,7 @@ class EditBoundaryConditionWindow(PamhyrWindow): data=self._data, undo=self._undo_stack, opt_data=self._study.time_system, - start_date=self._study.date + study=self._study ) table.setModel(self._table) @@ -151,6 +153,11 @@ class EditBoundaryConditionWindow(PamhyrWindow): self.find(QAction, "action_sort").triggered.connect(self.sort) self._table.dataChanged.connect(self.update) + def _propagated_update(self, key=Modules(0)): + if Modules.STUDY in key: + self._table.layoutChanged.emit() + self.plot.update() + def update(self): self.plot.update() self.plot.fit_to_data() diff --git a/src/View/LateralContribution/Edit/Table.py b/src/View/LateralContribution/Edit/Table.py index 0c5cf648..097a818f 100644 --- a/src/View/LateralContribution/Edit/Table.py +++ b/src/View/LateralContribution/Edit/Table.py @@ -20,6 +20,7 @@ import logging import traceback from datetime import date, time, datetime, timedelta +from tools import parse_datetime from tools import ( trace, timer, timestamp_to_old_pamhyr_date, @@ -73,11 +74,11 @@ class TableModel(PamhyrTableModel): if self._data.get_type_column(column) == float: value = f"{v:.4f}" elif self._data.header[column] == "time": - if self._opt_data == "time": + if self.time_system == "time": value = timestamp_to_old_pamhyr_date(int(v)) else: value = format_datetime( - datetime(1970, 1, 1) + timedelta(seconds=float(v)) + parse_datetime(self.start_date) + timedelta(seconds=float(v)) ) else: value = f"{v}" @@ -96,8 +97,8 @@ class TableModel(PamhyrTableModel): try: if (self._data.header[column] == "time" - and self._opt_data == "date"): - value = self.date_to_timestamp(value) + and self.time_system == "date"): + value = self.date_to_elapsed_seconds(value) self._undo.push( SetDataCommand( diff --git a/src/View/LateralContribution/Edit/Window.py b/src/View/LateralContribution/Edit/Window.py index 62329aef..d3f378bd 100644 --- a/src/View/LateralContribution/Edit/Window.py +++ b/src/View/LateralContribution/Edit/Window.py @@ -25,6 +25,8 @@ from PyQt5.QtGui import ( QKeySequence, ) +from Modules import Modules + from PyQt5.QtCore import ( Qt, QVariant, QAbstractTableModel, QCoreApplication, ) @@ -110,7 +112,7 @@ class EditLateralContributionWindow(PamhyrWindow): undo=self._undo_stack, trad=self._trad, opt_data=self._study.time_system, - start_date=self._study.date + study=self._study ) table.setModel(self._table) @@ -146,6 +148,11 @@ class EditLateralContributionWindow(PamhyrWindow): self._table.dataChanged.connect(self.update) self._table.layoutChanged.connect(self.update) + def _propagated_update(self, key=Modules(0)): + if Modules.STUDY in key: + self._table.layoutChanged.emit() + self.plot.update() + def update(self): self.plot.update() self.plot.fit_to_data() diff --git a/src/View/LateralContributionsAdisTS/Edit/Table.py b/src/View/LateralContributionsAdisTS/Edit/Table.py index d055be64..015da307 100644 --- a/src/View/LateralContributionsAdisTS/Edit/Table.py +++ b/src/View/LateralContributionsAdisTS/Edit/Table.py @@ -20,6 +20,7 @@ import logging import traceback from datetime import date, time, datetime, timedelta +from tools import parse_datetime from tools import ( trace, timer, timestamp_to_old_pamhyr_date, @@ -87,11 +88,11 @@ class TableModel(PamhyrTableModel): if self._data._types[column] == float: value = f"{v:.4f}" elif self._data.header[column] == "time": - if self._opt_data == "time": + if self.time_system == "time": value = timestamp_to_old_pamhyr_date_adists(int(v)) else: value = format_datetime( - datetime(1970, 1, 1) + timedelta(seconds=float(v)) + parse_datetime(self.start_date) + timedelta(seconds=float(v)) ) else: value = f"{v}" @@ -110,8 +111,8 @@ class TableModel(PamhyrTableModel): try: if (self._data.header[column] == "time" - and self._opt_data == "date"): - value = self.date_to_timestamp(value) + and self.time_system == "date"): + value = self.date_to_elapsed_seconds(value) row = self.get_true_data_row(row) diff --git a/src/View/LateralContributionsAdisTS/Edit/Window.py b/src/View/LateralContributionsAdisTS/Edit/Window.py index 18d2997f..b9b70b78 100644 --- a/src/View/LateralContributionsAdisTS/Edit/Window.py +++ b/src/View/LateralContributionsAdisTS/Edit/Window.py @@ -29,6 +29,8 @@ from PyQt5.QtCore import ( Qt, QVariant, QAbstractTableModel, QCoreApplication, ) +from Modules import Modules + from PyQt5.QtWidgets import ( QDialogButtonBox, QPushButton, QLineEdit, QFileDialog, QTableView, QAbstractItemView, @@ -132,7 +134,7 @@ class EditLateralContributionAdisTSWindow(PamhyrWindow): undo=self._undo_stack, trad=self._trad, opt_data=self._study.time_system, - start_date=self._study.date + study=self._study ) table.setModel(self._table) @@ -166,6 +168,11 @@ class EditLateralContributionAdisTSWindow(PamhyrWindow): self._table.dataChanged.connect(self.update) + def _propagated_update(self, key=Modules(0)): + if Modules.STUDY in key: + self._table.layoutChanged.emit() + self.plot.update() + def update(self): self.plot.update() self.plot.fit_to_data() diff --git a/src/View/Tools/PamhyrTable.py b/src/View/Tools/PamhyrTable.py index 5ba5b5d2..47880cbc 100644 --- a/src/View/Tools/PamhyrTable.py +++ b/src/View/Tools/PamhyrTable.py @@ -18,7 +18,6 @@ import logging import traceback -from datetime import timezone from tools import trace, timer, parse_datetime @@ -63,8 +62,16 @@ class PamhyrTextDelegate(QStyledItemDelegate): class PamhyrTableModel(QAbstractTableModel): - def date_to_timestamp(self, value): - """Convert an accepted calendar date to its raw UTC timestamp.""" + @property + def time_system(self): + return self._study.time_system if self._study is not None else self._opt_data + + @property + def start_date(self): + return self._study.date if self._study is not None else self._start_date + + def date_to_elapsed_seconds(self, value): + """Convert an accepted calendar date to elapsed simulation seconds.""" try: entered_date = parse_datetime(value) except ValueError as error: @@ -82,7 +89,7 @@ class PamhyrTableModel(QAbstractTableModel): ) raise error - return entered_date.replace(tzinfo=timezone.utc).timestamp() + return (entered_date - parse_datetime(self.start_date)).total_seconds() def _setup_delegates(self): if self._table_view is None: @@ -111,7 +118,7 @@ class PamhyrTableModel(QAbstractTableModel): opt_data=None, options=["rows_selection"], parent=None, - start_date=None): + start_date=None, study=None): super(PamhyrTableModel, self).__init__() self._table_view = table_view @@ -129,6 +136,7 @@ class PamhyrTableModel(QAbstractTableModel): self._undo = undo self._lst = [] self._start_date = start_date + self._study = study self._setup_delegates() self._setup_lst() diff --git a/src/View/WeatherParameters/Edit/Table.py b/src/View/WeatherParameters/Edit/Table.py index 76cb0190..0e7d9d64 100644 --- a/src/View/WeatherParameters/Edit/Table.py +++ b/src/View/WeatherParameters/Edit/Table.py @@ -20,6 +20,7 @@ import logging import traceback from datetime import date, time, datetime, timedelta +from tools import parse_datetime from tools import ( trace, timer, timestamp_to_old_pamhyr_date, @@ -74,11 +75,11 @@ class TableModel(PamhyrTableModel): if self._data.get_type_column(column) == float: value = f"{v:.4f}" elif self._data.header[column] == "time": - if self._opt_data == "time": + if self.time_system == "time": value = timestamp_to_old_pamhyr_date(int(v)) else: value = format_datetime( - datetime(1970, 1, 1) + timedelta(seconds=float(v)) + parse_datetime(self.start_date) + timedelta(seconds=float(v)) ) else: value = f"{v}" @@ -97,8 +98,8 @@ class TableModel(PamhyrTableModel): try: if (self._data.header[column] == "time" - and self._opt_data == "date"): - value = self.date_to_timestamp(value) + and self.time_system == "date"): + value = self.date_to_elapsed_seconds(value) self._undo.push( SetDataCommand( diff --git a/src/View/WeatherParameters/Edit/Window.py b/src/View/WeatherParameters/Edit/Window.py index d20beaab..f1ccbce9 100644 --- a/src/View/WeatherParameters/Edit/Window.py +++ b/src/View/WeatherParameters/Edit/Window.py @@ -25,6 +25,8 @@ from PyQt5.QtGui import ( QKeySequence, ) +from Modules import Modules + from PyQt5.QtCore import ( Qt, QVariant, QAbstractTableModel, QCoreApplication, ) @@ -122,7 +124,7 @@ class EditWeatherParametersWindow(PamhyrWindow): undo=self._undo_stack, trad=self._trad, opt_data=self._study.time_system, - start_date=self._study.date + study=self._study ) table.setModel(self._table) @@ -158,6 +160,11 @@ class EditWeatherParametersWindow(PamhyrWindow): self._table.dataChanged.connect(self.update) self._table.layoutChanged.connect(self.update) + def _propagated_update(self, key=Modules(0)): + if Modules.STUDY in key: + self._table.layoutChanged.emit() + self.plot.update() + def update(self): self.plot.update() self.plot.fit_to_data() diff --git a/src/tools.py b/src/tools.py index 7c1ea36c..9801a793 100644 --- a/src/tools.py +++ b/src/tools.py @@ -240,6 +240,8 @@ def timestamp(dt: datetime): SUPPORTED_DATETIME_FORMATS = ( + "%d:%m:%Y, %H:%M:%S", + "%d:%m:%Y", "%d-%m-%Y %H:%M:%S.%f", "%d-%m-%Y %H:%M:%S", "%d-%m-%Y %H:%M",