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