<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=EN-US link=blue vlink=purple>
<div class=Section1>
<p class=MsoNormal>I’ve run into an ValueError issue when parsing an
xsd:date response with a negative UTC timezone offset. This is happening in suds
0.3.6 as well as on the trunk.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Sorry I can’t provide the WSDL, since this is
internal-only – but instead, I have some patches which fix the issue in
sxdate.py, and add two test cases to builtin.py. If these changes look
acceptable I’d appreciate it if they were integrated into some future
Suds version.<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>The server uses Apache CXF 2.1.1 and JAX-B 2.1.6. The WSDL
defines a response element as follows:<o:p></o:p></p>
<p class=MsoNormal><xsd:element name="startDate"
type="xsd:date"/><o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>The response includes the timezone offset (US Pacific time),
which happens to be negative:<o:p></o:p></p>
<p class=MsoNormal><startDate>2008-01-01-08:00</startDate><o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>This gives a ValueError exception, similar to the following
(this is actually from the test case I implemented, not the original web
service client where I found the error):<o:p></o:p></p>
<p class=MsoNormal>Traceback (most recent call last):<o:p></o:p></p>
<p class=MsoNormal> File "tests/builtin.py", line 121, in
test_should_return_correct_date_object_given_date_with_different_negative_timezone<o:p></o:p></p>
<p class=MsoNormal> date =
XDate().translate("1945-08-20-03:00")<o:p></o:p></p>
<p class=MsoNormal> File "<my home dir>/suds/trunk/suds/xsd/sxdate.py",
line 82, in translate<o:p></o:p></p>
<p class=MsoNormal> return self.toPython(value)<o:p></o:p></p>
<p class=MsoNormal> File "<my home dir>/suds/trunk/suds/xsd/sxdate.py",
line 55, in toPython<o:p></o:p></p>
<p class=MsoNormal> year, month, day = value.rsplit('-', 3)<o:p></o:p></p>
<p class=MsoNormal>ValueError: too many values to unpack<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Here are the diffs from SVN trunk revision 547, for the one-line
fix to sxdate.py and the two testcases added to builtin.py. <o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>Index: tests/builtin.py<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>--- tests/builtin.py (revision 547)<o:p></o:p></p>
<p class=MsoNormal>+++ tests/builtin.py (working copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -117,11 +117,25 @@<o:p></o:p></p>
<p class=MsoNormal>
self.assertEqual(date.second, 0)<o:p></o:p></p>
<p class=MsoNormal>
self.assertEqual(date.hour, self.getHour(0, 3))<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>+ def
test_should_return_correct_date_object_given_date_with_different_negative_timezone(self):<o:p></o:p></p>
<p class=MsoNormal>+ date =
XDate().translate("1945-08-20-03:00")<o:p></o:p></p>
<p class=MsoNormal>+
self.assertEqual(date.day, self.getDay(20, 0, -3))<o:p></o:p></p>
<p class=MsoNormal>+ self.assertEqual(date.month,
8)<o:p></o:p></p>
<p class=MsoNormal>+
self.assertEqual(date.year, 1945)<o:p></o:p></p>
<p class=MsoNormal>+
self.assertEqual(date.minute, 0)<o:p></o:p></p>
<p class=MsoNormal>+
self.assertEqual(date.second, 0)<o:p></o:p></p>
<p class=MsoNormal>+
self.assertEqual(date.hour, self.getHour(0, -3))<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal> def test_should_return_correct_string_from_date_object_given_date_with_timezone(self):<o:p></o:p></p>
<p class=MsoNormal> date =
XDate().translate(XDate().translate("1945-08-20+03:00"), False)<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>
self.assertEquals("1945-08-%s%s" % (str(self.getDay(20, 0, 3)),
self.getTestersTimezoneString()), date)<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>+ def
test_should_return_correct_string_from_date_object_given_date_with_negative_timezone(self):<o:p></o:p></p>
<p class=MsoNormal>+ date =
XDate().translate(XDate().translate("1945-08-20-03:00"), False)<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal>+
self.assertEquals("1945-08-%s%s" % (str(self.getDay(20, 0, -3)),
self.getTestersTimezoneString()), date)<o:p></o:p></p>
<p class=MsoNormal>+<o:p></o:p></p>
<p class=MsoNormal> def
test_should_return_correct_date_object_given_date_with_different_utc(self):<o:p></o:p></p>
<p class=MsoNormal> #from where
I am, this is 6 hours off and would become a different day<o:p></o:p></p>
<p class=MsoNormal> date =
XDate().translate("1945-08-20Z")<o:p></o:p></p>
<p class=MsoNormal>Index: suds/xsd/sxdate.py<o:p></o:p></p>
<p class=MsoNormal>===================================================================<o:p></o:p></p>
<p class=MsoNormal>--- suds/xsd/sxdate.py (revision 547)<o:p></o:p></p>
<p class=MsoNormal>+++ suds/xsd/sxdate.py (working copy)<o:p></o:p></p>
<p class=MsoNormal>@@ -52,7 +52,7 @@<o:p></o:p></p>
<p class=MsoNormal> if
len(value) == 0:<o:p></o:p></p>
<p class=MsoNormal>
return None<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>- year, month, day
= value.rsplit('-', 3)<o:p></o:p></p>
<p class=MsoNormal>+ year, month, day
= value.split('-', 2)<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal> #if it has
a tz set, convert to user's tz<o:p></o:p></p>
<p class=MsoNormal> if len(day)
> 2:<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
</div>
</body>
</html>