From 9030c3f9b4b30fe6f062bd5ea1e4fbb26bb0f1ab Mon Sep 17 00:00:00 2001
From: Olivier Jossoud <olivier.jossoud@lsce.ipsl.fr>
Date: Fri, 11 Oct 2019 09:51:25 +0200
Subject: [PATCH] Use config file to set a default data directory.

---
 config/settings.ini        |  3 +++
 src/config.py              | 31 +++++++++++++++++++++++++++++++
 src/main.py                |  8 +++++++-
 src/uim/conductcalibuim.py |  7 +++++--
 src/utils.py               | 10 ++++++++++
 5 files changed, 56 insertions(+), 3 deletions(-)
 create mode 100644 config/settings.ini
 create mode 100644 src/config.py

diff --git a/config/settings.ini b/config/settings.ini
new file mode 100644
index 0000000..97caeda
--- /dev/null
+++ b/config/settings.ini
@@ -0,0 +1,3 @@
+[DATA_SOURCE]
+# Absolute path of the base directory where the data files produced by the CFA are be stored.
+absolute_root_dir = /homel/ojossoud/_temp/data_cfa
diff --git a/src/config.py b/src/config.py
new file mode 100644
index 0000000..3bf3c47
--- /dev/null
+++ b/src/config.py
@@ -0,0 +1,31 @@
+from configobj import ConfigObj
+import utils
+import threading
+
+
+class Config:
+
+    def __init__(self, filename):
+        self.full_filename = "../config/" + filename
+        self.config_parser = ConfigObj(self.full_filename)
+        self.file_access_lock = threading.Lock()
+
+    def write(self, instrument, key, value):
+        self.file_access_lock.acquire()
+
+        self.config_parser.reload()
+        self.config_parser[instrument][key] = str(value)
+        self.config_parser.write()
+        self.file_access_lock.release()
+
+    def read(self, instrument, key):
+        self.file_access_lock.acquire()
+        self.config_parser.reload()
+        try:
+            value = self.config_parser[instrument][key]
+        except:
+            self.file_access_lock.release()
+            raise
+        self.file_access_lock.release()
+        value = utils.convert_to_numeric(value)
+        return value
diff --git a/src/main.py b/src/main.py
index cf758f3..7dbeab7 100755
--- a/src/main.py
+++ b/src/main.py
@@ -3,12 +3,18 @@ import sys
 from PyQt5.QtWidgets import QApplication
 from PyQt5.QtCore import QThread
 
+from config import Config
+
 from gui.mainwindow import MainWindow
 
 from dataprovider.conductcalibprovider import ConductCalibProvider
 
 from uim.conductcalibuim import ConductCalibUim
 
+########################################################################################################################
+# CONFIG
+########################################################################################################################
+config = Config("settings.ini")
 
 ########################################################################################################################
 # WINDOWS
@@ -27,7 +33,7 @@ conduct_prvd = ConductCalibProvider()
 # GUI MANAGERS
 ########################################################################################################################
 
-conductcalib_uim = ConductCalibUim(conduct_prvd, main_window_ui)
+conductcalib_uim = ConductCalibUim(conduct_prvd, main_window_ui, config)
 
 ########################################################################################################################
 # LAUNCH APPLICATION
diff --git a/src/uim/conductcalibuim.py b/src/uim/conductcalibuim.py
index e620168..7b0d217 100644
--- a/src/uim/conductcalibuim.py
+++ b/src/uim/conductcalibuim.py
@@ -5,6 +5,7 @@ import pandas as pd
 import numpy as np
 
 import utils
+from config import Config
 from dataprovider.conductcalibprovider import ConductCalibProvider
 from dataprovider.conductcalibprovider import CalibRun
 from gui.uimainwindow import Ui_MainWindow
@@ -27,9 +28,10 @@ class ConductCalibUim:
     VALIDAUTO_COL = 5
     VALIDMANUAL_COL = 6
 
-    def __init__(self, conduct_prvd: ConductCalibProvider, main_ui: Ui_MainWindow):
+    def __init__(self, conduct_prvd: ConductCalibProvider, main_ui: Ui_MainWindow, config: Config):
         self.main_ui = main_ui
         self.conduct_prvd = conduct_prvd
+        self.config = config
         self.current_calib_run = None
         self.current_channel = int(self.main_ui.conduct_combobox_channel.currentText())
 
@@ -50,7 +52,8 @@ class ConductCalibUim:
         self.main_ui.conduct_tablewidget_run.cellClicked.connect(self.highlight_step)
 
     def load_data(self):
-        directory = QFileDialog.getExistingDirectory()
+        directory = QFileDialog.getExistingDirectory(
+            directory=self.config.read("DATA_SOURCE", "absolute_root_dir") + "/conduct_calib")
 
         # If user cancels directory selection, do nothing.
         if directory == "":
diff --git a/src/utils.py b/src/utils.py
index 309a333..ba5d688 100644
--- a/src/utils.py
+++ b/src/utils.py
@@ -2,6 +2,7 @@ import pyqtgraph as pg
 import datetime
 import pandas as pd
 import numpy as np
+import re
 from PyQt5.QtWidgets import QTableWidget
 from PyQt5.QtGui import QColor
 
@@ -16,6 +17,15 @@ def datetime64_to_epoch_ms(datetimes_list: np.ndarray) -> list:
     return [float(instant) / 1e9 for instant in datetimes_list]
 
 
+def convert_to_numeric(str_value: str):
+    """Convert a string to float (if there is a "." in the string) or to integer, if possible."""
+    if re.match("^-?\d+\.\d+$", str_value):
+        return float(str_value)
+    elif re.match("^-?\d+$", str_value):
+        return int(str_value)
+    else:
+        return str_value
+
 ####################################################################
 # Graphics
 
-- 
GitLab