list2form : gestion des erreurs et des petits fichiers (merci cgi.py…)
[progfou.git] / coda / coda-filter.py
old mode 100644 (file)
new mode 100755 (executable)
index 3e4dd76..5f1c334
@@ -16,6 +16,7 @@
 #
 import sys
 import email
+import email.charset
 from email.header import decode_header
 import smtplib
 import re
@@ -30,6 +31,12 @@ ORGANIZATION = "Agence universitaire de la Francophonie"
 DOC_PATTERN = r'^(.*:)?\s*(\S+)\s*/\s*(\d+)\s*$'
 # format du nouveau nom de document (à partir du type et numéro)
 DOC_FORMAT = 'CODA-%s-%08d.pdf'
+# réécriture des liens pour coda.auf
+BODY_PATTERN_1 = r'\n(http://coda.auf/)(.*)\n'
+BODY_FORMAT_1 = r'\n\nAccès depuis une implantation AUF :\n \1\2\n\nAccès depuis Internet :\n https://coda.auf.org/\2\n\n'
+# réécriture des liens pour form.coda.auf
+BODY_PATTERN_2 = r'\n(http://form.coda.auf/)(.*)\n'
+BODY_FORMAT_2 = r'\n\nAccès depuis une implantation AUF :\n \1\2\n\nAccès depuis Internet :\n https://form-coda.auf.org/\2\n\n'
 
 # codes de sortie venant de <sysexits.h>
 EX_TEMPFAIL = 75
@@ -52,11 +59,16 @@ except Exception, err:
 # TRAITEMENTS
 #--------------------------------------------------------------------------
 
+# par défaut les textes seront codés en Quoted-Printable
+qp_charset = email.charset.Charset('utf-8')
+qp_charset.header_encoding = email.charset.QP
+qp_charset.body_encoding = email.charset.QP
+
 # 05. si le destinataire est noreply@auf.org, on le remplace par l'émetteur
 #     (ANNULÉ car ça ne devrait plus arriver)
 #     (REPRIS pour le cas où le destinataire est impression-coda@auf.org)
-if msg['To'] in ['noreply@auf.org', 'impression-coda@auf.org']:
-    old_to = msg['To']
+if 'impression-coda@auf.org' in email_to_list:
+    old_to = 'impression-coda@auf.org'
     email_to_list.remove(old_to)
     email_to_list.append(email_from)
     msg.replace_header('To', email_from)
@@ -99,6 +111,20 @@ except Exception, err:
 
 # parcours des différentes parties du courriel
 for part in msg.walk():
+    # traitement du corps de message pour y remplacer :
+    #   http://coda.auf/coda/…
+    # par :
+    #   Accès depuis une implantation AUF : http://coda.auf/coda/…
+    #   Accès depuis Internet : https://coda.auf.org/coda/…
+    if part.get_content_type() == 'text/plain':
+        text = part.get_payload(decode=True)
+        new_text = re.sub(BODY_PATTERN_1, BODY_FORMAT_1, text)
+        new_text = re.sub(BODY_PATTERN_2, BODY_FORMAT_2, new_text)
+        if new_text != text:
+            del part['Content-Transfer-Encoding']
+            part.set_payload(new_text, qp_charset)
+        continue
+    # traitement uniquement si c'est un attachement de PDF
     if part.get_content_type() != 'application/pdf':
         continue
     # adaptation du nom de fichier dans le Content-Type