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