Skip to content

Commit c97bb15

Browse files
committed
add time zone support
fixes #11
1 parent a48e325 commit c97bb15

File tree

4 files changed

+47
-0
lines changed

4 files changed

+47
-0
lines changed

.github/workflows/test-python.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ jobs:
6868
run: >
6969
python3 django_repo/tests/runtests.py --settings mongodb_settings -v 2
7070
basic
71+
dates
72+
datetimes
7173
empty
7274
defer
7375
defer_regress
@@ -78,6 +80,7 @@ jobs:
7880
model_fields
7981
or_lookups
8082
sessions_tests
83+
timezones
8184
update
8285
8386
docs:

django_mongodb/compiler.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ def check_query(self):
9898
if self.query.is_empty():
9999
raise EmptyResultSet()
100100
if self.query.distinct:
101+
# This is a heuristic to detect QuerySet.datetimes() and dates().
102+
# "datetimefield" and "datefield" are the names of the annotations
103+
# the methods use. A user could annotate with the same names which
104+
# would give an incorrect error message.
105+
if "datetimefield" in self.query.annotations:
106+
raise NotSupportedError("QuerySet.datetimes() is not supported on MongoDB.")
107+
if "datefield" in self.query.annotations:
108+
raise NotSupportedError("QuerySet.dates() is not supported on MongoDB.")
101109
raise NotSupportedError("QuerySet.distinct() is not supported on MongoDB.")
102110
if self.query.extra:
103111
raise NotSupportedError("QuerySet.extra() is not supported on MongoDB.")

django_mongodb/features.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,19 @@ class DatabaseFeatures(BaseDatabaseFeatures):
2020
"basic.tests.ModelLookupTest.test_rich_lookup",
2121
"basic.tests.ModelLookupTest.test_too_many",
2222
"basic.tests.ModelTest.test_year_lookup_edge_case",
23+
"timezones.tests.LegacyDatabaseTests.test_query_datetime_lookups",
24+
"timezones.tests.NewDatabaseTests.test_query_convert_timezones",
25+
"timezones.tests.NewDatabaseTests.test_query_datetime_lookups",
26+
"timezones.tests.NewDatabaseTests.test_query_datetime_lookups_in_other_timezone",
2327
# "Save with update_fields did not affect any rows."
2428
"basic.tests.SelectOnSaveTests.test_select_on_save_lying_update",
2529
# QuerySet.extra() not supported.
2630
"basic.tests.ModelTest.test_extra_method_select_argument_with_dashes",
2731
"basic.tests.ModelTest.test_extra_method_select_argument_with_dashes_and_values",
2832
# QuerySet.aggregate() not supported: https://github.com/mongodb-labs/django-mongodb/issues/12
2933
"from_db_value.tests.FromDBValueTest.test_aggregation",
34+
"timezones.tests.LegacyDatabaseTests.test_query_aggregation",
35+
"timezones.tests.NewDatabaseTests.test_query_aggregation",
3036
# filtering on large decimalfield, see https://code.djangoproject.com/ticket/34590
3137
# for some background.
3238
"model_fields.test_decimalfield.DecimalFieldTests.test_lookup_decimal_larger_than_max_digits",
@@ -51,6 +57,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
5157
},
5258
"QuerySet.update() with expression not supported.": {
5359
"model_fields.test_integerfield.PositiveIntegerFieldTests.test_negative_values",
60+
"timezones.tests.NewDatabaseTests.test_update_with_timedelta",
5461
"update.tests.AdvancedTests.test_update_annotated_queryset",
5562
"update.tests.AdvancedTests.test_update_negated_f",
5663
"update.tests.AdvancedTests.test_update_negated_f_conditional_annotation",
@@ -97,6 +104,19 @@ class DatabaseFeatures(BaseDatabaseFeatures):
97104
"Test assumes integer primary key.": {
98105
"model_fields.test_foreignkey.ForeignKeyTests.test_to_python",
99106
},
107+
"QuerySet.dates() is not supported on MongoDB.": {
108+
"dates.tests.DatesTests.test_dates_trunc_datetime_fields",
109+
"dates.tests.DatesTests.test_related_model_traverse",
110+
},
111+
"QuerySet.datetimes() is not supported on MongoDB.": {
112+
"datetimes.tests.DateTimesTests.test_21432",
113+
"datetimes.tests.DateTimesTests.test_datetimes_has_lazy_iterator",
114+
"datetimes.tests.DateTimesTests.test_datetimes_returns_available_dates_for_given_scope_and_given_field",
115+
"datetimes.tests.DateTimesTests.test_related_model_traverse",
116+
"timezones.tests.LegacyDatabaseTests.test_query_datetimes",
117+
"timezones.tests.NewDatabaseTests.test_query_datetimes",
118+
"timezones.tests.NewDatabaseTests.test_query_datetimes_in_other_timezone",
119+
},
100120
"QuerySet.distinct() is not supported.": {
101121
"update.tests.AdvancedTests.test_update_all",
102122
},
@@ -118,6 +138,8 @@ class DatabaseFeatures(BaseDatabaseFeatures):
118138
"defer_regress.tests.DeferRegressionTest.test_ticket_16409",
119139
"model_fields.test_manytomanyfield.ManyToManyFieldDBTests.test_value_from_object_instance_with_pk",
120140
"model_fields.test_uuid.TestAsPrimaryKey.test_two_level_foreign_keys",
141+
"timezones.tests.LegacyDatabaseTests.test_query_annotation",
142+
"timezones.tests.NewDatabaseTests.test_query_annotation",
121143
"update.tests.AdvancedTests.test_update_annotated_multi_table_queryset",
122144
"update.tests.AdvancedTests.test_update_fk",
123145
"update.tests.AdvancedTests.test_update_ordered_by_inline_m2m_annotation",
@@ -127,4 +149,13 @@ class DatabaseFeatures(BaseDatabaseFeatures):
127149
"update.tests.SimpleTest.test_foreign_key_update_with_id",
128150
"update.tests.SimpleTest.test_nonempty_update_with_inheritance",
129151
},
152+
"Test executes raw SQL.": {
153+
"timezones.tests.LegacyDatabaseTests.test_cursor_execute_accepts_naive_datetime",
154+
"timezones.tests.LegacyDatabaseTests.test_cursor_execute_returns_naive_datetime",
155+
"timezones.tests.LegacyDatabaseTests.test_raw_sql",
156+
"timezones.tests.NewDatabaseTests.test_cursor_execute_accepts_aware_datetime",
157+
"timezones.tests.NewDatabaseTests.test_cursor_execute_returns_aware_datetime",
158+
"timezones.tests.NewDatabaseTests.test_cursor_explicit_time_zone",
159+
"timezones.tests.NewDatabaseTests.test_raw_sql",
160+
},
130161
}

django_mongodb/operations.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
import decimal
33
import uuid
44

5+
from django.conf import settings
56
from django.db.backends.base.operations import BaseDatabaseOperations
7+
from django.utils import timezone
68

79

810
class DatabaseOperations(BaseDatabaseOperations):
@@ -31,6 +33,9 @@ def convert_datefield_value(self, value, expression, connection):
3133
def convert_datetimefield_value(self, value, expression, connection):
3234
if value is not None:
3335
value = datetime.datetime.fromisoformat(value)
36+
if not settings.USE_TZ and timezone.is_aware(value):
37+
# Django expects naive datetimes when settings.USE_TZ is False.
38+
value = timezone.make_naive(value)
3439
return value
3540

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

0 commit comments

Comments
 (0)