From 0b0c402baf5ead8d4c31fb5888cbd2b73115f3a2 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Mon, 11 Sep 2023 11:20:08 +0200
Subject: [PATCH] Model: Add PamhyrModelListWithTab. Use it in BC and LC.

---
 .../BoundaryConditionList.py                  |  77 +------------
 .../LateralContributionList.py                |  77 +------------
 src/Model/Tools/PamhyrList.py                 | 105 +++++++++++++++++-
 3 files changed, 110 insertions(+), 149 deletions(-)

diff --git a/src/Model/BoundaryCondition/BoundaryConditionList.py b/src/Model/BoundaryCondition/BoundaryConditionList.py
index 2514f326..d4ffc6bf 100644
--- a/src/Model/BoundaryCondition/BoundaryConditionList.py
+++ b/src/Model/BoundaryCondition/BoundaryConditionList.py
@@ -20,6 +20,7 @@ from copy import copy
 from tools import trace, timer
 
 from Model.DB import SQLSubModel
+from Model.Tools.PamhyrList import PamhyrModelListWithTab
 from Model.Except import NotImplementedMethodeError
 
 from Model.BoundaryCondition.BoundaryCondition import BoundaryCondition
@@ -30,30 +31,12 @@ from Model.BoundaryCondition.BoundaryConditionTypes import (
     Solid,
 )
 
-class BoundaryConditionList(SQLSubModel):
+class BoundaryConditionList(PamhyrModelListWithTab):
+    _tabs_list = ["liquid", "solid", "suspenssion"]
     _sub_classes = [
         BoundaryCondition,
     ]
 
-    def __init__(self, status = None):
-        super(BoundaryConditionList, self).__init__()
-
-        self._status = status
-
-        self._tabs = {
-            "liquid" : [],
-            "solid" : [],
-            "suspenssion" : []
-        }
-
-    @classmethod
-    def _sql_create(cls, execute):
-        return cls._create_submodel(execute)
-
-    @classmethod
-    def _sql_update(cls, execute, version):
-        return True
-
     @classmethod
     def _sql_load(cls, execute, data = None):
         new = cls(status = data['status'])
@@ -82,66 +65,12 @@ class BoundaryConditionList(SQLSubModel):
 
         return True
 
-    def len(self, lst):
-        return len(self._tabs[lst])
-
-    def get_tab(self, lst):
-        return self._tabs[lst].copy()
-
-    def get(self, lst, row):
-        return self._tabs[lst][row]
-
-    def set(self, lst, row, new):
-        self._tabs[lst][row] = new
-        self._status.modified()
-
     def new(self, lst, index):
         n = NotDefined(status=self._status)
         self._tabs[lst].insert(index, n)
         self._status.modified()
         return n
 
-    def insert(self, lst, index, new):
-        self._tabs[lst].insert(index, new)
-        self._status.modified()
-
-    def delete(self, lst, bcs):
-        for bc in bcs:
-            self._tabs[lst].remove(bc)
-        self._status.modified()
-
-    def delete_i(self, lst, indexes):
-        bcs = list(
-            map(
-                lambda x: x[1],
-                filter(
-                    lambda x: x[0] in indexes,
-                    enumerate(self._tabs[lst])
-                )
-            )
-        )
-        self.delete(lst, bcs)
-
-    def sort(self, lst, reverse=False, key=None):
-        self._tabs[lst].sort(reverse=reverse, key=key)
-        self._status.modified()
-
-    def move_up(self, lst, index):
-        if index < len(self._tabs[lst]):
-            next = index - 1
-
-            l = self._tabs[lst]
-            l[index], l[next] = l[next], l[index]
-            self._status.modified()
-
-    def move_down(self, lst, index):
-        if index >= 0:
-            prev = index + 1
-
-            l = self._tabs[lst]
-            l[index], l[prev] = l[prev], l[index]
-            self._status.modified()
-
     def __copy__(self):
         new = BoundaryConditionList()
 
diff --git a/src/Model/LateralContribution/LateralContributionList.py b/src/Model/LateralContribution/LateralContributionList.py
index ca7c111e..6622a94f 100644
--- a/src/Model/LateralContribution/LateralContributionList.py
+++ b/src/Model/LateralContribution/LateralContributionList.py
@@ -20,6 +20,7 @@ from copy import copy
 from tools import trace, timer
 
 from Model.DB import SQLSubModel
+from Model.Tools.PamhyrList import PamhyrModelListWithTab
 from Model.Except import NotImplementedMethodeError
 
 from Model.LateralContribution.LateralContribution import LateralContribution
@@ -27,30 +28,12 @@ from Model.LateralContribution.LateralContributionTypes import (
     NotDefined, LateralContrib, Rain, Evaporation,
 )
 
-class LateralContributionList(SQLSubModel):
+class LateralContributionList(PamhyrModelListWithTab):
+    _tabs_list = ["liquid", "solid", "suspenssion"]
     _sub_classes = [
         LateralContribution,
     ]
 
-    def __init__(self, status = None):
-        super(LateralContributionList, self).__init__()
-
-        self._status = status
-
-        self._tabs = {
-            "liquid" : [],
-            "solid" : [],
-            "suspenssion" : []
-        }
-
-    @classmethod
-    def _sql_create(cls, execute):
-        return cls._create_submodel(execute)
-
-    @classmethod
-    def _sql_update(cls, execute, version):
-        return True
-
     @classmethod
     def _sql_load(cls, execute, data = None):
         new = cls(status = data['status'])
@@ -79,66 +62,12 @@ class LateralContributionList(SQLSubModel):
 
         return True
 
-    def len(self, lst):
-        return len(self._tabs[lst])
-
-    def get_tab(self, lst):
-        return self._tabs[lst].copy()
-
-    def get(self, lst, row):
-        return self._tabs[lst][row]
-
-    def set(self, lst, row, new):
-        self._tabs[lst][row] = new
-        self._status.modified()
-
     def new(self, lst, index):
         n = NotDefined(status=self._status)
         self._tabs[lst].insert(index, n)
         self._status.modified()
         return n
 
-    def insert(self, lst, index, new):
-        self._tabs[lst].insert(index, new)
-        self._status.modified()
-
-    def delete(self, lst, bcs):
-        for bc in bcs:
-            self._tabs[lst].remove(bc)
-        self._status.modified()
-
-    def delete_i(self, lst, indexes):
-        bcs = list(
-            map(
-                lambda x: x[1],
-                filter(
-                    lambda x: x[0] in indexes,
-                    enumerate(self._tabs[lst])
-                )
-            )
-        )
-        self.delete(lst, bcs)
-
-    def sort(self, lst, reverse=False, key=None):
-        self._tabs[lst].sort(reverse=reverse, key=key)
-        self._status.modified()
-
-    def move_up(self, lst, index):
-        if index < len(self._tabs[lst]):
-            next = index - 1
-
-            l = self._tabs[lst]
-            l[index], l[next] = l[next], l[index]
-            self._status.modified()
-
-    def move_down(self, lst, index):
-        if index >= 0:
-            prev = index + 1
-
-            l = self._tabs[lst]
-            l[index], l[prev] = l[prev], l[index]
-            self._status.modified()
-
     def __copy__(self):
         new = LateralContributionList()
 
diff --git a/src/Model/Tools/PamhyrList.py b/src/Model/Tools/PamhyrList.py
index bf8537dd..8807c149 100644
--- a/src/Model/Tools/PamhyrList.py
+++ b/src/Model/Tools/PamhyrList.py
@@ -81,7 +81,7 @@ class PamhyrModelList(SQLSubModel):
         Returns:
             The new elements
         """
-        raise NotImplementedMethodeError(self, self._sql_save)
+        raise NotImplementedMethodeError(self, self.new)
 
     def insert(self, index, new):
         self._lst.insert(index, new)
@@ -123,3 +123,106 @@ class PamhyrModelList(SQLSubModel):
             l = self._lst
             l[index], l[prev] = l[prev], l[index]
             self._status.modified()
+
+
+class PamhyrModelListWithTab(SQLSubModel):
+    _tabs_list = []
+    _sub_classes = [
+    ]
+
+    def __init__(self, status = None):
+        super(PamhyrModelListWithTab, self).__init__()
+
+        self._status = status
+        self._tabs = {}
+        for tab in self._tabs_list:
+            self._tabs[tab] = []
+
+    #######
+    # SQL #
+    #######
+
+    @classmethod
+    def _sql_create(cls, execute):
+        return cls._create_submodel(execute)
+
+    @classmethod
+    def _sql_update(cls, execute, version):
+        return cls._update_submodel(execute, version)
+
+    @classmethod
+    def _sql_load(cls, execute, data = None):
+        raise NotImplementedMethodeError(cls, cls._sql_load)
+
+    def _sql_save(self, execute, data = None):
+        raise NotImplementedMethodeError(self, self._sql_save)
+
+    ################
+    # MODEL METHOD #
+    ################
+
+    def len(self, lst):
+        return len(self._tabs[lst])
+
+    def get_tab(self, lst):
+        return self._tabs[lst].copy()
+
+    def get(self, lst, row):
+        return self._tabs[lst][row]
+
+    def set(self, lst, row, new):
+        self._tabs[lst][row] = new
+        self._status.modified()
+
+    def new(self, lst, index):
+        """Create new elements and add it to list
+
+        Args:
+            lst: The tab name
+            index: The index of new elements
+
+        Returns:
+            The new elements
+        """
+        raise NotImplementedMethodeError(self, self.new)
+
+    def insert(self, lst, index, new):
+        self._tabs[lst].insert(index, new)
+        self._status.modified()
+
+    def delete(self, lst, els):
+        for el in els:
+            self._tabs[lst].remove(el)
+        self._status.modified()
+
+    def delete_i(self, lst, indexes):
+        els = list(
+            map(
+                lambda x: x[1],
+                filter(
+                    lambda x: x[0] in indexes,
+                    enumerate(self._tabs[lst])
+                )
+            )
+        )
+        self.delete(lst, els)
+
+    def sort(self, lst, reverse=False, key=None):
+        self._tabs[lst].sort(reverse=reverse, key=key)
+        self._status.modified()
+
+    def move_up(self, lst, index):
+        if index < len(self._tabs[lst]):
+            next = index - 1
+
+            l = self._tabs[lst]
+            l[index], l[next] = l[next], l[index]
+            self._status.modified()
+
+    def move_down(self, lst, index):
+        if index >= 0:
+            prev = index + 1
+
+            l = self._tabs[lst]
+            l[index], l[prev] = l[prev], l[index]
+            self._status.modified()
-- 
GitLab