From 2bc0a5a7cd14df4edb633324b237d1b7cff3bfef Mon Sep 17 00:00:00 2001 From: Kurt Neufeld Date: Sun, 13 Jan 2019 18:12:03 -0700 Subject: [PATCH] DateTimeField with auto_now were overwriting... file values during load with tznow() --- alkali/metamodel.py | 16 ++++++++-------- alkali/tests/test_fields.py | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/alkali/metamodel.py b/alkali/metamodel.py index d5d7fd7..250f9ec 100644 --- a/alkali/metamodel.py +++ b/alkali/metamodel.py @@ -239,19 +239,19 @@ def __call__(cls, *args, **kw): # put field values (int,str,etc) into model instance for name, field in cls.Meta.fields.items(): - # THINK: this somewhat duplicates Field.__set__ code - value = kw.pop(name, field.default_value) + if getattr(field, 'auto_now', False): + value = kw.pop(name, tznow().isoformat()) + elif getattr(field, 'auto_now_add', False): + value = kw.pop(name, tznow().isoformat()) + else: + # THINK: this somewhat duplicates Field.__set__ code + value = kw.pop(name, field.default_value) + value = field.cast(value) # store the actual value in the model's __dict__, used by Field.__get__ obj.__dict__[name] = value - if getattr(field, 'auto_now_add', False): - obj.__dict__[name] = tznow() - - if getattr(field, 'auto_now', False): - obj.__dict__[name] = tznow() - obj._dirty = False obj.__init__(*args, **kw) diff --git a/alkali/tests/test_fields.py b/alkali/tests/test_fields.py index aee108b..842d101 100644 --- a/alkali/tests/test_fields.py +++ b/alkali/tests/test_fields.py @@ -4,6 +4,8 @@ import unittest import mock import datetime as dt +import json +import tempfile from alkali.fields import Field from alkali.fields import IntField, StringField, BoolField @@ -12,7 +14,7 @@ from alkali.fields import ForeignKey, OneToOneField from alkali.model import Model -from . import MyModel, MyMulti, MyDepModel +from . import MyModel, MyMulti, MyDepModel, AutoModel1 class TestField( unittest.TestCase ): @@ -382,3 +384,32 @@ class AutoModel1(Model): with self.assertRaises(RuntimeError): m.uuid = "abc" + + def test_date_load_with_autotime(self): + """ + make sure when we load a record that has auto_now or auto_now_add + that the value in the file is used + """ + tfile = tempfile.NamedTemporaryFile() + + data = b"""[{ + "auto": 5, + "creation": "2010-01-13T17:52:09.131085-07:00", + "modified": "2010-01-13T17:52:09.131178-07:00", + "f1": "a value", + "f2": null + }]""" + + tfile.write(data) + tfile.flush() + + creation = dt.datetime.fromisoformat("2010-01-13T17:52:09.131085-07:00") + modified = dt.datetime.fromisoformat("2010-01-13T17:52:09.131178-07:00") + + from alkali.storage import JSONStorage + storage = JSONStorage(tfile.name) + AutoModel1.objects.load(storage) + m = AutoModel1.objects.instances[0] + + self.assertEqual(creation, m.creation) + self.assertEqual(modified, m.modified)