From 7b93f62a644540c73b51260e0bf35022e109a9e5 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Wed, 10 May 2023 11:30:21 +0200
Subject: [PATCH] Study: Add time / date mode to study.

---
 src/Model/Study.py              |  27 ++++++-
 src/View/ASubWindow.py          |  29 ++++++-
 src/View/Main/NewStudyWindow.py |  45 ++++++++++-
 src/View/ui/NewStudy.ui         | 136 +++++++++++++++++++++-----------
 src/tools.py                    |  22 ++++++
 5 files changed, 208 insertions(+), 51 deletions(-)

diff --git a/src/Model/Study.py b/src/Model/Study.py
index 59a2ec9c..f1a50131 100644
--- a/src/Model/Study.py
+++ b/src/Model/Study.py
@@ -13,6 +13,9 @@ class Study(Serializable):
         # Study general information
         self.name = ""
         self.description = ""
+        # Time system
+        self._time_system = "time"
+        self._date = datetime.fromtimestamp(0)
 
         self.creation_date = datetime.now()
         self.last_modification_date = datetime.now()
@@ -21,13 +24,35 @@ class Study(Serializable):
         # Study data
         self.river = None
 
+    @property
+    def time_system(self):
+        return self._time_system
+
+    def use_time(self):
+        self._time_system = "time"
+
+    def use_date(self, date:datetime):
+        self._time_system = "date"
+        self._date = date
+
+    @property
+    def date(self):
+        return self._date
+
+    @date.setter
+    def date(self, timestamp):
+        self._date = timestamp
+
     @classmethod
     def new(cls):
         return cls()
 
     @classmethod
-    def new(cls, name, description):
+    def new(cls, name, description, date = None):
         me = cls()
         me.name = name
         me.description = description
+        if date is not None:
+            me.use_date()
+            me.date = date
         return me
diff --git a/src/View/ASubWindow.py b/src/View/ASubWindow.py
index 3e1a138f..a7b40c9f 100644
--- a/src/View/ASubWindow.py
+++ b/src/View/ASubWindow.py
@@ -4,6 +4,7 @@ import os
 import csv
 
 from io import StringIO
+from datetime import datetime
 
 from tools import trace
 
@@ -16,9 +17,10 @@ from PyQt5.QtWidgets import (
     QTimeEdit, QSpinBox, QTextEdit,
     QRadioButton, QComboBox, QFileDialog,
     QMessageBox, QTableView, QAction,
+    QDateTimeEdit,
 )
 from PyQt5.QtCore import (
-    QTime,
+    QTime, QDateTime,
 )
 from PyQt5.uic import loadUi
 
@@ -350,6 +352,31 @@ class ASubWindowFeatures(object):
         """
         return self.find(QComboBox, name).currentText()
 
+    def get_datetime_edit(self, name:str):
+        """Get datetime of datetime edit
+
+        Args:
+            name: The datetime edit component name
+
+        Returns:
+            The datetime
+        """
+        return self.find(QDateTimeEdit, name).dateTime().toPyDateTime()
+
+    def set_datetime_edit(self, name:str, date:datetime):
+        """Set datetime of a datetime edit
+
+        Args:
+            name: The datetime edit component name
+            date: The new datetime
+
+        Returns:
+            Nothing
+        """
+        qdate = QDateTime.fromString(date.isoformat(), "yyyy-MM-ddThh:mm:ss")
+        self.find(QDateTimeEdit, name).setDateTime(qdate)
+
+
 # Top level interface
 
 class ASubMainWindow(QMainWindow, ASubWindowFeatures, WindowToolKit):
diff --git a/src/View/Main/NewStudyWindow.py b/src/View/Main/NewStudyWindow.py
index 905815ea..6d313199 100644
--- a/src/View/Main/NewStudyWindow.py
+++ b/src/View/Main/NewStudyWindow.py
@@ -3,6 +3,11 @@
 from Model.Study import Study
 from View.ASubWindow import ASubWindow
 
+from PyQt5.QtWidgets import (
+    QRadioButton, QLabel, QDateTimeEdit,
+)
+
+
 class NewStudyWindow(ASubWindow):
     def __init__(self, study=None, title="New Study", parent=None):
         super(NewStudyWindow, self).__init__(name=title, ui="NewStudy", parent=parent)
@@ -13,16 +18,50 @@ class NewStudyWindow(ASubWindow):
         self.study = study
 
         if not self.study is None:
-            self.set_line_edit_text("lineEdit_name", study.name)
-            self.set_text_edit_text("textEdit_description", study.description)
+            self.set_line_edit_text("lineEdit_name", self.study.name)
+            self.set_text_edit_text("textEdit_description", self.study.description)
+            self.set_datetime_edit("dateTimeEdit_date", self.study.date)
+            if self.study.time_system == "date":
+                self.set_radio_button("radioButton_date", True)
+                self.find(QLabel, "label_date").setEnabled(True)
+                self.find(QDateTimeEdit, "dateTimeEdit_date").setEnabled(True)
+
+        self.connection()
+
+    def connection(self):
+        time = self.find(QRadioButton, "radioButton_time")
+        date = self.find(QRadioButton, "radioButton_date")
+
+        time.toggled.connect(self.set_time)
+        date.toggled.connect(self.set_date)
+
+    def set_time(self):
+        if self.get_radio_button("radioButton_time"):
+            self.find(QLabel, "label_date").setEnabled(False)
+            self.find(QDateTimeEdit, "dateTimeEdit_date").setEnabled(False)
+
+    def set_date(self):
+        if self.get_radio_button("radioButton_date"):
+            self.find(QLabel, "label_date").setEnabled(True)
+            self.find(QDateTimeEdit, "dateTimeEdit_date").setEnabled(True)
+
 
     def accept(self):
         name = self.get_line_edit_text("lineEdit_name")
         description = self.get_text_edit_text("textEdit_description")
 
         if self.study is None:
-            self.parent.set_model(Study.new(name, description))
+            study = Study.new(name, description)
+            if self.get_radio_button("radioButton_date"):
+                date = self.get_datetime_edit("dateTimeEdit_date")
+                study.use_date(date)
+            self.parent.set_model(study)
         else:
             self.study.name = name
             self.study.description = description
+            if self.get_radio_button("radioButton_date"):
+                date = self.get_datetime_edit("dateTimeEdit_date")
+                self.study.use_date(date)
+            else:
+                self.study.use_time()
         self.done(True)
diff --git a/src/View/ui/NewStudy.ui b/src/View/ui/NewStudy.ui
index 1805c10e..f95ff4a1 100644
--- a/src/View/ui/NewStudy.ui
+++ b/src/View/ui/NewStudy.ui
@@ -13,60 +13,104 @@
   <property name="windowTitle">
    <string>Dialog</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout_2">
+  <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
-    <layout class="QVBoxLayout" name="verticalLayout_3">
-     <item>
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <item>
-        <layout class="QGridLayout" name="gridLayout">
-         <item row="0" column="0">
-          <widget class="QLabel" name="label">
-           <property name="text">
-            <string>Name</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="0">
-          <widget class="QLabel" name="label_2">
-           <property name="text">
-            <string>Description</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="1">
-          <widget class="QLineEdit" name="lineEdit_name">
-           <property name="text">
-            <string>MyNewStudy</string>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="1">
-          <widget class="QTextEdit" name="textEdit_description">
-           <property name="autoFillBackground">
-            <bool>false</bool>
-           </property>
-           <property name="tabChangesFocus">
-            <bool>false</bool>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </item>
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>Name</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1" colspan="2">
+    <widget class="QLineEdit" name="lineEdit_name">
+     <property name="text">
+      <string>MyNewStudy</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0" colspan="2">
+    <widget class="QLabel" name="label_3">
+     <property name="text">
+      <string>Time system</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="2">
+    <layout class="QVBoxLayout" name="verticalLayout">
      <item>
-      <widget class="QDialogButtonBox" name="buttonBox">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
+      <widget class="QRadioButton" name="radioButton_time">
+       <property name="text">
+        <string>Time</string>
        </property>
-       <property name="standardButtons">
-        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+       <property name="checked">
+        <bool>true</bool>
        </property>
       </widget>
      </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QRadioButton" name="radioButton_date">
+         <property name="text">
+          <string>Date</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="Line" name="line">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_date">
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
+         <property name="text">
+          <string>Staring date</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QDateTimeEdit" name="dateTimeEdit_date">
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
     </layout>
    </item>
+   <item row="2" column="0" colspan="2">
+    <widget class="QLabel" name="label_2">
+     <property name="text">
+      <string>Description</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="2">
+    <widget class="QTextEdit" name="textEdit_description">
+     <property name="autoFillBackground">
+      <bool>false</bool>
+     </property>
+     <property name="tabChangesFocus">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="0" colspan="3">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
  <resources/>
diff --git a/src/tools.py b/src/tools.py
index d2f11917..be41a5b3 100644
--- a/src/tools.py
+++ b/src/tools.py
@@ -131,3 +131,25 @@ def flatten(lst):
         return []
 
     return reduce(list.__add__, lst)
+
+def old_pamhyr_date_to_timestamp(date:str):
+    v = date.split(":")
+    if len(v) != 4:
+        return 0
+
+    m = [
+        (24 * 60 * 60),         # Day to sec
+        (60 * 60),              # Hour to sec
+        60,                     # Minute to sec
+        1                       # Sec
+    ]
+
+    ts = reduce(
+        lambda acc, x: acc + x,
+        map(
+            lambda v, m: int(v) * int(m),
+            v, m
+        )
+    )
+
+    return ts
-- 
GitLab