Ticket #3011 (reopened defect)

Opened 5 months ago

Last modified 5 months ago

ticket.milestone.update or create with 'due' parameter fail

Reported by: takuzo.ohara@gmail.com Assigned to: athomas
Priority: normal Component: XmlRpcPlugin
Severity: blocker Keywords:
Cc: Trac Release: 0.11

Description

I am using python2.5, trac 0.11dev(r7035), XmlRpcPlugin trunk(r3650).

Using following simple script to update due date for a milestone:

import xmlrpclib

testurl = "http://unko:unko@10.0.0.5/proj/test11/login/xmlrpc"

server = xmlrpclib.ServerProxy(testurl)
milestone = server.ticket.milestone.get("testmilestone")
dt = datetime.datetime(1973, 10, 23)
server.ticket.milestone.update("testmilestone", {'due': dt})

Trac fails with following error:

2008-05-11 02:52:02,670 Trac[model] INFO: Updating milestone "testmilestone"
2008-05-11 02:52:02,692 Trac[web_ui] ERROR: unsupported operand type(s) for -: 'instance' and 'datetime.datetime'
2008-05-11 02:52:02,790 Trac[web_ui] ERROR: Traceback (most recent call last):
  File "/home/takuzo/debian/trac/xmlrpcplugin/tracrpc/web_ui.py", line 60, in process_request
    result = XMLRPCSystem(self.env).get_method(method)(req, args)
  File "/home/takuzo/debian/trac/xmlrpcplugin/tracrpc/api.py", line 85, in __call__
    result = self.callable(req, *args)
  File "/home/takuzo/debian/trac/xmlrpcplugin/tracrpc/ticket.py", line 215, in update
    self._updateHelper(name, attributes).update()
  File "/usr/lib/python2.5/site-packages/Trac-0.11dev_r7035-py2.5.egg/trac/ticket/model.py", line 692, in update
    (self.name, to_timestamp(self.due), to_timestamp(self.completed),
  File "/usr/lib/python2.5/site-packages/Trac-0.11dev_r7035-py2.5.egg/trac/util/datefmt.py", line 56, in to_timestamp
    return diff.days * 86400 + diff.seconds
TypeError: unsupported operand type(s) for -: 'instance' and 'datetime.datetime'

It is same with ticket.milestone.create.

It seems like xmlrpclib.DateTime? and datetime.datetime can not be subtracted at to_timestamp() in trac/util/datefmt.py.

Am I doing something wrong?

Attachments

Change History

05/11/08 21:04:12 changed by athomas

  • status changed from new to closed.
  • resolution set to invalid.

You should be passing use_datetime=True to xmlrpclib.ServerProxy() if you wish to ... use ... datetime objects.

If that doesn't fix your problem, feel free to reopen.

05/21/08 22:42:44 changed by takuzo.ohara@gmail.com

  • status changed from closed to reopened.
  • resolution deleted.

No, I modified the previous test script as follows, but it did not change the result.

-server = xmlrpclib.ServerProxy(testurl)
+server = xmlrpclib.ServerProxy(testurl, use_datetime=True)

05/21/08 22:46:14 changed by takuzo.ohara@gmail.com

I created a patch to trac to work around this problem.

What is the correct way to fix this?

--- Trac-0.11dev_r7035-py2.5.egg.orig/trac/util/datefmt.py
+++ Trac-0.11dev_r7035-py2.5.egg/trac/util/datefmt.py
@@ -26,6 +26,8 @@ from datetime import tzinfo, timedelta, 
 from trac.core import TracError
 from trac.util.text import to_unicode
 
+import xmlrpclib
+
 # Date/time utilities
 
 # -- conversion
@@ -49,8 +51,16 @@ def to_datetime(t, tzinfo=None):
     raise TypeError('expecting datetime, int, long, float, or None; got %s' %
                     type(t))
 
+def xmlrpc_datetime_to_datetime(data):
+    """Return datetime (in utc) from XMLRPC datetime string (is always utc)"""
+    t = list(time.strptime(data.value, "%Y%m%dT%H:%M:%S")[0:6])
+    return apply(datetime, t + [0, utc])
+
+
 def to_timestamp(dt):
     """Return the corresponding POSIX timestamp"""
+    if isinstance(dt, xmlrpclib.DateTime):
+        dt = xmlrpc_datetime_to_datetime(dt)
     if dt:
         diff = dt - _epoc
         return diff.days * 86400 + diff.seconds

Add/Change #3011 (ticket.milestone.update or create with 'due' parameter fail)




Change Properties
Action