list2form : gestion des erreurs et des petits fichiers (merci cgi.py…)
[progfou.git] / web / export4kaboom
1 #!/usr/bin/python3
2 # -*- coding: utf-8 -*-
3 """
4 export4kaboom - Outil d'export des référentiels adapté pour Kaboom
5
6 Copyright : Agence universitaire de la Francophonie — www.auf.org
7 Licence : GNU General Public Licence, version 3
8 Auteur : Jean Christophe André
9 Création : 20 octobre 2017
10
11 Debian-Depends: 
12
13 Mise en place dans Apache :
14   ScriptAlias /export4kaboom /usr/local/lib/export4kaboom
15 Usage :
16   http://references.auf.org/export4kaboom/implantations.json
17   http://references.auf.org/export4kaboom/etablissements.json
18 """
19 import os
20 import sys
21 import json
22 import urllib.request
23
24 def http_reply(data, mime_type=None, charset=None, headers={}, outfile=sys.stdout):
25     if data is None:
26         data = ''
27     # préparation des champs MIME
28     if mime_type is None:
29         mime_type = 'text/plain'
30     if charset is None:
31         charset = getattr(outfile, 'encoding', None)
32     if charset:
33         charset_spec = '; charset={}'.format(charset)
34     else:
35         charset_spec = ''
36     # préparation des en-têtes de la réponse
37     _headers = {
38         'Content-Type': '{}{}'.format(mime_type, charset_spec),
39         'Content-Length': len(data) if data else 0,
40         'Status': '200 OK',
41         'Pragma': 'no-cache',
42         'Expires': '0',
43         #'Vary': 'Content-Encoding',
44     }
45     if headers:
46         _headers.update(headers)
47     # envoi de la réponse
48     _headers = ''.join(("{}: {}\r\n".format(k, v) for k,v in _headers.items()))
49     outfile.write(_headers + "\r\n")
50     outfile.write(data)
51     outfile.flush()
52
53 def http_redirect(location):
54     data = """If you see this, it means the automatic redirection has \
55               failed.\r\nPlease go to {}\r\n""".format(location)
56     headers = {'Status': '302 Redirection', 'Location': location}
57     http_reply(data, headers=headers)
58
59 def hack_observateur(data):
60     for x in data:
61         if x['nom'].startswith('[Observateur] ') \
62         or x['nom'].startswith('[observateur] '):
63             x.update({'nom': x['nom'][14:]})
64             x.update({'statut': 'O'})
65
66 def country_code_to_name(data, fields=[]):
67     res = urllib.request.urlopen('http://references.auf.org/export/pays.json')
68     country = json.loads(res.read().decode('utf-8'))
69     country = {x['code']: x for x in country}
70     for x in data:
71         for f in fields:
72             x.update({f+'_nom': country[x[f]]['nom']})
73
74 if __name__ == '__main__':
75     # initialisation
76     path_info = os.environ.get('PATH_INFO', '')
77     path_prefix = os.environ.get('REQUEST_URI', '')
78     if len(path_info) > 0:
79         path_prefix = path_prefix[:-len(path_info)]
80     # routage
81     if path_info == '':
82         http_redirect(path_prefix + '/')
83     elif path_info == '/':
84         l = [
85             '/export/pays.json',
86             '/export4kaboom/implantations.json',
87             '/export4kaboom/etablissements.json',
88         ]
89         l = ['<li><a href="%s">%s</a></li>' % (f, f) for f in sorted(l)]
90         title = '<p>Liste des exports disponibles&nbsp;:</p>\n'
91         data = '<html>\n' + title + '<ul>\n' + '\n'.join(l) + '\n</ul>\n</html>'
92         http_reply(data, headers={'Content-Type': 'text/html'})
93     elif path_info == '/etablissements.json':
94         res = urllib.request.urlopen('http://references.auf.org/export/etablissements.json')
95         data = json.loads(res.read().decode('utf-8'))
96         data = [x for x in data if x['membre'] is True] # juste les membres
97         hack_observateur(data)
98         country_code_to_name(data, ['pays'])
99         data = json.dumps(data, indent='  ')
100         http_reply(data, mime_type='application/json')
101     elif path_info == '/implantations.json':
102         res = urllib.request.urlopen('http://references.auf.org/export/implantations.json')
103         data = json.loads(res.read().decode('utf-8'))
104         data = [x for x in data if x['statut'] == 1] # juste les ouvertes
105         country_code_to_name(data, ['adresse_physique_pays', 'adresse_postale_pays'])
106         data = json.dumps(data, indent='  ')
107         http_reply(data, mime_type='application/json')
108     else: # réponse par défaut
109         http_reply("Requête '{}' non gérée.".format(path_info))
110     sys.exit(0)