Salome HOME
CCAR: correction d'un probleme de mise a jour de contexte lors d'une insertion
[tools/eficas.git] / Noyau / N_CR.py
1 #@ MODIF N_CR Noyau  DATE 14/09/2004   AUTEUR MCOURTOI M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
9 # (AT YOUR OPTION) ANY LATER VERSION.                                 
10 #
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
15 #
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
19 #                                                                       
20 #                                                                       
21 # ======================================================================
22
23
24 """ Ce module contient la classe compte-rendu de validation
25 """
26
27 import string
28
29 class CR :
30    """ 
31         Classe servant à la construction et à l'affichage des objets Comptes-rendus 
32    """
33    def __init__(self,verbeux = 'non',debut='',fin='',dec='   '):
34       """
35          Attributs
36           - verbeux
37           - debut
38           - fin
39           - dec
40       """
41       self.verbeux = verbeux
42       self.debut=debut
43       self.fin=fin
44       self.dec=dec
45       self.crok=[]
46       self.crwarn=[]
47       self.crfatal=[]
48       self.crexception=[]
49       self.subcr=[]
50
51    def ok(self,comment):
52       """ Ajoute un commentaire OK à la liste crok"""
53       self.crok.append(comment)
54
55    def warn(self,comment):
56       """ Ajoute un commentaire Warning à la liste crwarn"""
57       self.crwarn.append(comment)
58
59    def fatal(self,comment):
60       """ Ajoute un commentaire Erreur Fatale à la liste crfatal"""
61       self.crfatal.append(comment)
62
63    def exception(self,comment):
64       """ Ajoute un commentaire Exception à la liste crexception"""
65       self.crexception.append(comment)
66
67    def add(self,cr):
68       """ Ajoute un objet CR à la liste subcr :il s'agit de l'objet CR d'un fils de self """
69       self.subcr.append(cr)
70
71    def estvide(self):
72       """ 
73            Retourne 1 si self ne contient aucun message grave (fatal ou exception) et
74                           aucun CR qui en contienne,
75                     0 sinon
76       """
77       if self.crexception : return 0
78       if self.crfatal : return 0
79       for s in self.subcr :
80         if not s.estvide(): return 0
81       return 1
82
83    def purge(self):
84       """ 
85            Purge complètement le CR sauf les exceptions
86       """
87       self.debut=''
88       self.fin=''
89       self.dec='   '
90       self.crok=[]
91       self.crwarn=[]
92       self.crfatal=[]
93       self.subcr=[]
94
95    def beautifie_messages(self):
96       """
97         Beautifie les messages stockés dans crok,crfatal,crexception et crwarn
98       """
99       l=[]
100       for mess in self.crok:
101          l.append(mess+'\n')
102       self.crok_belle=l
103       l=[]
104       for mess in self.crwarn:
105          l.append(encadre_message(mess,'*'))
106       self.crwarn_belle = l
107       l=[]
108       for mess in self.crfatal:
109          l.append(encadre_message(mess,'!'))
110       self.crfatal_belle = l
111       l=[]
112       for mess in self.crexception:
113          l.append(encadre_message(mess,'!'))
114       self.crexception_belle = l
115
116    def indent(self,s):
117       """
118         Insère en tete de chaque ligne du texte s la chaine self.dec
119       """
120       l = string.split(s,'\n')
121       return self.dec+string.join(l,'\n'+self.dec)[:-3]
122
123    def __str__(self):
124       """
125         Retourne une chaine de caractères décorée et représentative de self
126       """
127       s=''
128       self.beautifie_messages()
129       s=s+string.join(self.crok_belle,'')
130       s=s+string.join(self.crwarn_belle,'')
131       s=s+string.join(self.crfatal_belle,'')
132       s=s+string.join(self.crexception_belle,'')
133       for subcr in self.subcr:
134          if self.verbeux == 'oui':
135             s=s+str(subcr)+'\n'
136          else:
137             if not subcr.estvide():
138                s=s+str(subcr)
139       if s != '':
140          s=self.debut+'\n'+self.indent(s)+self.fin+'\n'
141       else :
142          s=self.debut+'\n'+self.fin+'\n'
143       return s
144
145    def report(self,decalage = 2):
146       """
147         Retourne une chaine de caractères non encadrée mais représentative de self
148       """
149       s=''
150       # on stocke dans s les messages de premier niveau
151       for mess in self.crok :
152         s=s + decalage*self.dec + mess + self.dec + '\n'
153       for mess in self.crwarn:
154         s=s + decalage*self.dec + mess + self.dec + '\n'
155       for mess in self.crfatal:
156         s=s + decalage*self.dec + mess + self.dec + '\n'
157       for mess in self.crexception:
158         s=s + decalage*self.dec + mess + self.dec + '\n'
159       # on récupère les messages des sous comptes-rendus ...
160       for subcr in self.subcr:
161         if not subcr.estvide():
162             s=s+subcr.report(decalage = decalage + 1)
163       # on rajoute les flags de début et de fin ... (si self n'est pas vide)
164       if not self.estvide() :
165         s = (decalage-1)*self.dec+self.debut+'\n'+s+ \
166             (decalage-1)*self.dec+self.fin+'\n'
167       return s
168
169    def get_mess_fatal(self):
170       """
171           Retourne une chaine de caractères contenant les messages de 
172           la liste crfatal (du dernier au premier)
173       """
174       self.crfatal.reverse()
175       s=''
176       for elem in self.crfatal :
177         s=s+elem
178       self.crfatal.reverse()
179       return s
180
181    def get_mess_exception(self):
182       """
183           Retourne une chaine de caractères contenant les messages 
184           de la liste crexception (du dernier au premier)
185       """
186       self.crexception.reverse()
187       s=''
188       for elem in self.crexception :
189         s=s+elem
190       self.crexception.reverse()
191       return s
192
193
194
195
196 def justify_text_old(texte='',cesure=50):
197   """
198       Prend la chaine de caractères 'texte' et la retourne avec un retour chariot
199       tous les 'cesure' caractères s'il y a lieu (le retour chariot est placé dans un blanc
200       et non au milieu d'un mot
201   """
202   texte = string.strip(texte)
203   if len(texte) < cesure : return texte
204   liste_lignes = string.split(texte,'\n')
205   texte_justifie = ''
206   for ligne in liste_lignes :
207     ligne = string.strip(ligne)
208     if len(ligne) <= cesure :
209       texte_justifie = texte_justifie + ligne + '\n'
210       continue
211     longueur = 0
212     new_text = ''
213     liste_mots = string.split(ligne,' ')
214     for mot in liste_mots :
215       new_longueur = longueur + len(mot)+1
216       if new_longueur < cesure :
217         new_text = new_text+' '+mot
218         longueur = longueur + len(mot) + 1
219       else :
220         longueur = 0
221         new_text = new_text + '\n'+mot
222     texte_justifie = texte_justifie + string.strip(new_text) + '\n'
223   return texte_justifie[0:-1]
224
225 def encadre_message_old(texte,motif):
226   """ 
227      Retourne la chaine de caractères texte entourée d'un cadre formés
228      d'éléments 'motif'
229   """
230   texte = justify_text(texte,cesure=80)
231   lignes = string.split(texte,'\n')
232   longueur = 0
233   for ligne in lignes :
234     if len(ligne)> longueur : longueur = len(ligne)
235   longueur = longueur + 4
236   txt = motif*longueur+'\n'
237   for ligne in lignes :
238     txt = txt + motif + ' '+ligne+' '*(longueur-len(motif+ligne)-2)+motif+'\n'
239   txt = txt + motif*longueur+'\n'
240   return txt
241
242
243
244
245 separateurs=(' ',',','/')
246 def split(ligne,cesure):
247        ligne= string.rstrip(ligne)
248        if len(ligne) <= cesure :
249           return ligne
250        else:
251           coupure=cesure
252           while ligne[coupure] not in separateurs and coupure > 0:
253              coupure = coupure - 1
254           if coupure == 0:
255              # Il faut augmenter la cesure
256              coupure =cesure
257              while ligne[coupure] not in separateurs and coupure < len(ligne)-1 :
258                 coupure = coupure + 1
259           if coupure == len(ligne)-1:
260              return ligne
261           else:
262              return ligne[:coupure+1]+ '\n' + split(ligne[coupure+1:],cesure)
263
264 def justify_text(texte='',cesure=50):
265        texte = string.strip(texte)
266        liste_lignes = string.split(texte,'\n')
267        l=[split(l,cesure) for l in liste_lignes]
268        texte_justifie=string.join(l,'\n')
269        return texte_justifie
270
271 def encadre_message(texte,motif):
272   """
273      Retourne la chaine de caractères texte entourée d'un cadre formés
274      d'éléments 'motif'
275   """
276   texte = justify_text(texte,cesure=80)
277   lignes = string.split(texte,'\n')
278   longueur = 0
279   for ligne in lignes :
280     ligne=string.rstrip(ligne)
281     if len(ligne)> longueur : longueur = len(ligne)
282   longueur = longueur + 4
283   txt = motif*longueur+'\n'
284   for ligne in lignes :
285     txt = txt + motif + ' '+ligne+' '*(longueur-len(motif+ligne)-2)+motif+'\n'
286   txt = txt + motif*longueur+'\n'
287   return txt
288
289
290
291