ajout pattern situation universitaire
[sigmawcs.git] / project / wcs / models.py
1 # -=- encoding: utf-8 -=-
2
3 from datetime import datetime, date as datetime_date
4 import os
5 import re
6 #import unicodedata
7
8 from sigma_v1.models import Personne, Dossier, DossierOrigine, DossierAccueil, DossierMobilite, DossierPieces
9 from sigma_v1.models import Etablissement, Implantation, Bureau
10
11 from wcs.settings import USER, STATUT_DOSSIER, MOBILITE, BUREAU, MAPPING, DATA_DIR
12 from wcs.settings import SIGMA_DOSSIER_M_ALT_MOIS_ORIGINE, SIGMA_DOSSIER_M_MOBILITE_ACCUEIL
13 from wcs.settings import SIGMA_DOSSIER_CATEGORIE_BOURSE, SIGMA_DOSSIER_ANNEE_BOURSE
14 from wcs.settings import SIGMA_DOSSIER_STATUT_PERSONNE
15 from wcs.settings import PATTERN_STATUT_PERSONNE, PATTERN_ETABL
16 from wcs.settings import PIECES_SUFFIXE, PIECES_SIGMA
17 from lib import majSansAccent, premiereMaj
18
19 #class Formulaire(object):
20 # Formulaire WCS (associé à un appel SIGMA)
21
22 #class Candidature(object):
23 # Candidature WCS (associé à un formulaire WCS)
24 # init = via une candidature au format json
25 #
26 # def createPdf(request, candidature):
27 # crée le PDF à partir d'un template local (futur : à partir du form wcs)
28 #
29 # def createZip(request, candidature):
30 # crée le dossier zip contenant PDF et toutes les pièces jointes
31
32 class JsonSigma2ObjectSigma(object):
33 # TEST : en cas d'échec, erreur levée en console
34 creation_django_ok = True
35 creation_db_ok = True
36
37 def createPersonne(self, data, save=True):
38 """
39 Créer Personne SIGMA à partir du json reçu, nettoyé, mappé et converti.
40 """
41 p = Personne()
42
43 #p.id
44 p.utilisateur_creation = USER
45 #p.utilisateur_maj =
46 #p.date_creation =
47 #p.date_maj =
48
49 p.civilite = data['sigma_personne_civilite']
50 p.nom = majSansAccent(data['sigma_personne_nom'].upper())[0:100]
51 p.nom_index = p.nom
52 p.nom_jeune_fille = majSansAccent(data['sigma_personne_nom_jeune_fille'].upper())[0:100]
53 p.nom_jeune_fille_index = p.nom_jeune_fille
54 p.prenom = majSansAccent(data['sigma_personne_prenom'].title())[0:100]
55 p.prenom_index = p.prenom.upper()
56 p.pays_nationalite = data['sigma_personne_pays_nationalite']
57 #p.sexe =
58
59 p.pays_naissance = data['sigma_personne_pays_naissance']
60 p.date_naissance = data['sigma_personne_date_naissance']
61 if data['sigma_personne_ville_naissance']:
62 p.ville_naissance = majSansAccent(data['sigma_personne_ville_naissance'].title())[0:50]
63
64 p.adresse = data['sigma_personne_adresse']
65 p.ville = majSansAccent(data['sigma_personne_ville'].title())[0:50]
66 p.region = data['sigma_personne_region'][0:50]
67 p.code_postal = data['sigma_personne_code_postal'][0:10]
68 p.pays_residence = data['sigma_personne_pays_residence']
69 p.tel = data['sigma_personne_tel'][0:25]
70 #p.fax
71 p.tel_pro = data['sigma_personne_tel_pro'][0:25]
72 #p.fax_pro
73 p.email = data['sigma_personne_email'][0:100]
74
75 if save:
76 p.save()
77
78 return p
79
80 def createDossier(self, data, p, save=True):
81 """
82 Créer Dossier SIGMA à partir du json reçu, nettoyé, mappé et converti.
83 """
84 d = Dossier()
85
86 #d.id
87 d.statut = STATUT_DOSSIER
88 d.mobilite = MOBILITE
89 d.personne = p
90
91 d.statut_personne = data['sigma_dossier_statut_personne']
92 d.fonction = data['sigma_dossier_fonction'][0:100]
93
94 if BUREAU is not None :
95 d.bureau_rattachement = BUREAU
96 else:
97 # bureau rattachement via établissement d'origine
98 try:
99 id_etablissement = data['sigma_dossier_o_etablissement'].lstrip('0')
100 etablissement = Etablissement.objects.get(id_gde=id_etablissement)
101 d.bureau_rattachement = etablissement.implantation_sigma.bureau.id_num
102 except Etablissement.DoesNotExist:
103 pass
104
105 d.intitule_d_diplome = data['sigma_dossier_intitule_d_diplome'][0:100]
106 if data['sigma_dossier_date_d_diplome'] is not None:
107 d.date_d_diplome = data['sigma_dossier_date_d_diplome']
108 d.nom_etb = data['sigma_dossier_nom_etabl'][0:100]
109 d.pays_etb = data['sigma_dossier_pays_etabl']
110 d.niveau = data['sigma_dossier_niveau']
111
112 #data['sigma_dossier_particip_prog_auf']
113 d.programme = data['sigma_dossier_programme'][0:255]
114 d.annee_programme = data['sigma_dossier_annee_programme'] or 0
115 if data['sigma_dossier_boursier_auf']:
116 d.categorie_bourse = SIGMA_DOSSIER_CATEGORIE_BOURSE
117 if data['sigma_dossier_categorie_bourse']:
118 d.categorie_bourse = data['sigma_dossier_categorie_bourse'][0:12]
119 d.annee_bourse = SIGMA_DOSSIER_ANNEE_BOURSE
120 if data['sigma_dossier_annee_bourse']:
121 d.annee_bourse = data['sigma_dossier_annee_bourse'] or 0
122
123 #d.etat
124 #d.dd_activation
125 #d.df_activation
126 d.utilisateur_creation = USER
127 d.utilisateur_maj = USER
128 #d.date_maj
129
130 #d.classement_1
131 #d.classement_2
132 #d.classement_3
133 #d.opp_regionale
134 #d.coche_selection
135 #d.reponse_notification
136 #d.commentaire_notification
137 #d.moyenne_academique
138 nl = u'\n\n'
139 d.autres_criteres = nl.join(data['sigma_dossier_autres_criteres'])[0:255]
140 #d.erreurs_recevabilite
141 #d.repechage
142 #d.rendu_irrecevable
143
144 if save:
145 d.save()
146
147 return d
148
149 def createDossierOrigine(self, data, d, save=True):
150 """
151 Créer DossierOrigine SIGMA à partir du json reçu, nettoyé, mappé et converti.
152 """
153 do = DossierOrigine()
154
155 #do.id
156 do.dossier = d
157
158 # établissement
159 id_etablissement = data['sigma_dossier_o_etablissement'].lstrip('0')
160 try:
161 etablissement = Etablissement.objects.get(id_gde=id_etablissement)
162
163 # id
164 do.etablissement = etablissement.id # PAS etablissement.id_gde
165
166 # coordonnées
167 do.pays = etablissement.pays
168 do.adresse = etablissement.adresse
169 if etablissement.code_postal is not None :
170 do.code_postal = etablissement.code_postal[0:10]
171 if etablissement.ville is not None :
172 do.ville = etablissement.ville[0:50]
173 if etablissement.province is not None :
174 do.region = etablissement.province[0:50]
175 #do.url_site
176 except Etablissement.DoesNotExist:
177 pass
178 do.sc_faculte = data['sigma_dossier_o_sc_faculte'][0:150]
179
180 #do.erreur_recevabilite_etbt_origine =
181 #do.autre_etb =
182
183 # accord scientifique
184 do.sc_civilite = data['sigma_dossier_o_sc_civilite'] or 'MR'
185 do.sc_nom = majSansAccent(data['sigma_dossier_o_sc_nom'].upper())[0:100]
186 do.sc_prenom = majSansAccent(data['sigma_dossier_o_sc_prenom'].title())[0:100]
187 do.sc_fonction = data['sigma_dossier_o_sc_fonction'][0:100]
188 #do.sc_adresse =
189 #do.sc_code_postal =
190 do.sc_ville = majSansAccent(data['sigma_dossier_o_sc_ville'].title())[0:50]
191 do.sc_tel_pro = data['sigma_dossier_o_sc_tel_pro'][0:25]
192 do.sc_email = data['sigma_dossier_o_sc_email'][0:100]
193 #do.sc_fax_pro =
194
195 # accord institutionnel
196 #do.inst_civilite =
197 #do.inst_nom =
198 #do.inst_prenom =
199 #do.inst_fonction =
200
201 if save:
202 do.save()
203
204 return do
205
206 def createDossierAccueil(self, data, d, save=True):
207 """
208 Créer DossierAccueil SIGMA à partir du json reçu, nettoyé, mappé et converti.
209 """
210 da = DossierAccueil()
211
212 #da.id =
213 da.dossier = d
214
215 # établissement
216 id_etablissement = data['sigma_dossier_a_etablissement'].lstrip('0')
217 try:
218 etablissement = Etablissement.objects.get(id_gde=id_etablissement)
219
220 # id
221 da.etablissement = etablissement.id # PAS etablissement.id_gde
222
223 # coordonnées
224 da.pays = etablissement.pays
225 da.adresse = etablissement.adresse
226 if etablissement.code_postal is not None :
227 da.code_postal = etablissement.code_postal[0:10]
228 if etablissement.ville is not None :
229 da.ville = etablissement.ville[0:50]
230 if etablissement.province is not None :
231 da.region = etablissement.province[0:50]
232 #da.url_site
233 except Etablissement.DoesNotExist:
234 pass
235 da.sc_faculte = data['sigma_dossier_a_sc_faculte'][0:150]
236
237 #da.erreur_recevabilite_etbt_accueil =
238 #da.autre_etb =
239
240 # accord scientifique
241 da.sc_civilite = data['sigma_dossier_a_sc_civilite']
242 da.sc_nom = majSansAccent(data['sigma_dossier_a_sc_nom'].upper())[0:100]
243 da.sc_prenom = majSansAccent(data['sigma_dossier_a_sc_prenom'].title())[0:100]
244 da.sc_fonction = data['sigma_dossier_a_sc_fonction'][0:100]
245 #da.sc_adresse =
246 #da.sc_code_postal =
247 da.sc_ville = majSansAccent(data['sigma_dossier_a_sc_ville'].title())[0:50]
248 da.sc_tel_pro = data['sigma_dossier_a_sc_tel_pro'][0:25]
249 da.sc_email = data['sigma_dossier_a_sc_email'][0:100]
250 #da.sc_fax_pro =
251
252 # accord institutionnel
253 #da.inst_civilite =
254 #da.inst_nom =
255 #da.inst_prenom =
256 #da.inst_fonction =
257 #da.inst_email =
258 #da.inst_tel_pro =
259 #da.inst_fax_pro =
260
261 if save:
262 da.save()
263
264 return da
265
266 def createDossierMobilite(self, data, d, save=True):
267 """
268 Créer DossierMobilite SIGMA à partir du json reçu, nettoyé, mappé et converti.
269 """
270 dm = DossierMobilite()
271
272 #dm.id =
273 dm.dossier = d
274
275 dm.intitule_diplome = data['sigma_dossier_m_intitule_diplome'][0:100]
276 if not dm.intitule_diplome and data['sigma_dossier_m_intitule_diplome_autre'] :
277 dm.intitule_diplome = data['sigma_dossier_m_intitule_diplome_autre'][0:100]
278
279 dm.niveau_encours = data['sigma_dossier_m_niveau_encours']
280
281 # calculs : ce qu'on peut dériver des data
282 mobilite_accueil = False
283 dd_mobilite = '1970-01-01'
284 df_mobilite = '1970-01-01'
285
286 o_dd = data['sigmawcs_dossier_o_dd']
287 o_df = data['sigmawcs_dossier_o_df']
288 a_dd = data['sigmawcs_dossier_a_dd']
289 a_df = data['sigmawcs_dossier_a_df']
290
291 # origine et accueil
292 if o_dd is not None and a_dd is not None:
293 if (o_dd < a_dd):
294 # commence mobilité à origine
295 mobilite_accueil = False
296 dd_mobilite = o_dd
297 df_mobilite = a_df
298 else :
299 # commence mobilité à accueil
300 mobilite_accueil = True
301 dd_mobilite = a_dd
302 df_mobilite = o_df
303 # origine seul
304 elif o_dd is not None and a_dd is None:
305 # commence mobilité à origine
306 mobilite_accueil = False
307 dd_mobilite = o_dd
308 if o_df is not None and a_df is not None:
309 if (o_df < a_df):
310 df_mobilite = a_df
311 else:
312 df_mobilite = o_df
313 elif o_df is not None:
314 df_mobilite = o_df
315 elif a_df is not None:
316 df_mobilite = a_df
317 # accueil seul
318 elif o_dd is None and a_dd is not None:
319 # commence mobilité à accueil
320 mobilite_accueil = True
321 dd_mobilite = a_dd
322 if o_df is not None and a_df is not None:
323 if (o_df < a_df):
324 df_mobilite = a_df
325 else:
326 df_mobilite = o_df
327 elif o_df is not None:
328 df_mobilite = o_df
329 elif a_df is not None:
330 df_mobilite = a_df
331
332 if data.has_key('sigma_dossier_m_dd_mobilite') and data.has_key('sigma_dossier_m_df_mobilite'):
333 dd_mobilite = data['sigma_dossier_m_dd_mobilite']
334 df_mobilite = data['sigma_dossier_m_df_mobilite']
335 # 1. data WCS
336 if data.has_key('sigma_dossier_m_mobilite_accueil'):
337 mobilite_accueil = data['sigma_dossier_m_mobilite_accueil']
338 # 2. conf de l'appel
339 elif SIGMA_DOSSIER_M_MOBILITE_ACCUEIL is not None:
340 mobilite_accueil = SIGMA_DOSSIER_M_MOBILITE_ACCUEIL
341
342 dm.dd_mobilite = dd_mobilite
343 dm.df_mobilite = df_mobilite
344 #dm.total_mobilite = total_mobilite # intervalle dd_mobilite, df_mobilite # computé par SIGMA?
345
346 # 1. default
347 alt_mois_origine = 0
348 # 2. data WCS
349 if data.has_key('sigma_dossier_m_alt_mois_origine'):
350 alt_mois_origine = data['sigma_dossier_m_alt_mois_origine']
351 # 3. conf de l'appel
352 elif SIGMA_DOSSIER_M_ALT_MOIS_ORIGINE is not None:
353 alt_mois_origine = SIGMA_DOSSIER_M_ALT_MOIS_ORIGINE
354 dm.alt_mois_origine = alt_mois_origine
355 dm.alt_mois_accueil = data['sigma_dossier_m_alt_mois_accueil']
356 dm.mobilite_accueil = mobilite_accueil
357
358 if data['sigma_dossier_m_date_inscription_these'] is not None:
359 dm.date_inscription_these = data['sigma_dossier_m_date_inscription_these']
360
361 if data['sigma_dossier_m_date_soutenance_these'] is not None:
362 dm.date_soutenance_these = data['sigma_dossier_m_date_soutenance_these']
363 # workaround : champ dm.date_soutenance_these pas affiché in SIGMA :
364 dm.type_these_autre = u"Date soutenance prévue : %s" % (dm.date_soutenance_these)
365 dm.type_these_autre = dm.type_these_autre[0:255]
366 if data['sigma_dossier_m_pays_soutenance'] is not u"":
367 dm.pays_soutenance = data['sigma_dossier_m_pays_soutenance']
368 if data['sigma_dossier_m_type_these'] is not u"":
369 dm.type_these = data['sigma_dossier_m_type_these']
370
371 dm.discipline = data['sigma_dossier_m_discipline']
372 dm.sous_discipline = data['sigma_dossier_m_sous_discipline']
373
374 if data['sigma_dossier_m_intitule_projet'] is not u"":
375 dm.intitule_projet = premiereMaj(data['sigma_dossier_m_intitule_projet'])
376 # ajout point à la fin...
377 if dm.intitule_projet[-1] != u"." :
378 dm.intitule_projet = dm.intitule_projet + u"."
379
380 if data['sigma_dossier_m_mot_clef1'] is not u"":
381 dm.mot_clef1 = majSansAccent(data['sigma_dossier_m_mot_clef1'].upper())[0:50]
382 if data['sigma_dossier_m_mot_clef2'] is not u"":
383 dm.mot_clef2 = majSansAccent(data['sigma_dossier_m_mot_clef2'].upper())[0:50]
384 if data['sigma_dossier_m_mot_clef3'] is not u"":
385 dm.mot_clef3 = majSansAccent(data['sigma_dossier_m_mot_clef3'].upper())[0:50]
386
387 if data['sigma_dossier_m_type_intervention'] is not u"":
388 dm.type_intervention = data['sigma_dossier_m_type_intervention']
389 dm.public_vise = data['sigma_dossier_m_public_vise']
390 dm.autres_publics = data['sigma_dossier_m_autres_publics'][0:50]
391
392 if data['sigma_dossier_m_mobilite_accueil'] is not u"":
393 dm.mobilite_accueil = data['sigma_dossier_m_mobilite_accueil'] # debut mobilité à l'accueil?
394 dm.intitule_diplome_demande = data['sigma_dossier_m_intitule_diplome_demande']
395 if data['sigma_dossier_m_niveau_demande'] is not u"":
396 dm.niveau_demande = data['sigma_dossier_m_niveau_demande']
397 if data['sigma_dossier_m_date_obtention_prevu'] is not None:
398 dm.obtention_prevu = data['sigma_dossier_m_date_obtention_prevu']
399
400 if data['sigma_dossier_m_dir_ori_civilite'] is not u"":
401 dm.dir_ori_civilite = data['sigma_dossier_m_dir_ori_civilite']
402 if data['sigma_dossier_m_dir_ori_nom'] is not u"":
403 dm.dir_ori_nom = majSansAccent(data['sigma_dossier_m_dir_ori_nom'].upper())[0:100]
404 if data['sigma_dossier_m_dir_ori_prenom'] is not u"":
405 dm.dir_ori_prenom = majSansAccent(data['sigma_dossier_m_dir_ori_prenom'].title())[0:100]
406 # email absent in SIGMA... sale workaround
407 dm.dir_ori_prenom = u"%s [%s]" % (dm.dir_ori_prenom, data['sigma_dossier_m_dir_ori_email'])
408 dm.dir_ori_prenom = dm.dir_ori_prenom[0:100]
409
410 if data['sigma_dossier_m_dir_acc_civilite'] is not u"":
411 dm.dir_acc_civilite = data['sigma_dossier_m_dir_acc_civilite']
412 if data['sigma_dossier_m_dir_acc_nom'] is not u"":
413 dm.dir_acc_nom = majSansAccent(data['sigma_dossier_m_dir_acc_nom'].upper())[0:100]
414 if data['sigma_dossier_m_dir_acc_prenom'] is not u"":
415 dm.dir_acc_prenom = majSansAccent(data['sigma_dossier_m_dir_acc_prenom'].title())[0:100]
416 # email absent in SIGMA... sale workaround
417 dm.dir_acc_prenom = u"%s [%s]" % (dm.dir_acc_prenom, data['sigma_dossier_m_dir_acc_email'])
418 dm.dir_acc_prenom = dm.dir_acc_prenom[0:100]
419
420 if save:
421 dm.save()
422
423 return dm
424
425 def createDossierPieces(self, data, d, save=True):
426 """
427 Créer DossierPieces SIGMA à partir du json reçu, nettoyé, mappé et converti.
428 """
429 pieces_created = []
430
431 #data['sigma_dossier_p_*']
432 mapping_reverse = {}
433 for k,v in MAPPING.items():
434 mapping_reverse[v] = k
435
436 for id, piece in PIECES_SUFFIXE.items():
437 # pièce présente? accès fichier réel
438 presente = False
439 if id == 19:
440 # formulaire
441 presente = True
442 else :
443 # autres pièces
444 sigma_key = mapping_reverse[piece]
445 path = '%s/%s' % (DATA_DIR, data[sigma_key])
446 if os.path.exists(path):
447 presente = True
448
449 dp = DossierPieces()
450 #dp.id =
451 dp.dossier = d
452 dp.presente = presente
453 dp.piece = id
454 #dp.conforme =
455 #dp.commentaire = u"Pièce chargée par candidat via formulaire électronique."
456 if save:
457 dp.save()
458 pieces_created.append(dp)
459
460 # Autres pièces in SIGMA
461
462 for piece in PIECES_SIGMA:
463 dp = DossierPieces()
464 dp.dossier = d
465 dp.piece = piece
466 if save:
467 dp.save()
468 pieces_created.append(dp)
469
470 return pieces_created
471
472 ### AUTRE
473 #data['wcs_num_dossier']
474
475 #data['sigma_confirmation_nom']
476 #data['sigma_confirmation_prenom']
477 #data['sigma_confirmation']
478
479 class JsonWcs2JsonSigma(object):
480 """
481 Converti les données de formulaires WCS, notamment les <option> des <select>
482 en données exploitables par SIGMA.
483 Ex.:
484 input : Algérie - Centre de recherche en anthropologie sociale et culturelle (Sud/BEOM/547)
485 output : 547
486 """
487
488 ### types SIGMA
489 # champs WCS = liste
490 civilite = []
491 statut = []
492 public_vise = []
493 niveau = []
494 diplome = []
495 mois = []
496 these = []
497 bourse = []
498 pays = []
499 etablissement = []
500 discipline = []
501 # champs WCS = date
502 date = []
503
504 # civilite
505 civilite.append('sigma_personne_civilite')
506 civilite.append('sigma_dossier_o_sc_civilite')
507 civilite.append('sigma_dossier_m_dir_ori_civilite')
508 civilite.append('sigma_dossier_a_sc_civilite')
509 civilite.append('sigma_dossier_m_dir_acc_civilite')
510 # statut
511 statut.append('sigma_dossier_statut_personne')
512 # public visé
513 public_vise.append('sigma_dossier_m_public_vise')
514 # niveau
515 niveau.append('sigma_dossier_niveau')
516 niveau.append('sigma_dossier_m_niveau_encours')
517 niveau.append('sigma_dossier_m_niveau_demande')
518 # diplome
519 diplome.append('sigma_dossier_m_intitule_diplome')
520 diplome.append('sigma_dossier_m_intitule_diplome_demande')
521 # mois
522 mois.append('sigma_dossier_m_alt_mois_origine')
523 mois.append('sigma_dossier_m_alt_mois_accueil')
524 # these
525 these.append('sigma_dossier_m_type_these')
526 # bourse
527 bourse.append('sigma_dossier_categorie_bourse')
528 # pays
529 pays.append('sigma_personne_pays_nationalite')
530 pays.append('sigma_personne_pays_naissance')
531 pays.append('sigma_personne_pays_residence')
532 pays.append('sigma_dossier_pays_etabl')
533 pays.append('sigma_dossier_m_pays_soutenance')
534 # etablissement
535 etablissement.append('sigma_dossier_o_etablissement')
536 etablissement.append('sigma_dossier_a_etablissement')
537 # discipline
538 discipline.append('sigma_dossier_m_discipline')
539 # date
540 date.append('sigma_personne_date_naissance')
541 date.append('sigma_dossier_date_d_diplome')
542 date.append('sigmawcs_dossier_o_dd')
543 date.append('sigmawcs_dossier_o_df')
544 date.append('sigmawcs_dossier_a_dd')
545 date.append('sigmawcs_dossier_a_df')
546 date.append('sigma_dossier_m_date_inscription_these')
547 date.append('sigma_dossier_m_date_soutenance_these')
548 date.append('sigma_dossier_m_date_obtention_prevu')
549
550 ### TEST (utilisé par test.py) : résultats conversion globale de tous les .json
551 convert_ok = True
552 convert_errors = []
553
554 ### NETTOYAGE unicode -> ISO
555 def cleanup(self, json):
556 for k,v in json.iteritems():
557 if type(v) is unicode :
558 # encodage : correction caractères
559 v = self.replaceUnicodeNotIso(v)
560 # strip espaces
561 v = v.lstrip()
562 v = v.rstrip()
563 json[k] = v
564 if type(v) is str :
565 #print ('%s : %s a str = %s') % (json['wcs_num_dossier'], k, v)
566 pass
567 return json
568
569 def replaceUnicodeNotIso(self, string):
570 """
571 Remplace caractère Unicode (scripts latin) n'ayant pas d'équivalent ISO-8859-1
572 par un caractère visuellement similaire.
573 """
574 result = ''
575
576 #nkfd_form = unicodedata.normalize('NFKD', unicode(string))
577 #string = u"".join([c for c in nkfd_form if not unicodedata.combining(c)])
578
579 # Latin Extended-A
580 avant = u'ĂŞşŢţνγδệịạỄợụĐốữẦươȘβğПΣăúµÁẾ◦õễọạươộảỨũửỆỘƯƠỹòớồíỲỊờậẵắằấầựừềĩìáủéỒỌếїđŨỂểứ()'
581 apres = u'ASsTtvgdêiaEouDouAuoSBgPEaumAE*oeoauooaUuuEOUOyoooiYioaaaaaauueiiaueOOeidUEeu()'
582
583 for char in string:
584 i = avant.find(char)
585 if i >= 0:
586 char = apres[i]
587 result += char
588
589 return result
590
591 ### MAPPAGE pour formulaire en cours
592 mapping = MAPPING
593
594 def mapper(self, json):
595 """
596 Traitement sur les champs reçus : mapper pour associer à SIGMA.
597 """
598 newJson = {}
599 mapping_reverse = {}
600 for k,v in self.mapping.items():
601 mapping_reverse[v] = k
602 # renomme champ avec nom SIGMA si mappé sinon conserve nom
603 for k,v in json.items():
604 if k in self.mapping.values():
605 new_k = mapping_reverse[k]
606 newJson[new_k] = v
607 else:
608 newJson[k] = v
609 # ajouter tous les champs SIGMA qui ne serait pas dans le formulaire reçu
610 for k,v in self.mapping.items():
611 if not newJson.has_key(k):
612 newJson[k] = None
613 return newJson
614
615 ### CONVERSION (de string s pour key k)
616 def convert(self, json):
617 """
618 Traitement sur les valeurs reçues : convertir pour rendre conforme SIGMA.
619 """
620 for k,s in json.iteritems():
621 if s is None:
622 s = u''
623 json[k] = s
624 if k in self.civilite :
625 s2 = self.str2civilite(s)
626 json[k] = s2
627 if s2 == s:
628 self.log_error(json, k, s)
629 elif k in self.statut :
630 json[k] = self.str2statutPersonne(s)
631 # no log_error
632 elif k in self.public_vise :
633 json[k] = self.list2publicVise(s)
634 # no log_error
635 elif k in self.niveau :
636 json[k] = self.str2niveauEtude(s)
637 # no log_error
638 elif k in self.diplome :
639 json[k] = self.str2diplome(s)
640 # no log_error
641 elif k in self.mois :
642 json[k] = self.str2nbMois(s)
643 # no log_error
644 elif k in self.these :
645 s2 = self.str2typeThese(s)
646 json[k] = s2
647 if s2 == s:
648 self.log_error(json, k, s)
649 elif k in self.bourse :
650 s2 = self.str2bourse(s)
651 json[k] = s2
652 if s != u'' and s2 == s:
653 self.log_error(json, k, s)
654 elif k in self.pays:
655 s2 = self.str2pays(s)
656 json[k] = s2
657 if s2 == s:
658 self.log_error(json, k, s)
659 elif k in self.etablissement :
660 s2 = self.str2etablissement(s)
661 json[k] = s2
662 if s2 == s:
663 self.log_error(json, k, s)
664 elif k in self.discipline :
665 s2 = self.str2discipline(s)
666 json[k] = s2
667 if s2 == s:
668 self.log_error(json, k, s)
669 elif k in self.date :
670 s2 = self.str2date(s)
671 json[k] = s2
672 if s2 == s:
673 self.log_error(json, k, s)
674 return json
675
676 def log_error(self, json, k, s):
677 self.convert_ok = False
678 error = '%s : %s = %s' % (json['wcs_num_dossier'], k, s)
679 self.convert_errors.append(error)
680
681 def str2civilite(self, s):
682 output = s
683 if s == 'M.':
684 output = 'MR'
685 elif s == 'Mme':
686 output = 'MM'
687 elif s == 'Mlle':
688 output = 'ME'
689 return output
690
691 def str2statutPersonne(self, s):
692 """
693 Exemple :
694 pattern 1 (SIGMA) :
695 1 Étudiant
696 2 Chercheur
697 3 Enseignant
698 4 Enseignant-chercheur
699 5 Post-Doc
700
701 pattern 2:
702 1 Chercheur
703 2 Enseignant-chercheur
704 3 Étudiant
705
706 pattern 3:
707 1 Étudiant
708 2 Enseignant
709
710 pattern 4:
711 1 Étudiant
712 2 Chercheur
713 3 Enseignant-chercheur
714
715 pattern 5:
716 1 Chercheur
717 2 Enseignant-chercheur
718
719 pattern 6:
720 1 Étudiant
721 2 Enseignant
722 3 Enseignant-chercheur
723 4 Chercheur
724 """
725 output = 0 # équivalent du default dans sigma_v1.models.Dossier.statut
726 if SIGMA_DOSSIER_STATUT_PERSONNE is not None :
727 # si conf.py donne constante pour cet appel, pas de traitement
728 output = SIGMA_DOSSIER_STATUT_PERSONNE
729 else :
730 try :
731 # id du statut = permière lettre
732 input = int(s[0])
733 # WCS : valeurs différentes de SIGMA... :(
734 if PATTERN_STATUT_PERSONNE is not None:
735 if PATTERN_STATUT_PERSONNE == 1:
736 output = input
737 elif PATTERN_STATUT_PERSONNE == 2:
738 if input == 1:
739 output = 2
740 elif input == 2:
741 output = 4
742 elif input == 3:
743 output = 1
744 elif PATTERN_STATUT_PERSONNE == 3:
745 if input == 1:
746 output = 1
747 elif input == 2:
748 output = 3
749 elif PATTERN_STATUT_PERSONNE == 4:
750 if input == 1:
751 output = 1
752 elif input == 2:
753 output = 2
754 elif input == 3:
755 output = 4
756 elif PATTERN_STATUT_PERSONNE == 5:
757 if input == 1:
758 output = 2
759 elif input == 2:
760 output = 4
761 elif PATTERN_STATUT_PERSONNE == 6:
762 if input == 1:
763 output = 1
764 elif input == 2:
765 output = 3
766 elif input == 3:
767 output = 4
768 elif input == 4:
769 output = 2
770 except IndexError, ValueError :
771 pass
772 return output
773
774 def list2publicVise(self, l):
775 """
776 L'idée est de retrouver l'id SIGMA du public visé en fonction libellé
777 passé.
778
779 Valeurs SIGMA
780 1 Etudiants
781 2 Enseignant
782 3 Chercheur
783 4 Enseignant-Chercheur
784 5 Post-Doc
785 6 Professionnels non enseignants
786 """
787 # map entre values SIGMA et string reçus de WCS
788 values = {
789 'etudiants':1,
790 'enseignant':2,
791 'chercheur':3,
792 'enseignant-chercheur':4,
793 'post-doc':5,
794 'professionnels non enseignants':6
795 }
796 output = 0 # équivalent du default dans sigma_v1.models.DossierMobilite.public_vise
797 if l and type(l) == list:
798 try:
799 public = l[0] # n'en prend qu'un car = FK dans modèle SIGMA... pas m2m
800 key = public.lower()
801 output = values[key]
802 except KeyError:
803 pass
804 return output
805
806 def str2niveauEtude(self, s):
807 """
808 C_NIVEAU L_INTITULE_NIVEAU L_NIVEAU (annees)
809 6 ... 0
810 1 Licence 2 2
811 2 Licence 3 3
812 3 Master 1 4
813 4 Master 2 5
814 7 Master 2 + 6
815 5 Doctorat 8
816 8 Bac + 7 7
817 9 Doctorat 9
818 """
819 output = 0
820 try :
821 # années études = permière lettre
822 annees = int(s[0])
823 # sauf 10 ans = 2 premières lettres...
824 if annees == 1:
825 annees = 10
826
827 if annees == 2 : output = 1
828 elif annees == 3 : output = 2
829 elif annees == 4 : output = 3
830 elif annees == 5 : output = 4
831 elif annees == 6 : output = 7
832 elif annees == 7 : output = 8
833 elif annees == 8 : output = 5
834 elif annees == 9 : output = 9
835 elif annees == 10 : output = 9
836
837 except IndexError, ValueError :
838 pass
839 return output
840
841 def str2diplome(self, s):
842 output = s
843 if s.lower().startswith('autre'):
844 output = '' # retourne vide car traitement teste si vide pour prendre valeur autre champ
845 return output
846
847 def str2nbMois(self, s):
848 output = 0
849 try :
850 # permière lettre = nb de mois
851 output = int(s[0])
852 except (ValueError, IndexError) :
853 pass
854 return output
855
856 def str2typeThese(self, s):
857 output = s
858 if s == 'Co-tutelle':
859 output = 'CT'
860 elif s == 'Co-direction':
861 output = 'CD'
862 elif s == 'Autre':
863 output = 'AU'
864 return output
865
866 def str2bourse(self, s):
867 """
868 Exemple :
869 input = Bourse de doctorat (Formation à la Recherche - FR)
870 output = FR
871 """
872 pattern = r'.*(?P<code>\w{2})\)$'
873 return self.code_from_pattern(pattern, s)
874
875 def str2pays(self, s):
876 """
877 Exemple :
878 input = Arménie (AM - Europe centrale et orientale)
879 output = AM
880 """
881 pattern = r'.*\((?P<code>\w{2}).*\)$'
882 return self.code_from_pattern(pattern, s)
883
884 def str2etablissement(self, s):
885 """
886 Exemple :
887 pattern 1 :
888 input = Algérie - Centre universitaire d'El Oued (Sud/BEOM/1120)
889 output = 1120
890
891 pattern 2 :
892 input = Cameroun - Université de Ngaoundéré (265 - Sud)
893 output = 265
894 """
895 patterns = {
896 1: r'.*\(.*/(?P<code>\d*)\)$',
897 2: r'.*\((?P<code>\d*) .*\)$',
898 }
899 pattern = patterns[PATTERN_ETABL]
900 return self.code_from_pattern(pattern, s)
901
902 def str2discipline(self, s):
903 """
904 Exemple :
905 input = Anthropologie (D104)
906 output = D104
907 """
908 pattern = r'.*\((?P<code>\w*)\)$'
909 return self.code_from_pattern(pattern, s)
910
911 def str2date(self, s):
912 date = None
913 try:
914 d = datetime.strptime(s, '%Y-%m-%d')
915 date = datetime_date(d.year, d.month, d.day)
916 except ValueError:
917 pass
918 return date
919
920 def code_from_pattern(self, pattern=r'^$', s=u''):
921 if s is None:
922 s = u''
923 output = s
924 if s :
925 m = re.match(pattern, s)
926 if m and m.group('code'):
927 output = m.group('code')
928 return output