From ca77b3defa378bbded9f605f5329967ddc688a20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-Elliott=20B=C3=A9cue?= Date: Fri, 25 Sep 2015 01:26:01 +0200 Subject: [PATCH] =?UTF-8?q?Pr=C3=A9pare=20l'utilisation=20de=20generalized?= =?UTF-8?q?=20time=20format=20pour=20recuPaiement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Et de datetimes timezone aware pour gérer le bousin --- gestion/gest_crans.py | 2 +- gestion/ldap_crans.py | 64 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/gestion/gest_crans.py b/gestion/gest_crans.py index f77f138b..289b8b97 100755 --- a/gestion/gest_crans.py +++ b/gestion/gest_crans.py @@ -41,7 +41,7 @@ from lock import make_lock, remove_lock from ldap_crans import crans_ldap, blacklist_items, droits_possibles, droits_critiques, smtpserv, script_utilisateur from ldap_crans import Adherent, AssociationCrans, Club, Facture from ldap_crans import Machine, MachineFixe, MachineWifi, MachineCrans, BorneWifi -from ldap_crans import tz, generalizedTimeFormat, fromGeneralizedTimeFormat +from ldap_crans import tz, generalizedTimeFormat, fromGeneralizedTimeFormat, datetimeFromGTF, datetimeToGTF, localizedDatetime import user_tests isadm = user_tests.isadm() diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index f9e7f23d..e6c2baae 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -47,6 +47,16 @@ import ridtools from user_tests import isadm import getpass +try: + import pytz +except: + pytz = None + +try: + import dateutil.tz +except: + dateutil = None + cur_user = os.getenv("SUDO_USER") or os.getenv("USER") or os.getenv("LOGNAME") or getpass.getuser() date_format = '%d/%m/%Y %H:%M' @@ -163,6 +173,60 @@ def fromGeneralizedTimeFormat(gtf): """ return time.mktime(time.strptime(gtf.split("-", 1)[0].split("+", 1)[0].split('Z', 1)[0], "%Y%m%d%H%M%S")) +def datetimeFromGTF(gtf): + """Returns a datetime from generalized time format + + """ + if '-' in gtf or '+' in gtf: + date, tz = gtf[0:14], gtf[14:] + else: + date = gtf.replace("Z", '') + tz = '+0000' + return localizedDatetime(date, tz) + +def datetimeToGTF(datetime_obj): + """Transforms a datetime to a GTF""" + to_append = "" + if datetime_obj.utcoffset() is None: + if pytz is not None: + datetime_obj = pytz.utc.localize(datetime_obj) + else: + to_append = "Z" + mostly_gtf = datetime.datetime.strftime(datetime_obj, "%Y%m%d%H%M%S%z") + return mostly_gtf.replace('+0000', "Z") + to_append + +def localizedDatetime(date=None, tz=None): + """Génère un datetime localisé à partir d'une chaîne de la forme + %Y%m%d%H%M%S, et d'une chaîne tz de la forme +0200""" + + _notz = (tz is None) + + if date is not None: + the_date = datetime.datetime.strptime(date, "%Y%m%d%H%M%S") + else: + the_date = datetime.datetime.now() + + # No timezone means we try to get from the system + # if we have dateutil, else, UTC. + if tz is None: + if dateutil is not None: + tz = datetime.datetime.now(dateutil.tz.tzlocal()).strftime("%z") + else: + tz = "+0000" + + # No pytz means no timezoned datetime + if pytz is not None: + the_timezone = pytz.FixedOffset(int(tz[0:-2])*60 + int(tz[-2:])) + the_date = the_timezone.localize(the_date) + the_date = the_timezone.normalize(the_date) + else: + # Maybe we can do something + if dateutil is not None: + if _notz: + the_date.replace(tzinfo=dateutil.tz.tzlocal()) + + return the_date + def strip_accents(a, sois_un_porc_avec_les_espaces = True): """ Supression des accents de la chaîne fournie """ res = normalize('NFKD', decode(a)).encode('ASCII', 'ignore')