From 5684bdc3a4c6d7f8551ff18d8c7cdbd4294175c8 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Tue, 4 Dec 2007 21:35:28 +0000 Subject: [PATCH] Fixed a bug introduced in [6891]: the "safe" YAML serializer can't handle time types out of the box. I've worked around the bug by coercing times to strings, which is far from perfect. However, it's better than a Python-specific "!!python/time" type which would break interoperability (which was the goal of switching to the safe mode in the first place). git-svn-id: http://code.djangoproject.com/svn/django/trunk@6893 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/serializers/pyyaml.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/django/core/serializers/pyyaml.py b/django/core/serializers/pyyaml.py index 668bcb288a..772f34a2e3 100644 --- a/django/core/serializers/pyyaml.py +++ b/django/core/serializers/pyyaml.py @@ -5,6 +5,7 @@ Requires PyYaml (http://pyyaml.org/), but that's checked for in __init__. """ import datetime +from django.db import models from django.core.serializers.python import Serializer as PythonSerializer from django.core.serializers.python import Deserializer as PythonDeserializer try: @@ -17,6 +18,19 @@ class Serializer(PythonSerializer): """ Convert a queryset to YAML. """ + + def handle_field(self, obj, field): + # A nasty special case: base YAML doesn't support serialization of time + # types (as opposed to dates or datetimes, which it does support). Since + # we want to use the "safe" serializer for better interoperability, we + # need to do something with those pesky times. Converting 'em to strings + # isn't perfect, but it's better than a "!!python/time" type which would + # halt deserialization under any other language. + if isinstance(field, models.TimeField) and getattr(obj, field.name) is not None: + self._current[field.name] = str(getattr(obj, field.name)) + else: + super(Serializer, self).handle_field(obj, field) + def end_serialization(self): self.options.pop('stream', None) self.options.pop('fields', None)