Quelques ajustements :
authorProgfou <jean-christophe.andre@auf.org>
Wed, 19 Jan 2011 06:50:04 +0000 (13:50 +0700)
committerProgfou <jean-christophe.andre@auf.org>
Wed, 19 Jan 2011 06:50:04 +0000 (13:50 +0700)
  * ajout des informations de gauche d'auteur (copyleft)
  * tri systématique des données dans les exports JSON
  * en cas d'absence d'extension dans un nom de fichier attaché au
    formulaire, détection automatique du type de fichier pour en
    déduire l'extension à ajouter (requiert python-magic)

wcs/wcs-extract
wcs/wcs-extract-all

index 72b8e37..a0391a6 100755 (executable)
@@ -1,12 +1,23 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
+"""
+Outil d'export de données w.c.s.
 
+Copyright : Agence universitaire de la Francophonie — www.auf.org
+Licence : GNU General Public Licence, version 2
+Auteur : Jean Christophe André
+Date de création : 15 octobre 2009
+
+Depends: wcs, python-simplejson, python-magic
+"""
 import os
 import os.path
 import shutil
 import logging
 from time import gmtime, strftime
 import simplejson as json
+import magic
+import mimetypes
 
 from wcs import publisher
 from wcs.formdef import FormDef
@@ -64,7 +75,7 @@ def extract_fields(formdef, output_directory):
     f.close()
 
     f = open(os.path.join(output_directory, 'field-names.json'), 'wb')
-    f.write(json.dumps(field_names, ensure_ascii=False))
+    f.write(json.dumps(field_names, ensure_ascii=False, sort_keys=True))
     f.close()
 
 
@@ -75,6 +86,10 @@ def extract_data(formdef, output_directory):
     # XXX: hack temporaire… :-/
     global pub
 
+    # on charge la base des types MIME une fois pour toutes
+    #magicmime = magic.Magic(mime=True) => ce sera pour plus tard…
+    magicmime = magic.open(magic.MAGIC_MIME_TYPE)
+
     liste_dossiers = []
     for object in formdef.data_class().select():
         result = {
@@ -112,7 +127,17 @@ def extract_data(formdef, output_directory):
             elif isinstance(field, DateField):
                 result[field_name] = strftime('%Y-%m-%d', data)
             elif isinstance(field, FileField):
-                extension = data.orig_filename.rpartition('.')[2].lower()
+                if '.' in data.orig_filename:
+                    extension = data.orig_filename.rpartition('.')[2].lower()
+                else: # il n'y a pas d'extension dans le nom de fichier
+                    p = os.path.join(pub.app_dir, 'uploads', data.qfilename)
+                    #m = magicmime.from_file(p) => ce sera pour plus tard…
+                    m = magicmime.file(p)
+                    extension = mimetypes.guess_extension(m)
+                    if extension is not None:
+                        extension = extension[1:]
+                    else:
+                        extension = 'unknown'
                 result[field_name] = "%s.%s" % (field_name, extension)
                 qfiles[field_name] = data.qfilename
             else:
@@ -140,14 +165,14 @@ def extract_data(formdef, output_directory):
         # génération du fichier JSON
         jsonname = os.path.join(output_directory, 'data', filename + '.json')
         f = open(jsonname, 'wb')
-        f.write(json.dumps(result, ensure_ascii=False))
+        f.write(json.dumps(result, ensure_ascii=False, sort_keys=True))
         f.close()
 
         logging.info("Dossier '%s' : %s.",
                                     filename, result['wcs_workflow_status'])
 
     f = open(os.path.join(output_directory, 'liste-dossiers.json'), 'wb')
-    f.write(json.dumps(liste_dossiers, ensure_ascii=False))
+    f.write(json.dumps(liste_dossiers, ensure_ascii=False, sort_keys=True))
     f.close()
 
 
index 1fbe3d8..2716d30 100755 (executable)
@@ -1,5 +1,8 @@
 #!/bin/sh
-OUTPUT_DIR="/srv/wcs"
+WCS_USER="wcs"
+WCS_DIR="`getent passwd "$WCS_USER" | cut -d: -f6`"
+OUTPUT_USER="wcs-export"
+OUTPUT_DIR="`getent passwd "$OUTPUT_USER" | cut -d: -f6`"
 SITE="formulaires.auf.org"
 FORMS="\
  horizons-francophones-2010-bureau-ocean-indien \
@@ -7,13 +10,18 @@ FORMS="\
  demande-de-bourse-de-doctorat-2011-2012-afrique-centrale-et-des-grands-lacs \
 "
 
-# XXX: hack en attendant de corriger le umask de wcs…
-sudo chmod -R g+rX /var/lib/wcs/
+if [ "`id -un`" != "root" ] ; then
+  echo "Ce script nécessite d'être lancé depuis l'utilisateur root."
+  exit 1
+fi
+
+# XXX: hack en attendant de savoir corriger le umask de wcs…
+expr match "$WCS_DIR" '^/var/lib/' > /dev/null && chmod -R g+rX "$WCS_DIR"
 
 echo "Traitement des formulaires de '$SITE'…"
 for f in $FORMS
 do
   echo " $f"
-  python wcs-extract.py $OUTPUT_DIR $SITE $f
+  sudo -u "$OUTPUT_USER" -H wcs-extract "$OUTPUT_DIR" "$SITE" "$f"
 done
 echo "Terminé."