From d2ff1b522d2de6b748596047435cdac0d795b4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 22 Nov 2018 18:57:33 +0100 Subject: [PATCH] editor drm voodoo: treat decimals properly --- src/c3nav/editor/models/changedobject.py | 6 ++++-- src/c3nav/mapdata/fields.py | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/c3nav/editor/models/changedobject.py b/src/c3nav/editor/models/changedobject.py index ec7afff9..3a8b8a0f 100644 --- a/src/c3nav/editor/models/changedobject.py +++ b/src/c3nav/editor/models/changedobject.py @@ -1,5 +1,6 @@ import typing from collections import OrderedDict +from decimal import Decimal from itertools import chain from django.contrib.contenttypes.models import ContentType @@ -49,6 +50,9 @@ class ChangedObject(models.Model): self._m2m_removed_cache = {name: set(values) for name, values in self.m2m_removed.items()} if model_class is not None: self.model_class = model_class + for field in self.model_class._meta.get_fields(): + if field.name in self.updated_fields and isinstance(field, DecimalField): + self.updated_fields[field.name] = Decimal(self.updated_fields[field.name]) @property def model_class(self) -> typing.Optional[typing.Type[models.Model]]: @@ -247,8 +251,6 @@ class ChangedObject(models.Model): if isinstance(field, I18nField): for lang, subvalue in value.items(): self.updated_fields['%s__i18n__%s' % (field.name, lang)] = subvalue - elif isinstance(field, DecimalField): - self.updated_fields[field.name] = None if value is None else str(value) elif isinstance(field, (CharField, TextField)): self.updated_fields[field.name] = None if field.null and not value else field.get_prep_value(value) else: diff --git a/src/c3nav/mapdata/fields.py b/src/c3nav/mapdata/fields.py index 24233834..ec0548cc 100644 --- a/src/c3nav/mapdata/fields.py +++ b/src/c3nav/mapdata/fields.py @@ -4,6 +4,7 @@ import typing from django.conf import settings from django.core.exceptions import ValidationError +from django.core.serializers.json import DjangoJSONEncoder from django.db import models from django.utils.functional import cached_property, lazy from django.utils.text import format_lazy @@ -122,7 +123,7 @@ class JSONField(models.TextField): return value def get_prep_value(self, value): - return json.dumps(value) + return json.dumps(value, cls=DjangoJSONEncoder) def value_to_string(self, obj): value = self.value_from_object(obj)