Exemple d'extraction des données de w.c.s, ici pour import dans Sigma.
authorProgfou <jean-christophe.andre@auf.org>
Wed, 9 Dec 2009 18:14:13 +0000 (01:14 +0700)
committerProgfou <jean-christophe.andre@auf.org>
Wed, 9 Dec 2009 18:14:13 +0000 (01:14 +0700)
wcs/courriel-Thomas.txt [new file with mode: 0644]
wcs/demande-de-bourse-de-doctorat-2010-2011_field-names.txt [new file with mode: 0644]
wcs/wcs2json.py [new file with mode: 0644]
wcs/wcs2json.sh [new file with mode: 0755]

diff --git a/wcs/courriel-Thomas.txt b/wcs/courriel-Thomas.txt
new file mode 100644 (file)
index 0000000..c5e0395
--- /dev/null
@@ -0,0 +1,71 @@
+Ce que j'attends :
+
+- un fichier   nnn-prenom-nom-email_domaine.json
+  pour chaque dossier "nnn"
+
+- dans ce fichier, quelque chose comme :
+
+  { 
+    'num_dossier': 134,
+    'nom': 'NOËL',
+    'prenom' : 'Thomas'
+    'date_naissance': '18/04/1973',
+    'nom_responsable_origine' : 'Leblanc',
+    ...
+  }
+
+c'est-à-dire qu'on cherche à avoir des intitulés clairs pour chaque champs du
+formulaire. Autrement dit, on renomme les noms du style "f652" de wcs.
+
+Par ailleurs, quelques traitement spéciaux en fonction de certains
+type de champ :
+
+PAYS
+====
+Quand dans WCS on a un pays du genre 
+
+    f_44 = "Sénégal (SN - Afrique de l'Ouest)"
+  il faut que dans notre JSON cela donne :
+    pays_nationalite_iso = 'SN',
+    pays_nationalite_nom = 'Sénégal',
+    pays_nationalite_region = "Afrique de l'Ouest",
+    pays_nationalite_code_region = 'AO',
+
+
+ETABLISSEMENTS
+==============
+Quand on a un établissement :
+    f_54 = "Algérie - Ecole machin (65 - Sud)"
+  il faut que ça donne :
+    etab_origine_code = '65'
+    etab_origine_sudnord = 'Sud'
+    etab_origine_nom = 'Ecole machin'
+    etab_origine_pays = 'Algérie'
+    etab_origine_pays_iso = 'DZ'
+    etab_origine_region = 'Europe Ouest et Maghreb'
+    etab_origine_code_region = 'EOM'
+
+
+NB : il nous faut donc, dans ce dernier cas, une association Pays/Région,
+celle qui est visible sur le réglement des bourses.
+
+DOC ATTACHES
+============
+Enfin, concernant les doc attachés, idéalement on aurait dans le JSON :
+
+   cv_url =
+'https://https://formulaires.auf.org/backoffice/demande-de-bourse-de-doctorat-2010-2011/234/download?f=103'
+   cv_filename = '0.87817287'
+   cv_realname = 'Curriculum Vitae.doc'
+
+L'URL est facile à calculer. Dans l'exemple ci-dessus on est dans le dossier
+134, et on a 3 documents :
+  ?f=101 pour le descriptif_detaille_url
+  ?f=102 pour le protocole_recherche_url
+  ?f=103 pour le cv_url
+
+
+
+
+Voilà, je pense que c'est à peu près tout. Davin, tu compléteras si tu penses
+qu'il manque des infos pour l'import SIGMA.
diff --git a/wcs/demande-de-bourse-de-doctorat-2010-2011_field-names.txt b/wcs/demande-de-bourse-de-doctorat-2010-2011_field-names.txt
new file mode 100644 (file)
index 0000000..24131bb
--- /dev/null
@@ -0,0 +1,79 @@
+5:civilite
+6:nom
+7:nom_jeune_fille
+8:prenom
+9:pays_nationalite
+10:pays_naissance
+11:date_naissance
+12:ville_naissance
+14:adresse
+15:ville
+16:region
+17:code_postal
+18:pays_residence
+19:tel
+20:tel_pro
+21:email
+23:statut_personne
+24:fonction
+26:intitule_d_diplome
+27:date_d_diplome
+28:nom_etb
+29:pays_etb
+30:niveau
+32:particip_prog_auf
+33:particip_prog_auf_dernier
+34:particip_prog_auf_annee
+35:boursier_auf
+36:boursier_auf_type
+37:boursier_auf_annee
+39:programme
+40:programme_autre
+41:annee_programme
+44:o_etablissement_unite
+45:o_sc_civilite
+46:o_sc_nom
+47:o_sc_prenom
+48:o_sc_fonction
+49:o_sc_ville
+50:o_sc_tel_pro
+51:o_sc_email
+53:o_inst_civilite
+54:o_inst_nom
+55:o_inst_prenom
+56:o_inst_email
+59:a_etablissement_unite
+60:a_sc_civilite
+61:a_sc_nom
+62:a_sc_prenom
+63:a_sc_fonction
+64:a_sc_ville
+65:a_sc_tel_pro
+66:a_sc_email
+68:a_inst_civilite
+69:a_inst_nom
+70:a_inst_prenom
+71:a_inst_email
+75:o_date_debut_mobilite
+76:o_date_fin_mobilite
+77:o_nb_mois
+79:a_date_debut_mobilite
+80:a_date_fin_mobilite
+81:a_nb_mois
+83:date_inscription_these
+84:date_soutenance_these
+85:pays_soutenance
+86:type_these
+87:discipline
+88:intitule_projet
+90:mot_clef1
+91:mot_clef2
+92:mot_clef3
+95:engagement_nom
+96:engagement_prenom
+98:engagement_respect_reglement
+101:descriptif_these
+102:protocole_recherche
+103:curriculum_vitae
+108:a_etablissement
+109:o_etablissement
diff --git a/wcs/wcs2json.py b/wcs/wcs2json.py
new file mode 100644 (file)
index 0000000..5494105
--- /dev/null
@@ -0,0 +1,120 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# le nom d'hote hébergeant wcs
+VHOST = "formulaires.auf.org"
+# nom du formulaire à explorer
+FORM_NAME = "demande-de-bourse-de-doctorat-2010-2011"
+# nom des fichiers à générer (un par formulaire)
+OUTPUT_DIRECTORY = "/srv/www/wcs/%s/%s" % (VHOST, FORM_NAME)
+
+URL_BASE = "http://%s/backoffice/%s" % (VHOST, FORM_NAME)
+URL_DOWNLOAD = "%s/%s" % (URL_BASE, "%s/download?f=%s")
+#TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
+TIME_FORMAT = "%Y-%m-%d"
+
+import os
+import sys
+from wcs import publisher
+from wcs.formdef import FormDef
+from wcs.fields import TitleField, CommentField, TextField, \
+                       StringField, ItemField, EmailField, \
+                       DateField, FileField, BoolField
+from time import strftime
+from simplejson import dumps, loads
+
+def cleanup(s):
+    avec_accent = u'çÇáàâÁÀÂéèêëÉÈÊËíìîïÍÌÎÏóòôöÓÒÔÖúùûüÚÙÛÜýỳyÿÝỲYŸ'
+    sans_accent = u'cCaaaAAAeeeeEEEEiiiiIIIIooooOOOOuuuuUUUUyyyyYYYY'
+    if type(s) is not unicode:
+        s = unicode(s, 'utf-8')
+        u  = False
+    r = ''
+    for c in s:
+        index = avec_accent.find(c)
+        if index >= 0:
+            c = sans_accent[index]
+        elif c != '-' and not ('a' <= c.lower() <= 'z'):
+            c = '-'
+        r += c
+    if not u:
+        r = r.encode('utf-8')
+    return r
+
+f = open(FORM_NAME + '_field-names.txt', 'r')
+field_names = dict([l.strip().split(':') for l in f.readlines()])
+f.close()
+
+qfile_commands = open(FORM_NAME + '_copy-qfiles.sh', 'w')
+
+pub = publisher.WcsPublisher.create_publisher()
+pub.app_dir = os.path.join(pub.app_dir, VHOST)
+
+
+formdef = FormDef.get_by_urlname(FORM_NAME)
+for object in formdef.data_class().select():
+    result = { 'num_dossier': object.id }
+    qfiles = { }
+    for field in formdef.fields:
+        field_id = str(field.id)
+        if not field_id in object.data:
+            continue
+        if isinstance(field, TitleField) or isinstance(field, CommentField):
+            continue
+        field_name = field_names.get(field_id, field.label)
+        data = object.data.get(field_id)
+        if isinstance(field, StringField) or isinstance(field, TextField) \
+        or isinstance(field, EmailField):
+            result[field_name] = data
+        elif isinstance(field, ItemField):
+            if field_name.startswith('pays') or 'etablissement' in field_name:
+                index = data.find('(')
+                if index >= 0:
+                    end = data.find(' ', index+1)
+                    data = data[index+1:end]
+            elif field_name == 'discipline':
+                index = data.rfind('(')
+                if index >= 0:
+                    end = data.find(')', index+1)
+                    data = data[index+1:end]
+            #elif field_name == 'region':
+            #    index = data.rfind('(')
+            #    if index >= 0:
+            #        index = data.find('-', index+1)
+            #        end = data.find(')', index+1)
+            #        data = filter(lambda c: c.isupper(), data[index+1:end])
+            result[field_name] = data
+        elif isinstance(field, BoolField):
+            result[field_name] = (data == 'True')
+        elif isinstance(field, FileField):
+            extension = data.orig_filename.rpartition('.')[2].lower()
+            result[field_name] = "%s.%s" % (field_name, extension)
+            qfiles[field_name] = data.qfilename
+        elif isinstance(field, DateField):
+            data = strftime(TIME_FORMAT, object.data.get(field_id))
+            result[field_name] = data
+        else:
+            data = object.data.get(field_id)
+            print "WARNING: unknown field type '%s' for '%s'" % \
+                                    (field.__class__.__name__, field.label)
+            raise RuntimeError
+
+    num_dossier = result['num_dossier']
+    nom = cleanup('-'.join(result['nom'].split()).upper())
+    prenom = cleanup('-'.join(result['prenom'].split()).upper())
+    email = result['email'].replace('@','-').lower()
+
+    filename = "%s/%04d-%s-%s-%s.json" % \
+        (OUTPUT_DIRECTORY, num_dossier, nom, prenom, email)
+
+    f = open(filename, 'wb')
+    f.write(dumps(result, ensure_ascii=False).replace(', ',',\n'))
+    f.close()
+
+    filename = filename[:-len('.json')]
+    for f in qfiles:
+        print >>qfile_commands, "cp -af '%s/uploads/%s' '%s_%s'" % \
+                        (pub.app_dir, qfiles[f], filename, result[f])
+
+qfile_commands.close()
+
diff --git a/wcs/wcs2json.sh b/wcs/wcs2json.sh
new file mode 100755 (executable)
index 0000000..25818b3
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+sudo chmod -R g+rX /var/lib/wcs/
+python wcs2json.py >& wcs2json.log
+tail wcs2json.log