Skip to content

Commit 553ed71

Browse files
committed
fix: modify datetime.datetime.utcnow() to datetime.datetime.now(datetime.timezone.utc) inside test since utcnow() is deprecated from 3.12 onwards
fix: change code inside `defining-documents.rst` and `signals.rst` to accommodate `datetime.datetime.utcnow()``
1 parent 370460d commit 553ed71

File tree

8 files changed

+51
-35
lines changed

8 files changed

+51
-35
lines changed

docs/guide/defining-documents.rst

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ objects** as class attributes to the document class::
2222

2323
class Page(Document):
2424
title = StringField(max_length=200, required=True)
25-
date_modified = DateTimeField(default=datetime.datetime.utcnow)
25+
date_modified = DateTimeField(default=datetime.datetime.now(datetime.timezone.utc))
2626

2727
As BSON (the binary format for storing data in mongodb) is order dependent,
2828
documents are serialized based on their field order.
@@ -274,7 +274,7 @@ store; in this situation a :class:`~mongoengine.fields.DictField` is appropriate
274274
user = ReferenceField(User)
275275
answers = DictField()
276276

277-
survey_response = SurveyResponse(date=datetime.utcnow(), user=request.user)
277+
survey_response = SurveyResponse(date=datetime.datetime.now(datetime.timezone.utc), user=request.user)
278278
response_form = ResponseForm(request.POST)
279279
survey_response.answers = response_form.cleaned_data()
280280
survey_response.save()
@@ -689,7 +689,7 @@ collection after a given period. See the official
689689
documentation for more information. A common usecase might be session data::
690690

691691
class Session(Document):
692-
created = DateTimeField(default=datetime.utcnow)
692+
created = DateTimeField(default=datetime.datetime.now(datetime.timezone.utc))
693693
meta = {
694694
'indexes': [
695695
{'fields': ['created'], 'expireAfterSeconds': 3600}
@@ -717,7 +717,7 @@ A default ordering can be specified for your
717717
:class:`~mongoengine.queryset.QuerySet` is created, and can be overridden by
718718
subsequent calls to :meth:`~mongoengine.queryset.QuerySet.order_by`. ::
719719

720-
from datetime import datetime
720+
from datetime import datetime,timezone
721721

722722
class BlogPost(Document):
723723
title = StringField()
@@ -812,7 +812,7 @@ the class name in every documents. When a document is loaded, MongoEngine checks
812812
it's :attr:`_cls` attribute and use that class to construct the instance.::
813813

814814
Page(title='a funky title').save()
815-
DatedPage(title='another title', date=datetime.utcnow()).save()
815+
DatedPage(title='another title', date=datetime.now(timezone.utc)).save()
816816

817817
print(Page.objects().count()) # 2
818818
print(DatedPage.objects().count()) # 1
@@ -823,7 +823,7 @@ it's :attr:`_cls` attribute and use that class to construct the instance.::
823823
print(list(qs))
824824
# [
825825
# {'_cls': u 'Page', 'title': 'a funky title'},
826-
# {'_cls': u 'Page.DatedPage', 'title': u 'another title', 'date': datetime.datetime(2019, 12, 13, 20, 16, 59, 993000)}
826+
# {'_cls': u 'Page.DatedPage', 'title': u 'another title', 'date': datetime(2019, 12, 13, 20, 16, 59, 993000)}
827827
# ]
828828

829829
Working with existing data

docs/guide/signals.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ Attaching Events
7474
After writing a handler function like the following::
7575

7676
import logging
77-
from datetime import datetime
77+
from datetime import datetime,timezone
7878

7979
from mongoengine import *
8080
from mongoengine import signals
8181

8282
def update_modified(sender, document):
83-
document.modified = datetime.utcnow()
83+
document.modified = datetime.now(timezone.utc)
8484

8585
You attach the event handler to your :class:`~mongoengine.Document` or
8686
:class:`~mongoengine.EmbeddedDocument` subclass::
@@ -139,7 +139,7 @@ cleaner looking while still allowing manual execution of the callback::
139139

140140
@handler(signals.pre_save)
141141
def update_modified(sender, document):
142-
document.modified = datetime.utcnow()
142+
document.modified = datetime.now(timezone.utc)
143143

144144
@update_modified.apply
145145
class Record(Document):

tests/document/test_instance.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import unittest
55
import uuid
66
import weakref
7-
from datetime import datetime
7+
from datetime import datetime, timezone
88
from unittest.mock import Mock
99

1010
import bson
@@ -3544,7 +3544,7 @@ class Test(Document):
35443544

35453545
def test_default_values_dont_get_override_upon_save_when_only_is_used(self):
35463546
class Person(Document):
3547-
created_on = DateTimeField(default=lambda: datetime.utcnow())
3547+
created_on = DateTimeField(default=lambda: datetime.now(timezone.utc))
35483548
name = StringField()
35493549

35503550
p = Person(name="alon")
@@ -3558,7 +3558,7 @@ class Person(Document):
35583558
assert orig_created_on == p3.created_on
35593559

35603560
class Person(Document):
3561-
created_on = DateTimeField(default=lambda: datetime.utcnow())
3561+
created_on = DateTimeField(default=lambda: datetime.now(timezone.utc))
35623562
name = StringField()
35633563
height = IntField(default=189)
35643564

tests/document/test_timeseries_collection.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import time
22
import unittest
3-
from datetime import datetime, timedelta
3+
from datetime import datetime, timedelta, timezone
44

55
from mongoengine import (
66
DateTimeField,
@@ -84,7 +84,7 @@ def test_insert_document_into_timeseries_collection(self):
8484
assert collection_name in self.db.list_collection_names()
8585

8686
# Insert a document and ensure it was inserted
87-
self.SensorData(timestamp=datetime.utcnow(), temperature=23.4).save()
87+
self.SensorData(timestamp=datetime.now(timezone.utc), temperature=23.4).save()
8888
assert collection.count_documents({}) == 1
8989

9090
@requires_mongodb_gte_50
@@ -98,7 +98,7 @@ def test_timeseries_expiration(self):
9898
assert options.get("timeseries", {}) is not None
9999
assert options["expireAfterSeconds"] == 1
100100

101-
self.SensorData(timestamp=datetime.utcnow(), temperature=23.4).save()
101+
self.SensorData(timestamp=datetime.now(timezone.utc), temperature=23.4).save()
102102

103103
assert collection.count_documents({}) == 1
104104

@@ -144,7 +144,7 @@ def test_timeseries_data_insertion_order(self):
144144
self.SensorData._get_collection()
145145

146146
# Insert documents out of order
147-
now = datetime.utcnow()
147+
now = datetime.now(timezone.utc)
148148
self.SensorData(timestamp=now, temperature=23.4).save()
149149
self.SensorData(timestamp=now - timedelta(seconds=5), temperature=22.0).save()
150150
self.SensorData(timestamp=now + timedelta(seconds=5), temperature=24.0).save()
@@ -164,7 +164,7 @@ def test_timeseries_query_by_time_range(self):
164164
self.SensorData._get_collection_name()
165165
self.SensorData._get_collection()
166166

167-
now = datetime.utcnow()
167+
now = datetime.now(timezone.utc)
168168
self.SensorData(timestamp=now - timedelta(seconds=10), temperature=22.0).save()
169169
self.SensorData(timestamp=now - timedelta(seconds=5), temperature=23.0).save()
170170
self.SensorData(timestamp=now, temperature=24.0).save()

tests/fields/test_complex_datetime_field.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,34 +163,40 @@ class Log(Document):
163163
assert fetched_log.timestamp is None
164164

165165
def test_default_static_value(self):
166-
NOW = datetime.datetime.utcnow()
166+
NOW_UTC = datetime.datetime.now(datetime.timezone.utc)
167+
NOW_NAIVE = NOW_UTC.replace(tzinfo=None)
167168

168169
class Log(Document):
169-
timestamp = ComplexDateTimeField(default=NOW)
170+
timestamp = ComplexDateTimeField(default=NOW_UTC)
170171

171172
Log.drop_collection()
172173

173174
log = Log()
174-
assert log.timestamp == NOW
175+
assert log.timestamp == NOW_NAIVE
175176
log.save()
176177

177178
fetched_log = Log.objects.with_id(log.id)
178-
assert fetched_log.timestamp == NOW
179+
assert fetched_log.timestamp == NOW_NAIVE
179180

180181
def test_default_callable(self):
181-
NOW = datetime.datetime.utcnow()
182+
NOW_UTC = datetime.datetime.now(datetime.timezone.utc)
183+
NOW_NAIVE = NOW_UTC.replace(tzinfo=None)
182184

183185
class Log(Document):
184-
timestamp = ComplexDateTimeField(default=datetime.datetime.utcnow)
186+
timestamp = ComplexDateTimeField(
187+
default=lambda: datetime.datetime.now(datetime.timezone.utc)
188+
)
185189

186190
Log.drop_collection()
187191

188192
log = Log()
189-
assert log.timestamp >= NOW
193+
assert (
194+
log.timestamp >= NOW_NAIVE
195+
) # since ComplexDateTimeField returns naive timestamp without timezone
190196
log.save()
191197

192198
fetched_log = Log.objects.with_id(log.id)
193-
assert fetched_log.timestamp >= NOW
199+
assert fetched_log.timestamp >= NOW_NAIVE
194200

195201
def test_setting_bad_value_does_not_raise_unless_validate_is_called(self):
196202
# test regression of #2253

tests/fields/test_datetime_field.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import datetime as dt
2+
from datetime import timezone
23

34
import pytest
45

@@ -45,9 +46,9 @@ def test_default_value_utcnow(self):
4546
"""
4647

4748
class Person(Document):
48-
created = DateTimeField(default=dt.datetime.utcnow)
49+
created = DateTimeField(default=lambda: dt.datetime.now(dt.timezone.utc))
4950

50-
utcnow = dt.datetime.utcnow()
51+
utcnow = dt.datetime.now(timezone.utc)
5152
person = Person()
5253
person.validate()
5354
person_created_t0 = person.created

tests/fields/test_fields.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ class Person(Document):
8989
name = StringField()
9090
age = IntField(default=30, required=False)
9191
userid = StringField(default=lambda: "test", required=True)
92-
created = DateTimeField(default=datetime.datetime.utcnow)
92+
created = DateTimeField(
93+
default=lambda: datetime.datetime.now(datetime.timezone.utc)
94+
)
9395
day = DateField(default=datetime.date.today)
9496

9597
person = Person(name="Ross")
@@ -169,7 +171,9 @@ class Person(Document):
169171
name = StringField()
170172
age = IntField(default=30, required=False)
171173
userid = StringField(default=lambda: "test", required=True)
172-
created = DateTimeField(default=datetime.datetime.utcnow)
174+
created = DateTimeField(
175+
default=lambda: datetime.datetime.now(datetime.timezone.utc)
176+
)
173177

174178
# Trying setting values to None
175179
person = Person(name=None, age=None, userid=None, created=None)
@@ -203,7 +207,9 @@ class Person(Document):
203207
name = StringField()
204208
age = IntField(default=30, required=False)
205209
userid = StringField(default=lambda: "test", required=True)
206-
created = DateTimeField(default=datetime.datetime.utcnow)
210+
created = DateTimeField(
211+
default=lambda: datetime.datetime.now(datetime.timezone.utc)
212+
)
207213

208214
person = Person()
209215
person.name = None
@@ -271,7 +277,9 @@ class Person(Document):
271277
name = StringField()
272278
age = IntField(default=30, required=False)
273279
userid = StringField(default=lambda: "test", required=True)
274-
created = DateTimeField(default=datetime.datetime.utcnow)
280+
created = DateTimeField(
281+
default=lambda: datetime.datetime.now(datetime.timezone.utc)
282+
)
275283

276284
person = Person(
277285
name="Ross",
@@ -336,7 +344,7 @@ class HandleNoneFields(Document):
336344
doc.str_fld = "spam ham egg"
337345
doc.int_fld = 42
338346
doc.flt_fld = 4.2
339-
doc.com_dt_fld = datetime.datetime.utcnow()
347+
doc.com_dt_fld = datetime.datetime.now(datetime.timezone.utc)
340348
doc.save()
341349

342350
res = HandleNoneFields.objects(id=doc.id).update(
@@ -372,7 +380,7 @@ class HandleNoneFields(Document):
372380
doc.str_fld = "spam ham egg"
373381
doc.int_fld = 42
374382
doc.flt_fld = 4.2
375-
doc.comp_dt_fld = datetime.datetime.utcnow()
383+
doc.comp_dt_fld = datetime.datetime.now(datetime.timezone.utc)
376384
doc.save()
377385

378386
# Unset all the fields

tests/queryset/test_queryset.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1554,7 +1554,8 @@ class BlogPost(Document):
15541554
meta = {"ordering": ["-published_date"]}
15551555

15561556
BlogPost.objects.create(
1557-
title="whatever", published_date=datetime.datetime.utcnow()
1557+
title="whatever",
1558+
published_date=datetime.datetime.now(datetime.timezone.utc),
15581559
)
15591560

15601561
with db_ops_tracker() as q:
@@ -3114,7 +3115,7 @@ class Link(Document):
31143115

31153116
Link.drop_collection()
31163117

3117-
now = datetime.datetime.utcnow()
3118+
now = datetime.datetime.now(datetime.timezone.utc)
31183119

31193120
# Note: Test data taken from a custom Reddit homepage on
31203121
# Fri, 12 Feb 2010 14:36:00 -0600. Link ordering should

0 commit comments

Comments
 (0)