From fbeef70dccdb6d2f8584c9d360d6d47d40e5a5fc Mon Sep 17 00:00:00 2001 From: Hasan Ramezani Date: Tue, 15 Dec 2020 23:02:55 +0100 Subject: [PATCH] Fixed jDateTimeField problem with auto_now_add when tz enable.(#124) --- CHANGELOG.md | 4 ++++ django_jalali/db/models.py | 5 ++++- jalali_test/foo/migrations/0001_initial.py | 7 +++++++ jalali_test/foo/models.py | 5 +++++ jalali_test/foo/tests.py | 22 +++++++++++++++++++++- 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7c2d5d..503c3f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased +### Fixed +- Fixed `jDateTimeField` problem with `auto_now_add` when tz enable (#124) + ## [4.1.0] - 2020-12-11 ### Fixed - Fix Django Jalali javascipt files loading when Django Jquery file loaded first diff --git a/django_jalali/db/models.py b/django_jalali/db/models.py index b976420..031ad9d 100644 --- a/django_jalali/db/models.py +++ b/django_jalali/db/models.py @@ -336,7 +336,10 @@ def to_python(self, value): def pre_save(self, model_instance, add): if self.auto_now or (self.auto_now_add and add): - value = jdatetime.datetime.fromgregorian(datetime=timezone.now()) + value = jdatetime.datetime.now() + if value is not None and settings.USE_TZ and timezone.is_naive(value): + default_timezone = timezone.get_default_timezone() + value = timezone.make_aware(value, default_timezone) setattr(model_instance, self.attname, value) return value else: diff --git a/jalali_test/foo/migrations/0001_initial.py b/jalali_test/foo/migrations/0001_initial.py index bc0a2ae..efb2309 100644 --- a/jalali_test/foo/migrations/0001_initial.py +++ b/jalali_test/foo/migrations/0001_initial.py @@ -46,4 +46,11 @@ class Migration(migrations.Migration): ('datetime2', django_jalali.db.models.jDateTimeField(default=datetime.datetime(2011, 9, 22, 10, 22, 23, 240000))), ], ), + migrations.CreateModel( + name='ModelWithAutoNowAdd', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('datetimefield', django_jalali.db.models.jDateTimeField(auto_now_add=True)), + ], + ), ] diff --git a/jalali_test/foo/models.py b/jalali_test/foo/models.py index d0d4412..7632453 100644 --- a/jalali_test/foo/models.py +++ b/jalali_test/foo/models.py @@ -27,3 +27,8 @@ class DateTimeWithDefault(models.Model): objects = jmodels.jManager() datetime1 = jmodels.jDateTimeField(default=jdatetime.datetime(1390, 6, 31, 10, 22, 23, 240000)) datetime2 = jmodels.jDateTimeField(default=datetime.datetime(2011, 9, 22, 10, 22, 23, 240000)) + + +class ModelWithAutoNowAdd(models.Model): + objects = jmodels.jManager() + datetimefield = jmodels.jDateTimeField(auto_now_add=True) diff --git a/jalali_test/foo/tests.py b/jalali_test/foo/tests.py index 3ee914f..ab4d1a1 100644 --- a/jalali_test/foo/tests.py +++ b/jalali_test/foo/tests.py @@ -16,7 +16,13 @@ from django import get_version from django.utils import timezone -from foo.models import Bar, BarTime, DateWithDefault, DateTimeWithDefault +from foo.models import ( + Bar, + BarTime, + DateWithDefault, + DateTimeWithDefault, + ModelWithAutoNowAdd, +) import jdatetime from urllib.parse import unquote @@ -133,6 +139,20 @@ def test_lookup_date_with_no_tz(self): self.assertEqual(str(k[0].datetime), '1392-03-12 10:22:23.240000') self.assertEqual(k[0].datetime.strftime('%z'), '') + def test_lookup_auto_now_add(self): + ModelWithAutoNowAdd.objects.create() + dt = ModelWithAutoNowAdd.objects.all()[0].datetimefield + objects = ModelWithAutoNowAdd.objects.filter(datetimefield=dt) + self.assertEqual(objects[0].datetimefield, dt) + + @requires_tz_support + @override_settings(USE_TZ=True, TIME_ZONE='Asia/Tehran') + def test_lookup_auto_now_add_datetime_with_tz(self): + ModelWithAutoNowAdd.objects.create() + dt = ModelWithAutoNowAdd.objects.all()[0].datetimefield + objects = ModelWithAutoNowAdd.objects.filter(datetimefield=dt) + self.assertEqual(objects[0].datetimefield, dt) + def test_serialize_default_jdatetime_value(self): jdt1 = jdatetime.datetime(1390, 6, 31, 10, 22, 23, 240000) field = jmodels.jDateTimeField(default=jdt1)