Outil de calcul des fuseaux horaires des employés.
[auf-refer.git] / auf-employes-timezones
1 #!/usr/bin/python3
2 # -*- coding: utf-8 -*-
3 """Outil de calcul des fuseaux horaires des employés AUF.
4
5 Copyright ©2017  Agence universitaire de la Francophonie
6 Licence : GPL version 3
7 Auteur : Progfou <jean-christophe.andre@auf.org>
8
9 Debian-Depends: python3, python3-tz, auf-refer
10 """
11 import sys
12 import os.path
13 import urllib
14 import xml.etree.ElementTree as etree
15 import aufrefer
16 import pytz # country_timezones
17
18 def print_error(*k, **kv):
19     print("\033[1;31m", *k, "\033[m", **kv, sep='', file=sys.stderr)
20
21 def get_tz_from_address(country, city=None):
22     tz = pytz.country_timezones(country.upper())
23     if len(tz) == 1:
24         tz = tz[0]
25     elif city == u'Montr\xe9al':
26         tz = u'America/Toronto'
27     elif city == u'Kinshasa':
28         tz = u'Africa/Kinshasa'
29     elif city == u'Lubumbashi':
30         tz = u'Africa/Lubumbashi'
31     elif city == u'S\xe3o Paulo':
32         tz = u'America/Sao_Paulo'
33     else: # show anomalies
34         print_error("Erreur TZ : county='{}',city='{}' => tz='{}'".format(country, city, tz))
35         tz = None
36     return tz
37
38 #
39 # récupération des fuseaux horaires « à la Microsoft », cf :
40 # http://www.unicode.org/cldr/charts/latest/supplemental/zone_tzid.html
41 #
42
43 microsoft_timezones = {}
44 _windowsZones_url = "http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml"
45 _windowsZones_filename = 'windowsZones.xml'
46 if not os.path.exists(_windowsZones_filename):
47     with urllib.request.urlopen(_windowsZones_url) as u:
48         with open(_windowsZones_filename, 'wb') as f:
49             f.write(u.read())
50 if os.path.exists(_windowsZones_filename):
51     tree = etree.parse(_windowsZones_filename)
52     for e in tree.findall('.//mapZone'):
53         for tz in e.get('type').split():
54             microsoft_timezones[tz] = e.get('other')
55
56 implantations = {
57   x['id']: x for x in aufrefer.get('datamaster-implantation.json')
58 }
59
60 print('"Email";"IANA Timezone";"Microsoft Timezone"')
61 for employe in aufrefer.get('datamaster-employe.json'):
62     if not employe['courriel']:
63         print_error("Employé sans courriel : {prenom} {nom} ({id})".format(**employe))
64         continue
65     try:
66         implantation = implantations[employe['implantation_physique']]
67     except:
68         print_error("Implantation inexistante ({implantation_physique})"
69               " pour l'employé : {prenom} {nom} ({id})".format(**employe))
70         continue
71     # enrichissement dynamique des données d'implantations
72     if 'tz' not in implantation:
73         implantation['tz'] = get_tz_from_address(
74             country=implantation['adresse_physique_pays'],
75             city=implantation['adresse_physique_ville'] )
76     # résultat
77     print('"{}";"{}";"{}"'.format(employe['courriel'], implantation['tz'],
78         microsoft_timezones.get(implantation['tz'], None)) )