pièces jointes : gestion des pièces absentes dans SIGMA (patch)
authordavin baragiotta <davin.baragiotta@u-db.(none)>
Wed, 18 May 2011 00:44:10 +0000 (20:44 -0400)
committerDavin BARAGIOTTA <davin.baragiotta@auf.org>
Wed, 18 May 2011 00:44:10 +0000 (20:44 -0400)
project/sigma_v1/settings.py
project/wcs/conf.py.edit
project/wcs/docs.py
project/wcs/lib.py
project/wcs/models.py
project/wcs/settings.py
project/wcs/views.py

index e4c6622..0bd4ffb 100644 (file)
@@ -2,7 +2,10 @@
 
 # Pièces nom requis pour apparaître dans interface SIGMA
 PIECES_SUFFIXE = {
-    # id_sigma: 'nom_fichier_sigma'  # Nom affichage SIGMA   
+    # utilisé lors de la création de l'archive des candidatures pour export vers SIGMA
+    #     views.exportSigmaFiles : ln 170
+    # id_sigma: 'nom_fichier_sigma'  # Nom affichage SIGMA 
+      
     #1:'',  # Attestation d’accord du(des) directeur(s) de thèse justifiant l'alternance proposée
     2:'attestation_o_dir',  # Attestation d'accord - Établissement d'accueil
     3:'attestation_a_dir',  # Attestation d'accord - Établissement d'origine
index df53efe..139b541 100644 (file)
@@ -19,37 +19,81 @@ SIGMA_DOSSIER_M_MOBILITE_ACCUEIL = None #ex.: False
 
 # Pièces réelles soumises par candidat
 PIECES_SUFFIXE = {
+    # utilisé lors de l'import de WCS en local 
+    #     views.importDossiersCandidaturesWcs : ln 90 et 113
+    # et lors de la création de l'archive des candidatures pour export vers SIGMA
+    #     views.exportSigmaFiles : ln 165
+    # et lors de la création des pièces jointes dans la DB
+    #     models.createDossierPieces : ln 402
+    # 
+    # ex.: 16:'curriculum_vitae'
+    # * key   = id SIGMA de la pièce (ex.: 16)
+    # * value = suffixe du fichier WCS
+    
+    # si value = vide : pas importé par import.py, pas exporté par export.py
+
+    #2:'attestation_d_accord_du_directeur_de_these_a_l_accueil',
+    #3:'attestation_d_accord_du_directeur_de_these_a_l_origine',
     16:'curriculum_vitae',
-    17:'descriptif_detaille_du_sujet_de_these',
+    #17:'descriptif_detaille_du_sujet_de_these',
     19:'', # formulaire
-    27:'protocole_de_recherche',
+    #27:'protocole_de_recherche',
+    1001:'lettre_de_motivation',
+    1002:'attestation_de_pre_inscription_a_la_formation_pour_l_annee_de_mobilite_2011_2012_emanant_du_responsable_du_master',
     }
-PIECES_WCS = [
-    16, # curriculum_vitae
-    17, # descriptif thèse
-    19, # formulaire
-    27, # protocole de recherche
-    ]
+
 # Pièces SIGMA autres à vérifier plus tard
 PIECES_SIGMA = [
-    1, # Attestation d’accord du(des) directeur(s) de thèse justifiant l'alternance proposée
-    2, # Attestation d'accord - Établissement d'accueil
-    3, # Attestation d'accord - Établissement d'origine
-    4, # Attestation d'accord à l'accueil - Responsable
-    5, # Attestation d'accord à l'origine - Responsable
-    6, # Attestation d'admission - Établissement d'accueil
-    7, # Demande d'inscription pour l'année de mobilité
-    8, # Attestation d'inscription pour l'année en cours
-    10, # Calendrier de l'alternance (dates conforme au règlement)
-    12, # Copie du dernier diplôme obtenu
-    18, # Fiche de renseignements personnels dûment complétée et signée
-    34, # Dossier reçu avant le
-    45, # Etablissement d'origine membre AUF
-    46, # Etablissement d'accueil membre AUF
-    47, # Année académique de 1ère inscription en thèse
-    55, # Date de naissance
-    56, # Etablissements Origine et Accueil situés dans 2 pays différents (Nord/Sud - Sud/Nord - Sud/Sud)
-    57, # Date de première inscription en thèse
+    # utilisé lors de la création des pièces jointes dans la DB
+    #     models.createDossierPieces : ln 421
+    
+    #1,  # Attestation d’accord du(des) directeur(s) de thèse justifiant l'alternance proposée
+    #2,  # Attestation d'accord - Établissement d'accueil
+    #3,  # Attestation d'accord - Établissement d'origine
+    #4,  # Attestation d'accord à l'accueil - Responsable
+    #5,  # Attestation d'accord à l'origine - Responsable
+    #6,  # Attestation d'admission - Établissement d'accueil
+    #7,  # Demande d'inscription pour l'année de mobilité
+    #8,  # Attestation d'inscription pour l'année en cours
+    #9,  # Budget prévisionnel détaillé
+    #10,  # Calendrier de l'alternance (dates conforme au règlement)
+    #11,  # Convention de stage
+    #12,  # Copie du dernier diplôme obtenu
+    #13,  # Copie du dernier relevé de notes
+    #14,  # Copie du diplôme de doctorat et du rapport de soutenance de thèse
+    #15,  # Copie du dossier de scolarité universitaire
+    #16,  # Curriculum vitae actualisé
+    #17,  # Description détaillée
+    #18,  # Fiche de renseignements personnels dûment complétée et signée
+    #19,  # Formulaire de demande dûment complété et signé
+    #20,  # Lettre de motivation
+    #21,  # Liste des activités pédagogiques
+    #22,  # Liste des membres du comité scientifique de la manifestation
+    #23,  # Liste détaillée des publications
+    #24,  # Liste détaillée des publications, communications et recherches non publiées
+    #25,  # Photocopie du passeport (no et date d’expiration)
+    #26,  # Profil de l'établissement d'accueil
+    #27,  # Protocole de recherche
+    #28,  # Calendrier
+    #29,  # Justificatif d'inscription deux années consécutives dans un même établissement durant les trois dernières années
+    #30,  # Composition du comité scientifique de la manifestation
+    #31,  # Opportunité pour les Universités partenaires au Sud et au Nord et retombées
+    #32,  # Classement de l'établissement des dossiers par ordre de priorité
+    #33,  # Attestation d'accord supplémentaire - Établissement d'origine
+    #34,  # Dossier reçu avant le
+    #45,  # Etablissement d'origine membre AUF
+    #46,  # Etablissement d'accueil membre AUF
+    #47,  # Année académique de 1ère inscription en thèse
+    #49,  # Année d'interruption après l'obtention du doctorat
+    #50,  # Programme de la formation demandée durant la période de mobilité
+    #51,  # Copie convention liant les établissements d’accueil et d’origine pour la formation visée
+    #52,  # Justificatif du statut de retraité(e)
+    #53,  # Attestation d'accord de l'enseignant pour dispenser le cours (séminaire, travaux dirigés/pratiques)
+    #54,  # Description détaillée des enseignements / cours à dispenser
+    #55,  # Date de naissance
+    #56,  # Etablissements Origine et Accueil situés dans 2 pays différents (Nord/Sud - Sud/Nord - Sud/Sud)
+    #57,  # Date de première inscription en thèse
+    #58,  # Etat des travaux réalisés
     ]
 
 # SIGMAWCS (SIGMA 2.0 : champs gérés provenant de WCS ont nom constant 'sigma_*'... plus de mapping)
@@ -162,6 +206,12 @@ MAPPING = {
     #'sigma_dossier_p_etat_travaux' : 'etat_des_travaux_realises',
     'sigma_dossier_p_protocole_recherche' : 'protocole_de_recherche',
     'sigma_dossier_p_cv' : 'curriculum_vitae',
+    'sigma_dossier_p_attestation_o_dir' : 'attestation_d_accord_du_directeur_de_these_a_l_origine',
+    'sigma_dossier_p_attestation_a_dir' : 'attestation_d_accord_du_directeur_de_these_a_l_accueil',  
+    
+    # Pièces pas dans SIGMA
+    #'wcs_lettre_motivation':'',
+    #'wcs_attestation_pre_inscription_formation_master':'',
     
     # Autre
 #    'sigma_confirmation_nom' : 'nom_du_candidat',
index 9f182d4..e2c27d2 100644 (file)
@@ -15,7 +15,7 @@ if __name__ == "__main__":
     """
     bin/django shell # python manage.py shell
     >>> cd wcs
-    >>> run views.py
+    >>> run docs.py
     """
     
     # json WCS
index 101ff89..7df82a0 100644 (file)
@@ -46,7 +46,7 @@ def createPdf(candidature):
     f.close()
         
 def createZip(candidature):
-    """Constitue une dossier ZIP comprenant :
+    """Constitue un dossier ZIP comprenant :
     * le formulaire en PDF
     * les pièces jointes soumises par candidat
     """
index b8a1974..11c3cb1 100644 (file)
@@ -11,7 +11,7 @@ from sigma_v1.models import Etablissement, Implantation, Bureau
 from wcs.settings import USER, STATUT_DOSSIER, MOBILITE, BUREAU, MAPPING, DATA_DIR
 from wcs.settings import SIGMA_DOSSIER_M_ALT_MOIS_ORIGINE, SIGMA_DOSSIER_M_MOBILITE_ACCUEIL
 from wcs.settings import PATTERN_STATUT_PERSONNE, PATTERN_ETABL
-from wcs.settings import PIECES_SUFFIXE, PIECES_WCS, PIECES_SIGMA
+from wcs.settings import PIECES_SUFFIXE, PIECES_SIGMA
 from lib import majSansAccent, premiereMaj
 
 #class Formulaire(object):
@@ -391,16 +391,15 @@ class JsonSigma2ObjectSigma(object):
         for k,v in MAPPING.items():
             mapping_reverse[v] = k
         
-        for piece in PIECES_WCS:
+        for id, piece in PIECES_SUFFIXE.items():
             # pièce présente? accès fichier réel
             presente = False
-            if piece == 19:
+            if id == 19:
                 # formulaire
                 presente = True
             else :
                 # autres pièces
-                wcs_suffixe = PIECES_SUFFIXE[piece]
-                sigma_key = mapping_reverse[wcs_suffixe]
+                sigma_key = mapping_reverse[piece]
                 filename = data[sigma_key]
                 if os.path.exists(filename):
                     presente = True
index 03622a3..22c01c7 100644 (file)
@@ -8,8 +8,13 @@ WCS_SIGMA_URL = 'https://formulaires.auf.org/sigma'
 # SIGMA
 # statut SIGMA des dossiers importés de WCS
 STATUT_DOSSIER = 3  # En cours
+
 # Pièces : nom du champ WCS attendu (sinon passer par conf.MAPPING)
 PIECES_FIELDNAME = {
+    # utilisé lors de la création de l'archive des candidatures 
+    # pour export vers SIGMA
+    #     views.exportSigmaFiles : ln 168
+
     2:'sigma_dossier_p_attestation_a_dir',
     3:'sigma_dossier_p_attestation_o_dir',
     16:'sigma_dossier_p_cv',
@@ -17,6 +22,10 @@ PIECES_FIELDNAME = {
     19:'', # formulaire (PDF) : pas encore fourni par WCS, généré localement par sigmawcs.wcs.docs
     27:'sigma_dossier_p_protocole_recherche',
     58:'sigma_dossier_p_etat_travaux',
+    
+    # hack pour exporter pièces WCS pas dans SIGMA
+    1001:'wcs_lettre_motivation',
+    1002:'wcs_attestation_pre_inscription_formation_master',
     }
     
 # SIGMAWCS
index 19697e9..f90dfe7 100644 (file)
@@ -116,13 +116,10 @@ def importDossiersCandidaturesWcs(appel):
                     pieceName = json[piece]
                     url = '%s/%s/%s' % (src, dossierDir, pieceName)
                     rapport = '* %s : %s' % (piece, pieceName)
-                except KeyError:
-                    erreurs.append(rapport)
-                try:
                     retrieve(url, pieceName)
                     print rapport
                     nb_pieces_done = nb_pieces_done + 1
-                except urllib2.HTTPError:
+                except KeyError, urllib2.HTTPError:
                     erreurs.append(rapport)
         print ''
     print '--------------------------------------------------'
@@ -168,9 +165,12 @@ def exportSigmaFiles(appel):
     for id, suffixe_wcs in PIECES_WCS_SUFFIXE.items():
         if suffixe_wcs:
             # nom champ json normalisé pour cette pièce
-            field = PIECES_FIELDNAME[id]
+            field = PIECES_FIELDNAME.get(id, '')
             # suffixe SIGMA
-            suffixe_sigma = PIECES_SIGMA_SUFFIXE[id]
+            suffixe_sigma = PIECES_SIGMA_SUFFIXE.get(id, '')
+            # pièces peuvent ne pas exister dans SIGMA
+            if not suffixe_sigma:
+                suffixe_sigma = suffixe_wcs
             # mapping
             mappingPiecesSuffixes[field] = (suffixe_wcs, suffixe_sigma)
         
@@ -181,7 +181,7 @@ def exportSigmaFiles(appel):
     print '--------------------------------------------------'
     
     # création du répertoire local pour rsync
-    print "Création du répertoire locale des dossiers de candidature (fichiers renommés) :"
+    print "Création du répertoire local des dossiers de candidature (fichiers renommés) :"
     exportCandidaturesPath = "%s/%d.zip" % (dstZip, MOBILITE)
     archive = zipfile.ZipFile(exportCandidaturesPath, "w", zipfile.ZIP_STORED)
         
@@ -205,8 +205,10 @@ def exportSigmaFiles(appel):
             # pièces jointes : renommage et copie
             for field, mapping in mappingPiecesSuffixes.items():
                 nom_src = candidature[field]
-                nom_dst = nom_src.replace(mapping[0], mapping[1])
-                # pièces peuvent être facultatives
+                suffixe_wcs = mapping[0]
+                suffixe_sigma = mapping[1]
+                nom_dst = nom_src.replace(suffixe_wcs, suffixe_sigma)
+                # pièces peuvent être facultatives dans WCS
                 if nom_src:
                     path_src = '%s/%s' % (src, nom_src)
                     path_dst = '%s/%s' % (dst, nom_dst)
@@ -215,6 +217,7 @@ def exportSigmaFiles(appel):
                     fdst.write(fsrc.read())
                     fdst.close()
                     fsrc.close()
+
             # formulaire (.pdf) et dossier complet (.zip) : copie
             extensions = ('.pdf', '.zip')
             for ext in extensions:
@@ -309,7 +312,7 @@ if __name__ == "__main__":
             print 'existant : %s' % (candidature['sigma_personne_email'])
         else :
             # json
-            candidature = jj.cleanup(candidature)     
+            candidature = jj.cleanup(candidature)
             candidature = jj.convert(candidature)
             # objets SIGMA
             p = jo.createPersonne(candidature)