From c496bf994cbc394f0c2ec9056751580775dfaf5e Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Nov 03 2017 14:18:08 +0000 Subject: PR#677: handle DateTime objects in encode_datetime Merges #677 https://pagure.io/koji/pull-request/677 Fixes: #676 https://pagure.io/koji/issue/676 messaging plugins fail on DateTime objects --- diff --git a/koji/util.py b/koji/util.py index ba999a7..cbf75b8 100644 --- a/koji/util.py +++ b/koji/util.py @@ -21,6 +21,7 @@ from __future__ import absolute_import import calendar import datetime +from koji.xmlrpcplus import DateTime from fnmatch import fnmatch import koji import logging @@ -186,6 +187,8 @@ def encode_datetime(value): """Convert datetime objects to strings""" if isinstance(value, datetime.datetime): return value.isoformat(' ') + elif isinstance(value, DateTime): + return datetime.datetime(*value.timetuple()[:6]).isoformat(' ') else: return value diff --git a/koji/xmlrpcplus.py b/koji/xmlrpcplus.py index 6a736f4..9164cd7 100644 --- a/koji/xmlrpcplus.py +++ b/koji/xmlrpcplus.py @@ -11,6 +11,7 @@ import types getparser = xmlrpc_client.getparser loads = xmlrpc_client.loads Fault = xmlrpc_client.Fault +DateTime = xmlrpc_client.DateTime class ExtendedMarshaller(xmlrpc_client.Marshaller): diff --git a/tests/test_lib/test_encode_datetime.py b/tests/test_lib/test_encode_datetime.py index 7617c26..1583c37 100644 --- a/tests/test_lib/test_encode_datetime.py +++ b/tests/test_lib/test_encode_datetime.py @@ -2,6 +2,7 @@ import datetime import unittest import koji.util +from koji.xmlrpcplus import DateTime class testEncodeDatetime(unittest.TestCase): @@ -22,6 +23,15 @@ class testEncodeDatetime(unittest.TestCase): self.assertEqual(chk1, dstr) self.assertEqual(chk2, dstr) + def test_xmlrpc_dates(self): + # we skip the last because xmlrpc's DateTime class does not preserve + # fractions of seconds + for dt, dstr in self.DATES[:2]: + dt = DateTime(dt) + chk1 = koji.util.encode_datetime(dt) + chk2 = koji.util.encode_datetime_recurse(dt) + self.assertEqual(chk1, dstr) + self.assertEqual(chk2, dstr) def test_embedded_dates(self): dt1, ds1 = self.DATES[0]