From 42f2080b8085232c93d7d82a2ea9e7be39a1f1f8 Mon Sep 17 00:00:00 2001 From: jortel Date: Wed, 3 Mar 2010 14:35:49 +0000 Subject: Add UTC class and change the wsse timestamps to use sax.date classes for propert formatting. Also, change wsse classes to have timestamps in UTC. --- suds/__init__.py | 2 +- suds/sax/date.py | 26 ++++++++++++++++++++++---- suds/wsse.py | 20 +++++++++++++------- tests/builtin.py | 1 + 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/suds/__init__.py b/suds/__init__.py index 3c9341b..c1d249a 100644 --- a/suds/__init__.py +++ b/suds/__init__.py @@ -27,7 +27,7 @@ import sys # __version__ = '0.4' -__build__="(beta) R660-20100219" +__build__="(beta) R663-20100303" # # Exceptions diff --git a/suds/sax/date.py b/suds/sax/date.py index f07cf84..81a7a10 100644 --- a/suds/sax/date.py +++ b/suds/sax/date.py @@ -132,6 +132,7 @@ class Time: @type adjusted: boolean @raise ValueError: When I{time} is invalid. """ + self.tz = Timezone() if isinstance(time, dt.time): self.time = time return @@ -245,7 +246,7 @@ class Time: if len(s) == len('-00:00'): return int(s[:3]) if len(s) == 0: - return Timezone.local + return self.tz.local if len(s) == 1: return 0 raise Exception() @@ -255,7 +256,10 @@ class Time: def __unicode__(self): time = self.time.isoformat() - return '%s%+.2d:00' % (time, Timezone.local) + if self.tz.local: + return '%s%+.2d:00' % (time, self.tz.local) + else: + return '%sZ' % time class DateTime(Date,Time): @@ -319,6 +323,18 @@ class DateTime(Date,Time): return 'T'.join(s) +class UTC(DateTime): + """ + Represents current UTC time. + """ + + def __init__(self, date=None): + if date is None: + date = dt.datetime.utcnow() + DateTime.__init__(self, date) + self.tz.local = 0 + + class Timezone: """ Timezone object used to do TZ conversions @@ -327,9 +343,11 @@ class Timezone: @cvar patten: The regex patten to match TZ. @type patten: L{re.RegexObject} """ - - local = ( 0-time.timezone/60/60 ) + pattern = re.compile('([zZ])|([\-\+][0-9]{2}:[0-9]{2})') + + def __init__(self): + self.local = ( 0-time.timezone/60/60 ) @classmethod def split(cls, s): diff --git a/suds/wsse.py b/suds/wsse.py index 0fc8301..2a697c1 100644 --- a/suds/wsse.py +++ b/suds/wsse.py @@ -22,6 +22,7 @@ from logging import getLogger from suds import * from suds.sudsobject import Object from suds.sax.element import Element +from suds.sax.date import UTC from datetime import datetime, timedelta try: @@ -87,9 +88,14 @@ class Token(Object): def now(cls): return datetime.now() + @classmethod + def utc(cls): + return datetime.utcnow() + @classmethod def sysdate(cls): - return cls.now().isoformat() + utc = UTC() + return str(utc) def __init__(self): Object.__init__(self) @@ -144,11 +150,11 @@ class UsernameToken(Token): """ Set I{created}. @param dt: The created date & time. - Set as datetime.now() when I{None}. + Set as datetime.utc() when I{None}. @type dt: L{datetime} """ if dt is None: - self.created = Token.now() + self.created = Token.utc() else: self.created = dt @@ -172,7 +178,7 @@ class UsernameToken(Token): root.append(n) if self.created is not None: n = Element('Created', ns=wsuns) - n.setText(self.created.isoformat()) + n.setText(str(UTC(self.created))) root.append(n) return root @@ -192,15 +198,15 @@ class Timestamp(Token): @type validity: int """ Token.__init__(self) - self.created = Token.now() + self.created = Token.utc() self.expires = self.created + timedelta(seconds=validity) def xml(self): root = Element("Timestamp", ns=wsuns) created = Element('Created', ns=wsuns) - created.setText(self.created.isoformat()) + created.setText(str(UTC(self.created))) expires = Element('Expires', ns=wsuns) - expires.setText(self.expires.isoformat()) + expires.setText(str(UTC(self.expires))) root.append(created) root.append(expires) return root \ No newline at end of file diff --git a/tests/builtin.py b/tests/builtin.py index 31ca3c3..c8f6c6f 100644 --- a/tests/builtin.py +++ b/tests/builtin.py @@ -16,6 +16,7 @@ import sys sys.path.append('../') +import unittest from suds.sax.date import Timezone as Tz from suds.xsd.sxbuiltin import * from unittest import TestCase -- cgit v1.2.1