Skip to content

Commit d083640

Browse files
committed
rework time zone support to set DatabaseFeatures.supports_timezones = False
1 parent 3c3ad0e commit d083640

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

django_mongodb/base.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ def _connect(self):
120120
self.connection = MongoClient(
121121
host=settings_dict["HOST"] or None,
122122
port=int(settings_dict["PORT"] or 27017),
123-
tz_aware=True,
124123
**options,
125124
)
126125
db_name = settings_dict["NAME"]

django_mongodb/features.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ class DatabaseFeatures(BaseDatabaseFeatures):
77
supports_ignore_conflicts = False
88
# Not implemented: https://github.com/mongodb-labs/django-mongodb/issues/8
99
supports_json_field = False
10+
# MongoDB stores datetimes in UTC.
11+
supports_timezones = False
1012
# Not implemented: https://github.com/mongodb-labs/django-mongodb/issues/7
1113
supports_transactions = False
1214
uses_savepoints = False
@@ -214,8 +216,8 @@ class DatabaseFeatures(BaseDatabaseFeatures):
214216
"timezones.tests.LegacyDatabaseTests.test_cursor_execute_accepts_naive_datetime",
215217
"timezones.tests.LegacyDatabaseTests.test_cursor_execute_returns_naive_datetime",
216218
"timezones.tests.LegacyDatabaseTests.test_raw_sql",
217-
"timezones.tests.NewDatabaseTests.test_cursor_execute_accepts_aware_datetime",
218-
"timezones.tests.NewDatabaseTests.test_cursor_execute_returns_aware_datetime",
219+
"timezones.tests.NewDatabaseTests.test_cursor_execute_accepts_naive_datetime",
220+
"timezones.tests.NewDatabaseTests.test_cursor_execute_returns_naive_datetime",
219221
"timezones.tests.NewDatabaseTests.test_cursor_explicit_time_zone",
220222
"timezones.tests.NewDatabaseTests.test_raw_sql",
221223
},

django_mongodb/operations.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,24 @@ def adapt_datefield_value(self, value):
1717
return datetime.datetime.combine(value, datetime.datetime.min.time())
1818

1919
def adapt_datetimefield_value(self, value):
20-
if not settings.USE_TZ and value is not None and timezone.is_naive(value):
21-
value = timezone.make_aware(value)
20+
if value is None:
21+
return None
22+
if timezone.is_aware(value):
23+
if settings.USE_TZ:
24+
value = timezone.make_naive(value, self.connection.timezone)
25+
else:
26+
raise ValueError(
27+
"MongoDB backend does not support timezone-aware "
28+
"datetimes when USE_TZ is False."
29+
)
2230
return value
2331

2432
def adapt_timefield_value(self, value):
2533
"""Store TimeField as datetime."""
2634
if value is None:
2735
return None
36+
if timezone.is_aware(value):
37+
raise ValueError("MongoDB backend does not support timezone-aware times.")
2838
return datetime.datetime.combine(datetime.datetime.min.date(), value)
2939

3040
def get_db_converters(self, expression):
@@ -33,7 +43,7 @@ def get_db_converters(self, expression):
3343
if internal_type == "DateField":
3444
converters.append(self.convert_datefield_value)
3545
elif internal_type == "DateTimeField":
36-
if not settings.USE_TZ:
46+
if settings.USE_TZ:
3747
converters.append(self.convert_datetimefield_value)
3848
elif internal_type == "DecimalField":
3949
converters.append(self.convert_decimalfield_value)
@@ -50,8 +60,7 @@ def convert_datefield_value(self, value, expression, connection):
5060

5161
def convert_datetimefield_value(self, value, expression, connection):
5262
if value is not None:
53-
# Django expects naive datetimes when settings.USE_TZ is False.
54-
value = timezone.make_naive(value)
63+
value = timezone.make_aware(value, self.connection.timezone)
5564
return value
5665

5766
def convert_decimalfield_value(self, value, expression, connection):

0 commit comments

Comments
 (0)