diff --git a/cms/djangoapps/contentstore/tests/test_clone_course.py b/cms/djangoapps/contentstore/tests/test_clone_course.py
index 120944d63a8973e572d2eb2d4b010e4a8e2a9b8a..34b3ae705358c3b5de9349f23467ad40b5252e84 100644
--- a/cms/djangoapps/contentstore/tests/test_clone_course.py
+++ b/cms/djangoapps/contentstore/tests/test_clone_course.py
@@ -4,10 +4,9 @@ Unit tests for cloning a course between the same and different module stores.
 
 
 import json
+from unittest.mock import Mock, patch
 
-import six
 from django.conf import settings
-from mock import Mock, patch
 from opaque_keys.edx.locator import CourseLocator
 
 from cms.djangoapps.contentstore.tasks import rerun_course
@@ -58,7 +57,7 @@ class CloneCourseTest(CourseTestCase):
         course_run = '2015_Q1'
         display_name = 'rerun'
         fields = {'display_name': display_name}
-        course_assets = set([u'subs_Introduction%20To%20New.srt.sjson'], )
+        course_assets = {'subs_Introduction%20To%20New.srt.sjson'}
 
         # Create a course using split modulestore
         course = CourseFactory.create(
@@ -79,14 +78,14 @@ class CloneCourseTest(CourseTestCase):
         # Get & verify all assets of the course
         assets, count = contentstore().get_all_content_for_course(course.id)
         self.assertEqual(count, 1)
-        self.assertEqual(set([asset['asset_key'].block_id for asset in assets]), course_assets)  # lint-amnesty, pylint: disable=consider-using-set-comprehension
+        self.assertEqual({asset['asset_key'].block_id for asset in assets}, course_assets)  # lint-amnesty, pylint: disable=consider-using-set-comprehension
 
         # rerun from split into split
         split_rerun_id = CourseLocator(org=org, course=course_number, run="2012_Q2")
         CourseRerunState.objects.initiated(course.id, split_rerun_id, self.user, fields['display_name'])
         result = rerun_course.delay(
-            six.text_type(course.id),
-            six.text_type(split_rerun_id),
+            str(course.id),
+            str(split_rerun_id),
             self.user.id,
             json.dumps(fields, cls=EdxJSONEncoder)
         )
@@ -109,7 +108,7 @@ class CloneCourseTest(CourseTestCase):
         # Mark the action as initiated
         fields = {'display_name': 'rerun'}
         CourseRerunState.objects.initiated(mongo_course1_id, split_course3_id, self.user, fields['display_name'])
-        result = rerun_course.delay(six.text_type(mongo_course1_id), six.text_type(split_course3_id), self.user.id,
+        result = rerun_course.delay(str(mongo_course1_id), str(split_course3_id), self.user.id,
                                     json.dumps(fields, cls=EdxJSONEncoder))
         self.assertEqual(result.get(), "succeeded")
         self.assertTrue(has_course_author_access(self.user, split_course3_id), "Didn't grant access")
@@ -117,7 +116,7 @@ class CloneCourseTest(CourseTestCase):
         self.assertEqual(rerun_state.state, CourseRerunUIStateManager.State.SUCCEEDED)
 
         # try creating rerunning again to same name and ensure it generates error
-        result = rerun_course.delay(six.text_type(mongo_course1_id), six.text_type(split_course3_id), self.user.id)
+        result = rerun_course.delay(str(mongo_course1_id), str(split_course3_id), self.user.id)
         self.assertEqual(result.get(), "duplicate course")
         # the below will raise an exception if the record doesn't exist
         CourseRerunState.objects.find_first(
@@ -130,7 +129,7 @@ class CloneCourseTest(CourseTestCase):
             split_course4_id = CourseLocator(org="edx3", course="split3", run="rerun_fail")
             fields = {'display_name': 'total failure'}
             CourseRerunState.objects.initiated(split_course3_id, split_course4_id, self.user, fields['display_name'])
-            result = rerun_course.delay(six.text_type(split_course3_id), six.text_type(split_course4_id), self.user.id,
+            result = rerun_course.delay(str(split_course3_id), str(split_course4_id), self.user.id,
                                         json.dumps(fields, cls=EdxJSONEncoder))
             self.assertIn("exception: ", result.get())
             self.assertIsNone(self.store.get_course(split_course4_id), "Didn't delete course after error")
diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py
index 6be1cd8d641cf74ec31c07a816a84e20c5caffcf..dbdb978a8baadda55e30a7a5f067ce5ff9d617a0 100644
--- a/cms/djangoapps/contentstore/tests/test_contentstore.py
+++ b/cms/djangoapps/contentstore/tests/test_contentstore.py
@@ -7,13 +7,11 @@ from datetime import timedelta
 from functools import wraps
 from json import loads
 from textwrap import dedent
-from unittest import SkipTest
+from unittest import SkipTest, mock
 from uuid import uuid4
 
 import ddt
 import lxml.html
-import mock
-import six
 from django.conf import settings
 from django.contrib.auth.models import User  # lint-amnesty, pylint: disable=imported-auth-user
 from django.middleware.csrf import _compare_salted_tokens  # lint-amnesty, pylint: disable=unused-import
@@ -26,8 +24,6 @@ from opaque_keys import InvalidKeyError
 from opaque_keys.edx.keys import AssetKey, CourseKey, UsageKey
 from opaque_keys.edx.locations import CourseLocator
 from path import Path as path
-from six import text_type
-from six.moves import range
 from waffle.testutils import override_switch
 
 from cms.djangoapps.contentstore.config import waffle
@@ -36,11 +32,11 @@ from cms.djangoapps.contentstore.utils import delete_course, reverse_course_url,
 from cms.djangoapps.contentstore.views.component import ADVANCED_COMPONENT_TYPES
 from common.djangoapps.course_action_state.managers import CourseActionStateItemNotFoundError
 from common.djangoapps.course_action_state.models import CourseRerunState, CourseRerunUIStateManager
-from openedx.core.djangoapps.django_comment_common.utils import are_permissions_roles_seeded
-from openedx.core.lib.tempdir import mkdtemp_clean
 from common.djangoapps.student import auth
 from common.djangoapps.student.models import CourseEnrollment
 from common.djangoapps.student.roles import CourseCreatorRole, CourseInstructorRole
+from openedx.core.djangoapps.django_comment_common.utils import are_permissions_roles_seeded
+from openedx.core.lib.tempdir import mkdtemp_clean
 from xmodule.capa_module import ProblemBlock
 from xmodule.contentstore.content import StaticContent
 from xmodule.contentstore.django import contentstore
@@ -124,7 +120,7 @@ class ImportRequiredTestCases(ContentStoreTestCase):
         Asset name in XML: "/invalid\\displayname/subs-esLhHcdKGWvKs.srt"
         """
         content_store = contentstore()
-        expected_displayname = u'_invalid_displayname_subs-esLhHcdKGWvKs.srt'
+        expected_displayname = '_invalid_displayname_subs-esLhHcdKGWvKs.srt'
 
         import_course_from_xml(
             self.store,
@@ -162,11 +158,11 @@ class ImportRequiredTestCases(ContentStoreTestCase):
 
         # Test course export does not fail
         root_dir = path(mkdtemp_clean())
-        print(u'Exporting to tempdir = {0}'.format(root_dir))
-        export_course_to_xml(self.store, content_store, course.id, root_dir, u'test_export')
+        print(f'Exporting to tempdir = {root_dir}')
+        export_course_to_xml(self.store, content_store, course.id, root_dir, 'test_export')
 
-        filesystem = OSFS(text_type(root_dir / 'test_export/static'))
-        exported_static_files = filesystem.listdir(u'/')
+        filesystem = OSFS(str(root_dir / 'test_export/static'))
+        exported_static_files = filesystem.listdir('/')
 
         # Verify that asset have been overwritten during export.
         self.assertEqual(len(exported_static_files), 1)
@@ -243,38 +239,38 @@ class ImportRequiredTestCases(ContentStoreTestCase):
         self.assertIsNotNone(course_updates)
 
         # check that course which is imported has files 'updates.html' and 'updates.items.json'
-        filesystem = OSFS(text_type(data_dir + '/course_info_updates/info'))
-        self.assertTrue(filesystem.exists(u'updates.html'))
-        self.assertTrue(filesystem.exists(u'updates.items.json'))
+        filesystem = OSFS(str(data_dir + '/course_info_updates/info'))
+        self.assertTrue(filesystem.exists('updates.html'))
+        self.assertTrue(filesystem.exists('updates.items.json'))
 
         # verify that course info update module has same data content as in data file from which it is imported
         # check 'data' field content
-        with filesystem.open(u'updates.html', 'r') as course_policy:
+        with filesystem.open('updates.html', 'r') as course_policy:
             on_disk = course_policy.read()
             self.assertEqual(course_updates.data, on_disk)
 
         # check 'items' field content
-        with filesystem.open(u'updates.items.json', 'r') as course_policy:
+        with filesystem.open('updates.items.json', 'r') as course_policy:
             on_disk = loads(course_policy.read())
             self.assertEqual(course_updates.items, on_disk)
 
         # now export the course to a tempdir and test that it contains files 'updates.html' and 'updates.items.json'
         # with same content as in course 'info' directory
         root_dir = path(mkdtemp_clean())
-        print(u'Exporting to tempdir = {0}'.format(root_dir))
-        export_course_to_xml(self.store, content_store, course.id, root_dir, u'test_export')
+        print(f'Exporting to tempdir = {root_dir}')
+        export_course_to_xml(self.store, content_store, course.id, root_dir, 'test_export')
 
         # check that exported course has files 'updates.html' and 'updates.items.json'
-        filesystem = OSFS(text_type(root_dir / 'test_export/info'))
-        self.assertTrue(filesystem.exists(u'updates.html'))
-        self.assertTrue(filesystem.exists(u'updates.items.json'))
+        filesystem = OSFS(str(root_dir / 'test_export/info'))
+        self.assertTrue(filesystem.exists('updates.html'))
+        self.assertTrue(filesystem.exists('updates.items.json'))
 
         # verify that exported course has same data content as in course_info_update module
-        with filesystem.open(u'updates.html', 'r') as grading_policy:
+        with filesystem.open('updates.html', 'r') as grading_policy:
             on_disk = grading_policy.read()
             self.assertEqual(on_disk, course_updates.data)
 
-        with filesystem.open(u'updates.items.json', 'r') as grading_policy:
+        with filesystem.open('updates.items.json', 'r') as grading_policy:
             on_disk = loads(grading_policy.read())
             self.assertEqual(on_disk, course_updates.items)
 
@@ -319,42 +315,42 @@ class ImportRequiredTestCases(ContentStoreTestCase):
         course_id = self.import_and_populate_course()
 
         root_dir = path(mkdtemp_clean())
-        print(u'Exporting to tempdir = {0}'.format(root_dir))
+        print(f'Exporting to tempdir = {root_dir}')
 
         # export out to a tempdir
-        export_course_to_xml(self.store, content_store, course_id, root_dir, u'test_export')
+        export_course_to_xml(self.store, content_store, course_id, root_dir, 'test_export')
 
         # check for static tabs
-        self.verify_content_existence(self.store, root_dir, course_id, u'tabs', 'static_tab', '.html')
+        self.verify_content_existence(self.store, root_dir, course_id, 'tabs', 'static_tab', '.html')
 
         # check for about content
-        self.verify_content_existence(self.store, root_dir, course_id, u'about', 'about', '.html')
+        self.verify_content_existence(self.store, root_dir, course_id, 'about', 'about', '.html')
 
         # assert that there is an html and video directory in drafts:
         draft_dir = OSFS(root_dir / 'test_export/drafts')
-        self.assertTrue(draft_dir.exists(u'html'))
-        self.assertTrue(draft_dir.exists(u'video'))
+        self.assertTrue(draft_dir.exists('html'))
+        self.assertTrue(draft_dir.exists('video'))
         # and assert that they contain the created modules
-        self.assertIn(self.DRAFT_HTML + ".xml", draft_dir.listdir(u'html'))
-        self.assertIn(self.DRAFT_VIDEO + ".xml", draft_dir.listdir(u'video'))
+        self.assertIn(self.DRAFT_HTML + ".xml", draft_dir.listdir('html'))
+        self.assertIn(self.DRAFT_VIDEO + ".xml", draft_dir.listdir('video'))
         # and assert the child of the orphaned draft wasn't exported
-        self.assertNotIn(self.ORPHAN_DRAFT_HTML + ".xml", draft_dir.listdir(u'html'))
+        self.assertNotIn(self.ORPHAN_DRAFT_HTML + ".xml", draft_dir.listdir('html'))
 
         # check for grading_policy.json
         filesystem = OSFS(root_dir / 'test_export/policies/2012_Fall')
-        self.assertTrue(filesystem.exists(u'grading_policy.json'))
+        self.assertTrue(filesystem.exists('grading_policy.json'))
 
         course = self.store.get_course(course_id)
         # compare what's on disk compared to what we have in our course
-        with filesystem.open(u'grading_policy.json', 'r') as grading_policy:
+        with filesystem.open('grading_policy.json', 'r') as grading_policy:
             on_disk = loads(grading_policy.read())
             self.assertEqual(on_disk, course.grading_policy)
 
         # check for policy.json
-        self.assertTrue(filesystem.exists(u'policy.json'))
+        self.assertTrue(filesystem.exists('policy.json'))
 
         # compare what's on disk to what we have in the course module
-        with filesystem.open(u'policy.json', 'r') as course_policy:
+        with filesystem.open('policy.json', 'r') as course_policy:
             on_disk = loads(course_policy.read())
             self.assertIn('course/2012_Fall', on_disk)
             self.assertEqual(on_disk['course/2012_Fall'], own_metadata(course))
@@ -421,10 +417,10 @@ class ImportRequiredTestCases(ContentStoreTestCase):
 
         root_dir = path(mkdtemp_clean())
 
-        print(u'Exporting to tempdir = {0}'.format(root_dir))
+        print(f'Exporting to tempdir = {root_dir}')
 
         # export out to a tempdir
-        export_course_to_xml(self.store, content_store, course_id, root_dir, u'test_export')
+        export_course_to_xml(self.store, content_store, course_id, root_dir, 'test_export')
 
         shutil.rmtree(root_dir)
 
@@ -447,10 +443,10 @@ class ImportRequiredTestCases(ContentStoreTestCase):
 
         root_dir = path(mkdtemp_clean())
 
-        print(u'Exporting to tempdir = {0}'.format(root_dir))
+        print(f'Exporting to tempdir = {root_dir}')
 
         # export out to a tempdir
-        export_course_to_xml(self.store, content_store, course_id, root_dir, u'test_export')
+        export_course_to_xml(self.store, content_store, course_id, root_dir, 'test_export')
 
         shutil.rmtree(root_dir)
 
@@ -503,7 +499,7 @@ class ImportRequiredTestCases(ContentStoreTestCase):
 
         # Export the course
         root_dir = path(mkdtemp_clean())
-        export_course_to_xml(self.store, content_store, course_id, root_dir, u'test_roundtrip')
+        export_course_to_xml(self.store, content_store, course_id, root_dir, 'test_roundtrip')
 
         # Reimport and get the video back
         import_course_from_xml(self.store, self.user.id, root_dir)
@@ -524,7 +520,7 @@ class ImportRequiredTestCases(ContentStoreTestCase):
 
         # Export the course
         root_dir = path(mkdtemp_clean())
-        export_course_to_xml(self.store, content_store, course_id, root_dir, u'test_roundtrip')
+        export_course_to_xml(self.store, content_store, course_id, root_dir, 'test_roundtrip')
 
         # Reimport and get the video back
         import_course_from_xml(self.store, self.user.id, root_dir, create_if_not_present=True)
@@ -547,8 +543,8 @@ class ImportRequiredTestCases(ContentStoreTestCase):
 
         root_dir = path(mkdtemp_clean())
 
-        print(u'Exporting to tempdir = {0}'.format(root_dir))
-        export_course_to_xml(self.store, None, course_id, root_dir, u'test_export_no_content_store')
+        print(f'Exporting to tempdir = {root_dir}')
+        export_course_to_xml(self.store, None, course_id, root_dir, 'test_export_no_content_store')
 
         # Delete the course from module store and reimport it
 
@@ -603,7 +599,7 @@ class ImportRequiredTestCases(ContentStoreTestCase):
             content_store,
             course_id,
             root_dir,
-            u'test_no_xml_attributes'
+            'test_no_xml_attributes'
         )
 
 
@@ -614,7 +610,7 @@ class MiscCourseTests(ContentStoreTestCase):
     """
 
     def setUp(self):
-        super(MiscCourseTests, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         # save locs not items b/c the items won't have the subsequently created children in them until refetched
         self.chapter_loc = self.store.create_child(
             self.user.id, self.course.location, 'chapter', 'test_chapter'
@@ -699,7 +695,7 @@ class MiscCourseTests(ContentStoreTestCase):
     def test_export_on_invalid_displayname(self, invalid_displayname):
         """ Tests that assets with invalid 'displayname' does not cause export to fail """
         content_store = contentstore()
-        exported_asset_name = u'_Fake_asset_displayname'
+        exported_asset_name = '_Fake_asset_displayname'
 
         # Create an asset with slash `invalid_displayname` '
         asset_key = self.course.id.make_asset_key('asset', "fake_asset.txt")
@@ -716,11 +712,11 @@ class MiscCourseTests(ContentStoreTestCase):
 
         # Now export the course to a tempdir and test that it contains assets. The export should pass
         root_dir = path(mkdtemp_clean())
-        print(u'Exporting to tempdir = {0}'.format(root_dir))
-        export_course_to_xml(self.store, content_store, self.course.id, root_dir, u'test_export')
+        print(f'Exporting to tempdir = {root_dir}')
+        export_course_to_xml(self.store, content_store, self.course.id, root_dir, 'test_export')
 
         filesystem = OSFS(root_dir / 'test_export/static')
-        exported_static_files = filesystem.listdir(u'/')
+        exported_static_files = filesystem.listdir('/')
 
         # Verify that only single asset has been exported with the expected asset name.
         self.assertTrue(filesystem.exists(exported_asset_name))
@@ -741,13 +737,13 @@ class MiscCourseTests(ContentStoreTestCase):
         # Make an existing unit a draft
         self.store.convert_to_draft(self.problem.location, self.user.id)
         root_dir = path(mkdtemp_clean())
-        export_course_to_xml(self.store, None, self.course.id, root_dir, u'test_export')
+        export_course_to_xml(self.store, None, self.course.id, root_dir, 'test_export')
 
         # Verify that problem is exported in the drafts. This is expected because we are
         # mocking get_item to for drafts. Expect no draft is exported.
         # Specifically get_item is used in `xmodule.modulestore.xml_exporter._export_drafts`
         export_draft_dir = OSFS(root_dir / 'test_export/drafts')
-        self.assertEqual(len(export_draft_dir.listdir(u'/')), 0)
+        self.assertEqual(len(export_draft_dir.listdir('/')), 0)
 
         # Remove tempdir
         shutil.rmtree(root_dir)
@@ -755,11 +751,11 @@ class MiscCourseTests(ContentStoreTestCase):
     def test_assets_overwrite(self):
         """ Tests that assets will similar 'displayname' will be overwritten during export """
         content_store = contentstore()
-        asset_displayname = u'Fake_asset.txt'
+        asset_displayname = 'Fake_asset.txt'
 
         # Create two assets with similar 'displayname'
         for i in range(2):
-            asset_path = 'sample_asset_{}.txt'.format(i)
+            asset_path = f'sample_asset_{i}.txt'
             asset_key = self.course.id.make_asset_key('asset', asset_path)
             content = StaticContent(
                 asset_key, asset_displayname, 'application/text', b'test',
@@ -776,12 +772,12 @@ class MiscCourseTests(ContentStoreTestCase):
 
         # Now export the course to a tempdir and test that it contains assets.
         root_dir = path(mkdtemp_clean())
-        print(u'Exporting to tempdir = {0}'.format(root_dir))
-        export_course_to_xml(self.store, content_store, self.course.id, root_dir, u'test_export')
+        print(f'Exporting to tempdir = {root_dir}')
+        export_course_to_xml(self.store, content_store, self.course.id, root_dir, 'test_export')
 
         # Verify that asset have been overwritten during export.
         filesystem = OSFS(root_dir / 'test_export/static')
-        exported_static_files = filesystem.listdir(u'/')
+        exported_static_files = filesystem.listdir('/')
         self.assertTrue(filesystem.exists(asset_displayname))
         self.assertEqual(len(exported_static_files), 1)
 
@@ -938,7 +934,7 @@ class MiscCourseTests(ContentStoreTestCase):
         """
         Tests the ajax callback to render an XModule
         """
-        with override_settings(COURSES_WITH_UNSAFE_CODE=[text_type(self.course.id)]):
+        with override_settings(COURSES_WITH_UNSAFE_CODE=[str(self.course.id)]):
             # also try a custom response which will trigger the 'is this course in whitelist' logic
             resp = self.client.get_json(
                 get_url('xblock_view_handler', self.vert_loc, kwargs={'view_name': 'container_preview'})
@@ -947,7 +943,7 @@ class MiscCourseTests(ContentStoreTestCase):
 
             vertical = self.store.get_item(self.vert_loc)
             for child in vertical.children:
-                self.assertContains(resp, text_type(child))
+                self.assertContains(resp, str(child))
 
     def test_delete(self):
         # make sure the parent points to the child object which is to be deleted
@@ -980,7 +976,7 @@ class MiscCourseTests(ContentStoreTestCase):
         self.assertIsNotNone(content)
 
         # let's restore the asset
-        restore_asset_from_trashcan(text_type(asset_key))
+        restore_asset_from_trashcan(str(asset_key))
 
         # now try to find it in courseware store, and they should be back after restore
         content = contentstore('trashcan').find(asset_key, throw_on_not_found=False)
@@ -1004,7 +1000,7 @@ class MiscCourseTests(ContentStoreTestCase):
         url = reverse_course_url(
             'assets_handler',
             self.course.id,
-            kwargs={'asset_key_string': text_type(asset_key)}
+            kwargs={'asset_key_string': str(asset_key)}
         )
         resp = self.client.delete(url)
         self.assertEqual(resp.status_code, 204)
@@ -1061,7 +1057,7 @@ class MiscCourseTests(ContentStoreTestCase):
             self.assertEqual(resp.status_code, 404)
 
     @override_switch(
-        '{}.{}'.format(waffle.WAFFLE_NAMESPACE, waffle.ENABLE_ACCESSIBILITY_POLICY_PAGE),
+        f'{waffle.WAFFLE_NAMESPACE}.{waffle.ENABLE_ACCESSIBILITY_POLICY_PAGE}',
         active=False)
     def test_disabled_accessibility_page(self):
         """
@@ -1118,7 +1114,7 @@ class MiscCourseTests(ContentStoreTestCase):
         # check that /static/ has been converted to the full path
         # note, we know the link it should be because that's what in the 'toy' course in the test data
         asset_key = self.course.id.make_asset_key('asset', 'handouts_sample_handout.txt')
-        self.assertContains(resp, text_type(asset_key))
+        self.assertContains(resp, str(asset_key))
 
     def test_prefetch_children(self):
         # make sure we haven't done too many round trips to DB:
@@ -1161,7 +1157,7 @@ class ContentStoreTest(ContentStoreTestCase):
                               "Please change either organization or course number to be unique.")
 
     def setUp(self):
-        super(ContentStoreTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.course_data = {
             'org': 'MITx',
@@ -1177,7 +1173,7 @@ class ContentStoreTest(ContentStoreTestCase):
         test_course_data = {}
         test_course_data.update(self.course_data)
         if number_suffix:
-            test_course_data['number'] = '{0}_{1}'.format(test_course_data['number'], number_suffix)
+            test_course_data['number'] = '{}_{}'.format(test_course_data['number'], number_suffix)
         course_key = _get_course_id(self.store, test_course_data)
         _create_course(self, course_key, test_course_data)
         # Verify that the creator is now registered in the course.
@@ -1451,13 +1447,13 @@ class ContentStoreTest(ContentStoreTestCase):
         """
         with mock.patch.dict('django.conf.settings.FEATURES', {'ALLOW_UNICODE_COURSE_ID': False}):
             error_message = "Special characters not allowed in organization, course number, and course run."
-            self.course_data['org'] = u'��������������'
+            self.course_data['org'] = '��������������'
             self.assert_create_course_failed(error_message)
 
-            self.course_data['number'] = u'��chantillon'
+            self.course_data['number'] = '��chantillon'
             self.assert_create_course_failed(error_message)
 
-            self.course_data['run'] = u'����������'
+            self.course_data['run'] = '����������'
             self.assert_create_course_failed(error_message)
 
     def assert_course_permission_denied(self):
@@ -1472,7 +1468,7 @@ class ContentStoreTest(ContentStoreTestCase):
         resp = self.client.get_html('/home/')
         self.assertContains(
             resp,
-            u'<h1 class="page-header">{} Home</h1>'.format(settings.STUDIO_SHORT_NAME),
+            f'<h1 class="page-header">{settings.STUDIO_SHORT_NAME} Home</h1>',
             status_code=200,
             html=True
         )
@@ -1495,8 +1491,8 @@ class ContentStoreTest(ContentStoreTestCase):
         self.assertContains(
             resp,
             '<article class="outline outline-complex outline-course" data-locator="{locator}" data-course-key="{course_key}">'.format(  # lint-amnesty, pylint: disable=line-too-long
-                locator=text_type(course.location),
-                course_key=text_type(course.id),
+                locator=str(course.location),
+                course_key=str(course.id),
             ),
             status_code=200,
             html=True
@@ -1507,7 +1503,7 @@ class ContentStoreTest(ContentStoreTestCase):
         course = CourseFactory.create()
 
         section_data = {
-            'parent_locator': text_type(course.location),
+            'parent_locator': str(course.location),
             'category': 'chapter',
             'display_name': 'Section One',
         }
@@ -1516,7 +1512,7 @@ class ContentStoreTest(ContentStoreTestCase):
 
         self.assertEqual(resp.status_code, 200)
         data = parse_json(resp)
-        retarget = text_type(course.id.make_usage_key('chapter', 'REPLACE')).replace('REPLACE', r'([0-9]|[a-f]){3,}')
+        retarget = str(course.id.make_usage_key('chapter', 'REPLACE')).replace('REPLACE', r'([0-9]|[a-f]){3,}')
         self.assertRegex(data['locator'], retarget)
 
     def test_capa_module(self):
@@ -1524,7 +1520,7 @@ class ContentStoreTest(ContentStoreTestCase):
         course = CourseFactory.create()
 
         problem_data = {
-            'parent_locator': text_type(course.location),
+            'parent_locator': str(course.location),
             'category': 'problem'
         }
 
@@ -1806,7 +1802,7 @@ class MetadataSaveTestCase(ContentStoreTestCase):
     """Test that metadata is correctly cached and decached."""
 
     def setUp(self):
-        super(MetadataSaveTestCase, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         course = CourseFactory.create()
 
@@ -1866,7 +1862,7 @@ class RerunCourseTest(ContentStoreTestCase):
     """
 
     def setUp(self):
-        super(RerunCourseTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.destination_course_data = {
             'org': 'MITx',
             'number': '111',
@@ -1880,7 +1876,7 @@ class RerunCourseTest(ContentStoreTestCase):
         """Create and send an ajax post for the rerun request"""
 
         # create data to post
-        rerun_course_data = {'source_course_key': text_type(source_course_key)}
+        rerun_course_data = {'source_course_key': str(source_course_key)}
         if not destination_course_data:
             destination_course_data = self.destination_course_data
         rerun_course_data.update(destination_course_data)
@@ -1900,7 +1896,7 @@ class RerunCourseTest(ContentStoreTestCase):
 
     def get_unsucceeded_course_action_elements(self, html, course_key):
         """Returns the elements in the unsucceeded course action section that have the given course_key"""
-        return html.cssselect(u'.courses-processing li[data-course-key="{}"]'.format(text_type(course_key)))
+        return html.cssselect('.courses-processing li[data-course-key="{}"]'.format(str(course_key)))
 
     def assertInCourseListing(self, course_key):
         """
@@ -1928,7 +1924,7 @@ class RerunCourseTest(ContentStoreTestCase):
             'course_key': destination_course_key,
             'should_display': True,
         }
-        for field_name, expected_value in six.iteritems(expected_states):
+        for field_name, expected_value in expected_states.items():
             self.assertEqual(getattr(rerun_state, field_name), expected_value)
 
         # Verify that the creator is now enrolled in the course.
@@ -1945,7 +1941,7 @@ class RerunCourseTest(ContentStoreTestCase):
         source_course = CourseFactory.create()
         destination_course_key = self.post_rerun_request(source_course.id)
         self.verify_rerun_course(source_course.id, destination_course_key, self.destination_course_data['display_name'])
-        videos, __ = get_videos_for_course(text_type(destination_course_key))
+        videos, __ = get_videos_for_course(str(destination_course_key))
         videos = list(videos)
         self.assertEqual(0, len(videos))
         self.assertInCourseListing(destination_course_key)
@@ -1972,7 +1968,7 @@ class RerunCourseTest(ContentStoreTestCase):
         create_video(
             dict(
                 edx_video_id="tree-hugger",
-                courses=[text_type(source_course.id)],
+                courses=[str(source_course.id)],
                 status='test',
                 duration=2,
                 encoded_videos=[]
@@ -1982,9 +1978,9 @@ class RerunCourseTest(ContentStoreTestCase):
         self.verify_rerun_course(source_course.id, destination_course_key, self.destination_course_data['display_name'])
 
         # Verify that the VAL copies videos to the rerun
-        videos, __ = get_videos_for_course(text_type(source_course.id))
+        videos, __ = get_videos_for_course(str(source_course.id))
         source_videos = list(videos)
-        videos, __ = get_videos_for_course(text_type(destination_course_key))
+        videos, __ = get_videos_for_course(str(destination_course_key))
         target_videos = list(videos)
         self.assertEqual(1, len(source_videos))
         self.assertEqual(source_videos, target_videos)
@@ -2101,7 +2097,7 @@ class RerunCourseTest(ContentStoreTestCase):
             'run': '2013'
         }
 
-        source_wiki_slug = '{0}.{1}.{2}'.format(course_data['org'], course_data['number'], course_data['run'])
+        source_wiki_slug = '{}.{}.{}'.format(course_data['org'], course_data['number'], course_data['run'])
 
         source_course_key = _get_course_id(self.store, course_data)
         _create_course(self, source_course_key, course_data)
@@ -2119,7 +2115,7 @@ class RerunCourseTest(ContentStoreTestCase):
         self.verify_rerun_course(source_course.id, destination_course_key, destination_course_data['display_name'])
         destination_course = self.store.get_course(destination_course_key)
 
-        destination_wiki_slug = '{0}.{1}.{2}'.format(
+        destination_wiki_slug = '{}.{}.{}'.format(
             destination_course.id.org, destination_course.id.course, destination_course.id.run
         )
 
@@ -2137,8 +2133,8 @@ class ContentLicenseTest(ContentStoreTestCase):
         root_dir = path(mkdtemp_clean())
         self.course.license = "creative-commons: BY SA"
         self.store.update_item(self.course, None)
-        export_course_to_xml(self.store, content_store, self.course.id, root_dir, u'test_license')
-        fname = "{block}.xml".format(block=self.course.scope_ids.usage_id.block_id)
+        export_course_to_xml(self.store, content_store, self.course.id, root_dir, 'test_license')
+        fname = f"{self.course.scope_ids.usage_id.block_id}.xml"
         run_file_path = root_dir / "test_license" / "course" / fname
         with run_file_path.open() as f:
             run_xml = etree.parse(f)
@@ -2151,8 +2147,8 @@ class ContentLicenseTest(ContentStoreTestCase):
             parent_location=self.course.location, category='video',
             license="all-rights-reserved"
         )
-        export_course_to_xml(self.store, content_store, self.course.id, root_dir, u'test_license')
-        fname = "{block}.xml".format(block=video_descriptor.scope_ids.usage_id.block_id)
+        export_course_to_xml(self.store, content_store, self.course.id, root_dir, 'test_license')
+        fname = f"{video_descriptor.scope_ids.usage_id.block_id}.xml"
         video_file_path = root_dir / "test_license" / "video" / fname
         with video_file_path.open() as f:
             video_xml = etree.parse(f)
@@ -2174,7 +2170,7 @@ class EntryPageTestCase(TestCase):
     """
 
     def setUp(self):
-        super(EntryPageTestCase, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.client = AjaxEnabledTestClient()
 
     def _test_page(self, page, status_code=200):
@@ -2197,7 +2193,7 @@ class EntryPageTestCase(TestCase):
         self._test_page("/logout", 200)
 
     @override_switch(
-        '{}.{}'.format(waffle.WAFFLE_NAMESPACE, waffle.ENABLE_ACCESSIBILITY_POLICY_PAGE),
+        f'{waffle.WAFFLE_NAMESPACE}.{waffle.ENABLE_ACCESSIBILITY_POLICY_PAGE}',
         active=True)
     def test_accessibility(self):
         self._test_page('/accessibility')
diff --git a/cms/djangoapps/contentstore/tests/test_core_caching.py b/cms/djangoapps/contentstore/tests/test_core_caching.py
index a66782006c95ec1940fe1b95b263f017c55b6b38..e6b23c2deeed836b64ccb83b077139b2e93365e8 100644
--- a/cms/djangoapps/contentstore/tests/test_core_caching.py
+++ b/cms/djangoapps/contentstore/tests/test_core_caching.py
@@ -9,7 +9,7 @@ from opaque_keys.edx.locator import AssetLocator, CourseLocator
 from openedx.core.djangoapps.contentserver.caching import del_cached_content, get_cached_content, set_cached_content
 
 
-class Content(object):
+class Content:
     """
     Mock cached content
     """
@@ -25,9 +25,9 @@ class CachingTestCase(TestCase):
     """
     Tests for https://edx.lighthouseapp.com/projects/102637/tickets/112-updating-asset-does-not-refresh-the-cached-copy
     """
-    unicodeLocation = AssetLocator(CourseLocator(u'c4x', u'mitX', u'800'), u'thumbnail', u'monsters.jpg')
+    unicodeLocation = AssetLocator(CourseLocator('c4x', 'mitX', '800'), 'thumbnail', 'monsters.jpg')
     # Note that some of the parts are strings instead of unicode strings
-    nonUnicodeLocation = AssetLocator(CourseLocator('c4x', u'mitX', u'800'), 'thumbnail', 'monsters.jpg')
+    nonUnicodeLocation = AssetLocator(CourseLocator('c4x', 'mitX', '800'), 'thumbnail', 'monsters.jpg')
     mockAsset = Content(unicodeLocation, 'my content')
 
     def test_put_and_get(self):
diff --git a/cms/djangoapps/contentstore/tests/test_course_create_rerun.py b/cms/djangoapps/contentstore/tests/test_course_create_rerun.py
index 4961e010cec323c0d43da5097eab4bd4740a5fde..70232c47e981faecbedbdf3c9eb3fb17302051a5 100644
--- a/cms/djangoapps/contentstore/tests/test_course_create_rerun.py
+++ b/cms/djangoapps/contentstore/tests/test_course_create_rerun.py
@@ -6,16 +6,11 @@ Test view handler for rerun (and eventually create)
 import datetime
 
 import ddt
-import six
 from django.test import override_settings
 from django.test.client import RequestFactory
 from django.urls import reverse
 from opaque_keys.edx.keys import CourseKey
-from organizations.api import (
-    add_organization,
-    get_organization_by_short_name,
-    get_course_organizations
-)
+from organizations.api import add_organization, get_course_organizations, get_organization_by_short_name
 from organizations.exceptions import InvalidOrganizationException
 
 from cms.djangoapps.contentstore.tests.utils import AjaxEnabledTestClient, parse_json
@@ -37,7 +32,7 @@ class TestCourseListing(ModuleStoreTestCase):
         """
         Add a user and a course
         """
-        super(TestCourseListing, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         # create and log in a staff user.
         # create and log in a non-staff user
         self.user = UserFactory()
@@ -81,7 +76,7 @@ class TestCourseListing(ModuleStoreTestCase):
             'description': 'Testing Organization Description',
         })
         response = self.client.ajax_post(self.course_create_rerun_url, {
-            'source_course_key': six.text_type(self.source_course_key),
+            'source_course_key': str(self.source_course_key),
             'org': self.source_course_key.org, 'course': self.source_course_key.course, 'run': 'copy',
             'display_name': 'not the same old name',
         })
@@ -160,7 +155,7 @@ class TestCourseListing(ModuleStoreTestCase):
             with self.assertRaises(InvalidOrganizationException):
                 get_organization_by_short_name("orgX")
             data = parse_json(response)
-            self.assertIn(u'Organization you selected does not exist in the system', data['error'])
+            self.assertIn('Organization you selected does not exist in the system', data['error'])
 
     @ddt.data(True, False)
     def test_course_creation_for_known_organization(self, organizations_autocreate):
diff --git a/cms/djangoapps/contentstore/tests/test_course_listing.py b/cms/djangoapps/contentstore/tests/test_course_listing.py
index 0502bf9201c53d86fd80f4f900cfc84c4e3527e1..acd2fbfd82fdb6ced80708d1e7a515910fc929d7 100644
--- a/cms/djangoapps/contentstore/tests/test_course_listing.py
+++ b/cms/djangoapps/contentstore/tests/test_course_listing.py
@@ -5,14 +5,13 @@ by reversing group name formats.
 
 
 import random
+from unittest.mock import Mock, patch
 
 import ddt
 from ccx_keys.locator import CCXLocator
 from django.conf import settings
 from django.test import RequestFactory
-from mock import Mock, patch
 from opaque_keys.edx.locations import CourseLocator
-from six.moves import range
 
 from cms.djangoapps.contentstore.tests.utils import AjaxEnabledTestClient
 from cms.djangoapps.contentstore.utils import delete_course
@@ -51,7 +50,7 @@ class TestCourseListing(ModuleStoreTestCase):
         """
         Add a user and a course
         """
-        super(TestCourseListing, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         # create and log in a staff user.
         # create and log in a non-staff user
         self.user = UserFactory()
@@ -91,7 +90,7 @@ class TestCourseListing(ModuleStoreTestCase):
         """
         Test on empty course listing, studio name is properly displayed
         """
-        message = u"Are you staff on an existing {studio_name} course?".format(studio_name=settings.STUDIO_SHORT_NAME)
+        message = f"Are you staff on an existing {settings.STUDIO_SHORT_NAME} course?"
         response = self.client.get('/home')
         self.assertContains(response, message)
 
@@ -256,9 +255,9 @@ class TestCourseListing(ModuleStoreTestCase):
         # create courses and assign those to the user which have their number in user_course_ids
         with self.store.default_store(store):
             for number in range(TOTAL_COURSES_COUNT):
-                org = 'Org{0}'.format(number)
-                course = 'Course{0}'.format(number)
-                run = 'Run{0}'.format(number)
+                org = f'Org{number}'
+                course = f'Course{number}'
+                run = f'Run{number}'
                 course_location = self.store.make_course_key(org, course, run)
                 if number in user_course_ids:
                     self._create_course_with_access_groups(course_location, self.user, store=store)
@@ -369,7 +368,7 @@ class TestCourseListing(ModuleStoreTestCase):
         # verify return values
         def _set_of_course_keys(course_list, key_attribute_name='id'):
             """Returns a python set of course keys by accessing the key with the given attribute name."""
-            return set(getattr(c, key_attribute_name) for c in course_list)
+            return {getattr(c, key_attribute_name) for c in course_list}
 
         found_courses, unsucceeded_course_actions = _accessible_courses_iter_for_tests(self.request)
         self.assertSetEqual(_set_of_course_keys(courses + courses_in_progress), _set_of_course_keys(found_courses))
diff --git a/cms/djangoapps/contentstore/tests/test_course_settings.py b/cms/djangoapps/contentstore/tests/test_course_settings.py
index 0d52d95d1a03bddf0a1aba0633c30a3e1b659622..6eb4f2aa76ecd94ea1dd424f3c4ed8d72c6c762d 100644
--- a/cms/djangoapps/contentstore/tests/test_course_settings.py
+++ b/cms/djangoapps/contentstore/tests/test_course_settings.py
@@ -7,10 +7,10 @@ import copy
 import datetime
 import json
 import unittest
+from unittest import mock
+from unittest.mock import Mock, patch
 
 import ddt
-import mock
-import six
 from crum import set_current_request
 from django.conf import settings
 from django.test import RequestFactory
@@ -18,7 +18,6 @@ from django.test.utils import override_settings
 from edx_toggles.toggles.testutils import override_waffle_flag
 from milestones.models import MilestoneRelationshipType
 from milestones.tests.utils import MilestonesTestCaseMixin
-from mock import Mock, patch
 from pytz import UTC
 
 from cms.djangoapps.contentstore.utils import reverse_course_url, reverse_usage_url
@@ -31,11 +30,11 @@ from cms.djangoapps.models.settings.course_metadata import CourseMetadata
 from cms.djangoapps.models.settings.encoder import CourseSettingsEncoder
 from cms.djangoapps.models.settings.waffle import MATERIAL_RECOMPUTE_ONLY_FLAG
 from common.djangoapps.course_modes.models import CourseMode
-from openedx.core.djangoapps.models.course_details import CourseDetails
 from common.djangoapps.student.roles import CourseInstructorRole, CourseStaffRole
 from common.djangoapps.student.tests.factories import UserFactory
 from common.djangoapps.util import milestones_helpers
 from common.djangoapps.xblock_django.models import XBlockStudioConfigurationFlag
+from openedx.core.djangoapps.models.course_details import CourseDetails
 from xmodule.fields import Date
 from xmodule.modulestore import ModuleStoreEnum
 from xmodule.modulestore.django import modulestore
@@ -100,7 +99,7 @@ class CourseAdvanceSettingViewTest(CourseTestCase, MilestonesTestCaseMixin):
     """
 
     def setUp(self):
-        super(CourseAdvanceSettingViewTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.fullcourse = CourseFactory.create()
         self.course_setting_url = get_url(self.course.id, 'advanced_settings_handler')
 
@@ -204,7 +203,7 @@ class CourseDetailsViewTest(CourseTestCase, MilestonesTestCaseMixin):
                 dt1 = date.from_json(encoded[field])
                 dt2 = details[field]
 
-                self.assertEqual(dt1, dt2, msg=u"{} != {} at {}".format(dt1, dt2, context))
+                self.assertEqual(dt1, dt2, msg=f"{dt1} != {dt2} at {context}")
             else:
                 self.fail(field + " missing from encoded but in details at " + context)
         elif field in encoded and encoded[field] is not None:
@@ -253,7 +252,7 @@ class CourseDetailsViewTest(CourseTestCase, MilestonesTestCaseMixin):
         # update pre requisite courses with a new course keys
         pre_requisite_course = CourseFactory.create(org='edX', course='900', run='test_run')
         pre_requisite_course2 = CourseFactory.create(org='edX', course='902', run='test_run')
-        pre_requisite_course_keys = [six.text_type(pre_requisite_course.id), six.text_type(pre_requisite_course2.id)]
+        pre_requisite_course_keys = [str(pre_requisite_course.id), str(pre_requisite_course2.id)]
         course_detail_json['pre_requisite_courses'] = pre_requisite_course_keys
         self.client.ajax_post(url, course_detail_json)
 
@@ -283,7 +282,7 @@ class CourseDetailsViewTest(CourseTestCase, MilestonesTestCaseMixin):
 
         # update pre requisite courses one valid and one invalid key
         pre_requisite_course = CourseFactory.create(org='edX', course='900', run='test_run')
-        pre_requisite_course_keys = [six.text_type(pre_requisite_course.id), 'invalid_key']
+        pre_requisite_course_keys = [str(pre_requisite_course.id), 'invalid_key']
         course_detail_json['pre_requisite_courses'] = pre_requisite_course_keys
         response = self.client.ajax_post(url, course_detail_json)
         self.assertEqual(400, response.status_code)
@@ -564,10 +563,10 @@ class CourseGradingTest(CourseTestCase):
             mock.call(
                 GRADING_POLICY_CHANGED_EVENT_TYPE,
                 {
-                    'course_id': six.text_type(self.course.id),
+                    'course_id': str(self.course.id),
                     'event_transaction_type': 'edx.grades.grading_policy_changed',
                     'grading_policy_hash': policy_hash,
-                    'user_id': six.text_type(self.user.id),
+                    'user_id': str(self.user.id),
                     'event_transaction_id': 'mockUUID',
                 }
             ) for policy_hash in (
@@ -687,8 +686,8 @@ class CourseGradingTest(CourseTestCase):
             mock.call(
                 GRADING_POLICY_CHANGED_EVENT_TYPE,
                 {
-                    'course_id': six.text_type(self.course.id),
-                    'user_id': six.text_type(self.user.id),
+                    'course_id': str(self.course.id),
+                    'user_id': str(self.user.id),
                     'grading_policy_hash': policy_hash,
                     'event_transaction_id': 'mockUUID',
                     'event_transaction_type': 'edx.grades.grading_policy_changed',
@@ -725,10 +724,10 @@ class CourseGradingTest(CourseTestCase):
             mock.call(
                 GRADING_POLICY_CHANGED_EVENT_TYPE,
                 {
-                    'course_id': six.text_type(self.course.id),
+                    'course_id': str(self.course.id),
                     'event_transaction_type': 'edx.grades.grading_policy_changed',
                     'grading_policy_hash': policy_hash,
-                    'user_id': six.text_type(self.user.id),
+                    'user_id': str(self.user.id),
                     'event_transaction_id': 'mockUUID',
                 }
             ) for policy_hash in (grading_policy_1, grading_policy_2, grading_policy_3)
@@ -802,10 +801,10 @@ class CourseGradingTest(CourseTestCase):
             mock.call(
                 GRADING_POLICY_CHANGED_EVENT_TYPE,
                 {
-                    'course_id': six.text_type(self.course.id),
+                    'course_id': str(self.course.id),
                     'event_transaction_type': 'edx.grades.grading_policy_changed',
                     'grading_policy_hash': policy_hash,
-                    'user_id': six.text_type(self.user.id),
+                    'user_id': str(self.user.id),
                     'event_transaction_id': 'mockUUID',
                 }
             ) for policy_hash in (grading_policy_1, grading_policy_2)
@@ -895,15 +894,15 @@ class CourseGradingTest(CourseTestCase):
         Test setting and getting section grades via the grade as url
         """
         grade_type_url = self.setup_test_set_get_section_grader_ajax()
-        response = self.client.ajax_post(grade_type_url, {'graderType': u'Homework'})
+        response = self.client.ajax_post(grade_type_url, {'graderType': 'Homework'})
         self.assertEqual(200, response.status_code)
         response = self.client.get_json(grade_type_url + '?fields=graderType')
-        self.assertEqual(json.loads(response.content.decode('utf-8')).get('graderType'), u'Homework')
+        self.assertEqual(json.loads(response.content.decode('utf-8')).get('graderType'), 'Homework')
         # and unset
-        response = self.client.ajax_post(grade_type_url, {'graderType': u'notgraded'})
+        response = self.client.ajax_post(grade_type_url, {'graderType': 'notgraded'})
         self.assertEqual(200, response.status_code)
         response = self.client.get_json(grade_type_url + '?fields=graderType')
-        self.assertEqual(json.loads(response.content.decode('utf-8')).get('graderType'), u'notgraded')
+        self.assertEqual(json.loads(response.content.decode('utf-8')).get('graderType'), 'notgraded')
 
     def _grading_policy_hash_for_course(self):
         return hash_grading_policy(modulestore().get_course(self.course.id).grading_policy)
@@ -916,7 +915,7 @@ class CourseMetadataEditingTest(CourseTestCase):
     """
 
     def setUp(self):
-        super(CourseMetadataEditingTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.fullcourse = CourseFactory.create()
         self.course_setting_url = get_url(self.course.id, 'advanced_settings_handler')
         self.fullcourse_setting_url = get_url(self.fullcourse.id, 'advanced_settings_handler')
@@ -1175,8 +1174,8 @@ class CourseMetadataEditingTest(CourseTestCase):
         self.assertEqual(len(errors), 3)
         self.assertFalse(test_model)
 
-        error_keys = set([error_obj['model']['display_name'] for error_obj in errors])  # lint-amnesty, pylint: disable=consider-using-set-comprehension
-        test_keys = set(['Advanced Module List', 'Course Advertised Start Date', 'Days Early for Beta Users'])
+        error_keys = {error_obj['model']['display_name'] for error_obj in errors}
+        test_keys = {'Advanced Module List', 'Course Advertised Start Date', 'Days Early for Beta Users'}
         self.assertEqual(error_keys, test_keys)
 
         # try fresh fetch to ensure no update happened
@@ -1527,7 +1526,7 @@ class CourseGraderUpdatesTest(CourseTestCase):
 
     def setUp(self):
         """Compute the url to use in tests"""
-        super(CourseGraderUpdatesTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.url = get_url(self.course.id, 'grading_handler')
         self.starting_graders = CourseGradingModel(self.course).graders
 
@@ -1625,9 +1624,9 @@ id=\"course-enrollment-end-time\" value=\"\" placeholder=\"HH:MM\" autocomplete=
         """
         Initialize course used to test enrollment fields.
         """
-        super(CourseEnrollmentEndFieldTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.course = CourseFactory.create(org='edX', number='dummy', display_name='Marketing Site Course')
-        self.course_details_url = reverse_course_url('settings_handler', six.text_type(self.course.id))
+        self.course_details_url = reverse_course_url('settings_handler', str(self.course.id))
 
     def _get_course_details_response(self, global_staff):
         """
diff --git a/cms/djangoapps/contentstore/tests/test_courseware_index.py b/cms/djangoapps/contentstore/tests/test_courseware_index.py
index 5c175d1ab8fc9a91d09af13405dcf64fff0ab58c..ca49b5013ace47baf904fac30bf6d70ccf6654d1 100644
--- a/cms/djangoapps/contentstore/tests/test_courseware_index.py
+++ b/cms/djangoapps/contentstore/tests/test_courseware_index.py
@@ -7,17 +7,15 @@ import json
 import time
 from datetime import datetime
 from unittest import skip
+from unittest.mock import patch
 from uuid import uuid4
 
 import ddt
 import pytest
-import six
 from django.conf import settings
 from lazy.lazy import lazy
-from mock import patch
 from pytz import UTC
 from search.search_engine_base import SearchEngine
-from six.moves import range
 from xblock.core import XBlock  # lint-amnesty, pylint: disable=unused-import
 
 from cms.djangoapps.contentstore.courseware_index import (
@@ -71,7 +69,7 @@ def create_children(store, parent, category, load_factor):
         child_object = ItemFactory.create(
             parent_location=parent.location,
             category=category,
-            display_name=u"{} {} {}".format(category, child_index, time.clock()),  # lint-amnesty, pylint: disable=no-member
+            display_name=f"{category} {child_index} {time.clock()}",  # lint-amnesty, pylint: disable=no-member
             modulestore=store,
             publish_item=True,
             start=datetime(2015, 3, 1, tzinfo=UTC),
@@ -195,7 +193,7 @@ class TestCoursewareSearchIndexer(MixedWithOptionsTestCase):
     WORKS_WITH_STORES = (ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split)
 
     def setUp(self):
-        super(TestCoursewareSearchIndexer, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.course = None
         self.chapter = None
@@ -263,7 +261,7 @@ class TestCoursewareSearchIndexer(MixedWithOptionsTestCase):
         )
 
     def _get_default_search(self):
-        return {"course": six.text_type(self.course.id)}
+        return {"course": str(self.course.id)}
 
     def _test_indexing_course(self, store):
         """ indexing course tests """
@@ -361,10 +359,10 @@ class TestCoursewareSearchIndexer(MixedWithOptionsTestCase):
 
         results = response["results"]
         date_map = {
-            six.text_type(self.chapter.location): early_date,
-            six.text_type(self.sequential.location): early_date,
-            six.text_type(self.vertical.location): later_date,
-            six.text_type(self.html_unit.location): later_date,
+            str(self.chapter.location): early_date,
+            str(self.sequential.location): early_date,
+            str(self.vertical.location): later_date,
+            str(self.html_unit.location): later_date,
         }
         for result in results:
             self.assertEqual(result["data"]["start_date"], date_map[result["data"]["id"]])
@@ -429,7 +427,7 @@ class TestCoursewareSearchIndexer(MixedWithOptionsTestCase):
         self.update_item(store, self.course)
         self.reindex_course(store)
         response = self.searcher.search(
-            field_dictionary={"course": six.text_type(self.course.id)}
+            field_dictionary={"course": str(self.course.id)}
         )
         self.assertEqual(response["total"], 1)
         self.assertEqual(response["results"][0]["data"]["content"]["display_name"], display_name)
@@ -446,7 +444,7 @@ class TestCoursewareSearchIndexer(MixedWithOptionsTestCase):
         )
         self.reindex_course(store)
         response = self.searcher.search(
-            field_dictionary={"course": six.text_type(self.course.id)}
+            field_dictionary={"course": str(self.course.id)}
         )
         self.assertEqual(response["total"], 1)
         self.assertEqual(response["results"][0]["data"]["content"]["short_description"], short_description)
@@ -473,7 +471,7 @@ class TestCoursewareSearchIndexer(MixedWithOptionsTestCase):
         self.reindex_course(store)
 
         response = self.searcher.search(
-            field_dictionary={"course": six.text_type(self.course.id)}
+            field_dictionary={"course": str(self.course.id)}
         )
         self.assertEqual(response["total"], 1)
         self.assertIn(CourseMode.HONOR, response["results"][0]["data"]["modes"])
@@ -605,11 +603,11 @@ class TestLargeCourseDeletions(MixedWithOptionsTestCase):
         self.course_id = None
 
     def setUp(self):
-        super(TestLargeCourseDeletions, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.course_id = None
 
     def tearDown(self):
-        super(TestLargeCourseDeletions, self).tearDown()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().tearDown()
         self._clean_course_id()
 
     def assert_search_count(self, expected_count):
@@ -622,13 +620,13 @@ class TestLargeCourseDeletions(MixedWithOptionsTestCase):
         """ Test that deleting items from a course works even when present within a very large course """
         def id_list(top_parent_object):
             """ private function to get ids from object down the tree """
-            list_of_ids = [six.text_type(top_parent_object.location)]
+            list_of_ids = [str(top_parent_object.location)]
             for child in top_parent_object.get_children():
                 list_of_ids.extend(id_list(child))
             return list_of_ids
 
         course, course_size = create_large_course(store, load_factor)
-        self.course_id = six.text_type(course.id)
+        self.course_id = str(course.id)
 
         # index full course
         CoursewareSearchIndexer.do_course_reindex(store, course.id)
@@ -657,10 +655,10 @@ class TestLargeCourseDeletions(MixedWithOptionsTestCase):
             self._do_test_large_course_deletion(store, load_factor)
         except:  # pylint: disable=bare-except
             # Catch any exception here to see when we fail
-            print(u"Failed with load_factor of {}".format(load_factor))
+            print(f"Failed with load_factor of {load_factor}")
 
-    @skip(("This test is to see how we handle very large courses, to ensure that the delete"
-           "procedure works smoothly - too long to run during the normal course of things"))
+    @skip("This test is to see how we handle very large courses, to ensure that the delete"
+          "procedure works smoothly - too long to run during the normal course of things")
     @ddt.data(*WORKS_WITH_STORES)
     def test_large_course_deletion(self, store_type):
         self._perform_test_using_store(store_type, self._test_large_course_deletion)
@@ -676,7 +674,7 @@ class TestTaskExecution(SharedModuleStoreTestCase):
 
     @classmethod
     def setUpClass(cls):
-        super(TestTaskExecution, cls).setUpClass()
+        super().setUpClass()
         SignalHandler.course_published.disconnect(listen_for_course_publish)
         SignalHandler.library_updated.disconnect(listen_for_library_update)
         cls.course = CourseFactory.create(start=datetime(2015, 3, 1, tzinfo=UTC))
@@ -730,7 +728,7 @@ class TestTaskExecution(SharedModuleStoreTestCase):
     def tearDownClass(cls):
         SignalHandler.course_published.connect(listen_for_course_publish)
         SignalHandler.library_updated.connect(listen_for_library_update)
-        super(TestTaskExecution, cls).tearDownClass()
+        super().tearDownClass()
 
     def test_task_indexing_course(self):
         """
@@ -739,7 +737,7 @@ class TestTaskExecution(SharedModuleStoreTestCase):
         """
         searcher = SearchEngine.get_search_engine(CoursewareSearchIndexer.INDEX_NAME)
         response = searcher.search(
-            field_dictionary={"course": six.text_type(self.course.id)}
+            field_dictionary={"course": str(self.course.id)}
         )
         self.assertEqual(response["total"], 0)
 
@@ -747,14 +745,14 @@ class TestTaskExecution(SharedModuleStoreTestCase):
 
         # Note that this test will only succeed if celery is working in inline mode
         response = searcher.search(
-            field_dictionary={"course": six.text_type(self.course.id)}
+            field_dictionary={"course": str(self.course.id)}
         )
         self.assertEqual(response["total"], 3)
 
     def test_task_library_update(self):
         """ Making sure that the receiver correctly fires off the task when invoked by signal """
         searcher = SearchEngine.get_search_engine(LibrarySearchIndexer.INDEX_NAME)
-        library_search_key = six.text_type(normalize_key_for_search(self.library.location.library_key))
+        library_search_key = str(normalize_key_for_search(self.library.location.library_key))
         response = searcher.search(field_dictionary={"library": library_search_key})
         self.assertEqual(response["total"], 0)
 
@@ -787,7 +785,7 @@ class TestLibrarySearchIndexer(MixedWithOptionsTestCase):
     WORKS_WITH_STORES = (ModuleStoreEnum.Type.split, )
 
     def setUp(self):
-        super(TestLibrarySearchIndexer, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.library = None
         self.html_unit1 = None
@@ -819,7 +817,7 @@ class TestLibrarySearchIndexer(MixedWithOptionsTestCase):
 
     def _get_default_search(self):
         """ Returns field_dictionary for default search """
-        return {"library": six.text_type(self.library.location.library_key.replace(version_guid=None, branch=None))}
+        return {"library": str(self.library.location.library_key.replace(version_guid=None, branch=None))}
 
     def reindex_library(self, store):
         """ kick off complete reindex of the course """
@@ -937,7 +935,7 @@ class GroupConfigurationSearchMongo(CourseTestCase, MixedWithOptionsTestCase):
     INDEX_NAME = CoursewareSearchIndexer.INDEX_NAME
 
     def setUp(self):
-        super(GroupConfigurationSearchMongo, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self._setup_course_with_content()
         self._setup_split_test_module()
@@ -1099,26 +1097,26 @@ class GroupConfigurationSearchMongo(CourseTestCase, MixedWithOptionsTestCase):
         Set up cohort and experiment content groups.
         """
         cohort_groups_list = {
-            u'id': 666,
-            u'name': u'Test name',
-            u'scheme': u'cohort',
-            u'description': u'Test description',
-            u'version': UserPartition.VERSION,
-            u'groups': [
-                {u'id': 0, u'name': u'Group A', u'version': 1, u'usage': []},
-                {u'id': 1, u'name': u'Group B', u'version': 1, u'usage': []},
+            'id': 666,
+            'name': 'Test name',
+            'scheme': 'cohort',
+            'description': 'Test description',
+            'version': UserPartition.VERSION,
+            'groups': [
+                {'id': 0, 'name': 'Group A', 'version': 1, 'usage': []},
+                {'id': 1, 'name': 'Group B', 'version': 1, 'usage': []},
             ],
         }
         experiment_groups_list = {
-            u'id': 0,
-            u'name': u'Experiment aware partition',
-            u'scheme': u'random',
-            u'description': u'Experiment aware description',
-            u'version': UserPartition.VERSION,
-            u'groups': [
-                {u'id': 2, u'name': u'Group A', u'version': 1, u'usage': []},
-                {u'id': 3, u'name': u'Group B', u'version': 1, u'usage': []},
-                {u'id': 4, u'name': u'Group C', u'version': 1, u'usage': []}
+            'id': 0,
+            'name': 'Experiment aware partition',
+            'scheme': 'random',
+            'description': 'Experiment aware description',
+            'version': UserPartition.VERSION,
+            'groups': [
+                {'id': 2, 'name': 'Group A', 'version': 1, 'usage': []},
+                {'id': 3, 'name': 'Group B', 'version': 1, 'usage': []},
+                {'id': 4, 'name': 'Group C', 'version': 1, 'usage': []}
             ],
         }
 
@@ -1153,9 +1151,9 @@ class GroupConfigurationSearchMongo(CourseTestCase, MixedWithOptionsTestCase):
         """
         return {
             'course_name': self.course.display_name,
-            'id': six.text_type(html_unit.location),
+            'id': str(html_unit.location),
             'content': {'html_content': '', 'display_name': html_unit.display_name},
-            'course': six.text_type(self.course.id),
+            'course': str(self.course.id),
             'location': [
                 self.chapter.display_name,
                 self.sequential.display_name,
@@ -1173,9 +1171,9 @@ class GroupConfigurationSearchMongo(CourseTestCase, MixedWithOptionsTestCase):
         """
         return {
             'course_name': self.course.display_name,
-            'id': six.text_type(html_unit.location),
+            'id': str(html_unit.location),
             'content': {'html_content': '', 'display_name': html_unit.display_name},
-            'course': six.text_type(self.course.id),
+            'course': str(self.course.id),
             'location': [
                 self.chapter.display_name,
                 self.sequential2.display_name,
@@ -1194,7 +1192,7 @@ class GroupConfigurationSearchMongo(CourseTestCase, MixedWithOptionsTestCase):
         return {
             'start_date': datetime(2015, 4, 1, 0, 0, tzinfo=UTC),
             'content': {'display_name': vertical.display_name},
-            'course': six.text_type(self.course.id),
+            'course': str(self.course.id),
             'location': [
                 self.chapter.display_name,
                 self.sequential2.display_name,
@@ -1202,7 +1200,7 @@ class GroupConfigurationSearchMongo(CourseTestCase, MixedWithOptionsTestCase):
             ],
             'content_type': 'Sequence',
             'content_groups': content_groups,
-            'id': six.text_type(vertical.location),
+            'id': str(vertical.location),
             'course_name': self.course.display_name,
             'org': self.course.org
         }
@@ -1213,9 +1211,9 @@ class GroupConfigurationSearchMongo(CourseTestCase, MixedWithOptionsTestCase):
         """
         return {
             'course_name': self.course.display_name,
-            'id': six.text_type(html_unit.location),
+            'id': str(html_unit.location),
             'content': {'html_content': '', 'display_name': html_unit.display_name},
-            'course': six.text_type(self.course.id),
+            'course': str(self.course.id),
             'location': [
                 self.chapter.display_name,
                 self.sequential.display_name,
@@ -1247,7 +1245,7 @@ class GroupConfigurationSearchMongo(CourseTestCase, MixedWithOptionsTestCase):
         # Only published modules should be in the index
         added_to_index = self.reindex_course(self.store)
         self.assertEqual(added_to_index, 16)
-        response = self.searcher.search(field_dictionary={"course": six.text_type(self.course.id)})
+        response = self.searcher.search(field_dictionary={"course": str(self.course.id)})
         self.assertEqual(response["total"], 16)
 
         group_access_content = {'group_access': {666: [1]}}
@@ -1265,44 +1263,44 @@ class GroupConfigurationSearchMongo(CourseTestCase, MixedWithOptionsTestCase):
             self.assertTrue(mock_index.called)
             indexed_content = self._get_index_values_from_call_args(mock_index)
             self.assertIn(self._html_group_result(self.html_unit1, [1]), indexed_content)
-            self.assertIn(self._html_experiment_group_result(self.html_unit4, [six.text_type(2)]), indexed_content)
-            self.assertIn(self._html_experiment_group_result(self.html_unit5, [six.text_type(3)]), indexed_content)
-            self.assertIn(self._html_experiment_group_result(self.html_unit6, [six.text_type(4)]), indexed_content)
-            self.assertNotIn(self._html_experiment_group_result(self.html_unit6, [six.text_type(5)]), indexed_content)
+            self.assertIn(self._html_experiment_group_result(self.html_unit4, [str(2)]), indexed_content)
+            self.assertIn(self._html_experiment_group_result(self.html_unit5, [str(3)]), indexed_content)
+            self.assertIn(self._html_experiment_group_result(self.html_unit6, [str(4)]), indexed_content)
+            self.assertNotIn(self._html_experiment_group_result(self.html_unit6, [str(5)]), indexed_content)
             self.assertIn(
-                self._vertical_experiment_group_result(self.condition_0_vertical, [six.text_type(2)]),
+                self._vertical_experiment_group_result(self.condition_0_vertical, [str(2)]),
                 indexed_content
             )
             self.assertNotIn(
-                self._vertical_experiment_group_result(self.condition_1_vertical, [six.text_type(2)]),
+                self._vertical_experiment_group_result(self.condition_1_vertical, [str(2)]),
                 indexed_content
             )
             self.assertNotIn(
-                self._vertical_experiment_group_result(self.condition_2_vertical, [six.text_type(2)]),
+                self._vertical_experiment_group_result(self.condition_2_vertical, [str(2)]),
                 indexed_content
             )
             self.assertNotIn(
-                self._vertical_experiment_group_result(self.condition_0_vertical, [six.text_type(3)]),
+                self._vertical_experiment_group_result(self.condition_0_vertical, [str(3)]),
                 indexed_content
             )
             self.assertIn(
-                self._vertical_experiment_group_result(self.condition_1_vertical, [six.text_type(3)]),
+                self._vertical_experiment_group_result(self.condition_1_vertical, [str(3)]),
                 indexed_content
             )
             self.assertNotIn(
-                self._vertical_experiment_group_result(self.condition_2_vertical, [six.text_type(3)]),
+                self._vertical_experiment_group_result(self.condition_2_vertical, [str(3)]),
                 indexed_content
             )
             self.assertNotIn(
-                self._vertical_experiment_group_result(self.condition_0_vertical, [six.text_type(4)]),
+                self._vertical_experiment_group_result(self.condition_0_vertical, [str(4)]),
                 indexed_content
             )
             self.assertNotIn(
-                self._vertical_experiment_group_result(self.condition_1_vertical, [six.text_type(4)]),
+                self._vertical_experiment_group_result(self.condition_1_vertical, [str(4)]),
                 indexed_content
             )
             self.assertIn(
-                self._vertical_experiment_group_result(self.condition_2_vertical, [six.text_type(4)]),
+                self._vertical_experiment_group_result(self.condition_2_vertical, [str(4)]),
                 indexed_content
             )
             mock_index.reset_mock()
diff --git a/cms/djangoapps/contentstore/tests/test_export_git.py b/cms/djangoapps/contentstore/tests/test_export_git.py
index bfbd98d3f2b843813af72f510ed46f0c07e0d07d..21d0c89788a4ae081334589531c5261b3ea69ffa 100644
--- a/cms/djangoapps/contentstore/tests/test_export_git.py
+++ b/cms/djangoapps/contentstore/tests/test_export_git.py
@@ -32,7 +32,7 @@ class TestExportGit(CourseTestCase):
         """
         Setup test course, user, and url.
         """
-        super(TestExportGit, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.course_module = modulestore().get_course(self.course.id)
         self.test_url = reverse_course_url('export_git', self.course.id)
 
@@ -46,7 +46,7 @@ class TestExportGit(CourseTestCase):
         os.mkdir(repo_dir)
         self.addCleanup(shutil.rmtree, repo_dir)
 
-        bare_repo_dir = '{0}/{1}.git'.format(
+        bare_repo_dir = '{}/{}.git'.format(
             os.path.abspath(git_export_utils.GIT_REPO_EXPORT_DIR),
             repo_name
         )
@@ -55,7 +55,7 @@ class TestExportGit(CourseTestCase):
 
         subprocess.check_output(['git', '--bare', 'init', ], cwd=bare_repo_dir)
         self.populate_course()
-        self.course_module.giturl = 'file://{}'.format(bare_repo_dir)
+        self.course_module.giturl = f'file://{bare_repo_dir}'
         modulestore().update_item(self.course_module, self.user.id)
 
     def test_giturl_missing(self):
@@ -70,7 +70,7 @@ class TestExportGit(CourseTestCase):
              'course settings before you can export to git.'),
         )
 
-        response = self.client.get('{}?action=push'.format(self.test_url))
+        response = self.client.get(f'{self.test_url}?action=push')
         self.assertContains(
             response,
             ('giturl must be defined in your '
@@ -84,7 +84,7 @@ class TestExportGit(CourseTestCase):
         self.course_module.giturl = 'foobar'
         modulestore().update_item(self.course_module, self.user.id)
 
-        response = self.client.get('{}?action=push'.format(self.test_url))
+        response = self.client.get(f'{self.test_url}?action=push')
         self.assertContains(response, 'Export Failed:')
 
     def test_exception_translation(self):
@@ -94,7 +94,7 @@ class TestExportGit(CourseTestCase):
         self.course_module.giturl = 'foobar'
         modulestore().update_item(self.course_module, self.user.id)
 
-        response = self.client.get('{}?action=push'.format(self.test_url))
+        response = self.client.get(f'{self.test_url}?action=push')
         self.assertNotContains(response, 'django.utils.functional.__proxy__')
 
     def test_course_export_success(self):
@@ -103,7 +103,7 @@ class TestExportGit(CourseTestCase):
         """
 
         self.make_bare_repo_with_course('test_repo')
-        response = self.client.get('{}?action=push'.format(self.test_url))
+        response = self.client.get(f'{self.test_url}?action=push')
         self.assertContains(response, 'Export Succeeded')
 
     def test_repo_with_dots(self):
@@ -111,7 +111,7 @@ class TestExportGit(CourseTestCase):
         Regression test for a bad directory pathing of repo's that have dots.
         """
         self.make_bare_repo_with_course('test.repo')
-        response = self.client.get('{}?action=push'.format(self.test_url))
+        response = self.client.get(f'{self.test_url}?action=push')
         self.assertContains(response, 'Export Succeeded')
 
     def test_dirty_repo(self):
diff --git a/cms/djangoapps/contentstore/tests/test_gating.py b/cms/djangoapps/contentstore/tests/test_gating.py
index 7ed635f73221dcec14608540fa23c2af6040ff9a..5f7bf639c729e24b03afd0ca1a49f87617eaa0c3 100644
--- a/cms/djangoapps/contentstore/tests/test_gating.py
+++ b/cms/djangoapps/contentstore/tests/test_gating.py
@@ -3,8 +3,9 @@ Unit tests for the gating feature in Studio
 """
 
 
+from unittest.mock import patch
+
 from milestones.tests.utils import MilestonesTestCaseMixin
-from mock import patch
 
 from cms.djangoapps.contentstore.signals.handlers import handle_item_deleted
 from openedx.core.lib.gating import api as gating_api
@@ -22,7 +23,7 @@ class TestHandleItemDeleted(ModuleStoreTestCase, MilestonesTestCaseMixin):
         """
         Initial data setup
         """
-        super(TestHandleItemDeleted, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.course = CourseFactory.create()
         self.course.enable_subsection_gating = True
diff --git a/cms/djangoapps/contentstore/tests/test_i18n.py b/cms/djangoapps/contentstore/tests/test_i18n.py
index 8d0344143fa194536e7a250753ca13adf568f33f..7ddc9965c27e14bab98c35697e04d2535540743d 100644
--- a/cms/djangoapps/contentstore/tests/test_i18n.py
+++ b/cms/djangoapps/contentstore/tests/test_i18n.py
@@ -1,13 +1,11 @@
-# -*- coding: utf-8 -*-
 """
 Tests for validate Internationalization and Module i18n service.
 """
 
 
 import gettext
-from unittest import skip
+from unittest import mock, skip
 
-import mock
 from django.contrib.auth.models import User  # lint-amnesty, pylint: disable=imported-auth-user
 from django.utils import translation
 from django.utils.translation import get_language
@@ -62,7 +60,7 @@ class TestModuleI18nService(ModuleStoreTestCase):
 
     def setUp(self):
         """ Setting up tests """
-        super(TestModuleI18nService, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.test_language = 'dummy language'
         self.request = mock.Mock()
         self.course = CourseFactory.create()
@@ -89,7 +87,7 @@ class TestModuleI18nService(ModuleStoreTestCase):
         Test django translation service works fine.
         """
 
-        class wrap_ugettext_with_xyz(object):  # pylint: disable=invalid-name
+        class wrap_ugettext_with_xyz:  # pylint: disable=invalid-name
             """
             A context manager function that just adds 'XYZ ' to the front
             of all strings of the module ugettext function.
@@ -187,7 +185,7 @@ class InternationalizationTest(ModuleStoreTestCase):
         will be cleared out before each test case execution and deleted
         afterwards.
         """
-        super(InternationalizationTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.uname = 'testuser'
         self.email = 'test+courses@edx.org'
@@ -216,7 +214,7 @@ class InternationalizationTest(ModuleStoreTestCase):
 
         resp = self.client.get_html('/home/')
         self.assertContains(resp,
-                            u'<h1 class="page-header">𝓢𝓽𝓾𝓭𝓲𝓸 Home</h1>',
+                            '<h1 class="page-header">𝓢𝓽𝓾𝓭𝓲𝓸 Home</h1>',
                             status_code=200,
                             html=True)
 
@@ -232,7 +230,7 @@ class InternationalizationTest(ModuleStoreTestCase):
         )
 
         self.assertContains(resp,
-                            u'<h1 class="page-header">𝓢𝓽𝓾𝓭𝓲𝓸 Home</h1>',
+                            '<h1 class="page-header">𝓢𝓽𝓾𝓭𝓲𝓸 Home</h1>',
                             status_code=200,
                             html=True)
 
@@ -257,9 +255,9 @@ class InternationalizationTest(ModuleStoreTestCase):
         )
 
         TEST_STRING = (
-            u'<h1 class="title-1">'
-            u'My \xc7\xf6\xfcrs\xe9s L#'
-            u'</h1>'
+            '<h1 class="title-1">'
+            'My \xc7\xf6\xfcrs\xe9s L#'
+            '</h1>'
         )
 
         self.assertContains(resp,
diff --git a/cms/djangoapps/contentstore/tests/test_import.py b/cms/djangoapps/contentstore/tests/test_import.py
index 61b8854f23223bdb63ada225199b92dc1b85d03d..41b06729ac9412b3e9d186c815eb08e9b3c08570 100644
--- a/cms/djangoapps/contentstore/tests/test_import.py
+++ b/cms/djangoapps/contentstore/tests/test_import.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # pylint: disable=protected-access
 """
 Tests for import_course_from_xml using the mongo modulestore.
@@ -6,14 +5,13 @@ Tests for import_course_from_xml using the mongo modulestore.
 
 
 import copy
+from unittest.mock import patch
 from uuid import uuid4
 
 import ddt
-import six
 from django.conf import settings
 from django.test.client import Client
 from django.test.utils import override_settings
-from mock import patch
 
 from xmodule.contentstore.django import contentstore
 from xmodule.exceptions import NotFoundError
@@ -37,7 +35,7 @@ class ContentStoreImportTest(ModuleStoreTestCase):
     NOTE: refactor using CourseFactory so they do not.
     """
     def setUp(self):
-        super(ContentStoreImportTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.client = Client()
         self.client.login(username=self.user.username, password=self.user_password)
@@ -48,7 +46,7 @@ class ContentStoreImportTest(ModuleStoreTestCase):
 
     def tearDown(self):
         self.task_patcher.stop()
-        super(ContentStoreImportTest, self).tearDown()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().tearDown()
 
     def load_test_import_course(self, target_id=None, create_if_not_present=True, module_store=None):
         '''
@@ -97,7 +95,7 @@ class ContentStoreImportTest(ModuleStoreTestCase):
         # Test with the split modulestore because store.has_course fails in old mongo with unicode characters.
         with modulestore().default_store(ModuleStoreEnum.Type.split):
             module_store = modulestore()
-            course_id = module_store.make_course_key(u'Юникода', u'unicode_course', u'échantillon')
+            course_id = module_store.make_course_key('Юникода', 'unicode_course', 'échantillon')
             import_course_from_xml(
                 module_store,
                 self.user.id,
@@ -111,7 +109,7 @@ class ContentStoreImportTest(ModuleStoreTestCase):
             self.assertIsNotNone(course)
 
             # test that course 'display_name' same as imported course 'display_name'
-            self.assertEqual(course.display_name, u"Φυσικά το όνομα Unicode")
+            self.assertEqual(course.display_name, "Φυσικά το όνομα Unicode")
 
     def test_static_import(self):
         '''
@@ -135,7 +133,7 @@ class ContentStoreImportTest(ModuleStoreTestCase):
         self.assertIsNotNone(content)
 
         # make sure course.static_asset_path is correct
-        print(u"static_asset_path = {0}".format(course.static_asset_path))
+        print(f"static_asset_path = {course.static_asset_path}")
         self.assertEqual(course.static_asset_path, 'test_import_course')
 
     def test_asset_import_nostatic(self):
@@ -174,7 +172,7 @@ class ContentStoreImportTest(ModuleStoreTestCase):
 
     def test_tab_name_imports_correctly(self):
         _module_store, _content_store, course = self.load_test_import_course()
-        print(u"course tabs = {0}".format(course.tabs))
+        print(f"course tabs = {course.tabs}")
         self.assertEqual(course.tabs[2]['name'], 'Syllabus')
 
     def test_import_performance_mongo(self):
@@ -269,7 +267,7 @@ class ContentStoreImportTest(ModuleStoreTestCase):
         self.assertIsNotNone(split_test_module)
 
         remapped_verticals = {
-            key: target_id.make_usage_key('vertical', value) for key, value in six.iteritems(groups_to_verticals)
+            key: target_id.make_usage_key('vertical', value) for key, value in groups_to_verticals.items()
         }
 
         self.assertEqual(remapped_verticals, split_test_module.group_id_to_child)
diff --git a/cms/djangoapps/contentstore/tests/test_libraries.py b/cms/djangoapps/contentstore/tests/test_libraries.py
index 27edd08d247179d1b544a9622dbdd9d31f719571..0c5002b4b632a4efea4b15457ffdf76abe227862 100644
--- a/cms/djangoapps/contentstore/tests/test_libraries.py
+++ b/cms/djangoapps/contentstore/tests/test_libraries.py
@@ -3,12 +3,11 @@ Content library unit tests that require the CMS runtime.
 """
 
 
+from unittest.mock import Mock, patch
+
 import ddt
-import six
 from django.test.utils import override_settings
-from mock import Mock, patch
 from opaque_keys.edx.locator import CourseKey, LibraryLocator
-from six.moves import range
 
 from cms.djangoapps.contentstore.tests.utils import AjaxEnabledTestClient, parse_json
 from cms.djangoapps.contentstore.utils import reverse_library_url, reverse_url, reverse_usage_url
@@ -41,7 +40,7 @@ class LibraryTestCase(ModuleStoreTestCase):
     """
 
     def setUp(self):
-        super(LibraryTestCase, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.user = UserFactory(password=self.user_password, is_staff=True)
         self.client = AjaxEnabledTestClient()
@@ -85,7 +84,7 @@ class LibraryTestCase(ModuleStoreTestCase):
             parent_location=course.location,
             user_id=self.user.id,
             publish_item=publish_item,
-            source_library_id=six.text_type(library_key),
+            source_library_id=str(library_key),
             **(other_settings or {})
         )
 
@@ -189,7 +188,7 @@ class TestLibraries(LibraryTestCase):
         # Create many blocks in the library and add them to a course:
         for num in range(8):
             ItemFactory.create(
-                data=u"This is #{}".format(num + 1),
+                data="This is #{}".format(num + 1),
                 category="html", parent_location=self.library.location, user_id=self.user.id, publish_item=False
             )
 
@@ -488,11 +487,11 @@ class TestLibraries(LibraryTestCase):
         self._create_library(library="l4", display_name="Library-Title-4", org='org-test2')
 
         self.assertEqual(len(self.client.get_json(LIBRARY_REST_URL).json()), 5)  # 1 more from self.setUp()
-        self.assertEqual(len(self.client.get_json('{}?org=org-test1'.format(LIBRARY_REST_URL)).json()), 2)
-        self.assertEqual(len(self.client.get_json('{}?text_search=test-lib'.format(LIBRARY_REST_URL)).json()), 2)
-        self.assertEqual(len(self.client.get_json('{}?text_search=library-title'.format(LIBRARY_REST_URL)).json()), 3)
-        self.assertEqual(len(self.client.get_json('{}?text_search=library-'.format(LIBRARY_REST_URL)).json()), 3)
-        self.assertEqual(len(self.client.get_json('{}?text_search=org-test'.format(LIBRARY_REST_URL)).json()), 3)
+        self.assertEqual(len(self.client.get_json(f'{LIBRARY_REST_URL}?org=org-test1').json()), 2)
+        self.assertEqual(len(self.client.get_json(f'{LIBRARY_REST_URL}?text_search=test-lib').json()), 2)
+        self.assertEqual(len(self.client.get_json(f'{LIBRARY_REST_URL}?text_search=library-title').json()), 3)
+        self.assertEqual(len(self.client.get_json(f'{LIBRARY_REST_URL}?text_search=library-').json()), 3)
+        self.assertEqual(len(self.client.get_json(f'{LIBRARY_REST_URL}?text_search=org-test').json()), 3)
 
 
 @ddt.ddt
@@ -504,7 +503,7 @@ class TestLibraryAccess(LibraryTestCase):
 
     def setUp(self):
         """ Create a library, staff user, and non-staff user """
-        super(TestLibraryAccess, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.non_staff_user_password = 'foo'
         self.non_staff_user = UserFactory(password=self.non_staff_user_password, is_staff=False)
 
@@ -531,11 +530,11 @@ class TestLibraryAccess(LibraryTestCase):
 
         `library` can be a LibraryLocator or the library's root XBlock
         """
-        if isinstance(library, (six.string_types, LibraryLocator)):
+        if isinstance(library, (str, LibraryLocator)):
             lib_key = library
         else:
             lib_key = library.location.library_key
-        response = self.client.get(reverse_library_url('library_handler', six.text_type(lib_key)))
+        response = self.client.get(reverse_library_url('library_handler', str(lib_key)))
         self.assertIn(response.status_code, (200, 302, 403))
         return response.status_code == 200
 
@@ -544,7 +543,7 @@ class TestLibraryAccess(LibraryTestCase):
         Log out when done each test
         """
         self.client.logout()
-        super(TestLibraryAccess, self).tearDown()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().tearDown()
 
     def test_creation(self):
         """
@@ -599,7 +598,7 @@ class TestLibraryAccess(LibraryTestCase):
         # Now non_staff_user should be able to access library2_key only:
         lib_list = self._list_libraries()
         self.assertEqual(len(lib_list), 1)
-        self.assertEqual(lib_list[0]["library_key"], six.text_type(library2_key))
+        self.assertEqual(lib_list[0]["library_key"], str(library2_key))
         self.assertTrue(self._can_access_library(library2_key))
         self.assertFalse(self._can_access_library(self.library))
 
@@ -626,7 +625,7 @@ class TestLibraryAccess(LibraryTestCase):
         # Now non_staff_user should be able to access lib_key_pacific only:
         lib_list = self._list_libraries()
         self.assertEqual(len(lib_list), 1)
-        self.assertEqual(lib_list[0]["library_key"], six.text_type(lib_key_pacific))
+        self.assertEqual(lib_list[0]["library_key"], str(lib_key_pacific))
         self.assertTrue(self._can_access_library(lib_key_pacific))
         self.assertFalse(self._can_access_library(lib_key_atlantic))
         self.assertFalse(self._can_access_library(self.lib_key))
@@ -666,8 +665,8 @@ class TestLibraryAccess(LibraryTestCase):
         def can_copy_block():
             """ Check if studio lets us duplicate the XBlock in the library """
             response = self.client.ajax_post(reverse_url('xblock_handler'), {
-                'parent_locator': six.text_type(self.library.location),
-                'duplicate_source_locator': six.text_type(block.location),
+                'parent_locator': str(self.library.location),
+                'duplicate_source_locator': str(block.location),
             })
             self.assertIn(response.status_code, (200, 403))  # 400 would be ambiguous
             return response.status_code == 200
@@ -675,7 +674,7 @@ class TestLibraryAccess(LibraryTestCase):
         def can_create_block():
             """ Check if studio lets us make a new XBlock in the library """
             response = self.client.ajax_post(reverse_url('xblock_handler'), {
-                'parent_locator': six.text_type(self.library.location), 'category': 'html',
+                'parent_locator': str(self.library.location), 'category': 'html',
             })
             self.assertIn(response.status_code, (200, 403))  # 400 would be ambiguous
             return response.status_code == 200
@@ -728,8 +727,8 @@ class TestLibraryAccess(LibraryTestCase):
 
         # Copy block to the course:
         response = self.client.ajax_post(reverse_url('xblock_handler'), {
-            'parent_locator': six.text_type(course.location),
-            'duplicate_source_locator': six.text_type(block.location),
+            'parent_locator': str(course.location),
+            'duplicate_source_locator': str(block.location),
         })
         self.assertIn(response.status_code, (200, 403))  # 400 would be ambiguous
         duplicate_action_allowed = (response.status_code == 200)
@@ -837,7 +836,7 @@ class TestOverrides(LibraryTestCase):
     """
 
     def setUp(self):
-        super(TestOverrides, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.original_display_name = "A Problem Block"
         self.original_weight = 1
 
@@ -1022,7 +1021,7 @@ class TestIncompatibleModuleStore(LibraryTestCase):
     """
 
     def setUp(self):
-        super(TestIncompatibleModuleStore, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         # Create a course in an incompatible modulestore.
         with modulestore().default_store(ModuleStoreEnum.Type.mongo):
             self.course = CourseFactory.create()
diff --git a/cms/djangoapps/contentstore/tests/test_orphan.py b/cms/djangoapps/contentstore/tests/test_orphan.py
index c6deba4d682155e597170e85a8fcae3f4de3baa6..48745753f496509e3463c7856dd6950f3a582058 100644
--- a/cms/djangoapps/contentstore/tests/test_orphan.py
+++ b/cms/djangoapps/contentstore/tests/test_orphan.py
@@ -6,7 +6,6 @@ Test finding orphans via the view and django config
 import json
 
 import ddt
-import six
 from opaque_keys.edx.locator import BlockUsageLocator
 
 from cms.djangoapps.contentstore.tests.utils import CourseTestCase
@@ -95,13 +94,13 @@ class TestOrphan(TestOrphanBase):
                 HTTP_ACCEPT='application/json'
             ).content.decode('utf-8')
         )
-        self.assertEqual(len(orphans), 3, u"Wrong # {}".format(orphans))
+        self.assertEqual(len(orphans), 3, f"Wrong # {orphans}")
         location = course.location.replace(category='chapter', name='OrphanChapter')
-        self.assertIn(six.text_type(location), orphans)
+        self.assertIn(str(location), orphans)
         location = course.location.replace(category='vertical', name='OrphanVert')
-        self.assertIn(six.text_type(location), orphans)
+        self.assertIn(str(location), orphans)
         location = course.location.replace(category='html', name='OrphanHtml')
-        self.assertIn(six.text_type(location), orphans)
+        self.assertIn(str(location), orphans)
 
     @ddt.data(
         (ModuleStoreEnum.Type.split, 9, 5),
@@ -121,7 +120,7 @@ class TestOrphan(TestOrphanBase):
         orphans = json.loads(
             self.client.get(orphan_url, HTTP_ACCEPT='application/json').content.decode('utf-8')
         )
-        self.assertEqual(len(orphans), 0, u"Orphans not deleted {}".format(orphans))
+        self.assertEqual(len(orphans), 0, f"Orphans not deleted {orphans}")
 
         # make sure that any children with one orphan parent and one non-orphan
         # parent are not deleted
@@ -174,8 +173,8 @@ class TestOrphan(TestOrphanBase):
 
         # HTML component has `vertical1` as its parent.
         html_parent = self.store.get_parent_location(multi_parent_html.location)
-        self.assertNotEqual(six.text_type(html_parent), six.text_type(orphan_vertical.location))
-        self.assertEqual(six.text_type(html_parent), six.text_type(vertical1.location))
+        self.assertNotEqual(str(html_parent), str(orphan_vertical.location))
+        self.assertEqual(str(html_parent), str(vertical1.location))
 
         # Get path of the `multi_parent_html` & verify path_to_location returns a expected path
         path = path_to_location(self.store, multi_parent_html.location)
@@ -227,7 +226,7 @@ class TestOrphan(TestOrphanBase):
 
         # Verify chapter1 is parent of vertical1.
         vertical1_parent = self.store.get_parent_location(vertical1.location)
-        self.assertEqual(six.text_type(vertical1_parent), six.text_type(chapter1.location))
+        self.assertEqual(str(vertical1_parent), str(chapter1.location))
 
         # Make `Vertical1` the parent of `HTML0`. So `HTML0` will have to parents (`Vertical0` & `Vertical1`)
         vertical1.children.append(html.location)
@@ -236,7 +235,7 @@ class TestOrphan(TestOrphanBase):
         # Get parent location & verify its either of the two verticals. As both parents are non-orphan,
         # alphabetically least is returned
         html_parent = self.store.get_parent_location(html.location)
-        self.assertEqual(six.text_type(html_parent), six.text_type(vertical1.location))
+        self.assertEqual(str(html_parent), str(vertical1.location))
 
         # verify path_to_location returns a expected path
         path = path_to_location(self.store, html.location)
diff --git a/cms/djangoapps/contentstore/tests/test_outlines.py b/cms/djangoapps/contentstore/tests/test_outlines.py
index 4ad80c534761eef29174bc3d02d07d14498e6f09..12f495cc1e9d7008d95a6606e948dffc8a7736e6 100644
--- a/cms/djangoapps/contentstore/tests/test_outlines.py
+++ b/cms/djangoapps/contentstore/tests/test_outlines.py
@@ -6,12 +6,8 @@ from datetime import datetime, timezone
 
 from opaque_keys.edx.keys import CourseKey
 
-from openedx.core.djangoapps.content.learning_sequences.data import (
-    CourseOutlineData,
-    ExamData,
-    VisibilityData,
-)
 from openedx.core.djangoapps.content.learning_sequences.api import get_course_outline
+from openedx.core.djangoapps.content.learning_sequences.data import CourseOutlineData, ExamData, VisibilityData
 from xmodule.modulestore import ModuleStoreEnum
 from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
 from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
diff --git a/cms/djangoapps/contentstore/tests/test_permissions.py b/cms/djangoapps/contentstore/tests/test_permissions.py
index 4a5e005c9a2487e609b7edb577dc7b792afba21d..98d8fa074a58b1adaa5ca84b2860caa16d002db9 100644
--- a/cms/djangoapps/contentstore/tests/test_permissions.py
+++ b/cms/djangoapps/contentstore/tests/test_permissions.py
@@ -6,7 +6,6 @@ Test CRUD for authorization.
 import copy
 
 from django.contrib.auth.models import User  # lint-amnesty, pylint: disable=imported-auth-user
-from six.moves import range
 
 from cms.djangoapps.contentstore.tests.utils import AjaxEnabledTestClient
 from cms.djangoapps.contentstore.utils import reverse_course_url, reverse_url
@@ -25,7 +24,7 @@ class TestCourseAccess(ModuleStoreTestCase):
 
         Create a pool of users w/o granting them any permissions
         """
-        super(TestCourseAccess, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.client = AjaxEnabledTestClient()
         self.client.login(username=self.user.username, password=self.user_password)
@@ -51,8 +50,8 @@ class TestCourseAccess(ModuleStoreTestCase):
         """
         users = []
         for i in range(8):
-            username = "user{}".format(i)
-            email = "test+user{}@edx.org".format(i)
+            username = f"user{i}"
+            email = f"test+user{i}@edx.org"
             user = User.objects.create_user(username, email, 'foo')
             user.is_active = True
             user.save()
@@ -94,7 +93,7 @@ class TestCourseAccess(ModuleStoreTestCase):
             user = users.pop()
             group.add_users(user)
             user_by_role[role].append(user)
-            self.assertTrue(auth.has_course_author_access(user, self.course_key), "{} does not have access".format(user))  # lint-amnesty, pylint: disable=line-too-long
+            self.assertTrue(auth.has_course_author_access(user, self.course_key), f"{user} does not have access")  # lint-amnesty, pylint: disable=line-too-long
 
         course_team_url = reverse_course_url('course_team_handler', self.course_key)
         response = self.client.get_html(course_team_url)
@@ -127,9 +126,9 @@ class TestCourseAccess(ModuleStoreTestCase):
                 if hasattr(user, '_roles'):
                     del user._roles
 
-                self.assertTrue(auth.has_course_author_access(user, copy_course_key), u"{} no copy access".format(user))
+                self.assertTrue(auth.has_course_author_access(user, copy_course_key), f"{user} no copy access")
                 if (role is OrgStaffRole) or (role is OrgInstructorRole):
                     auth.remove_users(self.user, role(self.course_key.org), user)
                 else:
                     auth.remove_users(self.user, role(self.course_key), user)
-                self.assertFalse(auth.has_course_author_access(user, self.course_key), u"{} remove didn't work".format(user))  # lint-amnesty, pylint: disable=line-too-long
+                self.assertFalse(auth.has_course_author_access(user, self.course_key), f"{user} remove didn't work")  # lint-amnesty, pylint: disable=line-too-long
diff --git a/cms/djangoapps/contentstore/tests/test_proctoring.py b/cms/djangoapps/contentstore/tests/test_proctoring.py
index aedb929b08210ece2d0d5c1e4db21ab0c5db08f2..76437f7b5c1fa6de05fcb04628a421ad2210ba67 100644
--- a/cms/djangoapps/contentstore/tests/test_proctoring.py
+++ b/cms/djangoapps/contentstore/tests/test_proctoring.py
@@ -4,12 +4,11 @@ Tests for the edx_proctoring integration into Studio
 
 
 from datetime import datetime, timedelta
+from unittest.mock import patch
 
 import ddt
-import six
 from django.conf import settings
 from edx_proctoring.api import get_all_exams_for_course, get_review_policy_by_exam_id
-from mock import patch
 from pytz import UTC
 
 from cms.djangoapps.contentstore.signals.handlers import listen_for_course_publish
@@ -28,7 +27,7 @@ class TestProctoredExams(ModuleStoreTestCase):
         """
         Initial data setup
         """
-        super(TestProctoredExams, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.course = CourseFactory.create(
             org='edX',
@@ -43,7 +42,7 @@ class TestProctoredExams(ModuleStoreTestCase):
         Helper method to compare the sequence with the stored exam,
         which should just be a single one
         """
-        exams = get_all_exams_for_course(six.text_type(self.course.id))
+        exams = get_all_exams_for_course(str(self.course.id))
 
         self.assertEqual(len(exams), 1)
 
@@ -58,8 +57,8 @@ class TestProctoredExams(ModuleStoreTestCase):
             # the hide after due value only applies to timed exams
             self.assertEqual(exam['hide_after_due'], sequence.hide_after_due)
 
-        self.assertEqual(exam['course_id'], six.text_type(self.course.id))
-        self.assertEqual(exam['content_id'], six.text_type(sequence.location))
+        self.assertEqual(exam['course_id'], str(self.course.id))
+        self.assertEqual(exam['content_id'], str(sequence.location))
         self.assertEqual(exam['exam_name'], sequence.display_name)
         self.assertEqual(exam['time_limit_mins'], sequence.default_time_limit_minutes)
         self.assertEqual(exam['is_proctored'], sequence.is_proctored_exam)
@@ -166,7 +165,7 @@ class TestProctoredExams(ModuleStoreTestCase):
 
         listen_for_course_publish(self, self.course.id)
 
-        exams = get_all_exams_for_course(six.text_type(self.course.id))
+        exams = get_all_exams_for_course(str(self.course.id))
         self.assertEqual(len(exams), 1)
 
         sequence.is_time_limited = False
@@ -197,7 +196,7 @@ class TestProctoredExams(ModuleStoreTestCase):
 
         listen_for_course_publish(self, self.course.id)
 
-        exams = get_all_exams_for_course(six.text_type(self.course.id))
+        exams = get_all_exams_for_course(str(self.course.id))
         self.assertEqual(len(exams), 1)
 
         self.store.delete_item(chapter.location, self.user.id)
@@ -207,7 +206,7 @@ class TestProctoredExams(ModuleStoreTestCase):
 
         # look through exam table, the dangling exam
         # should be disabled
-        exams = get_all_exams_for_course(six.text_type(self.course.id))
+        exams = get_all_exams_for_course(str(self.course.id))
         self.assertEqual(len(exams), 1)
 
         exam = exams[0]
@@ -232,7 +231,7 @@ class TestProctoredExams(ModuleStoreTestCase):
 
         listen_for_course_publish(self, self.course.id)
 
-        exams = get_all_exams_for_course(six.text_type(self.course.id))
+        exams = get_all_exams_for_course(str(self.course.id))
         self.assertEqual(len(exams), 0)
 
     @ddt.data(
@@ -271,7 +270,7 @@ class TestProctoredExams(ModuleStoreTestCase):
 
         # there shouldn't be any exams because we haven't enabled that
         # advanced setting flag
-        exams = get_all_exams_for_course(six.text_type(self.course.id))
+        exams = get_all_exams_for_course(str(self.course.id))
         self.assertEqual(len(exams), expected_count)
 
     def test_self_paced_no_due_dates(self):
@@ -299,7 +298,7 @@ class TestProctoredExams(ModuleStoreTestCase):
             is_onboarding_exam=False,
         )
         listen_for_course_publish(self, self.course.id)
-        exams = get_all_exams_for_course(six.text_type(self.course.id))
+        exams = get_all_exams_for_course(str(self.course.id))
         # self-paced courses should ignore due dates
         assert exams[0]['due_date'] is None
 
@@ -308,5 +307,5 @@ class TestProctoredExams(ModuleStoreTestCase):
         self.course.self_paced = False
         self.course = self.update_course(self.course, 1)
         listen_for_course_publish(self, self.course.id)
-        exams = get_all_exams_for_course(six.text_type(self.course.id))
+        exams = get_all_exams_for_course(str(self.course.id))
         assert exams[0]['due_date'] is not None
diff --git a/cms/djangoapps/contentstore/tests/test_request_event.py b/cms/djangoapps/contentstore/tests/test_request_event.py
index aa51ef3d50719a1157bd1fadc225beda9d5e6909..c4d21f72497a30634a81dd10c7b041b8085925d5 100644
--- a/cms/djangoapps/contentstore/tests/test_request_event.py
+++ b/cms/djangoapps/contentstore/tests/test_request_event.py
@@ -3,7 +3,6 @@
 
 from django.test import TestCase
 from django.urls import reverse
-from six import unichr
 
 from cms.djangoapps.contentstore.views.helpers import event as cms_user_track
 
@@ -20,7 +19,7 @@ class CMSLogTest(TestCase):
         """
         requests = [
             {"event": "my_event", "event_type": "my_event_type", "page": "my_page"},
-            {"event": "{'json': 'object'}", "event_type": unichr(512), "page": "my_page"}
+            {"event": "{'json': 'object'}", "event_type": chr(512), "page": "my_page"}
         ]
         for request_params in requests:
             response = self.client.post(reverse(cms_user_track), request_params)
@@ -33,7 +32,7 @@ class CMSLogTest(TestCase):
         """
         requests = [
             {"event": "my_event", "event_type": "my_event_type", "page": "my_page"},
-            {"event": "{'json': 'object'}", "event_type": unichr(512), "page": "my_page"}
+            {"event": "{'json': 'object'}", "event_type": chr(512), "page": "my_page"}
         ]
         for request_params in requests:
             response = self.client.get(reverse(cms_user_track), request_params)
diff --git a/cms/djangoapps/contentstore/tests/test_signals.py b/cms/djangoapps/contentstore/tests/test_signals.py
index ae81839a3ff6c3746155bda3542c41270a2ac73b..c2ceda240eccce696751abcbc1a47e408bf93caf 100644
--- a/cms/djangoapps/contentstore/tests/test_signals.py
+++ b/cms/djangoapps/contentstore/tests/test_signals.py
@@ -1,9 +1,9 @@
 """Tests for verifying availability of resources for locking"""
 
 
+from unittest.mock import Mock, patch
+
 import ddt
-import six
-from mock import Mock, patch
 
 from cms.djangoapps.contentstore.signals.handlers import GRADING_POLICY_COUNTDOWN_SECONDS, handle_grading_policy_changed
 from common.djangoapps.student.models import CourseEnrollment
@@ -17,7 +17,7 @@ class LockedTest(ModuleStoreTestCase):
     """Test class to verify locking of mocked resources"""
 
     def setUp(self):
-        super(LockedTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.course = CourseFactory.create(
             org='edx',
             name='course',
@@ -33,9 +33,9 @@ class LockedTest(ModuleStoreTestCase):
         add_mock.return_value = lock_available
         sender = Mock()
 
-        handle_grading_policy_changed(sender, course_key=six.text_type(self.course.id))
+        handle_grading_policy_changed(sender, course_key=str(self.course.id))
 
-        cache_key = 'handle_grading_policy_changed-{}'.format(six.text_type(self.course.id))
+        cache_key = 'handle_grading_policy_changed-{}'.format(str(self.course.id))
         self.assertEqual(lock_available, compute_grades_async_mock.called)
         if lock_available:
             add_mock.assert_called_once_with(cache_key, "true", GRADING_POLICY_COUNTDOWN_SECONDS)
diff --git a/cms/djangoapps/contentstore/tests/test_tasks.py b/cms/djangoapps/contentstore/tests/test_tasks.py
index 8d927a0bad790e86fdd35d4a20fdfd8997f2552c..cb4d604e699eb22ac7a66c17f465b1d6ea3971ae 100644
--- a/cms/djangoapps/contentstore/tests/test_tasks.py
+++ b/cms/djangoapps/contentstore/tests/test_tasks.py
@@ -5,9 +5,9 @@ Unit tests for course import and export Celery tasks
 
 import copy
 import json
+from unittest import mock
 from uuid import uuid4
 
-import mock
 from django.conf import settings
 from django.contrib.auth.models import User  # lint-amnesty, pylint: disable=imported-auth-user
 from django.test.utils import override_settings
@@ -45,7 +45,7 @@ class ExportCourseTestCase(CourseTestCase):
         Verify that a routine course export task succeeds
         """
         key = str(self.course.location.course_key)
-        result = export_olx.delay(self.user.id, key, u'en')
+        result = export_olx.delay(self.user.id, key, 'en')
         status = UserTaskStatus.objects.get(task_id=result.id)
         self.assertEqual(status.state, UserTaskStatus.SUCCEEDED)
         artifacts = UserTaskArtifact.objects.filter(status=status)
@@ -59,17 +59,17 @@ class ExportCourseTestCase(CourseTestCase):
         The export task should fail gracefully if an exception is thrown
         """
         key = str(self.course.location.course_key)
-        result = export_olx.delay(self.user.id, key, u'en')
-        self._assert_failed(result, json.dumps({u'raw_error_msg': u'Boom!'}))
+        result = export_olx.delay(self.user.id, key, 'en')
+        self._assert_failed(result, json.dumps({'raw_error_msg': 'Boom!'}))
 
     def test_invalid_user_id(self):
         """
         Verify that attempts to export a course as an invalid user fail
         """
-        user_id = User.objects.order_by(u'-id').first().pk + 100
+        user_id = User.objects.order_by('-id').first().pk + 100
         key = str(self.course.location.course_key)
-        result = export_olx.delay(user_id, key, u'en')
-        self._assert_failed(result, u'Unknown User ID: {}'.format(user_id))
+        result = export_olx.delay(user_id, key, 'en')
+        self._assert_failed(result, f'Unknown User ID: {user_id}')
 
     def test_non_course_author(self):
         """
@@ -77,8 +77,8 @@ class ExportCourseTestCase(CourseTestCase):
         """
         _, nonstaff_user = self.create_non_staff_authed_user_client()
         key = str(self.course.location.course_key)
-        result = export_olx.delay(nonstaff_user.id, key, u'en')
-        self._assert_failed(result, u'Permission denied')
+        result = export_olx.delay(nonstaff_user.id, key, 'en')
+        self._assert_failed(result, 'Permission denied')
 
     def _assert_failed(self, task_result, error_message):
         """
@@ -89,7 +89,7 @@ class ExportCourseTestCase(CourseTestCase):
         artifacts = UserTaskArtifact.objects.filter(status=status)
         self.assertEqual(len(artifacts), 1)
         error = artifacts[0]
-        self.assertEqual(error.name, u'Error')
+        self.assertEqual(error.name, 'Error')
         self.assertEqual(error.text, error_message)
 
 
@@ -104,7 +104,7 @@ class ExportLibraryTestCase(LibraryTestCase):
         Verify that a routine library export task succeeds
         """
         key = str(self.lib_key)
-        result = export_olx.delay(self.user.id, key, u'en')
+        result = export_olx.delay(self.user.id, key, 'en')
         status = UserTaskStatus.objects.get(task_id=result.id)
         self.assertEqual(status.state, UserTaskStatus.SUCCEEDED)
         artifacts = UserTaskArtifact.objects.filter(status=status)
diff --git a/cms/djangoapps/contentstore/tests/test_transcripts_utils.py b/cms/djangoapps/contentstore/tests/test_transcripts_utils.py
index b21cc74e24109707f96ff57d906b5c29993fe850..799cdd5b5551b38ab0f89f31a5272d9cfd40a2ca 100644
--- a/cms/djangoapps/contentstore/tests/test_transcripts_utils.py
+++ b/cms/djangoapps/contentstore/tests/test_transcripts_utils.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """ Tests for transcripts_utils. """
 
 
@@ -7,6 +6,7 @@ import json
 import tempfile
 import textwrap
 import unittest
+from unittest.mock import Mock, patch
 from uuid import uuid4
 
 import ddt
@@ -14,8 +14,6 @@ import pytest
 from django.conf import settings
 from django.test.utils import override_settings
 from django.utils import translation
-from mock import Mock, patch
-from six import text_type
 
 from cms.djangoapps.contentstore.tests.utils import mock_requests_get
 from common.djangoapps.student.tests.factories import UserFactory
@@ -33,7 +31,7 @@ TEST_DATA_CONTENTSTORE['DOC_STORE_CONFIG']['db'] = 'test_xcontent_%s' % uuid4().
 class TestGenerateSubs(unittest.TestCase):
     """Tests for `generate_subs` function."""
     def setUp(self):
-        super(TestGenerateSubs, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.source_subs = {
             'start': [100, 200, 240, 390, 1000],
@@ -104,11 +102,11 @@ class TestSaveSubsToStore(SharedModuleStoreTestCase):
         """
         A helper to compute a static file location from a subtitle id.
         """
-        return StaticContent.compute_location(cls.course.id, u'subs_{0}.srt.sjson'.format(sub_id))
+        return StaticContent.compute_location(cls.course.id, f'subs_{sub_id}.srt.sjson')
 
     @classmethod
     def setUpClass(cls):
-        super(TestSaveSubsToStore, cls).setUpClass()
+        super().setUpClass()
         cls.course = CourseFactory.create(
             org=cls.org, number=cls.number, display_name=cls.display_name)
 
@@ -125,8 +123,8 @@ class TestSaveSubsToStore(SharedModuleStoreTestCase):
         }
 
         # Prefix it to ensure that unicode filenames are allowed
-        cls.subs_id = u'uniçøde_{}'.format(uuid4())
-        cls.subs_copied_id = u'cøpy_{}'.format(uuid4())
+        cls.subs_id = f'uniçøde_{uuid4()}'
+        cls.subs_copied_id = f'cøpy_{uuid4()}'
 
         cls.content_location = cls.sub_id_to_location(cls.subs_id)
         cls.content_copied_location = cls.sub_id_to_location(cls.subs_copied_id)
@@ -138,7 +136,7 @@ class TestSaveSubsToStore(SharedModuleStoreTestCase):
         cls.content_location_unjsonable = cls.sub_id_to_location(cls.unjsonable_subs_id)
 
     def setUp(self):
-        super(TestSaveSubsToStore, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.addCleanup(self.clear_subs_content)
         self.clear_subs_content()
 
@@ -186,7 +184,7 @@ class TestYoutubeSubsBase(SharedModuleStoreTestCase):
     """
     @classmethod
     def setUpClass(cls):
-        super(TestYoutubeSubsBase, cls).setUpClass()
+        super().setUpClass()
         cls.course = CourseFactory.create(
             org=cls.org, number=cls.number, display_name=cls.display_name)  # lint-amnesty, pylint: disable=no-member
 
@@ -205,7 +203,7 @@ class TestDownloadYoutubeSubs(TestYoutubeSubsBase):
         """
         Remove, if subtitle content exists.
         """
-        filename = 'subs_{0}.srt.sjson'.format(subs_id)
+        filename = f'subs_{subs_id}.srt.sjson'
         content_location = StaticContent.compute_location(self.course.id, filename)
         try:
             content = contentstore().find(content_location)
@@ -281,7 +279,7 @@ class TestDownloadYoutubeSubs(TestYoutubeSubsBase):
 
         # Check assets status after importing subtitles.
         for subs_id in good_youtube_subs.values():  # lint-amnesty, pylint: disable=undefined-variable
-            filename = 'subs_{0}.srt.sjson'.format(subs_id)
+            filename = f'subs_{subs_id}.srt.sjson'
             content_location = StaticContent.compute_location(
                 self.course.id, filename
             )
@@ -381,7 +379,7 @@ class TestGenerateSubsFromSource(TestDownloadYoutubeSubs):  # lint-amnesty, pyli
 
         # Check assets status after importing subtitles.
         for subs_id in youtube_subs.values():
-            filename = 'subs_{0}.srt.sjson'.format(subs_id)
+            filename = f'subs_{subs_id}.srt.sjson'
             content_location = StaticContent.compute_location(
                 self.course.id, filename
             )
@@ -408,7 +406,7 @@ class TestGenerateSubsFromSource(TestDownloadYoutubeSubs):  # lint-amnesty, pyli
 
         with self.assertRaises(transcripts_utils.TranscriptsGenerationException) as cm:
             transcripts_utils.generate_subs_from_source(youtube_subs, 'BAD_FORMAT', srt_filedata, self.course)
-        exception_message = text_type(cm.exception)
+        exception_message = str(cm.exception)
         self.assertEqual(exception_message, "We support only SubRip (*.srt) transcripts format.")
 
     def test_fail_bad_subs_filedata(self):
@@ -422,7 +420,7 @@ class TestGenerateSubsFromSource(TestDownloadYoutubeSubs):  # lint-amnesty, pyli
 
         with self.assertRaises(transcripts_utils.TranscriptsGenerationException) as cm:
             transcripts_utils.generate_subs_from_source(youtube_subs, 'srt', srt_filedata, self.course)
-        exception_message = text_type(cm.exception)
+        exception_message = str(cm.exception)
         self.assertEqual(exception_message, "Something wrong with SubRip transcripts file during parsing.")
 
 
@@ -561,7 +559,7 @@ class TestTranscript(unittest.TestCase):
     Tests for Transcript class e.g. different transcript conversions.
     """
     def setUp(self):
-        super(TestTranscript, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.srt_transcript = textwrap.dedent("""\
             0
@@ -591,7 +589,7 @@ class TestTranscript(unittest.TestCase):
             }
         """)
 
-        self.txt_transcript = u"Elephant's Dream\nAt the left we can see..."
+        self.txt_transcript = "Elephant's Dream\nAt the left we can see..."
 
     def test_convert_srt_to_txt(self):
         """
@@ -659,10 +657,10 @@ class TestSubsFilename(unittest.TestCase):
     """
 
     def test_unicode(self):
-        name = transcripts_utils.subs_filename(u"˙∆©ƒƒƒ")
-        self.assertEqual(name, u'subs_˙∆©ƒƒƒ.srt.sjson')
-        name = transcripts_utils.subs_filename(u"˙∆©ƒƒƒ", 'uk')
-        self.assertEqual(name, u'uk_subs_˙∆©ƒƒƒ.srt.sjson')
+        name = transcripts_utils.subs_filename("˙∆©ƒƒƒ")
+        self.assertEqual(name, 'subs_˙∆©ƒƒƒ.srt.sjson')
+        name = transcripts_utils.subs_filename("˙∆©ƒƒƒ", 'uk')
+        self.assertEqual(name, 'uk_subs_˙∆©ƒƒƒ.srt.sjson')
 
 
 @ddt.ddt
@@ -710,7 +708,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
     """Tests for `get_transcript` function."""
 
     def setUp(self):
-        super(TestGetTranscript, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.course = CourseFactory.create()
 
@@ -731,8 +729,8 @@ class TestGetTranscript(SharedModuleStoreTestCase):
         self.subs_srt = transcripts_utils.Transcript.convert(json.dumps(self.subs_sjson), 'sjson', 'srt')
 
         self.subs = {
-            u'en': self.subs_srt,
-            u'ur': transcripts_utils.Transcript.convert(json.dumps(self.subs_sjson), 'sjson', 'srt'),
+            'en': self.subs_srt,
+            'ur': transcripts_utils.Transcript.convert(json.dumps(self.subs_sjson), 'sjson', 'srt'),
         }
 
         self.srt_mime_type = transcripts_utils.Transcript.mime_types[transcripts_utils.Transcript.SRT]
@@ -743,15 +741,15 @@ class TestGetTranscript(SharedModuleStoreTestCase):
         self.video = ItemFactory.create(
             category='video',
             parent_location=self.vertical.location,
-            edx_video_id=u'1234-5678-90'
+            edx_video_id='1234-5678-90'
         )
 
-    def create_transcript(self, subs_id, language=u'en', filename='video.srt', youtube_id_1_0='', html5_sources=None):
+    def create_transcript(self, subs_id, language='en', filename='video.srt', youtube_id_1_0='', html5_sources=None):
         """
         create transcript.
         """
         transcripts = {}
-        if language != u'en':
+        if language != 'en':
             transcripts = {language: filename}
 
         html5_sources = html5_sources or []
@@ -761,7 +759,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
             sub=subs_id,
             youtube_id_1_0=youtube_id_1_0,
             transcripts=transcripts,
-            edx_video_id=u'1234-5678-90',
+            edx_video_id='1234-5678-90',
             html5_sources=html5_sources
         )
 
@@ -803,9 +801,9 @@ class TestGetTranscript(SharedModuleStoreTestCase):
 
     @ddt.data(
         # en lang does not exist so NotFoundError will be raised
-        (u'en',),
+        ('en',),
         # ur lang does not exist so KeyError and then NotFoundError will be raised
-        (u'ur',),
+        ('ur',),
     )
     @ddt.unpack
     def test_get_transcript_not_found(self, lang):
@@ -821,7 +819,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
     @ddt.data(
         # video.sub transcript
         {
-            'language': u'en',
+            'language': 'en',
             'subs_id': 'video_101',
             'youtube_id_1_0': '',
             'html5_sources': [],
@@ -829,7 +827,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
         },
         # if video.sub is present, rest will be skipped.
         {
-            'language': u'en',
+            'language': 'en',
             'subs_id': 'video_101',
             'youtube_id_1_0': 'test_yt_id',
             'html5_sources': ['www.abc.com/foo.mp4'],
@@ -837,7 +835,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
         },
         # video.youtube_id_1_0 transcript
         {
-            'language': u'en',
+            'language': 'en',
             'subs_id': '',
             'youtube_id_1_0': 'test_yt_id',
             'html5_sources': [],
@@ -845,7 +843,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
         },
         # video.html5_sources transcript
         {
-            'language': u'en',
+            'language': 'en',
             'subs_id': '',
             'youtube_id_1_0': '',
             'html5_sources': ['www.abc.com/foo.mp4'],
@@ -853,7 +851,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
         },
         # non-english transcript
         {
-            'language': u'ur',
+            'language': 'ur',
             'subs_id': '',
             'youtube_id_1_0': '',
             'html5_sources': [],
@@ -888,7 +886,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
         """
         Verify that `get_transcript` function returns correct data for non-english when transcript is in content store.
         """
-        language = u'ur'
+        language = 'ur'
         self.create_transcript(self.subs_id, language)
         content, filename, mimetype = transcripts_utils.get_transcript(
             self.video,
@@ -928,7 +926,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
                 output_format='mpeg'
             )
 
-        exception_message = text_type(invalid_format_exception.exception)
+        exception_message = str(invalid_format_exception.exception)
         self.assertEqual(exception_message, 'Invalid transcript format `mpeg`')
 
     def test_get_transcript_no_content(self):
@@ -944,7 +942,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
                 'ur'
             )
 
-        exception_message = text_type(no_content_exception.exception)
+        exception_message = str(no_content_exception.exception)
         self.assertEqual(exception_message, 'No transcript content')
 
     def test_get_transcript_no_en_transcript(self):
@@ -959,7 +957,7 @@ class TestGetTranscript(SharedModuleStoreTestCase):
                 'en'
             )
 
-        exception_message = text_type(no_en_transcript_exception.exception)
+        exception_message = str(no_en_transcript_exception.exception)
         self.assertEqual(exception_message, 'No transcript for `en` language')
 
     @ddt.data(
diff --git a/cms/djangoapps/contentstore/tests/test_users_default_role.py b/cms/djangoapps/contentstore/tests/test_users_default_role.py
index eb92b9c308e143aad23017e878ad2d6bcd8700ef..2bd93d94a41e33814a2c99cf7f1ef2efa454a82a 100644
--- a/cms/djangoapps/contentstore/tests/test_users_default_role.py
+++ b/cms/djangoapps/contentstore/tests/test_users_default_role.py
@@ -6,8 +6,8 @@ after deleting it creates same course again
 
 from cms.djangoapps.contentstore.tests.utils import AjaxEnabledTestClient
 from cms.djangoapps.contentstore.utils import delete_course, reverse_url
-from lms.djangoapps.courseware.tests.factories import UserFactory
 from common.djangoapps.student.models import CourseEnrollment
+from lms.djangoapps.courseware.tests.factories import UserFactory
 from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
 
 
@@ -19,7 +19,7 @@ class TestUsersDefaultRole(ModuleStoreTestCase):
         """
         Add a user and a course
         """
-        super(TestUsersDefaultRole, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         # create and log in a staff user.
         self.user = UserFactory(is_staff=True)
         self.client = AjaxEnabledTestClient()
@@ -49,7 +49,7 @@ class TestUsersDefaultRole(ModuleStoreTestCase):
         Reverse the setup
         """
         self.client.logout()
-        super(TestUsersDefaultRole, self).tearDown()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().tearDown()
 
     def test_user_forum_default_role_on_course_deletion(self):
         """
diff --git a/cms/djangoapps/contentstore/tests/test_utils.py b/cms/djangoapps/contentstore/tests/test_utils.py
index 642a379b06c4a320bc43d56e6534fac98368c486..97e6fd492d6283150819dd4a80ac41fc08c9a848 100644
--- a/cms/djangoapps/contentstore/tests/test_utils.py
+++ b/cms/djangoapps/contentstore/tests/test_utils.py
@@ -4,7 +4,6 @@
 import collections
 from datetime import datetime, timedelta
 
-import six
 from django.test import TestCase
 from opaque_keys.edx.locator import CourseLocator
 from pytz import UTC
@@ -83,7 +82,7 @@ class ExtraPanelTabTestCase(TestCase):
         if tabs is None:
             tabs = []
         course = collections.namedtuple('MockCourse', ['tabs'])
-        if isinstance(tabs, six.string_types):
+        if isinstance(tabs, str):
             course.tabs = self.get_tab_type_dicts(tabs)
         else:
             course.tabs = tabs
@@ -95,7 +94,7 @@ class XBlockVisibilityTestCase(SharedModuleStoreTestCase):
 
     @classmethod
     def setUpClass(cls):
-        super(XBlockVisibilityTestCase, cls).setUpClass()
+        super().setUpClass()
 
         cls.dummy_user = ModuleStoreEnum.UserID.test
         cls.past = datetime(1970, 1, 1, tzinfo=UTC)
@@ -168,7 +167,7 @@ class ReleaseDateSourceTest(CourseTestCase):
     """Tests for finding the source of an xblock's release date."""
 
     def setUp(self):
-        super(ReleaseDateSourceTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.chapter = ItemFactory.create(category='chapter', parent_location=self.course.location)
         self.sequential = ItemFactory.create(category='sequential', parent_location=self.chapter.location)
@@ -222,7 +221,7 @@ class StaffLockTest(CourseTestCase):
     """Base class for testing staff lock functions."""
 
     def setUp(self):
-        super(StaffLockTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.chapter = ItemFactory.create(category='chapter', parent_location=self.course.location)
         self.sequential = ItemFactory.create(category='sequential', parent_location=self.chapter.location)
@@ -332,7 +331,7 @@ class GroupVisibilityTest(CourseTestCase):
     """
 
     def setUp(self):
-        super(GroupVisibilityTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         chapter = ItemFactory.create(category='chapter', parent_location=self.course.location)
         sequential = ItemFactory.create(category='sequential', parent_location=chapter.location)
@@ -432,7 +431,7 @@ class GetUserPartitionInfoTest(ModuleStoreTestCase):
 
     def setUp(self):
         """Create a dummy course. """
-        super(GetUserPartitionInfoTest, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.course = CourseFactory()
         self.block = ItemFactory.create(category="problem", parent_location=self.course.location)
 
@@ -465,18 +464,18 @@ class GetUserPartitionInfoTest(ModuleStoreTestCase):
         expected = [
             {
                 "id": 0,
-                "name": u"Cohort user partition",
-                "scheme": u"cohort",
+                "name": "Cohort user partition",
+                "scheme": "cohort",
                 "groups": [
                     {
                         "id": 0,
-                        "name": u"Group A",
+                        "name": "Group A",
                         "selected": False,
                         "deleted": False,
                     },
                     {
                         "id": 1,
-                        "name": u"Group B",
+                        "name": "Group B",
                         "selected": False,
                         "deleted": False,
                     },
@@ -484,12 +483,12 @@ class GetUserPartitionInfoTest(ModuleStoreTestCase):
             },
             {
                 "id": 1,
-                "name": u"Random user partition",
-                "scheme": u"random",
+                "name": "Random user partition",
+                "scheme": "random",
                 "groups": [
                     {
                         "id": 0,
-                        "name": u"Group C",
+                        "name": "Group C",
                         "selected": False,
                         "deleted": False,
                     },
diff --git a/cms/djangoapps/contentstore/tests/test_video_utils.py b/cms/djangoapps/contentstore/tests/test_video_utils.py
index 71e9643fad5204c859b2381dafcef394d9d354d6..f8f54c07027b7558d4f4e4906f3792a5979f1e71 100644
--- a/cms/djangoapps/contentstore/tests/test_video_utils.py
+++ b/cms/djangoapps/contentstore/tests/test_video_utils.py
@@ -1,4 +1,3 @@
-#-*- coding: utf-8 -*-
 """
 Unit tests for video utils.
 """
@@ -6,16 +5,15 @@ Unit tests for video utils.
 
 from datetime import datetime
 from unittest import TestCase
+from unittest.mock import patch
 
 import ddt
 import pytz
 import requests
-import six
 from django.conf import settings
 from django.core.files.uploadedfile import UploadedFile
 from django.test.utils import override_settings
 from edxval.api import create_profile, create_video, get_course_video_image_url, update_video_image
-from mock import patch
 
 from cms.djangoapps.contentstore.tests.utils import CourseTestCase
 from cms.djangoapps.contentstore.video_utils import (
@@ -59,8 +57,8 @@ class ScrapeVideoThumbnailsTestCase(CourseTestCase):
     """
 
     def setUp(self):
-        super(ScrapeVideoThumbnailsTestCase, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
-        course_ids = [six.text_type(self.course.id)]
+        super().setUp()
+        course_ids = [str(self.course.id)]
         profiles = ['youtube']
         created = datetime.now(pytz.utc)
         previous_uploads = [
@@ -116,7 +114,7 @@ class ScrapeVideoThumbnailsTestCase(CourseTestCase):
         # Create video images.
         with make_image_file() as image_file:
             update_video_image(
-                'test-youtube-video-2', six.text_type(self.course.id), image_file, 'image.jpg'
+                'test-youtube-video-2', str(self.course.id), image_file, 'image.jpg'
             )
 
     def mocked_youtube_thumbnail_response(
@@ -232,7 +230,7 @@ class ScrapeVideoThumbnailsTestCase(CourseTestCase):
         """
         Test that youtube thumbnails are correctly scrapped.
         """
-        course_id = six.text_type(self.course.id)
+        course_id = str(self.course.id)
         video1_edx_video_id = 'test-youtube-video-1'
         video2_edx_video_id = 'test-youtube-video-2'
 
@@ -286,7 +284,7 @@ class ScrapeVideoThumbnailsTestCase(CourseTestCase):
         """
         Test that we get correct logs in case of failure as well as success.
         """
-        course_id = six.text_type(self.course.id)
+        course_id = str(self.course.id)
         video1_edx_video_id = 'test-youtube-video-1'
         mocked_request.side_effect = [
             self.mocked_youtube_thumbnail_response(
@@ -297,13 +295,13 @@ class ScrapeVideoThumbnailsTestCase(CourseTestCase):
         scrape_youtube_thumbnail(course_id, video1_edx_video_id, 'test-yt-id')
         if is_success:
             mock_logger.info.assert_called_with(
-                u'VIDEOS: Scraping youtube video thumbnail for edx_video_id [%s] in course [%s]',
+                'VIDEOS: Scraping youtube video thumbnail for edx_video_id [%s] in course [%s]',
                 video1_edx_video_id,
                 course_id
             )
         else:
             mock_logger.info.assert_called_with(
-                u'VIDEOS: Scraping youtube video thumbnail failed for edx_video_id [%s] in course [%s] with error: %s',
+                'VIDEOS: Scraping youtube video thumbnail failed for edx_video_id [%s] in course [%s] with error: %s',
                 video1_edx_video_id,
                 course_id,
                 'This image file must be larger than 2 KB.'
@@ -313,21 +311,21 @@ class ScrapeVideoThumbnailsTestCase(CourseTestCase):
         (
             None,
             'image/jpeg',
-            u'This image file must be larger than {image_min_size}.'.format(
+            'This image file must be larger than {image_min_size}.'.format(
                 image_min_size=settings.VIDEO_IMAGE_MIN_FILE_SIZE_KB
             )
         ),
         (
             b'dummy-content',
             None,
-            u'This image file type is not supported. Supported file types are {supported_file_formats}.'.format(
+            'This image file type is not supported. Supported file types are {supported_file_formats}.'.format(
                 supported_file_formats=list(settings.VIDEO_IMAGE_SUPPORTED_FILE_FORMATS.keys())
             )
         ),
         (
             None,
             None,
-            u'This image file type is not supported. Supported file types are {supported_file_formats}.'.format(
+            'This image file type is not supported. Supported file types are {supported_file_formats}.'.format(
                 supported_file_formats=list(settings.VIDEO_IMAGE_SUPPORTED_FILE_FORMATS.keys())
             )
         ),
@@ -347,7 +345,7 @@ class ScrapeVideoThumbnailsTestCase(CourseTestCase):
         Test that when no thumbnail is downloaded, video image is not updated.
         """
         mock_download_youtube_thumbnail.return_value = image_content, image_content_type
-        course_id = six.text_type(self.course.id)
+        course_id = str(self.course.id)
         video1_edx_video_id = 'test-youtube-video-1'
 
         # Verify that video1 has no image attached.
@@ -358,7 +356,7 @@ class ScrapeVideoThumbnailsTestCase(CourseTestCase):
         scrape_youtube_thumbnail(course_id, video1_edx_video_id, 'test-yt-id')
 
         mock_logger.info.assert_called_with(
-            u'VIDEOS: Scraping youtube video thumbnail failed for edx_video_id [%s] in course [%s] with error: %s',
+            'VIDEOS: Scraping youtube video thumbnail failed for edx_video_id [%s] in course [%s] with error: %s',
             video1_edx_video_id,
             course_id,
             error_message
diff --git a/cms/djangoapps/contentstore/tests/tests.py b/cms/djangoapps/contentstore/tests/tests.py
index 19837e7136548b0e5a948bde17ad5e5debdf206f..8424e144b481ac506c4b0a59dc2e92713445f46a 100644
--- a/cms/djangoapps/contentstore/tests/tests.py
+++ b/cms/djangoapps/contentstore/tests/tests.py
@@ -5,8 +5,8 @@ This test file will test registration, login, activation, and session activity t
 
 import datetime
 import time
+from unittest import mock
 
-import mock
 from ddt import data, ddt, unpack
 from django.conf import settings
 from django.core.cache import cache
@@ -91,7 +91,7 @@ class AuthTestCase(ContentStoreTestCase):
     ENABLED_CACHES = ['default', 'mongo_metadata_inheritance', 'loc_cache']
 
     def setUp(self):
-        super(AuthTestCase, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.email = 'a@b.com'
         self.pw = 'xyz'
@@ -127,7 +127,7 @@ class AuthTestCase(ContentStoreTestCase):
         # Not logged in.  Should redirect to login.
         print('Not logged in')
         for page in auth_pages:
-            print(u"Checking '{0}'".format(page))
+            print(f"Checking '{page}'")
             self.check_page_get(page, expected=302)
 
         # Logged in should work.
@@ -135,7 +135,7 @@ class AuthTestCase(ContentStoreTestCase):
 
         print('Logged in')
         for page in simple_auth_pages:
-            print(u"Checking '{0}'".format(page))
+            print(f"Checking '{page}'")
             self.check_page_get(page, expected=200)
 
     @override_settings(SESSION_INACTIVITY_TIMEOUT_IN_SECONDS=1)
@@ -176,7 +176,7 @@ class AuthTestCase(ContentStoreTestCase):
             assertion_method = getattr(self, assertion_method_name)
             assertion_method(
                 response,
-                u'<a class="action action-signup" href="{}/register?next=http%3A%2F%2Ftestserver%2F">Sign Up</a>'.format
+                '<a class="action action-signup" href="{}/register?next=http%3A%2F%2Ftestserver%2F">Sign Up</a>'.format
                 (settings.LMS_ROOT_URL)
             )
             self.assertContains(
@@ -191,7 +191,7 @@ class ForumTestCase(CourseTestCase):
 
     def setUp(self):
         """ Creates the test course. """
-        super(ForumTestCase, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.course = CourseFactory.create(org='testX', number='727', display_name='Forum Course')
 
     def set_blackout_dates(self, blackout_dates):
@@ -242,7 +242,7 @@ class CourseKeyVerificationTestCase(CourseTestCase):
         """
         Create test course.
         """
-        super(CourseKeyVerificationTestCase, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
         self.course = CourseFactory.create(org='edX', number='test_course_key', display_name='Test Course')
 
     @data(('edX/test_course_key/Test_Course', 200), ('garbage:edX+test_course_key+Test_Course', 404))
@@ -251,7 +251,7 @@ class CourseKeyVerificationTestCase(CourseTestCase):
         """
         Tests for the ensure_valid_course_key decorator.
         """
-        url = '/import/{course_key}'.format(course_key=course_key)
+        url = f'/import/{course_key}'
         resp = self.client.get_html(url)
         self.assertEqual(resp.status_code, status_code)
 
diff --git a/cms/djangoapps/contentstore/tests/utils.py b/cms/djangoapps/contentstore/tests/utils.py
index f739e6bf866e1380e4024ad21f32805909ee2ac9..7389a5a7e111476c5af40383e0eee52cfc81b0c9 100644
--- a/cms/djangoapps/contentstore/tests/utils.py
+++ b/cms/djangoapps/contentstore/tests/utils.py
@@ -5,12 +5,11 @@ Utilities for contentstore tests
 
 import json
 import textwrap
+from unittest.mock import Mock
 
-import six
 from django.conf import settings
 from django.contrib.auth.models import User  # lint-amnesty, pylint: disable=imported-auth-user
 from django.test.client import Client
-from mock import Mock
 from opaque_keys.edx.keys import AssetKey, CourseKey
 
 from cms.djangoapps.contentstore.utils import reverse_url
@@ -51,7 +50,7 @@ class AjaxEnabledTestClient(Client):
         Convenience method for client post which serializes the data into json and sets the accept type
         to json
         """
-        if not isinstance(data, six.string_types):
+        if not isinstance(data, str):
             data = json.dumps(data or {})
         kwargs.setdefault("HTTP_X_REQUESTED_WITH", "XMLHttpRequest")
         kwargs.setdefault("HTTP_ACCEPT", "application/json")
@@ -84,7 +83,7 @@ class CourseTestCase(ProceduralCourseTestMixin, ModuleStoreTestCase):
         afterwards.
         """
 
-        super(CourseTestCase, self).setUp()  # lint-amnesty, pylint: disable=super-with-arguments
+        super().setUp()
 
         self.client = AjaxEnabledTestClient()
         self.client.login(username=self.user.username, password=self.user_password)
@@ -195,7 +194,7 @@ class CourseTestCase(ProceduralCourseTestMixin, ModuleStoreTestCase):
         html_module = self.store.get_item(course_id.make_usage_key('html', 'nonportable'))
         new_data = html_module.data = html_module.data.replace(
             '/static/',
-            '/c4x/{0}/{1}/asset/'.format(course_id.org, course_id.course)
+            f'/c4x/{course_id.org}/{course_id.course}/asset/'
         )
         self.store.update_item(html_module, self.user.id)
 
@@ -285,10 +284,10 @@ class CourseTestCase(ProceduralCourseTestMixin, ModuleStoreTestCase):
         course2_items = self.store.get_items(course2_id)
         self.assertGreater(len(course1_items), 0)  # ensure it found content instead of [] == []
         if len(course1_items) != len(course2_items):
-            course1_block_ids = set([item.location.block_id for item in course1_items])  # lint-amnesty, pylint: disable=consider-using-set-comprehension
-            course2_block_ids = set([item.location.block_id for item in course2_items])  # lint-amnesty, pylint: disable=consider-using-set-comprehension
+            course1_block_ids = {item.location.block_id for item in course1_items}
+            course2_block_ids = {item.location.block_id for item in course2_items}
             raise AssertionError(
-                u"Course1 extra blocks: {}; course2 extra blocks: {}".format(
+                "Course1 extra blocks: {}; course2 extra blocks: {}".format(
                     course1_block_ids - course2_block_ids, course2_block_ids - course1_block_ids
                 )
             )
@@ -357,7 +356,7 @@ class CourseTestCase(ProceduralCourseTestMixin, ModuleStoreTestCase):
         course1_asset_attrs = content_store.get_attrs(course1_id.make_asset_key(category, filename))
         course2_asset_attrs = content_store.get_attrs(course2_id.make_asset_key(category, filename))
         self.assertEqual(len(course1_asset_attrs), len(course2_asset_attrs))
-        for key, value in six.iteritems(course1_asset_attrs):
+        for key, value in course1_asset_attrs.items():
             if key in ['_id', 'filename', 'uploadDate', 'content_son', 'thumbnail_location']:
                 pass
             else: