From 76030c6ccb79d1b7a49b2f8ba0262e1894464b88 Mon Sep 17 00:00:00 2001 From: "pascale.noyret" Date: Tue, 19 May 2015 14:46:00 +0200 Subject: [PATCH] mise en coherence validation Aster --- Validation/V_AU_MOINS_UN.py | 81 +++--- Validation/V_AU_PLUS_UN.py | 106 ++++---- Validation/V_A_CLASSER.py | 211 ++++++++-------- Validation/V_ENSEMBLE.py | 93 +++---- Validation/V_ETAPE.py | 433 +++++++++++++++++--------------- Validation/V_EXCLUS.py | 79 +++--- Validation/V_JDC.py | 144 +++++------ Validation/V_MACRO_ETAPE.py | 373 ++++++++++++++------------- Validation/V_MCBLOC.py | 116 ++++----- Validation/V_MCCOMPO.py | 221 ++++++++-------- Validation/V_MCFACT.py | 144 ++++++----- Validation/V_MCLIST.py | 202 ++++++++------- Validation/V_MCSIMP.py | 366 +++++++++++++-------------- Validation/V_MEME_NOMBRE.py | 113 ++++----- Validation/V_PRESENT_ABSENT.py | 87 +++---- Validation/V_PRESENT_PRESENT.py | 84 ++++--- Validation/V_PROC_ETAPE.py | 98 ++++---- Validation/V_UN_PARMI.py | 83 +++--- 18 files changed, 1573 insertions(+), 1461 deletions(-) diff --git a/Validation/V_AU_MOINS_UN.py b/Validation/V_AU_MOINS_UN.py index 5f1afea0..735b7162 100644 --- a/Validation/V_AU_MOINS_UN.py +++ b/Validation/V_AU_MOINS_UN.py @@ -1,49 +1,52 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== class AU_MOINS_UN: - """ - La règle AU_MOINS_UN vérifie que l'on trouve au moins un des mots-clés - de la règle parmi les arguments d'un OBJECT. - Ces arguments sont transmis à la règle pour validation sous la forme - d'une liste de noms de mots-clés ou d'un dictionnaire dont - les clés sont des noms de mots-clés. - """ - def verif(self,args): - """ - La méthode verif vérifie que l'on trouve au moins un des mos-clés - de la liste self.mcs parmi les éléments de args + """ + La règle AU_MOINS_UN vérifie que l'on trouve au moins un des mots-clés + de la règle parmi les arguments d'un OBJECT. + + Ces arguments sont transmis à la règle pour validation sous la forme + d'une liste de noms de mots-clés ou d'un dictionnaire dont + les clés sont des noms de mots-clés. + """ - args peut etre un dictionnaire ou une liste. Les éléments de args - sont soit les éléments de la liste soit les clés du dictionnaire. - """ - # on compte le nombre de mots cles presents - text ='' - count=0 - args = self.liste_to_dico(args) - for mc in self.mcs: - if args.has_key(mc):count=count+1 - if count == 0: - text = u"- Il faut au moins un mot-clé parmi : "+`self.mcs`+'\n' - return text,0 - return text,1 + def verif(self, args): + """ + La méthode verif vérifie que l'on trouve au moins un des mos-clés + de la liste self.mcs parmi les éléments de args + args peut etre un dictionnaire ou une liste. Les éléments de args + sont soit les éléments de la liste soit les clés du dictionnaire. + """ + # on compte le nombre de mots cles presents + text = '' + count = 0 + args = self.liste_to_dico(args) + for mc in self.mcs: + if args.has_key(mc): + count = count + 1 + if count == 0: + text = u"- Il faut au moins un mot-clé parmi : " + `self.mcs`+'\n' + return text, 0 + return text, 1 diff --git a/Validation/V_AU_PLUS_UN.py b/Validation/V_AU_PLUS_UN.py index e9ac6f48..324608c0 100644 --- a/Validation/V_AU_PLUS_UN.py +++ b/Validation/V_AU_PLUS_UN.py @@ -1,58 +1,62 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# 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 AU_PLUS_UN: - """ - La règle vérifie que l'on trouve 1 (au plus) des mots-clés - de la règle parmi les arguments d'un OBJECT. - Ces arguments sont transmis à la règle pour validation sous la forme - d'une liste de noms de mots-clés ou d'un dictionnaire dont - les clés sont des noms de mots-clés. - """ - def verif(self, args): - """ - La méthode verif vérifie que l'on trouve 1 (au plus) des mos-clés - de la liste self.mcs parmi les éléments de args + """ + La règle vérifie que l'on trouve 1 (au plus) des mots-clés + de la règle parmi les arguments d'un OBJECT. + + Ces arguments sont transmis à la règle pour validation sous la forme + d'une liste de noms de mots-clés ou d'un dictionnaire dont + les clés sont des noms de mots-clés. + """ + + def verif(self, args): + """ + La méthode verif vérifie que l'on trouve 1 (au plus) des mos-clés + de la liste self.mcs parmi les éléments de args - args peut etre un dictionnaire ou une liste. Les éléments de args - sont soit les éléments de la liste soit les clés du dictionnaire. - """ - # on compte le nombre de mots cles presents - text = '' - count = 0 - args = self.liste_to_dico(args) - for mc in self.mcs: - count = count + args.get(mc, 0) - if count > 1: - text = u"- Il ne faut qu'un mot-clé (au plus) parmi : "+`self.mcs`+'\n' - return text, 0 - return text, 1 + args peut etre un dictionnaire ou une liste. Les éléments de args + sont soit les éléments de la liste soit les clés du dictionnaire. + """ + # on compte le nombre de mots cles presents + text = '' + count = 0 + args = self.liste_to_dico(args) + for mc in self.mcs: + count = count + args.get(mc, 0) + if count > 1: + text = u"- Il ne faut qu'un mot-clé (au plus) parmi : " + \ + `self.mcs`+'\n' + return text, 0 + return text, 1 - def liste_to_dico(self, args) : - if type(args) is dict: - return args - elif type(args) in (list, tuple): - dico={} - for arg in args: - dico[arg] = dico.get(arg, 0) + 1 - return dico - else : - raise Exception("Erreur ce n'est ni un dictionnaire ni une liste %s" % args) + def liste_to_dico(self, args): + if type(args) is dict: + return args + elif type(args) in (list, tuple): + dico = {} + for arg in args: + dico[arg] = dico.get(arg, 0) + 1 + return dico + else: + raise Exception( + "Erreur ce n'est ni un dictionnaire ni une liste %s" % args) diff --git a/Validation/V_A_CLASSER.py b/Validation/V_A_CLASSER.py index c77083c8..a5e62298 100644 --- a/Validation/V_A_CLASSER.py +++ b/Validation/V_A_CLASSER.py @@ -1,114 +1,121 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2012 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== + from Noyau.strfunc import convert, ufmt -class A_CLASSER: - """ - La règle A_CLASSER vérifie que ... - """ - def __init__(self,*args): - if len(args) > 2 : - print convert(ufmt(_(u"Erreur à la création de la règle A_CLASSER(%s)"), - args)) - return - self.args=args - if type(args[0]) == tuple: - self.args0 = args[0] - elif type(args[0]) == str: - self.args0 = (args[0],) - else : - print convert(ufmt(_(u"Le premier argument de : %s doit etre un " - u"tuple ou une chaine"), args)) - if type(args[1]) == tuple: - self.args1 = args[1] - elif type(args[1]) == str: - self.args1 = (args[1],) - else : - print convert(ufmt(_(u"Le deuxième argument de :%s doit etre un " - u"tuple ou une chaine"), args)) - # création de la liste des mcs - liste = [] - liste.extend(self.args0) - liste.extend(self.args1) - self.mcs = liste - self.init_couples_permis() +class A_CLASSER: - def init_couples_permis(self): - """ Crée la liste des couples permis parmi les self.args, càd pour chaque élément - de self.args0 crée tous les couples possibles avec un élément de self.args1""" - liste = [] - for arg0 in self.args0: - for arg1 in self.args1: - liste.append((arg0,arg1)) - self.liste_couples = liste + """ + La règle A_CLASSER vérifie que ... - def verif(self,args): - """ - args peut etre un dictionnaire ou une liste. Les éléments de args - sont soit les éléments de la liste soit les clés du dictionnaire. - """ - # création de la liste des couples présents dans le fichier de commandes - l_couples = [] - couple = [] - text = u'' - test = 1 - for nom in args: - if nom in self.mcs : - couple.append(nom) - if len(couple) == 2 : - l_couples.append(tuple(couple)) - couple = [nom,] - if len(couple) > 0 : - l_couples.append(tuple(couple)) - # l_couples peut etre vide si l'on n'a pas réussi à trouver au moins un - # élément de self.mcs - if len(l_couples) == 0 : - message = ufmt(_(u"- Il faut qu'au moins un objet de la liste : %r" - u" soit suivi d'au moins un objet de la liste : %r"), - self.args0, self.args1) - return message,0 - # A ce stade, on a trouvé des couples : il faut vérifier qu'ils sont - # tous licites - num = 0 - for couple in l_couples : - num = num+1 - if len(couple) == 1 : - # on a un 'faux' couple - if couple[0] not in self.args1: - text = text + ufmt(_(u"- L'objet : %s doit être suivi d'un objet de la liste : %r\n"), - couple[0], self.args1) - test = 0 - else : - if num > 1 : - # ce n'est pas le seul couple --> licite - break - else : - text = text + ufmt(_(u"- L'objet : %s doit être précédé d'un objet de la liste : %r\n"), - couple[0], self.args0) - test = 0 - elif couple not in self.liste_couples : - text = text + ufmt(_(u"- L'objet : %s ne peut être suivi de : %s\n"), - couple[0], couple[1]) - test = 0 - return text,test + """ + def __init__(self, *args): + if len(args) > 2: + print convert( + ufmt(_(u"Erreur à la création de la règle A_CLASSER(%s)"), + args)) + return + self.args = args + if type(args[0]) == tuple: + self.args0 = args[0] + elif type(args[0]) == str: + self.args0 = (args[0],) + else: + print convert(ufmt(_(u"Le premier argument de : %s doit etre un " + u"tuple ou une chaine"), args)) + if type(args[1]) == tuple: + self.args1 = args[1] + elif type(args[1]) == str: + self.args1 = (args[1],) + else: + print convert(ufmt(_(u"Le deuxième argument de :%s doit etre un " + u"tuple ou une chaine"), args)) + # création de la liste des mcs + liste = [] + liste.extend(self.args0) + liste.extend(self.args1) + self.mcs = liste + self.init_couples_permis() + def init_couples_permis(self): + """ Crée la liste des couples permis parmi les self.args, càd pour chaque élément + de self.args0 crée tous les couples possibles avec un élément de self.args1""" + liste = [] + for arg0 in self.args0: + for arg1 in self.args1: + liste.append((arg0, arg1)) + self.liste_couples = liste + def verif(self, args): + """ + args peut etre un dictionnaire ou une liste. Les éléments de args + sont soit les éléments de la liste soit les clés du dictionnaire. + """ + # création de la liste des couples présents dans le fichier de + # commandes + l_couples = [] + couple = [] + text = u'' + test = 1 + for nom in args: + if nom in self.mcs: + couple.append(nom) + if len(couple) == 2: + l_couples.append(tuple(couple)) + couple = [nom, ] + if len(couple) > 0: + l_couples.append(tuple(couple)) + # l_couples peut etre vide si l'on n'a pas réussi à trouver au moins un + # élément de self.mcs + if len(l_couples) == 0: + message = ufmt(_(u"- Il faut qu'au moins un objet de la liste : %r" + u" soit suivi d'au moins un objet de la liste : %r"), + self.args0, self.args1) + return message, 0 + # A ce stade, on a trouvé des couples : il faut vérifier qu'ils sont + # tous licites + num = 0 + for couple in l_couples: + num = num + 1 + if len(couple) == 1: + # on a un 'faux' couple + if couple[0] not in self.args1: + text = text + ufmt( + _(u"- L'objet : %s doit être suivi d'un objet de la liste : %r\n"), + couple[0], self.args1) + test = 0 + else: + if num > 1: + # ce n'est pas le seul couple --> licite + break + else: + text = text + ufmt( + _(u"- L'objet : %s doit être précédé d'un objet de la liste : %r\n"), + couple[0], self.args0) + test = 0 + elif couple not in self.liste_couples: + text = text + ufmt( + _(u"- L'objet : %s ne peut être suivi de : %s\n"), + couple[0], couple[1]) + test = 0 + return text, test diff --git a/Validation/V_ENSEMBLE.py b/Validation/V_ENSEMBLE.py index 7a5546cd..b062ba58 100644 --- a/Validation/V_ENSEMBLE.py +++ b/Validation/V_ENSEMBLE.py @@ -1,56 +1,57 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== class ENSEMBLE: - """ - La règle vérifie que si un mot-clé de self.mcs est present - parmi les elements de args tous les autres doivent etre presents. - - Ces arguments sont transmis à la règle pour validation sous la forme - d'une liste de noms de mots-clés ou d'un dictionnaire dont - les clés sont des noms de mots-clés. - """ - def verif(self,args): - """ - La methode verif effectue la verification specifique à la règle. - args peut etre un dictionnaire ou une liste. Les éléments de args - sont soit les éléments de la liste soit les clés du dictionnaire. - """ - # on compte le nombre de mots cles presents, il doit etre egal a la liste - # figurant dans la regle - text = '' - test = 1 - args = self.liste_to_dico(args) - pivot = None - for mc in self.mcs: - if args.has_key(mc): - pivot = mc - break - if pivot : - for mc in self.mcs: - if mc != pivot : - if not args.has_key(mc): - text = text + "- "+ pivot + u" étant présent, "+mc+ u" doit être présent"+'\n' - test = 0 - return text,test + """ + La règle vérifie que si un mot-clé de self.mcs est present + parmi les elements de args tous les autres doivent etre presents. + Ces arguments sont transmis à la règle pour validation sous la forme + d'une liste de noms de mots-clés ou d'un dictionnaire dont + les clés sont des noms de mots-clés. + """ + def verif(self, args): + """ + La methode verif effectue la verification specifique à la règle. + args peut etre un dictionnaire ou une liste. Les éléments de args + sont soit les éléments de la liste soit les clés du dictionnaire. + """ + # on compte le nombre de mots cles presents, il doit etre egal a la liste + # figurant dans la regle + text = '' + test = 1 + args = self.liste_to_dico(args) + pivot = None + for mc in self.mcs: + if args.has_key(mc): + pivot = mc + break + if pivot: + for mc in self.mcs: + if mc != pivot: + if not args.has_key(mc): + text = text + "- " + pivot + u" étant présent, " + \ + mc + u" doit être présent" + '\n' + test = 0 + return text, test diff --git a/Validation/V_ETAPE.py b/Validation/V_ETAPE.py index 03254488..4d963d1d 100644 --- a/Validation/V_ETAPE.py +++ b/Validation/V_ETAPE.py @@ -1,31 +1,32 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== """ - Ce module contient la classe mixin ETAPE qui porte les méthodes - nécessaires pour réaliser la validation d'un objet de type ETAPE - dérivé de OBJECT. + Ce module contient la classe mixin ETAPE qui porte les méthodes + nécessaires pour réaliser la validation d'un objet de type ETAPE + dérivé de OBJECT. Une classe mixin porte principalement des traitements et est - utilisée par héritage multiple pour composer les traitements. + utilisée par héritage multiple pour composer les traitements. """ # Modules Python import types @@ -35,203 +36,227 @@ import re # Modules EFICAS import V_MCCOMPO +from Noyau import MAXSIZE, MAXSIZE_MSGCHK from Noyau.N_Exception import AsException from Noyau.N_utils import AsType from Noyau.strfunc import ufmt + class ETAPE(V_MCCOMPO.MCCOMPO): - """ - """ - - def valid_child(self): - """ Cette methode teste la validite des mots cles de l'etape """ - for child in self.mc_liste : - if not child.isvalid(): - return 0 - return 1 - - def valid_regles(self,cr): - """ Cette methode teste la validite des regles de l'etape """ - text_erreurs,test_regles = self.verif_regles() - if not test_regles : - if cr == 'oui' : - self.cr.fatal(_(u"Règle(s) non respectée(s) : %s"), text_erreurs) - return 0 - return 1 - - def valid_sdnom(self,cr): - """ Cette methode teste la validite du nom du concept produit par l'etape """ - valid=1 - if self.sd.nom != None : - #if self.jdc and self.jdc.definition.code == 'ASTER' and len(self.sd.nom) > 8 : - # le nom de la sd doit avoir une longueur <= 8 caractères pour ASTER - # if cr == 'oui' : - # self.cr.fatal(_(u"Le nom de concept %s est trop long (8 caractères maxi)"), - # self.sd.nom) - # valid = 0 - if self.sd.nom.find('sansnom') != -1 : - # la SD est 'sansnom' : --> erreur - if cr == 'oui' : - self.cr.fatal(_(u"Pas de nom pour le concept retourné")) - valid = 0 - elif re.search('^SD_[0-9]*$', self.sd.nom): - # la SD est 'SD_' cad son nom = son id donc pas de nom donné par utilisateur : --> erreur - if cr == 'oui' : - self.cr.fatal(_(u"Nom de concept invalide ('SD_' est réservé)")) - valid = 0 - return valid - - def get_valid(self): - if hasattr(self,'valid'): - return self.valid - else: - self.valid=None - return None - - def set_valid(self,valid): - old_valid=self.get_valid() - self.valid = valid - self.state = 'unchanged' - if not old_valid or old_valid != self.valid : - self.init_modif_up() - - def isvalid(self,sd='oui',cr='non'): - """ - Methode pour verifier la validité de l'objet ETAPE. Cette méthode - peut etre appelée selon plusieurs modes en fonction de la valeur - de sd et de cr. - - Si cr vaut oui elle crée en plus un compte-rendu. - - Cette méthode a plusieurs fonctions : - - - mettre à jour l'état de self (update) - - - retourner un indicateur de validité 0=non, 1=oui - - - produire un compte-rendu : self.cr - - """ - if CONTEXT.debug : print "ETAPE.isvalid ",self.nom - if self.state == 'unchanged' : - return self.valid - else: - valid=self.valid_child() - valid=valid * self.valid_regles(cr) - - if self.reste_val != {}: - if cr == 'oui' : - self.cr.fatal(_(u"Mots clés inconnus : %s"), ','.join(self.reste_val.keys())) - valid=0 - - if sd == "non": - # Dans ce cas, on ne teste qu'une validité partielle (sans tests sur le concept produit) - # Conséquence : on ne change pas l'état ni l'attribut valid, on retourne simplement - # l'indicateur de validité valid - return valid - - if self.definition.reentrant == 'n' and self.reuse: - # Il ne peut y avoir de concept reutilise avec un OPER non reentrant - if cr == 'oui' : - self.cr.fatal(_(u'Opérateur non réentrant : ne pas utiliser reuse')) - valid=0 - - if self.sd == None: - # Le concept produit n'existe pas => erreur - if cr == 'oui' : - self.cr.fatal(_(u"Concept retourné non défini")) - valid = 0 + + """ + """ + + def valid_child(self): + """ Cette methode teste la validite des mots cles de l'etape """ + for child in self.mc_liste: + if not child.isvalid(): + return 0 + return 1 + + def valid_regles(self, cr): + """ Cette methode teste la validite des regles de l'etape """ + text_erreurs, test_regles = self.verif_regles() + if not test_regles: + if cr == 'oui': + self.cr.fatal( + _(u"Règle(s) non respectée(s) : %s"), text_erreurs) + return 0 + return 1 + + def valid_sdnom(self, cr): + """ Cette methode teste la validite du nom du concept produit par l'etape """ + valid = 1 + if self.sd.nom != None: + if self.jdc and self.jdc.definition.code == 'ASTER' and len(self.sd.nom) > 8: + # le nom de la sd doit avoir une longueur <= 8 caractères pour + # ASTER + if cr == 'oui': + self.cr.fatal( + _(u"Le nom de concept %s est trop long (8 caractères maxi)"), + self.sd.nom) + valid = 0 + if self.sd.nom.find('sansnom') != -1: + # la SD est 'sansnom' : --> erreur + if cr == 'oui': + self.cr.fatal(_(u"Pas de nom pour le concept retourné")) + valid = 0 + elif re.search('^SD_[0-9]*$', self.sd.nom): + # la SD est 'SD_' cad son nom = son id donc pas de nom donné + # par utilisateur : --> erreur + if cr == 'oui': + self.cr.fatal( + _(u"Nom de concept invalide ('SD_' est réservé)")) + valid = 0 + return valid + + def get_valid(self): + if hasattr(self, 'valid'): + return self.valid else: - valid = valid * self.valid_sdnom(cr) + self.valid = None + return None - if valid: - valid = self.update_sdprod(cr) + def set_valid(self, valid): + old_valid = self.get_valid() + self.valid = valid + self.state = 'unchanged' + if not old_valid or old_valid != self.valid: + self.init_modif_up() - self.set_valid(valid) + def isvalid(self, sd='oui', cr='non'): + """ + Methode pour verifier la validité de l'objet ETAPE. Cette méthode + peut etre appelée selon plusieurs modes en fonction de la valeur + de sd et de cr. - return self.valid + Si cr vaut oui elle crée en plus un compte-rendu. - def update_sdprod(self,cr='non'): - """ - Cette méthode met à jour le concept produit en fonction des conditions initiales : + Cette méthode a plusieurs fonctions : - 1. Il n'y a pas de concept retourné (self.definition.sd_prod == None) + - mettre à jour l'état de self (update) - 2. Le concept retourné n existait pas (self.sd == None) + - retourner un indicateur de validité 0=non, 1=oui - 3. Le concept retourné existait. On change alors son type ou on le supprime + - produire un compte-rendu : self.cr - En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1 - """ - sd_prod=self.definition.sd_prod - if type(sd_prod) == types.FunctionType: # Type de concept retourné calculé - d=self.cree_dict_valeurs(self.mc_liste) - try: - sd_prod= apply(sd_prod,(),d) - except: - # Erreur pendant le calcul du type retourné - if CONTEXT.debug:traceback.print_exc() - self.sd=None - if cr == 'oui' : - l=traceback.format_exception(sys.exc_info()[0], - sys.exc_info()[1], - sys.exc_info()[2]) - self.cr.fatal(_(u'Impossible d affecter un type au résultat\n %s'), ' '.join(l[2:])) - return 0 - # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er - valid=1 - if self.reuse: - if AsType(self.reuse) != sd_prod: - if cr == 'oui' : - self.cr.fatal(_(u'Type de concept réutilisé incompatible avec type produit')) - valid= 0 - if self.sdnom!='': - if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom: - # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom) - if cr == 'oui' : - self.cr.fatal(_(u'Concept réutilisé : le nom de la variable de ' - u'retour devrait être %s et non %s'), - self.reuse.nom, self.sdnom) - valid= 0 - if valid:self.sd=self.reuse - else: - if sd_prod == None:# Pas de concept retourné - # Que faut il faire de l eventuel ancien sd ? - self.sd = None + """ + if CONTEXT.debug: + print "ETAPE.isvalid ", self.nom + if self.state == 'unchanged': + return self.valid else: - if self.sd: - # Un sd existe deja, on change son type - if CONTEXT.debug:print "changement de type:",self.sd,sd_prod - if self.sd.__class__ != sd_prod: - self.sd.change_type(sd_prod) - else: - # Le sd n existait pas , on ne le crée pas - if cr == 'oui' : - self.cr.fatal(_(u"Concept retourné non défini")) - valid=0 - if self.definition.reentrant == 'o': - if cr == 'oui' : - self.cr.fatal(_(u'Commande obligatoirement réentrante : spécifier reuse=concept')) - valid=0 - return valid - - - def report(self): - """ - Methode pour generation d un rapport de validite - """ - self.cr=self.CR(debut=u'Etape : '+self.nom \ - + u' ligne : '+`self.appel[0]`\ - + u' fichier : '+ self.appel[1], - fin = u'Fin Etape : '+self.nom) - self.state = 'modified' - try: - self.isvalid(cr='oui') - except AsException,e: - if CONTEXT.debug : traceback.print_exc() - self.cr.fatal(_(u'Etape : %s ligne : %r fichier : %r %s'), - self.nom, self.appel[0], self.appel[1], e) - for child in self.mc_liste: - self.cr.add(child.report()) - return self.cr - + valid = self.valid_child() + valid = valid * self.valid_regles(cr) + + if self.reste_val != {}: + if cr == 'oui': + self.cr.fatal( + _(u"Mots clés inconnus : %s"), ','.join(self.reste_val.keys())) + valid = 0 + + if sd == "non": + # Dans ce cas, on ne teste qu'une validité partielle (sans tests sur le concept produit) + # Conséquence : on ne change pas l'état ni l'attribut valid, on retourne simplement + # l'indicateur de validité valid + return valid + + if self.definition.reentrant == 'n' and self.reuse: + # Il ne peut y avoir de concept reutilise avec un OPER non + # reentrant + if cr == 'oui': + self.cr.fatal( + _(u'Opérateur non réentrant : ne pas utiliser reuse')) + valid = 0 + + if self.sd == None: + # Le concept produit n'existe pas => erreur + if cr == 'oui': + self.cr.fatal(_(u"Concept retourné non défini")) + valid = 0 + else: + valid = valid * self.valid_sdnom(cr) + + if valid: + valid = self.update_sdprod(cr) + + self.set_valid(valid) + + return self.valid + + def update_sdprod(self, cr='non'): + """ + Cette méthode met à jour le concept produit en fonction des conditions initiales : + + 1. Il n'y a pas de concept retourné (self.definition.sd_prod == None) + + 2. Le concept retourné n existait pas (self.sd == None) + + 3. Le concept retourné existait. On change alors son type ou on le supprime + + En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1 + """ + sd_prod = self.definition.sd_prod + if type(sd_prod) == types.FunctionType: # Type de concept retourné calculé + d = self.cree_dict_valeurs(self.mc_liste) + try: + sd_prod = apply(sd_prod, (), d) + except: + # Erreur pendant le calcul du type retourné + if CONTEXT.debug: + traceback.print_exc() + self.sd = None + if cr == 'oui': + l = traceback.format_exception(sys.exc_info()[0], + sys.exc_info()[1], + sys.exc_info()[2]) + self.cr.fatal( + _(u'Impossible d affecter un type au résultat\n %s'), ' '.join(l[2:])) + return 0 + # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la + # cr\351er + valid = 1 + if self.reuse: + if AsType(self.reuse) != sd_prod: + if cr == 'oui': + self.cr.fatal( + _(u'Type de concept réutilisé incompatible avec type produit')) + valid = 0 + if self.sdnom != '': + if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom: + # Le nom de la variable de retour (self.sdnom) doit etre le + # meme que celui du concept reutilise (self.reuse.nom) + if cr == 'oui': + self.cr.fatal(_(u'Concept réutilisé : le nom de la variable de ' + u'retour devrait être %s et non %s'), + self.reuse.nom, self.sdnom) + valid = 0 + if valid: + self.sd = self.reuse + else: + if sd_prod == None: # Pas de concept retourné + # Que faut il faire de l eventuel ancien sd ? + self.sd = None + else: + if self.sd: + # Un sd existe deja, on change son type + if CONTEXT.debug: + print "changement de type:", self.sd, sd_prod + if self.sd.__class__ != sd_prod: + self.sd.change_type(sd_prod) + else: + # Le sd n existait pas , on ne le crée pas + if cr == 'oui': + self.cr.fatal(_(u"Concept retourné non défini")) + valid = 0 + if self.definition.reentrant == 'o': + if cr == 'oui': + self.cr.fatal( + _(u'Commande obligatoirement réentrante : spécifier reuse=concept')) + valid = 0 + return valid + + def report(self): + """ + Methode pour generation d un rapport de validite + """ + self.cr = self.CR(debut=u'Etape : ' + self.nom + + u' ligne : ' + `self.appel[0]` + + u' fichier : ' + `self.appel[1]`, + fin=u'Fin Etape : ' + self.nom) + self.state = 'modified' + try: + self.isvalid(cr='oui') + except AsException, e: + if CONTEXT.debug: + traceback.print_exc() + self.cr.fatal(_(u'Etape : %s ligne : %r fichier : %r %s'), + self.nom, self.appel[0], self.appel[1], e) + i = 0 + for child in self.mc_liste: + i += 1 + if i > MAXSIZE: + print(MAXSIZE_MSGCHK.format(MAXSIZE, len(self.mc_liste))) + break + self.cr.add(child.report()) + return self.cr diff --git a/Validation/V_EXCLUS.py b/Validation/V_EXCLUS.py index d8a3c54e..da3b602b 100644 --- a/Validation/V_EXCLUS.py +++ b/Validation/V_EXCLUS.py @@ -1,49 +1,50 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com -# - +# ====================================================================== class EXCLUS: - """ - La règle vérifie qu'un seul mot-clé de self.mcs est present - parmi les elements de args. - Ces arguments sont transmis à la règle pour validation sous la forme - d'une liste de noms de mots-clés ou d'un dictionnaire dont - les clés sont des noms de mots-clés. - """ - def verif(self,args): - """ - La methode verif effectue la verification specifique à la règle. - args peut etre un dictionnaire ou une liste. Les éléments de args - sont soit les éléments de la liste soit les clés du dictionnaire. - """ - # on compte le nombre de mots cles presents - text ='' - count=0 - args = self.liste_to_dico(args) - for mc in self.mcs: - if args.has_key(mc):count=count+1 - if count > 1: - text= u"- Il ne faut qu un mot clé parmi : "+`self.mcs`+'\n' - return text,0 - return text,1 + """ + La règle vérifie qu'un seul mot-clé de self.mcs est present + parmi les elements de args. + Ces arguments sont transmis à la règle pour validation sous la forme + d'une liste de noms de mots-clés ou d'un dictionnaire dont + les clés sont des noms de mots-clés. + """ + def verif(self, args): + """ + La methode verif effectue la verification specifique à la règle. + args peut etre un dictionnaire ou une liste. Les éléments de args + sont soit les éléments de la liste soit les clés du dictionnaire. + """ + # on compte le nombre de mots cles presents + text = '' + count = 0 + args = self.liste_to_dico(args) + for mc in self.mcs: + if args.has_key(mc): + count = count + 1 + if count > 1: + text = u"- Il ne faut qu un mot clé parmi : " + `self.mcs`+'\n' + return text, 0 + return text, 1 diff --git a/Validation/V_JDC.py b/Validation/V_JDC.py index dca46405..db34d99b 100644 --- a/Validation/V_JDC.py +++ b/Validation/V_JDC.py @@ -1,30 +1,32 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== + """ - Ce module contient la classe mixin JDC qui porte les méthodes - nécessaires pour réaliser la validation d'un objet de type JDC - dérivé de OBJECT. + Ce module contient la classe mixin JDC qui porte les méthodes + nécessaires pour réaliser la validation d'un objet de type JDC + dérivé de OBJECT. Une classe mixin porte principalement des traitements et est - utilisée par héritage multiple pour composer les traitements. + utilisée par héritage multiple pour composer les traitements. """ # Modules EFICAS import V_MCCOMPO @@ -32,59 +34,61 @@ from Noyau.N_Exception import AsException from Noyau.N_utils import AsType from Noyau.strfunc import ufmt + class JDC(V_MCCOMPO.MCCOMPO): - """ - """ - def report(self): - """ - Methode pour generation d un rapport de validite - """ - self.cr.purge() - self.cr.debut="DEBUT CR validation : "+self.nom - self.cr.fin="FIN CR validation :"+self.nom - for e in self.etapes : - if e.isactif(): - self.cr.add(e.report()) - self.state = 'modified' - self.isvalid(cr='oui') - return self.cr + """ + """ - def isvalid(self,cr='non'): - """ - Méthode booléenne qui retourne 0 si le JDC est invalide, 1 sinon - """ - # FR : on prend en compte l'état du JDC ('unchanged','modified','undetermined') - # afin d'accélérer le test de validité du JDC - if self.state == 'unchanged': - return self.valid - else: - valid = 1 - texte,test = self.verif_regles() - if test == 0: - if cr == 'oui': - self.cr.fatal(' '.strip(texte)) - valid = 0 - if valid : - for e in self.etapes: - if not e.isactif() : continue - if not e.isvalid(): - valid = 0 - break - self.state="unchanged" - self.valid = valid - return self.valid + def report(self): + """ + Methode pour generation d un rapport de validite + """ + self.cr.purge() + self.cr.debut = "DEBUT CR validation : " + self.nom + self.cr.fin = "FIN CR validation :" + self.nom + for e in self.etapes: + if e.isactif(): + self.cr.add(e.report()) + self.state = 'modified' + self.isvalid(cr='oui') + return self.cr - def verif_regles(self): - """ - Effectue la vérification de validité des règles du jeu de commandes - """ - noms_etapes = [etape.nom for etape in self.etapes] - texte_global = '' - test_global = 1 - for regle in self.regles: - texte, test = regle.verif(noms_etapes) - texte_global = texte_global + texte - test_global = test_global*test - return texte_global, test_global + def isvalid(self, cr='non'): + """ + Méthode booléenne qui retourne 0 si le JDC est invalide, 1 sinon + """ + # FR : on prend en compte l'état du JDC ('unchanged','modified','undetermined') + # afin d'accélérer le test de validité du JDC + if self.state == 'unchanged': + return self.valid + else: + valid = 1 + texte, test = self.verif_regles() + if test == 0: + if cr == 'oui': + self.cr.fatal(' '.strip(texte)) + valid = 0 + if valid: + for e in self.etapes: + if not e.isactif(): + continue + if not e.isvalid(): + valid = 0 + break + self.state = "unchanged" + self.valid = valid + return self.valid + def verif_regles(self): + """ + Effectue la vérification de validité des règles du jeu de commandes + """ + noms_etapes = [etape.nom for etape in self.etapes] + texte_global = '' + test_global = 1 + for regle in self.regles: + texte, test = regle.verif(noms_etapes) + texte_global = texte_global + texte + test_global = test_global * test + return texte_global, test_global diff --git a/Validation/V_MACRO_ETAPE.py b/Validation/V_MACRO_ETAPE.py index aabb7c16..6d1a0e00 100644 --- a/Validation/V_MACRO_ETAPE.py +++ b/Validation/V_MACRO_ETAPE.py @@ -1,31 +1,32 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== """ - Ce module contient la classe mixin MACRO_ETAPE qui porte les méthodes - nécessaires pour réaliser la validation d'un objet de type MACRO_ETAPE - dérivé de OBJECT. + Ce module contient la classe mixin MACRO_ETAPE qui porte les méthodes + nécessaires pour réaliser la validation d'un objet de type MACRO_ETAPE + dérivé de OBJECT. Une classe mixin porte principalement des traitements et est - utilisée par héritage multiple pour composer les traitements. + utilisée par héritage multiple pour composer les traitements. """ # Modules Python import types @@ -39,164 +40,180 @@ from Noyau.N_Exception import AsException from Noyau.N_utils import AsType from Noyau.strfunc import ufmt + class MACRO_ETAPE(V_ETAPE.ETAPE): - """ - """ - - def isvalid(self,sd='oui',cr='non'): - """ - Methode pour verifier la validité de l'objet ETAPE. Cette méthode - peut etre appelée selon plusieurs modes en fonction de la valeur - de sd et de cr. - - Si cr vaut oui elle crée en plus un compte-rendu. - - Cette méthode a plusieurs fonctions : - - - mettre à jour l'état de self (update) - - - retourner un indicateur de validité 0=non, 1=oui - - - produire un compte-rendu : self.cr - - """ - if CONTEXT.debug : print "ETAPE.isvalid ",self.nom - if self.state == 'unchanged' : - return self.valid - else: - valid=1 - # On marque les concepts CO pour verification ulterieure de leur bonne utilisation - l = self.get_all_co() - # On verifie que les concepts CO sont bien passes par type_sdprod - for c in l: - #if c.etape is self.parent: - if c.is_typco() != 2: - # le concept est propriete de l'etape parent - # Il n'a pas ete transforme par type_sdprod - # Cette situation est interdite - # Pb: La macro-commande a passe le concept a une commande (macro ?) mal definie - if cr =='oui': - self.cr.fatal(_(u"Macro-commande mal définie : le concept n'a pas été typé par " - u"un appel à type_sdprod pour %s"), c.nom) - valid=0 - - valid=valid * self.valid_child() - valid=valid * self.valid_regles(cr) - - if self.reste_val != {}: - if cr == 'oui' : - self.cr.fatal(_(u"Mots clés inconnus : %s"), ','.join(self.reste_val.keys())) - valid=0 - - if sd == "non": - # Dans ce cas, on ne calcule qu'une validite partielle, on ne modifie pas l'état de self - # on retourne simplement l'indicateur valid - return valid - - if self.sd != None : - valid = valid * self.valid_sdnom(cr) - - if self.definition.reentrant == 'n' and self.reuse: - # Il ne peut y avoir de concept reutilise avec une MACRO non reentrante - if cr == 'oui' : - self.cr.fatal(_(u'Macro-commande non réentrante : ne pas utiliser reuse')) - valid=0 - - if valid: - valid = self.update_sdprod(cr) - - # Si la macro comprend des etapes internes, on teste leur validite - for e in self.etapes: - if not e.isvalid(): - valid=0 - break - - self.set_valid(valid) - - return self.valid - - def update_sdprod(self,cr='non'): - """ - Cette méthode met à jour le concept produit en fonction des conditions initiales : - - 1. Il n'y a pas de concept retourné (self.definition.sd_prod == None) - - 2. Le concept retourné n existait pas (self.sd == None) - - 3. Le concept retourné existait. On change alors son type ou on le supprime - - En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1 - """ - sd_prod=self.definition.sd_prod - # On memorise le type retourné dans l attribut typret - self.typret=None - if type(sd_prod) == types.FunctionType: - # Type de concept retourné calculé - d=self.cree_dict_valeurs(self.mc_liste) - try: - # la sd_prod d'une macro a l'objet lui meme en premier argument - # contrairement à une ETAPE ou PROC_ETAPE - # Comme sd_prod peut invoquer la méthode type_sdprod qui ajoute - # les concepts produits dans self.sdprods, il faut le mettre à zéro - self.sdprods=[] - sd_prod= apply(sd_prod,(self,),d) - except: - # Erreur pendant le calcul du type retourné - if CONTEXT.debug:traceback.print_exc() - self.sd=None - if cr == 'oui' : - l=traceback.format_exception(sys.exc_info()[0], - sys.exc_info()[1], - sys.exc_info()[2]) - self.cr.fatal(_(u'Impossible d affecter un type au résultat\n%s'), ' '.join(l[2:])) - return 0 - # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er - valid=1 - if self.reuse: - # Un concept reutilise a ete specifie - if AsType(self.reuse) != sd_prod: - if cr == 'oui' : - self.cr.fatal(_(u'Type de concept réutilisé incompatible avec type produit')) - valid=0 - if self.sdnom!='': - if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom: - # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom) - if cr == 'oui' : - self.cr.fatal(_(u'Concept réutilisé : le nom de la variable de ' - u'retour devrait être %s et non %s'), - self.reuse.nom, self.sdnom) - valid= 0 - if valid:self.sd=self.reuse - else: - #Cas d'un concept non reutilise - if sd_prod == None:# Pas de concept retourné - # Que faut il faire de l eventuel ancien sd ? - self.sd = None - else: - if self.sd: - # Un sd existe deja, on change son type - if CONTEXT.debug:print "changement de type:",self.sd,sd_prod - if self.sd.__class__ != sd_prod: - self.sd.change_type(sd_prod) - self.typret=sd_prod - else: - # Le sd n existait pas , on ne le crée pas - self.typret=sd_prod - if cr == 'oui' : - self.cr.fatal(_(u"Concept retourné non défini")) - valid=0 - if self.definition.reentrant == 'o': - if cr == 'oui' : - self.cr.fatal(_(u'Commande obligatoirement réentrante : spécifier reuse=concept')) - valid=0 - return valid - - def report(self): - """ - Methode pour la generation d un rapport de validation - """ - V_ETAPE.ETAPE.report(self) - for e in self.etapes : - self.cr.add(e.report()) - return self.cr + """ + """ + + def isvalid(self, sd='oui', cr='non'): + """ + Methode pour verifier la validité de l'objet ETAPE. Cette méthode + peut etre appelée selon plusieurs modes en fonction de la valeur + de sd et de cr. + + Si cr vaut oui elle crée en plus un compte-rendu. + + Cette méthode a plusieurs fonctions : + + - mettre à jour l'état de self (update) + + - retourner un indicateur de validité 0=non, 1=oui + + - produire un compte-rendu : self.cr + + """ + if CONTEXT.debug: + print "ETAPE.isvalid ", self.nom + if self.state == 'unchanged': + return self.valid + else: + valid = 1 + # On marque les concepts CO pour verification ulterieure de leur + # bonne utilisation + l = self.get_all_co() + # On verifie que les concepts CO sont bien passes par type_sdprod + for c in l: + # if c.etape is self.parent: + if c.is_typco() != 2: + # le concept est propriete de l'etape parent + # Il n'a pas ete transforme par type_sdprod + # Cette situation est interdite + # Pb: La macro-commande a passe le concept a une commande + # (macro ?) mal definie + if cr == 'oui': + self.cr.fatal(_(u"Macro-commande mal définie : le concept n'a pas été typé par " + u"un appel à type_sdprod pour %s"), c.nom) + valid = 0 + + valid = valid * self.valid_child() + valid = valid * self.valid_regles(cr) + + if self.reste_val != {}: + if cr == 'oui': + self.cr.fatal( + _(u"Mots clés inconnus : %s"), ','.join(self.reste_val.keys())) + valid = 0 + + if sd == "non": + # Dans ce cas, on ne calcule qu'une validite partielle, on ne modifie pas l'état de self + # on retourne simplement l'indicateur valid + return valid + + if self.sd != None: + valid = valid * self.valid_sdnom(cr) + + if self.definition.reentrant == 'n' and self.reuse: + # Il ne peut y avoir de concept reutilise avec une MACRO non + # reentrante + if cr == 'oui': + self.cr.fatal( + _(u'Macro-commande non réentrante : ne pas utiliser reuse')) + valid = 0 + + if valid: + valid = self.update_sdprod(cr) + + # Si la macro comprend des etapes internes, on teste leur validite + for e in self.etapes: + if not e.isvalid(): + valid = 0 + break + + self.set_valid(valid) + + return self.valid + + def update_sdprod(self, cr='non'): + """ + Cette méthode met à jour le concept produit en fonction des conditions initiales : + + 1. Il n'y a pas de concept retourné (self.definition.sd_prod == None) + + 2. Le concept retourné n existait pas (self.sd == None) + + 3. Le concept retourné existait. On change alors son type ou on le supprime + + En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1 + """ + sd_prod = self.definition.sd_prod + # On memorise le type retourné dans l attribut typret + self.typret = None + if type(sd_prod) == types.FunctionType: + # Type de concept retourné calculé + d = self.cree_dict_valeurs(self.mc_liste) + try: + # la sd_prod d'une macro a l'objet lui meme en premier argument + # contrairement à une ETAPE ou PROC_ETAPE + # Comme sd_prod peut invoquer la méthode type_sdprod qui ajoute + # les concepts produits dans self.sdprods, il faut le mettre à + # zéro + self.sdprods = [] + sd_prod = apply(sd_prod, (self,), d) + except: + # Erreur pendant le calcul du type retourné + if CONTEXT.debug: + traceback.print_exc() + self.sd = None + if cr == 'oui': + l = traceback.format_exception(sys.exc_info()[0], + sys.exc_info()[1], + sys.exc_info()[2]) + self.cr.fatal( + _(u'Impossible d affecter un type au résultat\n%s'), ' '.join(l[2:])) + return 0 + # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la + # cr\351er + valid = 1 + if self.reuse: + # Un concept reutilise a ete specifie + if AsType(self.reuse) != sd_prod: + if cr == 'oui': + self.cr.fatal( + _(u'Type de concept réutilisé incompatible avec type produit')) + valid = 0 + if self.sdnom != '': + if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom: + # Le nom de la variable de retour (self.sdnom) doit etre le + # meme que celui du concept reutilise (self.reuse.nom) + if cr == 'oui': + self.cr.fatal(_(u'Concept réutilisé : le nom de la variable de ' + u'retour devrait être %s et non %s'), + self.reuse.nom, self.sdnom) + valid = 0 + if valid: + self.sd = self.reuse + else: + # Cas d'un concept non reutilise + if sd_prod == None: # Pas de concept retourné + # Que faut il faire de l eventuel ancien sd ? + self.sd = None + else: + if self.sd: + # Un sd existe deja, on change son type + if CONTEXT.debug: + print "changement de type:", self.sd, sd_prod + if self.sd.__class__ != sd_prod: + self.sd.change_type(sd_prod) + self.typret = sd_prod + else: + # Le sd n existait pas , on ne le crée pas + self.typret = sd_prod + if cr == 'oui': + self.cr.fatal(_(u"Concept retourné non défini")) + valid = 0 + if self.definition.reentrant == 'o': + if cr == 'oui': + self.cr.fatal( + _(u'Commande obligatoirement réentrante : spécifier reuse=concept')) + valid = 0 + return valid + + def report(self): + """ + Methode pour la generation d un rapport de validation + """ + V_ETAPE.ETAPE.report(self) + for e in self.etapes: + self.cr.add(e.report()) + return self.cr diff --git a/Validation/V_MCBLOC.py b/Validation/V_MCBLOC.py index c35eabec..32a1ef49 100644 --- a/Validation/V_MCBLOC.py +++ b/Validation/V_MCBLOC.py @@ -1,75 +1,79 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== + """ - Ce module contient la classe mixin MCBLOC qui porte les méthodes - nécessaires pour réaliser la validation d'un objet de type MCBLOC - dérivé de OBJECT. + Ce module contient la classe mixin MCBLOC qui porte les méthodes + nécessaires pour réaliser la validation d'un objet de type MCBLOC + dérivé de OBJECT. Une classe mixin porte principalement des traitements et est - utilisée par héritage multiple pour composer les traitements. + utilisée par héritage multiple pour composer les traitements. """ # Modules EFICAS import V_MCCOMPO from Noyau.strfunc import ufmt + class MCBLOC(V_MCCOMPO.MCCOMPO): - """ - Cette classe a un attribut de classe : - - txt_nat qui sert pour les comptes-rendus liés à cette classe - """ + """ + Cette classe a un attribut de classe : - txt_nat = u"Bloc :" + - txt_nat qui sert pour les comptes-rendus liés à cette classe + """ - def isvalid(self,sd='oui',cr='non'): - """ - Methode pour verifier la validité du MCBLOC. Cette méthode - peut etre appelée selon plusieurs modes en fonction de la valeur - de sd et de cr. + txt_nat = u"Bloc :" - Si cr vaut oui elle crée en plus un compte-rendu - sd est présent pour compatibilité de l'interface mais ne sert pas - """ - if self.state == 'unchanged' : - return self.valid - else: - valid = 1 - if hasattr(self,'valid'): - old_valid = self.valid - else: - old_valid = None - for child in self.mc_liste : - if not child.isvalid(): - valid = 0 - break - # Après avoir vérifié la validité de tous les sous-objets, on vérifie - # la validité des règles - text_erreurs,test_regles = self.verif_regles() - if not test_regles : - if cr == 'oui': - self.cr.fatal(_(u"Règle(s) non respectée(s) : %s"), text_erreurs) - valid = 0 - self.valid = valid - self.state = 'unchanged' - if not old_valid or old_valid != self.valid : - self.init_modif_up() - return self.valid + def isvalid(self, sd='oui', cr='non'): + """ + Methode pour verifier la validité du MCBLOC. Cette méthode + peut etre appelée selon plusieurs modes en fonction de la valeur + de sd et de cr. + Si cr vaut oui elle crée en plus un compte-rendu + sd est présent pour compatibilité de l'interface mais ne sert pas + """ + if self.state == 'unchanged': + return self.valid + else: + valid = 1 + if hasattr(self, 'valid'): + old_valid = self.valid + else: + old_valid = None + for child in self.mc_liste: + if not child.isvalid(): + valid = 0 + break + # Après avoir vérifié la validité de tous les sous-objets, on vérifie + # la validité des règles + text_erreurs, test_regles = self.verif_regles() + if not test_regles: + if cr == 'oui': + self.cr.fatal( + _(u"Règle(s) non respectée(s) : %s"), text_erreurs) + valid = 0 + self.valid = valid + self.state = 'unchanged' + if not old_valid or old_valid != self.valid: + self.init_modif_up() + return self.valid diff --git a/Validation/V_MCCOMPO.py b/Validation/V_MCCOMPO.py index 2d63e43d..a7db4902 100644 --- a/Validation/V_MCCOMPO.py +++ b/Validation/V_MCCOMPO.py @@ -1,26 +1,27 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== """ - Ce module contient la classe de base MCCOMPO qui sert à factoriser + Ce module contient la classe de base MCCOMPO qui sert à factoriser les traitements des objets composites de type OBJECT """ # Modules Python @@ -28,97 +29,109 @@ import os import traceback # Modules EFICAS +from Noyau import MAXSIZE, MAXSIZE_MSGCHK from Noyau import N_CR from Noyau.N_Exception import AsException from Noyau.strfunc import ufmt, to_unicode -class MCCOMPO: - """ - L'attribut mc_liste a été créé par une classe dérivée de la - classe MCCOMPO du Noyau - """ - - CR=N_CR.CR - - def __init__(self): - self.state = 'undetermined' - # défini dans les classes dérivées - self.txt_nat = '' - - def init_modif_up(self): - """ - Propage l'état modifié au parent s'il existe et n'est pas l'objet - lui-meme - """ - if self.parent and self.parent != self : - self.parent.state = 'modified' - - def report(self): - """ - Génère le rapport de validation de self - """ - self.cr=self.CR() - self.cr.debut = self.txt_nat+self.nom - self.cr.fin = u"Fin "+self.txt_nat+self.nom - for child in self.mc_liste: - self.cr.add(child.report()) - self.state = 'modified' - try: - self.isvalid(cr='oui') - except AsException,e: - if CONTEXT.debug : traceback.print_exc() - self.cr.fatal(' '.join((self.txt_nat, self.nom, str(e)))) - return self.cr - - def verif_regles(self): - """ - A partir du dictionnaire des mots-clés présents, vérifie si les règles - de self sont valides ou non. - - Retourne une chaine et un booléen : - - - texte = la chaine contient le message d'erreur de la (les) règle(s) violée(s) ('' si aucune) - - - testglob = booléen 1 si toutes les règles OK, 0 sinon - """ - # On verifie les regles avec les defauts affectés - dictionnaire = self.dict_mc_presents(restreint='non') - texte = [''] - testglob = 1 - for r in self.definition.regles: - erreurs,test = r.verif(dictionnaire) - testglob = testglob*test - if erreurs != '': - texte.append(to_unicode(erreurs)) - texte = os.linesep.join(texte) - return texte, testglob - - def dict_mc_presents(self,restreint='non'): - """ - Retourne le dictionnaire {mocle : objet} construit à partir de self.mc_liste - Si restreint == 'non' : on ajoute tous les mots-clés simples du catalogue qui ont - une valeur par défaut - Si restreint == 'oui' : on ne prend que les mots-clés effectivement entrés par - l'utilisateur (cas de la vérification des règles) - """ - dico={} - # on ajoute les couples {nom mot-clé:objet mot-clé} effectivement présents - for v in self.mc_liste: - if v == None : continue - k=v.nom - dico[k]=v - if restreint == 'oui' : return dico - # Si restreint != 'oui', - # on ajoute les couples {nom mot-clé:objet mot-clé} des mots-clés simples - # possibles pour peu qu'ils aient une valeur par défaut - for k,v in self.definition.entites.items(): - if v.label != 'SIMP' : continue - if not v.defaut : continue - if not dico.has_key(k): - dico[k]=v(nom=k,val=None,parent=self) - #on ajoute l'objet detenteur de regles pour des validations plus sophistiquees (a manipuler avec precaution) - dico["self"]=self - return dico - +class MCCOMPO: + """ + L'attribut mc_liste a été créé par une classe dérivée de la + classe MCCOMPO du Noyau + """ + + CR = N_CR.CR + + def __init__(self): + self.state = 'undetermined' + # défini dans les classes dérivées + self.txt_nat = '' + + def init_modif_up(self): + """ + Propage l'état modifié au parent s'il existe et n'est pas l'objet + lui-meme + """ + if self.parent and self.parent != self: + self.parent.state = 'modified' + + def report(self): + """ + Génère le rapport de validation de self + """ + self.cr = self.CR() + self.cr.debut = self.txt_nat + self.nom + self.cr.fin = u"Fin " + self.txt_nat + self.nom + i = 0 + for child in self.mc_liste: + i += 1 + if i > MAXSIZE: + print(MAXSIZE_MSGCHK.format(MAXSIZE, len(self.mc_liste))) + break + self.cr.add(child.report()) + self.state = 'modified' + try: + self.isvalid(cr='oui') + except AsException, e: + if CONTEXT.debug: + traceback.print_exc() + self.cr.fatal(' '.join((self.txt_nat, self.nom, str(e)))) + return self.cr + + def verif_regles(self): + """ + A partir du dictionnaire des mots-clés présents, vérifie si les règles + de self sont valides ou non. + + Retourne une chaine et un booléen : + + - texte = la chaine contient le message d'erreur de la (les) règle(s) violée(s) ('' si aucune) + + - testglob = booléen 1 si toutes les règles OK, 0 sinon + """ + # On verifie les regles avec les defauts affectés + dictionnaire = self.dict_mc_presents(restreint='non') + texte = [''] + testglob = 1 + for r in self.definition.regles: + erreurs, test = r.verif(dictionnaire) + testglob = testglob * test + if erreurs != '': + texte.append(to_unicode(erreurs)) + texte = os.linesep.join(texte) + return texte, testglob + + def dict_mc_presents(self, restreint='non'): + """ + Retourne le dictionnaire {mocle : objet} construit à partir de self.mc_liste + Si restreint == 'non' : on ajoute tous les mots-clés simples du catalogue qui ont + une valeur par défaut + Si restreint == 'oui' : on ne prend que les mots-clés effectivement entrés par + l'utilisateur (cas de la vérification des règles) + """ + dico = {} + # on ajoute les couples {nom mot-clé:objet mot-clé} effectivement + # présents + for v in self.mc_liste: + if v == None: + continue + k = v.nom + dico[k] = v + if restreint == 'oui': + return dico + # Si restreint != 'oui', + # on ajoute les couples {nom mot-clé:objet mot-clé} des mots-clés simples + # possibles pour peu qu'ils aient une valeur par défaut + for k, v in self.definition.entites.items(): + if v.label != 'SIMP': + continue + if not v.defaut: + continue + if not dico.has_key(k): + dico[k] = v(nom=k, val=None, parent=self) + # on ajoute l'objet detenteur de regles pour des validations plus + # sophistiquees (a manipuler avec precaution) + dico["self"] = self + return dico diff --git a/Validation/V_MCFACT.py b/Validation/V_MCFACT.py index 233250be..f31eb0ca 100644 --- a/Validation/V_MCFACT.py +++ b/Validation/V_MCFACT.py @@ -1,88 +1,94 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== + """ - Ce module contient la classe mixin MCFACT qui porte les méthodes - nécessaires pour réaliser la validation d'un objet de type MCFACT - dérivé de OBJECT. + Ce module contient la classe mixin MCFACT qui porte les méthodes + nécessaires pour réaliser la validation d'un objet de type MCFACT + dérivé de OBJECT. Une classe mixin porte principalement des traitements et est - utilisée par héritage multiple pour composer les traitements. + utilisée par héritage multiple pour composer les traitements. """ # Modules EFICAS import V_MCCOMPO from Noyau.strfunc import ufmt + class MCFACT(V_MCCOMPO.MCCOMPO): - """ - Cette classe a un attribut de classe : - - txt_nat qui sert pour les comptes-rendus liés à cette classe - """ + """ + Cette classe a un attribut de classe : - txt_nat = u"Mot clé Facteur :" + - txt_nat qui sert pour les comptes-rendus liés à cette classe + """ - def isvalid(self,sd='oui',cr='non'): - """ - Methode pour verifier la validité du MCFACT. Cette méthode - peut etre appelée selon plusieurs modes en fonction de la valeur - de sd et de cr. + txt_nat = u"Mot clé Facteur :" - Si cr vaut oui elle crée en plus un compte-rendu - sd est présent pour compatibilité de l'interface mais ne sert pas - """ - if self.state == 'unchanged' : - return self.valid - else: - valid = 1 - if hasattr(self,'valid'): - old_valid = self.valid - else: - old_valid = None - for child in self.mc_liste : - if not child.isvalid(): - valid = 0 - break - # Après avoir vérifié la validité de tous les sous-objets, on vérifie - # la validité des règles - text_erreurs,test_regles = self.verif_regles() - if not test_regles : - if cr == 'oui' : self.cr.fatal(_(u"Règle(s) non respectée(s) : %s"), text_erreurs) - valid = 0 - # - # On verifie les validateurs s'il y en a - # - if self.definition.validators and not self.definition.validators.verif(self.valeur): - if cr == 'oui' : - self.cr.fatal(_(u"Mot-clé : %s devrait avoir %s"), - self.nom, self.definition.validators.info()) - valid=0 - # fin des validateurs - # - if self.reste_val != {}: - if cr == 'oui' : - self.cr.fatal(_(u"Mots clés inconnus : %s"), ','.join(self.reste_val.keys())) - valid=0 - self.valid = valid - self.state = 'unchanged' - if not old_valid or old_valid != self.valid : - self.init_modif_up() - return self.valid + def isvalid(self, sd='oui', cr='non'): + """ + Methode pour verifier la validité du MCFACT. Cette méthode + peut etre appelée selon plusieurs modes en fonction de la valeur + de sd et de cr. + Si cr vaut oui elle crée en plus un compte-rendu + sd est présent pour compatibilité de l'interface mais ne sert pas + """ + if self.state == 'unchanged': + return self.valid + else: + valid = 1 + if hasattr(self, 'valid'): + old_valid = self.valid + else: + old_valid = None + for child in self.mc_liste: + if not child.isvalid(): + valid = 0 + break + # Après avoir vérifié la validité de tous les sous-objets, on vérifie + # la validité des règles + text_erreurs, test_regles = self.verif_regles() + if not test_regles: + if cr == 'oui': + self.cr.fatal( + _(u"Règle(s) non respectée(s) : %s"), text_erreurs) + valid = 0 + # + # On verifie les validateurs s'il y en a + # + if self.definition.validators and not self.definition.validators.verif(self.valeur): + if cr == 'oui': + self.cr.fatal(_(u"Mot-clé : %s devrait avoir %s"), + self.nom, self.definition.validators.info()) + valid = 0 + # fin des validateurs + # + if self.reste_val != {}: + if cr == 'oui': + self.cr.fatal( + _(u"Mots clés inconnus : %s"), ','.join(self.reste_val.keys())) + valid = 0 + self.valid = valid + self.state = 'unchanged' + if not old_valid or old_valid != self.valid: + self.init_modif_up() + return self.valid diff --git a/Validation/V_MCLIST.py b/Validation/V_MCLIST.py index 6bc3aae1..948d82b7 100644 --- a/Validation/V_MCLIST.py +++ b/Validation/V_MCLIST.py @@ -1,114 +1,128 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== """ - Ce module contient la classe mixin MCList qui porte les méthodes - nécessaires pour réaliser la validation d'un objet de type MCList - dérivé de OBJECT. + Ce module contient la classe mixin MCList qui porte les méthodes + nécessaires pour réaliser la validation d'un objet de type MCList + dérivé de OBJECT. Une classe mixin porte principalement des traitements et est - utilisée par héritage multiple pour composer les traitements. + utilisée par héritage multiple pour composer les traitements. """ # Modules Python import traceback # Modules EFICAS +from Noyau import MAXSIZE, MAXSIZE_MSGCHK from Noyau import N_CR from Noyau.N_Exception import AsException from Noyau.strfunc import ufmt + class MCList: - """ - Cette classe a deux attributs de classe : - - - CR qui sert à construire l'objet compte-rendu - - - txt_nat qui sert pour les comptes-rendus liés à cette classe - """ - - CR = N_CR.CR - txt_nat = u"Mot clé Facteur Multiple :" - - def isvalid(self,cr='non'): - """ - Methode pour verifier la validité du MCList. Cette méthode - peut etre appelée selon plusieurs modes en fonction de la valeur - de cr. - - Si cr vaut oui elle crée en plus un compte-rendu. - - On n'utilise pas d'attribut pour stocker l'état et on ne remonte pas - le changement d'état au parent (pourquoi ??) - MCLIST est une liste de MCFACT. Les MCFACT ont le meme parent - que le MCLIST qui les contient. Il n'est donc pas necessaire de - remonter le changement d'etat au parent. C'est deja fait - par les MCFACT. - """ - if len(self.data) == 0 : return 0 - - valid= 1 - definition=self.data[0].definition - # Verification du nombre des mots cles facteurs - if definition.min is not None and len(self.data) < definition.min : - valid=0 - if cr == 'oui' : - self.cr.fatal(_(u"Nombre de mots clés facteurs insuffisant minimum : %s"), - definition.min) - - if definition.max is not None and len(self.data) > definition.max : - valid=0 - if cr == 'oui' : - self.cr.fatal(_(u"Nombre de mots clés facteurs trop grand maximum : %s"), - definition.max) - num = 0 - for i in self.data: - num = num+1 - if not i.isvalid(): - valid = 0 - if cr=='oui' and len(self) > 1: - self.cr.fatal(_(u"L'occurrence numéro %d du mot-clé facteur : %s n'est pas valide"), - num, self.nom) - return valid - - def report(self): - """ - Génère le rapport de validation de self - """ - if len(self) > 1: - # Mot cle facteur multiple - self.cr=self.CR( debut = u"Mot-clé facteur multiple : "+self.nom, - fin = u"Fin Mot-clé facteur multiple : "+self.nom) - for i in self.data: - self.cr.add(i.report()) - elif len(self) == 1: - # Mot cle facteur non multiple - self.cr=self.data[0].report() - else: - self.cr=self.CR( debut = u"Mot-clé facteur : "+self.nom, - fin = u"Fin Mot-clé facteur : "+self.nom) - - try : - self.isvalid(cr='oui') - except AsException,e: - if CONTEXT.debug : traceback.print_exc() - self.cr.fatal(_(u"Mot-clé facteur multiple : %s, %s"), self.nom, e) - return self.cr + """ + Cette classe a deux attributs de classe : + + - CR qui sert à construire l'objet compte-rendu + + - txt_nat qui sert pour les comptes-rendus liés à cette classe + """ + + CR = N_CR.CR + txt_nat = u"Mot clé Facteur Multiple :" + + def isvalid(self, cr='non'): + """ + Methode pour verifier la validité du MCList. Cette méthode + peut etre appelée selon plusieurs modes en fonction de la valeur + de cr. + + Si cr vaut oui elle crée en plus un compte-rendu. + + On n'utilise pas d'attribut pour stocker l'état et on ne remonte pas + le changement d'état au parent (pourquoi ??) + MCLIST est une liste de MCFACT. Les MCFACT ont le meme parent + que le MCLIST qui les contient. Il n'est donc pas necessaire de + remonter le changement d'etat au parent. C'est deja fait + par les MCFACT. + """ + if len(self.data) == 0: + return 0 + + valid = 1 + definition = self.data[0].definition + # Verification du nombre des mots cles facteurs + if definition.min is not None and len(self.data) < definition.min: + valid = 0 + if cr == 'oui': + self.cr.fatal( + _(u"Nombre de mots clés facteurs insuffisant minimum : %s"), + definition.min) + + if definition.max is not None and len(self.data) > definition.max: + valid = 0 + if cr == 'oui': + self.cr.fatal( + _(u"Nombre de mots clés facteurs trop grand maximum : %s"), + definition.max) + num = 0 + for i in self.data: + num = num + 1 + if not i.isvalid(): + valid = 0 + if cr == 'oui' and len(self) > 1: + self.cr.fatal( + _(u"L'occurrence numéro %d du mot-clé facteur : %s n'est pas valide"), + num, self.nom) + return valid + + def report(self): + """ + Génère le rapport de validation de self + """ + if len(self) > 1: + # Mot cle facteur multiple + self.cr = self.CR( + debut=u"Mot-clé facteur multiple : " + self.nom, + fin=u"Fin Mot-clé facteur multiple : " + self.nom) + j = 0 + for i in self.data: + j += 1 + if j > MAXSIZE: + print(MAXSIZE_MSGCHK.format(MAXSIZE, len(self.data))) + break + self.cr.add(i.report()) + elif len(self) == 1: + # Mot cle facteur non multiple + self.cr = self.data[0].report() + else: + self.cr = self.CR(debut=u"Mot-clé facteur : " + self.nom, + fin=u"Fin Mot-clé facteur : " + self.nom) + + try: + self.isvalid(cr='oui') + except AsException, e: + if CONTEXT.debug: + traceback.print_exc() + self.cr.fatal(_(u"Mot-clé facteur multiple : %s, %s"), self.nom, e) + return self.cr diff --git a/Validation/V_MCSIMP.py b/Validation/V_MCSIMP.py index 45ac1820..6f0e8a5b 100644 --- a/Validation/V_MCSIMP.py +++ b/Validation/V_MCSIMP.py @@ -1,30 +1,31 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== """ - Ce module contient la classe mixin MCSIMP qui porte les méthodes - nécessaires pour réaliser la validation d'un objet de type MCSIMP - dérivé de OBJECT. + Ce module contient la classe mixin MCSIMP qui porte les méthodes + nécessaires pour réaliser la validation d'un objet de type MCSIMP + dérivé de OBJECT. Une classe mixin porte principalement des traitements et est - utilisée par héritage multiple pour composer les traitements. + utilisée par héritage multiple pour composer les traitements. """ # Modules Python import traceback @@ -32,171 +33,172 @@ import traceback # Modules EFICAS from Noyau import N_CR from Noyau.N_Exception import AsException -from Noyau.N_VALIDATOR import ValError,TypeProtocol,CardProtocol,IntoProtocol +from Noyau.N_VALIDATOR import ValError, TypeProtocol, CardProtocol, IntoProtocol from Noyau.N_VALIDATOR import listProto from Noyau.strfunc import ufmt -class MCSIMP: - """ - COMMENTAIRE CCAR: - Cette classe est quasiment identique à la classe originale d'EFICAS - a part quelques changements cosmétiques et des chagements pour la - faire fonctionner de facon plus autonome par rapport à l'environnement - EFICAS - - A mon avis, il faudrait aller plus loin et réduire les dépendances - amont au strict nécessaire. - - - Est il indispensable de faire l'évaluation de la valeur dans le contexte - du jdc dans cette classe. - - - Ne pourrait on pas doter les objets en présence des méthodes suffisantes - pour éviter les tests un peu particuliers sur GEOM, PARAMETRE et autres. J'ai - d'ailleurs modifié la classe pour éviter l'import de GEOM - """ - - CR=N_CR.CR - - def __init__(self): - self.state='undetermined' - self.typeProto=TypeProtocol("type",typ=self.definition.type) - self.intoProto=IntoProtocol("into",into=self.definition.into,val_min=self.definition.val_min,val_max=self.definition.val_max) - self.cardProto=CardProtocol("card",min=self.definition.min,max=self.definition.max) - - def get_valid(self): - if hasattr(self,'valid'): - return self.valid - else: - self.valid=None - return None - - def set_valid(self,valid): - old_valid=self.get_valid() - self.valid = valid - self.state = 'unchanged' - if not old_valid or old_valid != self.valid : - self.init_modif_up() - - def isvalid(self,cr='non'): - """ - Cette méthode retourne un indicateur de validité de l'objet de type MCSIMP - - - 0 si l'objet est invalide - - 1 si l'objet est valide - - Le paramètre cr permet de paramétrer le traitement. Si cr == 'oui' - la méthode construit également un comte-rendu de validation - dans self.cr qui doit avoir été créé préalablement. - """ - if self.state == 'unchanged': - return self.valid - else: - valid = 1 - v=self.valeur - # verification presence - if self.isoblig() and v == None : - if cr == 'oui' : - self.cr.fatal(_(u"Mot-clé : %s obligatoire non valorisé"), self.nom) - valid = 0 - - lval=listProto.adapt(v) - #Pour tenir compte des Tuples - if hasattr(self.definition.type[0],'ntuple') : - try : - if not (type(lval[0]) is tuple) : lval=(lval,) - except : - pass - if lval is None: - valid=0 - if cr == 'oui' : - self.cr.fatal(_(u"None n'est pas une valeur autorisée")) - else: - # type,into ... - #typeProto=TypeProtocol("type",typ=self.definition.type) - #intoProto=IntoProtocol("into",into=self.definition.into,val_min=self.definition.val_min,val_max=self.definition.val_max) - #cardProto=CardProtocol("card",min=self.definition.min,max=self.definition.max) - #typeProto=self.definition.typeProto - #intoProto=self.definition.intoProto - #cardProto=self.definition.cardProto - typeProto=self.typeProto - intoProto=self.intoProto - cardProto=self.cardProto - if cr == 'oui' : - #un cr est demandé : on collecte tous les types d'erreur - try: - for val in lval: - typeProto.adapt(val) - except ValError,e: - valid=0 - self.cr.fatal(*e) - try: - for val in lval: - intoProto.adapt(val) - except ValError,e: - valid=0 - self.cr.fatal(*e) - #self.cr.fatal(unicode(e)) - try: - cardProto.adapt(lval) - except ValError,e: - valid=0 - self.cr.fatal(*e) - #self.cr.fatal(unicode(e)) - # - # On verifie les validateurs s'il y en a et si necessaire (valid == 1) - # - if valid and self.definition.validators: - try: - self.definition.validators.convert(lval) - except ValError,e: - self.cr.fatal(_(u"Mot-clé %s invalide : %s\nCritère de validité: %s"), - self.nom, str(e), self.definition.validators.info()) - valid=0 - else: - #si pas de cr demande, on sort a la toute premiere erreur - try: - for val in lval: - typeProto.adapt(val) - intoProto.adapt(val) - cardProto.adapt(lval) - if self.definition.validators: - if hasattr(self.definition.validators,'set_MCSimp'): - self.definition.validators.set_MCSimp(self) - self.definition.validators.convert(lval) - except ValError,e: - valid=0 - - self.set_valid(valid) - return self.valid - - def isoblig(self): - """ indique si le mot-clé est obligatoire - """ - return self.definition.statut=='o' - - def init_modif_up(self): - """ - Propage l'état modifié au parent s'il existe et n'est l'objet - lui-meme - """ - if self.parent and self.parent != self : - self.parent.state = 'modified' - - def report(self): - """ génère le rapport de validation de self """ - self.cr=self.CR() - self.cr.debut = u"Mot-clé simple : "+self.nom - self.cr.fin = u"Fin Mot-clé simple : "+self.nom - self.state = 'modified' - try: - self.isvalid(cr='oui') - except AsException,e: - if CONTEXT.debug : traceback.print_exc() - self.cr.fatal(_(u"Mot-clé simple : %s %s"), self.nom, e) - return self.cr - - - - +class MCSIMP: + """ + COMMENTAIRE CCAR: + Cette classe est quasiment identique à la classe originale d'EFICAS + a part quelques changements cosmétiques et des chagements pour la + faire fonctionner de facon plus autonome par rapport à l'environnement + EFICAS + + A mon avis, il faudrait aller plus loin et réduire les dépendances + amont au strict nécessaire. + + - Est il indispensable de faire l'évaluation de la valeur dans le contexte + du jdc dans cette classe. + + - Ne pourrait on pas doter les objets en présence des méthodes suffisantes + pour éviter les tests un peu particuliers sur GEOM, PARAMETRE et autres. J'ai + d'ailleurs modifié la classe pour éviter l'import de GEOM + """ + + CR = N_CR.CR + + def __init__(self): + self.state = 'undetermined' + self.typeProto = TypeProtocol("type", typ=self.definition.type) + self.intoProto = IntoProtocol( + "into", into=self.definition.into, val_min=self.definition.val_min, val_max=self.definition.val_max) + self.cardProto = CardProtocol( + "card", min=self.definition.min, max=self.definition.max) + + def get_valid(self): + if hasattr(self, 'valid'): + return self.valid + else: + self.valid = None + return None + + def set_valid(self, valid): + old_valid = self.get_valid() + self.valid = valid + self.state = 'unchanged' + if not old_valid or old_valid != self.valid: + self.init_modif_up() + + def isvalid(self, cr='non'): + """ + Cette méthode retourne un indicateur de validité de l'objet de type MCSIMP + + - 0 si l'objet est invalide + - 1 si l'objet est valide + + Le paramètre cr permet de paramétrer le traitement. Si cr == 'oui' + la méthode construit également un comte-rendu de validation + dans self.cr qui doit avoir été créé préalablement. + """ + if self.state == 'unchanged': + return self.valid + else: + valid = 1 + v = self.valeur + # verification presence + if self.isoblig() and v == None: + if cr == 'oui': + self.cr.fatal( + _(u"Mot-clé : %s obligatoire non valorisé"), self.nom) + valid = 0 + + lval = listProto.adapt(v) + # Ajout PN + # Pour tenir compte des Tuples + if hasattr(self.definition.type[0],'ntuple') : + try : + if not (type(lval[0]) is tuple) : lval=(lval,) + except : + pass + + if lval is None: + valid = 0 + if cr == 'oui': + self.cr.fatal(_(u"None n'est pas une valeur autorisée")) + else: + # type,into ... + # typeProto=TypeProtocol("type",typ=self.definition.type) + # intoProto=IntoProtocol("into",into=self.definition.into,val_min=self.definition.val_min,val_max=self.definition.val_max) + # cardProto=CardProtocol("card",min=self.definition.min,max=self.definition.max) + # typeProto=self.definition.typeProto + # intoProto=self.definition.intoProto + # cardProto=self.definition.cardProto + typeProto = self.typeProto + intoProto = self.intoProto + cardProto = self.cardProto + if cr == 'oui': + # un cr est demandé : on collecte tous les types d'erreur + try: + for val in lval: + typeProto.adapt(val) + except ValError, e: + valid = 0 + self.cr.fatal(*e) + try: + for val in lval: + intoProto.adapt(val) + except ValError, e: + valid = 0 + self.cr.fatal(*e) + try: + cardProto.adapt(lval) + except ValError, e: + valid = 0 + self.cr.fatal(*e) + # + # On verifie les validateurs s'il y en a et si necessaire (valid == 1) + # + if valid and self.definition.validators: + try: + self.definition.validators.convert(lval) + except ValError, e: + self.cr.fatal( + _(u"Mot-clé %s invalide : %s\nCritère de validité: %s"), + self.nom, str(e), self.definition.validators.info()) + valid = 0 + else: + # si pas de cr demande, on sort a la toute premiere erreur + try: + for val in lval: + typeProto.adapt(val) + intoProto.adapt(val) + cardProto.adapt(lval) + if self.definition.validators: + if hasattr(self.definition.validators, 'set_MCSimp'): + self.definition.validators.set_MCSimp(self) + self.definition.validators.convert(lval) + except ValError, e: + valid = 0 + + self.set_valid(valid) + return self.valid + + def isoblig(self): + """ indique si le mot-clé est obligatoire + """ + return self.definition.statut == 'o' + + def init_modif_up(self): + """ + Propage l'état modifié au parent s'il existe et n'est l'objet + lui-meme + """ + if self.parent and self.parent != self: + self.parent.state = 'modified' + + def report(self): + """ génère le rapport de validation de self """ + self.cr = self.CR() + self.cr.debut = u"Mot-clé simple : " + self.nom + self.cr.fin = u"Fin Mot-clé simple : " + self.nom + self.state = 'modified' + try: + self.isvalid(cr='oui') + except AsException, e: + if CONTEXT.debug: + traceback.print_exc() + self.cr.fatal(_(u"Mot-clé simple : %s %s"), self.nom, e) + return self.cr diff --git a/Validation/V_MEME_NOMBRE.py b/Validation/V_MEME_NOMBRE.py index 71237ce1..a18b74de 100644 --- a/Validation/V_MEME_NOMBRE.py +++ b/Validation/V_MEME_NOMBRE.py @@ -1,61 +1,62 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# 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. +# ====================================================================== +# person_in_charge: mathieu.courtois at edf.fr + class MEME_NOMBRE: - """ - La règle MEME_NOMBRE vérifie que l'on trouve au moins un des mots-clés - de la règle parmi les arguments d'un OBJECT. - - Ces arguments sont transmis à la règle pour validation sous la forme - d'une liste de noms de mots-clés ou d'un dictionnaire dont - les clés sont des noms de mots-clés. - """ - def verif(self,args): - """ - La méthode verif vérifie que l'on trouve au moins un des mos-clés - de la liste self.mcs parmi les éléments de args - - args peut etre un dictionnaire ou une liste. Les éléments de args - sont soit les éléments de la liste soit les clés du dictionnaire. - """ - # on compte le nombre de mots cles presents - text ='' - args = self.liste_to_dico(args) - size = -1 - - for mc in self.mcs: - if mc not in args.keys(): - text = u"Une clé dans la règle n'existe pas %s" % mc - return text,0 - - val = args[mc].valeur - len_val = 0 - if not isinstance(val,type([])): - len_val = 1 - else: - len_val = len(val) - - if size == -1: - size = len_val - elif size != len_val: - text = u"Pas la même longeur" - return text,0 - return text,1 + """ + La règle MEME_NOMBRE vérifie que l'on trouve au moins un des mots-clés + de la règle parmi les arguments d'un OBJECT. + + Ces arguments sont transmis à la règle pour validation sous la forme + d'une liste de noms de mots-clés ou d'un dictionnaire dont + les clés sont des noms de mots-clés. + """ + + def verif(self, args): + """ + La méthode verif vérifie que l'on trouve au moins un des mos-clés + de la liste self.mcs parmi les éléments de args + + args peut etre un dictionnaire ou une liste. Les éléments de args + sont soit les éléments de la liste soit les clés du dictionnaire. + """ + # on compte le nombre de mots cles presents + text = '' + args = self.liste_to_dico(args) + size = -1 + + for mc in self.mcs: + if mc not in args.keys(): + text = u"Une clé dans la règle n'existe pas %s" % mc + return text, 0 + + val = args[mc].valeur + len_val = 0 + if not isinstance(val, type([])): + len_val = 1 + else: + len_val = len(val) + + if size == -1: + size = len_val + elif size != len_val: + text = u"Pas la même longeur" + return text, 0 + return text, 1 diff --git a/Validation/V_PRESENT_ABSENT.py b/Validation/V_PRESENT_ABSENT.py index 4a287dbc..d89b3ff7 100644 --- a/Validation/V_PRESENT_ABSENT.py +++ b/Validation/V_PRESENT_ABSENT.py @@ -1,52 +1,53 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# ====================================================================== +class PRESENT_ABSENT: -class PRESENT_ABSENT: - """ - La règle vérifie que si le premier mot-clé de self.mcs est present - parmi les elements de args les autres mots clés de self.mcs - doivent etre absents - - Ces arguments sont transmis à la règle pour validation sous la forme - d'une liste de noms de mots-clés ou d'un dictionnaire dont - les clés sont des noms de mots-clés. - """ - def verif(self,args): - """ - La methode verif effectue la verification specifique à la règle. - args peut etre un dictionnaire ou une liste. Les éléments de args - sont soit les éléments de la liste soit les clés du dictionnaire. - """ - # on verifie que si le premier de la liste est present, - # les autres sont absents - text='' - test = 1 - args = self.liste_to_dico(args) - mc0=self.mcs[0] - if args.has_key(mc0): - for mc in self.mcs[1:len(self.mcs)]: - if args.has_key(mc): - text = text + u"- Le mot clé "+`mc0`+ u" étant présent, il faut que : "+\ - mc+" soit absent"+'\n' - test = 0 - return text,test + """ + La règle vérifie que si le premier mot-clé de self.mcs est present + parmi les elements de args les autres mots clés de self.mcs + doivent etre absents + Ces arguments sont transmis à la règle pour validation sous la forme + d'une liste de noms de mots-clés ou d'un dictionnaire dont + les clés sont des noms de mots-clés. + """ + def verif(self, args): + """ + La methode verif effectue la verification specifique à la règle. + args peut etre un dictionnaire ou une liste. Les éléments de args + sont soit les éléments de la liste soit les clés du dictionnaire. + """ + # on verifie que si le premier de la liste est present, + # les autres sont absents + text = '' + test = 1 + args = self.liste_to_dico(args) + mc0 = self.mcs[0] + if args.has_key(mc0): + for mc in self.mcs[1:len(self.mcs)]: + if args.has_key(mc): + text = text + u"- Le mot clé " + `mc0`+ u" étant présent, il faut que : " +\ + mc + " soit absent" + '\n' + test = 0 + return text, test diff --git a/Validation/V_PRESENT_PRESENT.py b/Validation/V_PRESENT_PRESENT.py index 870028f9..9d5fbed8 100644 --- a/Validation/V_PRESENT_PRESENT.py +++ b/Validation/V_PRESENT_PRESENT.py @@ -1,49 +1,53 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== class PRESENT_PRESENT: - """ - La règle vérifie que si le premier mot-clé de self.mcs est present - parmi les elements de args les autres doivent l'etre aussi - Ces arguments sont transmis à la règle pour validation sous la forme - d'une liste de noms de mots-clés ou d'un dictionnaire dont - les clés sont des noms de mots-clés. - """ - def verif(self,args): - """ - La methode verif effectue la verification specifique à la règle. - args peut etre un dictionnaire ou une liste. Les éléments de args - sont soit les éléments de la liste soit les clés du dictionnaire. - """ - # on verifie que si le premier de la liste est present, - # les autres le sont aussi - mc0=self.mcs[0] - text='' - test = 1 - args = self.liste_to_dico(args) - if args.has_key(mc0): - for mc in self.mcs[1:len(self.mcs)]: - if not args.has_key(mc): - text = text + u"- Le mot clé "+`mc0`+ u" étant présent, il faut que : "+mc+ u" soit présent"+'\n' - test = 0 - return text,test + """ + La règle vérifie que si le premier mot-clé de self.mcs est present + parmi les elements de args les autres doivent l'etre aussi + + Ces arguments sont transmis à la règle pour validation sous la forme + d'une liste de noms de mots-clés ou d'un dictionnaire dont + les clés sont des noms de mots-clés. + """ + def verif(self, args): + """ + La methode verif effectue la verification specifique à la règle. + args peut etre un dictionnaire ou une liste. Les éléments de args + sont soit les éléments de la liste soit les clés du dictionnaire. + """ + # on verifie que si le premier de la liste est present, + # les autres le sont aussi + mc0 = self.mcs[0] + text = '' + test = 1 + args = self.liste_to_dico(args) + if args.has_key(mc0): + for mc in self.mcs[1:len(self.mcs)]: + if not args.has_key(mc): + text = text + u"- Le mot clé " + `mc0`+ \ + u" étant présent, il faut que : " + \ + mc + u" soit présent" + '\n' + test = 0 + return text, test diff --git a/Validation/V_PROC_ETAPE.py b/Validation/V_PROC_ETAPE.py index 8399ede1..7f1adcdf 100644 --- a/Validation/V_PROC_ETAPE.py +++ b/Validation/V_PROC_ETAPE.py @@ -1,30 +1,29 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# 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. +# ====================================================================== """ - Ce module contient la classe mixin PROC_ETAPE qui porte les méthodes - nécessaires pour réaliser la validation d'un objet de type PROC_ETAPE - dérivé de OBJECT. + Ce module contient la classe mixin PROC_ETAPE qui porte les méthodes + nécessaires pour réaliser la validation d'un objet de type PROC_ETAPE + dérivé de OBJECT. Une classe mixin porte principalement des traitements et est - utilisée par héritage multiple pour composer les traitements. + utilisée par héritage multiple pour composer les traitements. """ # Modules EFICAS import V_ETAPE @@ -34,38 +33,39 @@ from Noyau.strfunc import ufmt class PROC_ETAPE(V_ETAPE.ETAPE): - """ - On réutilise les méthodes report,verif_regles - de ETAPE par héritage. - """ - - def isvalid(self,sd='oui',cr='non'): - """ - Methode pour verifier la validité de l'objet PROC_ETAPE. Cette méthode - peut etre appelée selon plusieurs modes en fonction de la valeur - de sd et de cr (sd n'est pas utilisé). - Si cr vaut oui elle crée en plus un compte-rendu. + """ + On réutilise les méthodes report,verif_regles + de ETAPE par héritage. + """ - Cette méthode a plusieurs fonctions : + def isvalid(self, sd='oui', cr='non'): + """ + Methode pour verifier la validité de l'objet PROC_ETAPE. Cette méthode + peut etre appelée selon plusieurs modes en fonction de la valeur + de sd et de cr (sd n'est pas utilisé). - - retourner un indicateur de validité 0=non, 1=oui + Si cr vaut oui elle crée en plus un compte-rendu. - - produire un compte-rendu : self.cr + Cette méthode a plusieurs fonctions : - - propager l'éventuel changement d'état au parent - """ - if CONTEXT.debug : print "ETAPE.isvalid ",self.nom - if self.state == 'unchanged' : - return self.valid - else: - valid=self.valid_child() - valid=valid * self.valid_regles(cr) - if self.reste_val != {}: - if cr == 'oui' : - self.cr.fatal(_(u"Mots clés inconnus : %s"), ','.join(self.reste_val.keys())) - valid=0 - self.set_valid(valid) - return self.valid + - retourner un indicateur de validité 0=non, 1=oui + - produire un compte-rendu : self.cr + - propager l'éventuel changement d'état au parent + """ + if CONTEXT.debug: + print "ETAPE.isvalid ", self.nom + if self.state == 'unchanged': + return self.valid + else: + valid = self.valid_child() + valid = valid * self.valid_regles(cr) + if self.reste_val != {}: + if cr == 'oui': + self.cr.fatal( + _(u"Mots clés inconnus : %s"), ','.join(self.reste_val.keys())) + valid = 0 + self.set_valid(valid) + return self.valid diff --git a/Validation/V_UN_PARMI.py b/Validation/V_UN_PARMI.py index e8d8e908..e5375546 100644 --- a/Validation/V_UN_PARMI.py +++ b/Validation/V_UN_PARMI.py @@ -1,48 +1,53 @@ -# -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2013 EDF R&D +# coding=utf-8 +# person_in_charge: mathieu.courtois at edf.fr +# ====================================================================== +# COPYRIGHT (C) 1991 - 2015 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 library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# 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. # -# This library 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 -# Lesser 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. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +# ====================================================================== + class UN_PARMI: - """ - La règle vérifie que l'on trouve un des mots-clés - de la règle parmi les arguments d'un OBJECT. - Ces arguments sont transmis à la règle pour validation sous la forme - d'une liste de noms de mots-clés ou d'un dictionnaire dont - les clés sont des noms de mots-clés. - """ - def verif(self,args): - """ - La méthode verif vérifie que l'on trouve un des mos-clés - de la liste self.mcs parmi les éléments de args + """ + La règle vérifie que l'on trouve un des mots-clés + de la règle parmi les arguments d'un OBJECT. + + Ces arguments sont transmis à la règle pour validation sous la forme + d'une liste de noms de mots-clés ou d'un dictionnaire dont + les clés sont des noms de mots-clés. + """ - args peut etre un dictionnaire ou une liste. Les éléments de args - sont soit les éléments de la liste soit les clés du dictionnaire. - """ - # on compte le nombre de mots cles presents - text ='' - count=0 - args = self.liste_to_dico(args) - for mc in self.mcs: - if args.has_key(mc):count=count+1 - if count != 1: - text = u"- Il faut un et un seul mot-clé parmi : "+`self.mcs`+'\n' - return text,0 - return text,1 + def verif(self, args): + """ + La méthode verif vérifie que l'on trouve un des mos-clés + de la liste self.mcs parmi les éléments de args + args peut etre un dictionnaire ou une liste. Les éléments de args + sont soit les éléments de la liste soit les clés du dictionnaire. + """ + # on compte le nombre de mots cles presents + text = '' + count = 0 + args = self.liste_to_dico(args) + for mc in self.mcs: + if args.has_key(mc): + count = count + 1 + if count != 1: + text = u"- Il faut un et un seul mot-clé parmi : " + \ + `self.mcs`+'\n' + return text, 0 + return text, 1 -- 2.39.2