Skip to content

Commit 13e20b7

Browse files
mfarhan943mumarkhan999
authored andcommitted
chore: replace pytz with zoneinfo
1 parent 85ecad1 commit 13e20b7

File tree

279 files changed

+1140
-1110
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

279 files changed

+1140
-1110
lines changed

cms/djangoapps/api/v1/tests/test_serializers/test_course_runs.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import datetime
55
import ddt
6-
import pytz
6+
from zoneinfo import ZoneInfo
77
from django.test import RequestFactory
88

99
from common.djangoapps.student.roles import CourseInstructorRole, CourseStaffRole
@@ -22,7 +22,7 @@ class CourseRunSerializerTests(ModuleStoreTestCase): # lint-amnesty, pylint: di
2222
def setUp(self):
2323
super().setUp()
2424

25-
self.course_start = datetime.datetime.now(pytz.UTC)
25+
self.course_start = datetime.datetime.now(ZoneInfo("UTC"))
2626
self.course_end = self.course_start + datetime.timedelta(days=30)
2727

2828
self.request = RequestFactory().get('')

cms/djangoapps/api/v1/tests/test_views/test_course_runs.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from unittest.mock import patch # lint-amnesty, pylint: disable=unused-import
66

77
import ddt
8-
import pytz
8+
from zoneinfo import ZoneInfo
99
from django.core.files.uploadedfile import SimpleUploadedFile
1010
from django.test import RequestFactory, override_settings
1111
from django.urls import reverse
@@ -117,7 +117,7 @@ def test_update(self):
117117
assert CourseAccessRole.objects.filter(course_id=course_run.id).count() == 0
118118

119119
url = reverse('api:v1:course_run-detail', kwargs={'pk': str(course_run.id)})
120-
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
120+
start = datetime.datetime.now(ZoneInfo("UTC")).replace(microsecond=0)
121121
end = start + datetime.timedelta(days=30)
122122
title = 'A New Testing Strategy'
123123
user = UserFactory()
@@ -165,7 +165,7 @@ def test_update_with_pacing_type(self):
165165
"""
166166
Test that update run updates the pacing type
167167
"""
168-
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
168+
start = datetime.datetime.now(ZoneInfo("UTC")).replace(microsecond=0)
169169
course_run = CourseFactory(start=start, end=None, self_paced=False)
170170
data = {
171171
'pacing_type': 'self_paced',
@@ -183,7 +183,7 @@ def test_update_with_instructor_role(self):
183183
Test that update creates a new instructor role only if it does not exist
184184
"""
185185
instructor_role = 'instructor'
186-
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
186+
start = datetime.datetime.now(ZoneInfo("UTC")).replace(microsecond=0)
187187
new_user = UserFactory()
188188
course_run = CourseFactory(start=start, end=None, self_paced=False)
189189
assert CourseAccessRole.objects.filter(course_id=course_run.id).count() == 0
@@ -214,7 +214,7 @@ def test_update_with_multiple_roles(self):
214214
"""
215215
staff_role = 'staff'
216216
instructor_role = 'instructor'
217-
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
217+
start = datetime.datetime.now(ZoneInfo("UTC")).replace(microsecond=0)
218218
course_run = CourseFactory(start=start, end=None, self_paced=False)
219219

220220
existing_user = UserFactory()
@@ -255,7 +255,7 @@ def test_update_with_multiple_roles(self):
255255
def test_create(self, pacing_type, expected_self_paced_value):
256256
"""Tests successful course run creation"""
257257
user = UserFactory()
258-
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
258+
start = datetime.datetime.now(ZoneInfo("UTC")).replace(microsecond=0)
259259
end = start + datetime.timedelta(days=30)
260260
role = 'staff'
261261
data = self.get_course_run_data(user, start, end, pacing_type, role)
@@ -280,7 +280,7 @@ def test_create_with_invalid_course_team(self):
280280
with expected validation message
281281
"""
282282
user = UserFactory()
283-
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
283+
start = datetime.datetime.now(ZoneInfo("UTC")).replace(microsecond=0)
284284
end = start + datetime.timedelta(days=30)
285285
data = self.get_course_run_data(user, start, end, 'self-paced')
286286
data['team'] = [{'user': 'invalid-username'}]
@@ -334,7 +334,7 @@ def test_rerun(self, pacing_type, expected_self_paced_value, number):
334334
'short_name': original_course_run.id.org, # lint-amnesty, pylint: disable=no-member
335335
'description': 'Testing Organization Description',
336336
})
337-
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
337+
start = datetime.datetime.now(ZoneInfo("UTC")).replace(microsecond=0)
338338
end = start + datetime.timedelta(days=30)
339339
user = UserFactory()
340340
role = 'instructor'

cms/djangoapps/contentstore/api/views/course_validation.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import logging
33

44
import dateutil
5-
from pytz import UTC
5+
from zoneinfo import ZoneInfo
66
from rest_framework.generics import GenericAPIView
77
from rest_framework.response import Response
88

@@ -255,34 +255,34 @@ def _get_open_responses(self, course, graded_only):
255255

256256
def _has_date_before_start(self, ora, start): # lint-amnesty, pylint: disable=missing-function-docstring
257257
if ora.submission_start:
258-
if dateutil.parser.parse(ora.submission_start).replace(tzinfo=UTC) < start:
258+
if dateutil.parser.parse(ora.submission_start).replace(tzinfo=ZoneInfo("UTC")) < start:
259259
return True
260260
if ora.submission_due:
261-
if dateutil.parser.parse(ora.submission_due).replace(tzinfo=UTC) < start:
261+
if dateutil.parser.parse(ora.submission_due).replace(tzinfo=ZoneInfo("UTC")) < start:
262262
return True
263263
for assessment in ora.rubric_assessments:
264264
if assessment['start']:
265-
if dateutil.parser.parse(assessment['start']).replace(tzinfo=UTC) < start:
265+
if dateutil.parser.parse(assessment['start']).replace(tzinfo=ZoneInfo("UTC")) < start:
266266
return True
267267
if assessment['due']:
268-
if dateutil.parser.parse(assessment['due']).replace(tzinfo=UTC) < start:
268+
if dateutil.parser.parse(assessment['due']).replace(tzinfo=ZoneInfo("UTC")) < start:
269269
return True
270270

271271
return False
272272

273273
def _has_date_after_end(self, ora, end): # lint-amnesty, pylint: disable=missing-function-docstring
274274
if ora.submission_start:
275-
if dateutil.parser.parse(ora.submission_start).replace(tzinfo=UTC) > end:
275+
if dateutil.parser.parse(ora.submission_start).replace(tzinfo=ZoneInfo("UTC")) > end:
276276
return True
277277
if ora.submission_due:
278-
if dateutil.parser.parse(ora.submission_due).replace(tzinfo=UTC) > end:
278+
if dateutil.parser.parse(ora.submission_due).replace(tzinfo=ZoneInfo("UTC")) > end:
279279
return True
280280
for assessment in ora.rubric_assessments:
281281
if assessment['start']:
282-
if dateutil.parser.parse(assessment['start']).replace(tzinfo=UTC) > end:
282+
if dateutil.parser.parse(assessment['start']).replace(tzinfo=ZoneInfo("UTC")) > end:
283283
return True
284284
if assessment['due']:
285-
if dateutil.parser.parse(assessment['due']).replace(tzinfo=UTC) > end:
285+
if dateutil.parser.parse(assessment['due']).replace(tzinfo=ZoneInfo("UTC")) > end:
286286
return True
287287
return False
288288

cms/djangoapps/contentstore/management/commands/tests/test_clean_stale_certificate_availability_dates.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from datetime import datetime, timedelta
55

66
from django.core.management import CommandError, call_command
7-
import pytz
7+
from zoneinfo import ZoneInfo
88

99
from cms.djangoapps.contentstore.models import CleanStaleCertificateAvailabilityDatesConfig
1010
from openedx.core.lib.courses import get_course_by_id
@@ -26,7 +26,7 @@ def setUp(self):
2626
self.instructor_paced_course1 = CourseFactory()
2727

2828
# set the self-paced courses to self-paced, create and insert an invalid certificate available date for them
29-
self.certificate_available_date = datetime.now(pytz.UTC) + timedelta(days=30)
29+
self.certificate_available_date = datetime.now(ZoneInfo("UTC")) + timedelta(days=30)
3030
self.self_paced_course1.self_paced = True
3131
self.self_paced_course1.certificate_available_date = self.certificate_available_date
3232
self.self_paced_course2.self_paced = True

cms/djangoapps/contentstore/rest_api/v2/views/tests/test_home.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from unittest.mock import patch
77

88
import ddt
9-
import pytz
9+
from zoneinfo import ZoneInfo
1010
from django.conf import settings
1111
from django.test import override_settings
1212
from django.urls import reverse
@@ -43,7 +43,7 @@ def setUp(self):
4343
display_name="Demo Course (Sample)",
4444
id=archived_course_key,
4545
org=archived_course_key.org,
46-
end=(datetime.now() - timedelta(days=365)).replace(tzinfo=pytz.UTC),
46+
end=(datetime.now() - timedelta(days=365)).replace(tzinfo=ZoneInfo("UTC")),
4747
)
4848
self.non_staff_client, _ = self.create_non_staff_authed_user_client()
4949

cms/djangoapps/contentstore/signals/handlers.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from opaque_keys.edx.keys import CourseKey
1515
from openedx_events.content_authoring.data import CourseCatalogData, CourseScheduleData
1616
from openedx_events.content_authoring.signals import COURSE_CATALOG_INFO_CHANGED
17-
from pytz import UTC
17+
from zoneinfo import ZoneInfo
1818

1919
from cms.djangoapps.contentstore.courseware_index import (
2020
CourseAboutSearchIndexer,
@@ -145,8 +145,8 @@ def listen_for_course_publish(sender, course_key, **kwargs): # pylint: disable=
145145

146146
# Kick off a courseware indexing action after the data is ready
147147
if CoursewareSearchIndexer.indexing_is_enabled() and CourseAboutSearchIndexer.indexing_is_enabled():
148-
transaction.on_commit(lambda: update_search_index.delay(course_key_str, datetime.now(UTC).isoformat()))
149-
148+
transaction.on_commit(lambda: update_search_index.delay(
149+
course_key_str, datetime.now(ZoneInfo("UTC")).isoformat()))
150150
update_discussions_settings_from_course_task.apply_async(
151151
args=[course_key_str],
152152
countdown=settings.DISCUSSION_SETTINGS['COURSE_PUBLISH_TASK_DELAY'],
@@ -175,7 +175,7 @@ def listen_for_library_update(sender, library_key, **kwargs): # pylint: disable
175175
# import here, because signal is registered at startup, but items in tasks are not yet able to be loaded
176176
from cms.djangoapps.contentstore.tasks import update_library_index
177177

178-
update_library_index.delay(str(library_key), datetime.now(UTC).isoformat())
178+
update_library_index.delay(str(library_key), datetime.now(ZoneInfo("UTC")).isoformat())
179179

180180

181181
@receiver(SignalHandler.item_deleted)

cms/djangoapps/contentstore/tasks.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
from organizations.exceptions import InvalidOrganizationException
3636
from organizations.models import Organization, OrganizationCourse
3737
from path import Path as path
38-
from pytz import UTC
38+
from zoneinfo import ZoneInfo
3939
from user_tasks.models import UserTaskArtifact, UserTaskStatus
4040
from user_tasks.tasks import UserTask
4141

@@ -197,7 +197,7 @@ def _parse_time(time_isoformat):
197197
# remove the +00:00 from the end of the formats generated within the system
198198
time_isoformat.split('+')[0],
199199
"%Y-%m-%dT%H:%M:%S.%f"
200-
).replace(tzinfo=UTC)
200+
).replace(tzinfo=ZoneInfo("UTC"))
201201

202202

203203
@shared_task

cms/djangoapps/contentstore/tests/test_course_settings.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from edx_toggles.toggles.testutils import override_waffle_flag
1919
from milestones.models import MilestoneRelationshipType
2020
from milestones.tests.utils import MilestonesTestCaseMixin
21-
from pytz import UTC
21+
from zoneinfo import ZoneInfo
2222

2323
from cms.djangoapps.contentstore.utils import reverse_course_url, reverse_usage_url
2424
from cms.djangoapps.models.settings.course_grading import (
@@ -75,7 +75,7 @@ def test_pre_1900_date(self):
7575
doesn't work for these dates.
7676
"""
7777
details = CourseDetails.fetch(self.course.id)
78-
pre_1900 = datetime.datetime(1564, 4, 23, 1, 1, 1, tzinfo=UTC)
78+
pre_1900 = datetime.datetime(1564, 4, 23, 1, 1, 1, tzinfo=ZoneInfo("UTC"))
7979
details.enrollment_start = pre_1900
8080
dumped_jsondetails = json.dumps(details, cls=CourseSettingsEncoder)
8181
loaded_jsondetails = json.loads(dumped_jsondetails)
@@ -88,7 +88,7 @@ def test_ooc_encoder(self):
8888
details = {
8989
'number': 1,
9090
'string': 'string',
91-
'datetime': datetime.datetime.now(UTC)
91+
'datetime': datetime.datetime.now(ZoneInfo("UTC"))
9292
}
9393
jsondetails = json.dumps(details, cls=CourseSettingsEncoder)
9494
jsondetails = json.loads(jsondetails)
@@ -116,7 +116,6 @@ def setUp(self):
116116

117117
@override_settings(FEATURES={'DISABLE_MOBILE_COURSE_AVAILABLE': True})
118118
def test_mobile_field_available(self):
119-
120119
"""
121120
Test to check `Mobile Course Available` field is not viewable in Studio
122121
when DISABLE_MOBILE_COURSE_AVAILABLE is true.
@@ -235,12 +234,13 @@ def test_update_and_fetch(self):
235234
resp = self.client.get_json(url)
236235
self.compare_details_with_encoding(json.loads(resp.content.decode('utf-8')), details.__dict__, "virgin get")
237236

238-
self.alter_field(url, details, 'start_date', datetime.datetime(2012, 11, 12, 1, 30, tzinfo=UTC))
239-
self.alter_field(url, details, 'start_date', datetime.datetime(2012, 11, 1, 13, 30, tzinfo=UTC))
240-
self.alter_field(url, details, 'end_date', datetime.datetime(2013, 2, 12, 1, 30, tzinfo=UTC))
241-
self.alter_field(url, details, 'enrollment_start', datetime.datetime(2012, 10, 12, 1, 30, tzinfo=UTC))
237+
self.alter_field(url, details, 'start_date', datetime.datetime(2012, 11, 12, 1, 30, tzinfo=ZoneInfo("UTC")))
238+
self.alter_field(url, details, 'start_date', datetime.datetime(2012, 11, 1, 13, 30, tzinfo=ZoneInfo("UTC")))
239+
self.alter_field(url, details, 'end_date', datetime.datetime(2013, 2, 12, 1, 30, tzinfo=ZoneInfo("UTC")))
240+
self.alter_field(url, details, 'enrollment_start', datetime.datetime(
241+
2012, 10, 12, 1, 30, tzinfo=ZoneInfo("UTC")))
242242

243-
self.alter_field(url, details, 'enrollment_end', datetime.datetime(2012, 11, 15, 1, 30, tzinfo=UTC))
243+
self.alter_field(url, details, 'enrollment_end', datetime.datetime(2012, 11, 15, 1, 30, tzinfo=ZoneInfo("UTC")))
244244
self.alter_field(url, details, 'short_description', "Short Description")
245245
self.alter_field(url, details, 'about_sidebar_html', "About Sidebar HTML")
246246
self.alter_field(url, details, 'overview', "Overview")
@@ -1470,7 +1470,7 @@ def test_validate_update_does_not_allow_proctoring_provider_changes_after_course
14701470
Only admin users may update the provider if the course has started.
14711471
"""
14721472
field_name = "proctoring_provider"
1473-
course = CourseFactory.create(start=datetime.datetime.now(UTC) - datetime.timedelta(days=1))
1473+
course = CourseFactory.create(start=datetime.datetime.now(ZoneInfo("UTC")) - datetime.timedelta(days=1))
14741474
user = UserFactory.create(is_staff=staff_user)
14751475

14761476
did_validate, errors, test_model = CourseMetadata.validate_and_update_from_json(

0 commit comments

Comments
 (0)