]> SALOME platform Git repositories - modules/eficas.git/commitdiff
Salome HOME
Simplified catalog description management with readercata
authorRenaud Barate <renaud.barate@edf.fr>
Thu, 1 Jul 2010 14:26:22 +0000 (14:26 +0000)
committerRenaud Barate <renaud.barate@edf.fr>
Thu, 1 Jul 2010 14:26:22 +0000 (14:26 +0000)
Editeur/catadesc.py [new file with mode: 0644]
InterfaceQT4/monChoixCata.py
InterfaceQT4/monUniqueBasePanel.py
InterfaceQT4/readercata.py
Noyau/N_VALIDATOR.py

diff --git a/Editeur/catadesc.py b/Editeur/catadesc.py
new file mode 100644 (file)
index 0000000..ff0d868
--- /dev/null
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
+class CatalogDescription:
+    
+    def __init__(self, identifier, cata_file_path, file_format = "python",
+                 default = False, code = None, user_name = None,
+                 selectable = True):
+        """
+        This class can be used to describe an Eficas catalog.
+
+        :type  identifier: string
+        :param identifier: unique identifier for the catalog
+                
+        :type  cata_file_path: string
+        :param cata_file_path: path of the file containing the catalog itself
+                
+        :type  file_format: string
+        :param file_format: format of the files generated when using this
+                            catalog
+                
+        :type  default: boolean
+        :param default: indicate if this catalog is the default one (appear on
+                        the top of the catalogs list)
+                
+        :type  code: string
+        :param code: Deprecated. Used to indicate the code associated to this
+                     catalog
+                
+        :type  user_name: string
+        :param user_name: name of the catalog as it will appear in the list
+                
+        :type  selectable: boolean
+        :param selectable: indicate if this catalog appears in the list.
+                           Setting this parameter to False is useful to keep
+                           old catalogs to edit existing files but to forbid
+                           to use them to create new files.
+                
+        """
+        self.identifier = identifier
+        self.cata_file_path = cata_file_path
+        self.file_format = file_format
+        self.default = default
+        self.code = code
+        if user_name is None:
+            self.user_name = identifier
+        else:
+            self.user_name = user_name
+        self.selectable = selectable
+
+    @staticmethod
+    def create_from_tuple(cata_tuple):
+        print "Warning: Describing a catalog with a tuple is deprecated. " \
+              "Please create a CatalogDescription instance directly."
+        desc = CatalogDescription(code = cata_tuple[0],
+                                  identifier = cata_tuple[1],
+                                  cata_file_path = cata_tuple[2],
+                                  file_format = cata_tuple[3])
+        if len(cata_tuple) == 5 and cata_tuple[4] == "defaut":
+            desc.default = True
+        return desc
index 169d37c092bf13cffd9632c015917afdadf23ad1..2c1a74982b5487f59b392f2b9a07d94f783bc95c 100644 (file)
@@ -32,30 +32,23 @@ from PyQt4.QtCore import *
 
 class MonChoixCata(Ui_DChoixCata,QtGui.QDialog):
   """
-  Classe définissant le panel associé aux mots-clés qui demandent
-  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
-  discrètes
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+  discrètes
   """
-  def __init__(self,listeCata,readercata, QWparent , name = None,fl = 0):
-      QtGui.QDialog.__init__(self,QWparent)
+  def __init__(self, QWparent, listeCata, title = None):
+      QtGui.QDialog.__init__(self, QWparent)
       self.setModal(True)
       self.setupUi(self)
-      self.listeCata=listeCata
-      self.readercata=readercata
-      for cata in self.listeCata :
-               self.CBChoixCata.insertItem(100,cata)
-      lab  = QString(repr(len(listeCata)))
-      lab += QString(" versions du catalogue sont disponibles")
-      self.TLNb.setText(lab)
-      self.CBChoixCata.setCurrentIndex(0)
-      self.readercata.version_cata=self.CBChoixCata.currentText()
+      self.CBChoixCata.addItems(listeCata)
+      self.TLNb.setText(QString("%d versions du catalogue sont disponibles" %
+                                len(listeCata)))
+      if title is not None:
+          self.setWindowTitle(QString.fromUtf8(title))
 
   def on_buttonCancel_clicked(self):
       QDialog.reject(self)
 
-  def on_CBChoixCata_activated(self):
-      self.readercata.version_cata=self.CBChoixCata.currentText()
-
   def on_buttonOk_clicked(self):
       QDialog.accept(self)
 
index 39892c224db8e743651f7aa1f7c4f9e8bd53a8ef..f85909166d10a3cb894e1de3087f29168abf453b 100644 (file)
@@ -88,6 +88,7 @@ class MonUniqueBasePanel(DUnBase,QTPanel,SaisieValeur):
         else :
           self.bParametres.close()
         type = mc.type[0]
+        # TODO: Use type properties instead of hard-coded "grno" and "grma" type check
         enable_salome_selection = self.editor.salome and \
             (('grma' in repr(type)) or ('grno' in repr(type)) or
              (hasattr(type, "enable_salome_selection") and type.enable_salome_selection))
index 174ced8c60cc1c023ff6a603d85c5fc21f2c625f..7a88e5ad7393921f923d5efa50af7999aefa4b57 100644 (file)
@@ -29,9 +29,11 @@ import os,sys,py_compile
 import traceback
 import cPickle
 import re
+import types
 
 # Modules Eficas
 from Noyau.N_CR import CR
+from Editeur.catadesc import CatalogDescription
 from Editeur.utils  import init_rep_cata_dev
 
 import analyse_catalogue
@@ -72,9 +74,20 @@ class READERCATA:
 
       liste_cata_possibles=[]
       self.Commandes_Ordre_Catalogue=[]
+
+      all_cata_list = []
       for catalogue in self.appliEficas.CONFIGURATION.catalogues:
-          if catalogue[0] == self.code :
-             if (self.ssCode == None) or (self.ssCode == catalogue[3]):
+          if isinstance(catalogue, CatalogDescription):
+              all_cata_list.append(catalogue)
+          elif isinstance(catalogue, types.TupleType):
+              all_cata_list.append(CatalogDescription.create_from_tuple(catalogue))
+          else:
+              print "Catalog description cannot be interpreted: ", catalogue
+
+      # TODO: Remove this filter. Normally, CONFIGURATION should only define the catalogs for this code anyway.
+      for catalogue in all_cata_list:
+          if catalogue.code == self.code :
+             if (self.ssCode == None) or (self.ssCode == catalogue.file_format):
                  liste_cata_possibles.append(catalogue)
 
       if len(liste_cata_possibles)==0:          
@@ -82,34 +95,49 @@ class READERCATA:
           self.appliEficas.close()
           if self.appliEficas.salome == 0 :
              sys.exit(1)
+          return
 
 
       if self.version_code is not None:
           # La version a ete fixee
           for cata in liste_cata_possibles:
-             if self.version_code == cata[1]:
-                self.fic_cata = cata[2]
-                self.appliEficas.format_fichier=cata[3]
-      elif len(liste_cata_possibles)==1:
-          self.fic_cata = liste_cata_possibles[0][2]
-          self.version_code = liste_cata_possibles[0][1]
-          self.appliEficas.format_fichier=liste_cata_possibles[0][3] 
-          lab=QString("Eficas ") 
-          lab+=QString(self.VERSION_EFICAS) 
-          lab+=QString(" pour ")
-          lab+=QString(self.code) 
-          lab+=QString(" avec le catalogue ")
-          lab+=self.version_code
-          try :
-          # souci pour les includes et sans Ihm
-              self.appliEficas.setWindowTitle(lab)
-          except :
-              pass
+             if self.version_code == cata.identifier:
+                self.fic_cata = cata.cata_file_path
+                self.appliEficas.format_fichier = cata.file_format
       else:
-          # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
-          # lequel il veut utiliser ...
-          self.ask_choix_catalogue()
-          # On est dans Salome et il faut sortir proprement
+          cata_choice_list = []
+          for cata in liste_cata_possibles:
+              if cata.selectable:
+                  if cata.default:
+                      cata_choice_list.insert(0, cata)
+                  else :
+                      cata_choice_list.append(cata)
+          if len(cata_choice_list) == 0:
+              QMessageBox.critical(self.QWParent, "Import du catalogue",
+                                   QString.fromUtf8("Aucun catalogue trouvé"))
+              self.appliEficas.close()
+              if self.appliEficas.salome == 0 :
+                 sys.exit(1)
+          elif len(cata_choice_list) == 1:
+              self.fic_cata = cata_choice_list[0].cata_file_path
+              self.version_code = cata_choice_list[0].identifier
+              self.appliEficas.format_fichier = cata_choice_list[0].file_format
+              lab=QString("Eficas ") 
+              lab+=QString(self.VERSION_EFICAS) 
+              lab+=QString(" pour ")
+              lab+=QString(self.code) 
+              lab+=QString(" avec le catalogue ")
+              lab+=self.version_code
+              try :
+              # souci pour les includes et sans Ihm
+                  self.appliEficas.setWindowTitle(lab)
+              except :
+                  pass
+          else:
+              # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
+              # lequel il veut utiliser ...
+              self.ask_choix_catalogue(cata_choice_list)
+              # On est dans Salome et il faut sortir proprement
 
       if self.fic_cata == None :
           if self.appliEficas.salome == 0 :
@@ -205,38 +233,13 @@ class READERCATA:
       rep_cata = os.path.dirname(self.fic_cata)
       self.Commandes_Ordre_Catalogue = analyse_catalogue_initial.analyse_catalogue(self.fic_cata)
 
-   def ask_choix_catalogue(self):
+   def ask_choix_catalogue(self, cata_choice_list):
       """
-      Ouvre une fenetre de sélection du catalogue dans le cas o¹ plusieurs
+      Ouvre une fenetre de sélection du catalogue dans le cas où plusieurs
       ont été définis dans Accas/editeur.ini
       """      
-      # construction du dictionnaire et de la liste des catalogues
-      self.dico_catalogues = {}
-      liste_choix=[]
-      for catalogue in self.appliEficas.CONFIGURATION.catalogues:
-          if catalogue[0] == self.code :
-              self.dico_catalogues[catalogue[1]] = catalogue
-              if len(catalogue) == 5 :
-                  if catalogue[4]=='defaut' : 
-                     liste_choix.insert(0,catalogue[1])
-              else :
-                  liste_choix.append(catalogue[1])
-      
-
-      lab=QString(self.VERSION_EFICAS)
-      lab+=QString(" pour ")
-      lab+=QString(self.code) 
-      lab+=QString(" avec le catalogue ")
-
-      # teste si plusieurs catalogues ou non
-      if len(liste_choix) == 0:          
-          QMessageBox.critical( self.QWParent, "", QString.fromUtf8("Aucun catalogue déclaré pour %s" %self.code))
-         self.appliEficas.close()
-          if self.appliEficas.salome == 0 :
-             sys.exit(1)
-          
-      # création d'une boite de dialogue modale
-      widgetChoix=MonChoixCata(liste_choix,self, self.appliEficas, "", True )
+      title = getattr(self.appliEficas.CONFIGURATION, "cata_choice_window_title", None)
+      widgetChoix = MonChoixCata(self.appliEficas, [cata.user_name for cata in cata_choice_list], title)
       ret=widgetChoix.exec_()
       
       lab=QString(self.VERSION_EFICAS)
@@ -244,19 +247,19 @@ class READERCATA:
       lab+=QString(self.code) 
       lab+=QString(" avec le catalogue ")
       if ret == QDialog.Accepted:
-          self.version_cata=str(self.version_cata)
-          self.fic_cata = self.dico_catalogues[self.version_cata][2]
+          cata = cata_choice_list[widgetChoix.CBChoixCata.currentIndex()]
+          self.version_cata = cata.identifier
+          self.fic_cata = cata.cata_file_path
           self.version_code = self.version_cata
-          self.appliEficas.format_fichier = self.dico_catalogues[self.version_cata][3]
+          self.appliEficas.format_fichier = cata.file_format
           lab+=self.version_cata
           self.appliEficas.setWindowTitle(lab)
           #qApp.mainWidget().setCaption(lab)
-      else :
-         self.appliEficas.close()
+      else:
+          self.appliEficas.close()
           if self.appliEficas.salome == 0 :
              sys.exit(0)
 
-
    def traite_clefs_documentaires(self):
       try:
         self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
index 7a60b914a4aac9f0067081ba7ba624350fdfffdb..513f172b73c14529e8380cc37fa196d7192910ef 100644 (file)
@@ -130,7 +130,8 @@ class TypeProtocol(PProtocol):
                 if is_str(obj): return obj
             elif type_permis == 'Fichier' :
                  import os
-                 if os.path.isfile(obj):return obj
+                 if (len(typ) > 2 and typ[2] == "Sauvegarde") or os.path.isfile(obj):
+                     return obj
                  else : raise ValError("%s n'est pas un fichier valide" % repr(obj))
             elif type(type_permis) == types.ClassType or isinstance(type_permis,type):
                 try: