diff --git a/openedx/features/course_bookmarks/tests/test_course_bookmarks.py b/openedx/features/course_bookmarks/tests/test_course_bookmarks.py index e71fc909c7c6949396dbce9e879b9318dd391991..264bc26e4448f06d5581ed1cee06355667b9b773 100644 --- a/openedx/features/course_bookmarks/tests/test_course_bookmarks.py +++ b/openedx/features/course_bookmarks/tests/test_course_bookmarks.py @@ -24,7 +24,7 @@ class TestCourseBookmarksTool(SharedModuleStoreTestCase): Set up a course to be used for testing. """ # pylint: disable=super-method-not-called - with super(TestCourseBookmarksTool, cls).setUpClassAndTestData(): + with super().setUpClassAndTestData(): with cls.store.default_store(ModuleStoreEnum.Type.split): cls.course = CourseFactory.create() with cls.store.bulk_operations(cls.course.id): diff --git a/openedx/features/course_bookmarks/views/course_bookmarks.py b/openedx/features/course_bookmarks/views/course_bookmarks.py index 25b0783d4389f766e5191a3ff614e15f4aba7d69..b5a98e048381d021138122f647860f14edc5afb9 100644 --- a/openedx/features/course_bookmarks/views/course_bookmarks.py +++ b/openedx/features/course_bookmarks/views/course_bookmarks.py @@ -43,7 +43,7 @@ class CourseBookmarksView(View): course_key = CourseKey.from_string(course_id) course = get_course_with_access(request.user, 'load', course_key, check_if_enrolled=True) course_url_name = default_course_url_name(course.id) - course_url = reverse(course_url_name, kwargs={'course_id': six.text_type(course.id)}) + course_url = reverse(course_url_name, kwargs={'course_id': str(course.id)}) # Render the bookmarks list as a fragment bookmarks_fragment = CourseBookmarksFragmentView().render_to_fragment(request, course_id=course_id) diff --git a/openedx/features/course_duration_limits/access.py b/openedx/features/course_duration_limits/access.py index 0e498fcee722d4c15176d1e502dc1498d19c5581..60f9491ecd5f324cf25ab2e452e94a1355a42c90 100644 --- a/openedx/features/course_duration_limits/access.py +++ b/openedx/features/course_duration_limits/access.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Contains code related to computing content gating course duration limits and course access based on these limits. @@ -28,7 +27,7 @@ class AuditExpiredError(AccessError): """ def __init__(self, user, course, expiration_date): error_code = 'audit_expired' - developer_message = 'User {} had access to {} until {}'.format(user, course, expiration_date) + developer_message = f'User {user} had access to {course} until {expiration_date}' expiration_date = strftime_localized(expiration_date, 'SHORT_DATE') user_message = _('Access expired on {expiration_date}').format(expiration_date=expiration_date) try: @@ -42,8 +41,9 @@ class AuditExpiredError(AccessError): ' for expired on {expiration_date}').format( expiration_date=expiration_date ) - super(AuditExpiredError, self).__init__(error_code, developer_message, user_message, # lint-amnesty, pylint: disable=super-with-arguments - additional_context_user_message) + + # lint-amnesty, pylint: disable=super-with-arguments + super().__init__(error_code, developer_message, user_message, additional_context_user_message) def get_user_course_duration(user, course): @@ -219,7 +219,7 @@ def generate_course_expired_fragment_from_key(user, course_key): shouldn't show a course expired message for this user. """ request_cache = RequestCache('generate_course_expired_fragment_from_key') - cache_key = 'message:{},{}'.format(user.id, course_key) + cache_key = f'message:{user.id},{course_key}' cache_response = request_cache.get_cached_response(cache_key) if cache_response.is_found: cached_message = cache_response.value diff --git a/openedx/features/course_duration_limits/admin.py b/openedx/features/course_duration_limits/admin.py index 56e64f5c9f36bb3da0117dd0b62b71a8019af48f..00efbcfb723c145875fd0f0fd528313e2cad3617 100644 --- a/openedx/features/course_duration_limits/admin.py +++ b/openedx/features/course_duration_limits/admin.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Django Admin pages for CourseDurationLimitConfig. """ diff --git a/openedx/features/course_duration_limits/migrations/0001_initial.py b/openedx/features/course_duration_limits/migrations/0001_initial.py index 9d4eda696bfb90c79a677931f10f6de2e3e7ce77..c233db4904587cf5f9a8a5579babf1b1f25b37ca 100644 --- a/openedx/features/course_duration_limits/migrations/0001_initial.py +++ b/openedx/features/course_duration_limits/migrations/0001_initial.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.11.16 on 2018-11-08 19:43 diff --git a/openedx/features/course_duration_limits/migrations/0002_auto_20181119_0959.py b/openedx/features/course_duration_limits/migrations/0002_auto_20181119_0959.py index fc13db3c6346354b33a06c35315c966234fdd210..c13e3aa5f2f42ccd77f23e7a657aae37a3ee1d0d 100644 --- a/openedx/features/course_duration_limits/migrations/0002_auto_20181119_0959.py +++ b/openedx/features/course_duration_limits/migrations/0002_auto_20181119_0959.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.11.16 on 2018-11-19 14:59 diff --git a/openedx/features/course_duration_limits/migrations/0003_auto_20181128_1407.py b/openedx/features/course_duration_limits/migrations/0003_auto_20181128_1407.py index f656e439873f82128a86c153e2e9568c1e266688..2f25cee76990e8ca80b1a17b06a640473ca59d73 100644 --- a/openedx/features/course_duration_limits/migrations/0003_auto_20181128_1407.py +++ b/openedx/features/course_duration_limits/migrations/0003_auto_20181128_1407.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.11.16 on 2018-11-28 19:07 diff --git a/openedx/features/course_duration_limits/migrations/0004_auto_20181128_1521.py b/openedx/features/course_duration_limits/migrations/0004_auto_20181128_1521.py index 94f97f6f69a1361a8a124b29543e94108da7047e..cb85f856abb3201c5ef04116b98e1a508273be35 100644 --- a/openedx/features/course_duration_limits/migrations/0004_auto_20181128_1521.py +++ b/openedx/features/course_duration_limits/migrations/0004_auto_20181128_1521.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.11.16 on 2018-11-28 20:21 diff --git a/openedx/features/course_duration_limits/migrations/0005_auto_20190306_1546.py b/openedx/features/course_duration_limits/migrations/0005_auto_20190306_1546.py index ca7748e5007d29c5c9aa8cc42583d4b224509fc1..cbbb50b234f71e3d885550d1e90fb56f0b4ae670 100644 --- a/openedx/features/course_duration_limits/migrations/0005_auto_20190306_1546.py +++ b/openedx/features/course_duration_limits/migrations/0005_auto_20190306_1546.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.11.20 on 2019-03-06 15:46 diff --git a/openedx/features/course_duration_limits/migrations/0006_auto_20190308_1447.py b/openedx/features/course_duration_limits/migrations/0006_auto_20190308_1447.py index d0e0b26204a9ead64c22bd17b148d24bc69e5cf5..5d05b030a3b0213f1396a086f6d6b06323aed044 100644 --- a/openedx/features/course_duration_limits/migrations/0006_auto_20190308_1447.py +++ b/openedx/features/course_duration_limits/migrations/0006_auto_20190308_1447.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.11.20 on 2019-03-08 14:47 diff --git a/openedx/features/course_duration_limits/migrations/0007_auto_20190311_1919.py b/openedx/features/course_duration_limits/migrations/0007_auto_20190311_1919.py index d06d18cb437e74a82bef11a05069d4eaac18211f..10813ce59ca966c5d23c76679bde19d0fc637d0f 100644 --- a/openedx/features/course_duration_limits/migrations/0007_auto_20190311_1919.py +++ b/openedx/features/course_duration_limits/migrations/0007_auto_20190311_1919.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.11.20 on 2019-03-11 19:19 diff --git a/openedx/features/course_duration_limits/migrations/0008_auto_20190313_1634.py b/openedx/features/course_duration_limits/migrations/0008_auto_20190313_1634.py index 60f357de12aaf9604d8cbae814f035500d99c1bd..0c0377d4a7b1254e70cd6046f7e2ee79ad4f526d 100644 --- a/openedx/features/course_duration_limits/migrations/0008_auto_20190313_1634.py +++ b/openedx/features/course_duration_limits/migrations/0008_auto_20190313_1634.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Generated by Django 1.11.20 on 2019-03-13 16:34 diff --git a/openedx/features/course_duration_limits/tests/test_access.py b/openedx/features/course_duration_limits/tests/test_access.py index 8b18d3a9bdf8d6a9739e30f6688164dab8be7ad8..263561dd5a96abfb3cdfb74418b236d6d66ad30f 100644 --- a/openedx/features/course_duration_limits/tests/test_access.py +++ b/openedx/features/course_duration_limits/tests/test_access.py @@ -32,7 +32,7 @@ from common.djangoapps.util.date_utils import strftime_localized class TestAccess(CacheIsolationTestCase): """Tests of openedx.features.course_duration_limits.access""" def setUp(self): - super(TestAccess, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments + super().setUp() # lint-amnesty, pylint: disable=super-with-arguments CourseDurationLimitConfig.objects.create(enabled=True, enabled_as_of=datetime(2018, 1, 1, tzinfo=UTC)) DynamicUpgradeDeadlineConfiguration.objects.create(enabled=True) diff --git a/openedx/features/course_duration_limits/tests/test_course_expiration.py b/openedx/features/course_duration_limits/tests/test_course_expiration.py index ee0edc4e183137ef9ebf3bfb26ec1f43088e99cc..54470bb702086f5702ce66019a73f3548ce0b480 100644 --- a/openedx/features/course_duration_limits/tests/test_course_expiration.py +++ b/openedx/features/course_duration_limits/tests/test_course_expiration.py @@ -3,15 +3,18 @@ Contains tests to verify correctness of course expiration functionality """ from datetime import timedelta +from unittest import mock import ddt -import mock import six from django.conf import settings from django.urls import reverse from django.utils.timezone import now from common.djangoapps.course_modes.models import CourseMode +from common.djangoapps.student.models import CourseEnrollment, FBEEnrollmentExclusion +from common.djangoapps.student.roles import CourseInstructorRole +from common.djangoapps.student.tests.factories import TEST_PASSWORD, CourseEnrollmentFactory, UserFactory from lms.djangoapps.courseware.tests.factories import ( BetaTesterFactory, GlobalStaffFactory, @@ -35,9 +38,6 @@ from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITIO from openedx.features.course_duration_limits.access import get_user_course_expiration_date from openedx.features.course_duration_limits.models import CourseDurationLimitConfig from openedx.features.course_experience.tests.views.helpers import add_course_mode -from common.djangoapps.student.models import CourseEnrollment, FBEEnrollmentExclusion -from common.djangoapps.student.roles import CourseInstructorRole -from common.djangoapps.student.tests.factories import TEST_PASSWORD, CourseEnrollmentFactory, UserFactory from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory from xmodule.partitions.partitions import ENROLLMENT_TRACK_PARTITION_ID @@ -48,7 +48,7 @@ from xmodule.partitions.partitions import ENROLLMENT_TRACK_PARTITION_ID class CourseExpirationTestCase(ModuleStoreTestCase, MasqueradeMixin): """Tests to verify the get_user_course_expiration_date function is working correctly""" def setUp(self): - super(CourseExpirationTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments + super().setUp() # lint-amnesty, pylint: disable=super-with-arguments self.course = CourseFactory( start=now() - timedelta(weeks=10), ) @@ -61,7 +61,7 @@ class CourseExpirationTestCase(ModuleStoreTestCase, MasqueradeMixin): def tearDown(self): CourseEnrollment.unenroll(self.user, self.course.id) - super(CourseExpirationTestCase, self).tearDown() # lint-amnesty, pylint: disable=super-with-arguments + super().tearDown() # lint-amnesty, pylint: disable=super-with-arguments def test_enrollment_mode(self): """Tests that verified enrollments do not have an expiration""" @@ -236,10 +236,10 @@ class CourseExpirationTestCase(ModuleStoreTestCase, MasqueradeMixin): self.update_masquerade(**masquerade_config) - course_home_url = reverse('openedx.course_experience.course_home', args=[six.text_type(self.course.id)]) + course_home_url = reverse('openedx.course_experience.course_home', args=[str(self.course.id)]) response = self.client.get(course_home_url, follow=True) assert response.status_code == 200 - six.assertCountEqual(self, response.redirect_chain, []) + self.assertCountEqual(response.redirect_chain, []) banner_text = 'You lose all access to this course, including your progress,' if show_expiration_banner: self.assertContains(response, banner_text) @@ -273,10 +273,10 @@ class CourseExpirationTestCase(ModuleStoreTestCase, MasqueradeMixin): self.update_masquerade(username='audit') - course_home_url = reverse('openedx.course_experience.course_home', args=[six.text_type(self.course.id)]) + course_home_url = reverse('openedx.course_experience.course_home', args=[str(self.course.id)]) response = self.client.get(course_home_url, follow=True) assert response.status_code == 200 - six.assertCountEqual(self, response.redirect_chain, []) + self.assertCountEqual(response.redirect_chain, []) banner_text = 'You lose all access to this course, including your progress,' self.assertNotContains(response, banner_text) @@ -309,10 +309,10 @@ class CourseExpirationTestCase(ModuleStoreTestCase, MasqueradeMixin): self.update_masquerade(username='audit') - course_home_url = reverse('openedx.course_experience.course_home', args=[six.text_type(self.course.id)]) + course_home_url = reverse('openedx.course_experience.course_home', args=[str(self.course.id)]) response = self.client.get(course_home_url, follow=True) assert response.status_code == 200 - six.assertCountEqual(self, response.redirect_chain, []) + self.assertCountEqual(response.redirect_chain, []) banner_text = 'This learner does not have access to this course. Their access expired on' self.assertContains(response, banner_text) @@ -360,10 +360,10 @@ class CourseExpirationTestCase(ModuleStoreTestCase, MasqueradeMixin): self.update_masquerade(username=expired_staff.username) - course_home_url = reverse('openedx.course_experience.course_home', args=[six.text_type(self.course.id)]) + course_home_url = reverse('openedx.course_experience.course_home', args=[str(self.course.id)]) response = self.client.get(course_home_url, follow=True) assert response.status_code == 200 - six.assertCountEqual(self, response.redirect_chain, []) + self.assertCountEqual(response.redirect_chain, []) banner_text = 'This learner does not have access to this course. Their access expired on' self.assertNotContains(response, banner_text) @@ -409,9 +409,9 @@ class CourseExpirationTestCase(ModuleStoreTestCase, MasqueradeMixin): self.update_masquerade(username=expired_staff.username) - course_home_url = reverse('openedx.course_experience.course_home', args=[six.text_type(self.course.id)]) + course_home_url = reverse('openedx.course_experience.course_home', args=[str(self.course.id)]) response = self.client.get(course_home_url, follow=True) assert response.status_code == 200 - six.assertCountEqual(self, response.redirect_chain, []) + self.assertCountEqual(response.redirect_chain, []) banner_text = 'This learner does not have access to this course. Their access expired on' self.assertNotContains(response, banner_text) diff --git a/openedx/features/course_duration_limits/tests/test_models.py b/openedx/features/course_duration_limits/tests/test_models.py index 5f3878aa2ef9db4b613f383d87c7360f0107d4db..0473faefd3304a1c9b7f342690da950a3b5f1319 100644 --- a/openedx/features/course_duration_limits/tests/test_models.py +++ b/openedx/features/course_duration_limits/tests/test_models.py @@ -4,13 +4,13 @@ Tests of CourseDurationLimitConfig. import itertools from datetime import datetime, timedelta +from unittest.mock import Mock import ddt import pytest import pytz from django.utils import timezone from edx_django_utils.cache import RequestCache -from mock import Mock from opaque_keys.edx.locator import CourseLocator from common.djangoapps.course_modes.tests.factories import CourseModeFactory @@ -35,7 +35,7 @@ class TestCourseDurationLimitConfig(CacheIsolationTestCase): CourseModeFactory.create(course_id=self.course_overview.id, mode_slug='audit') CourseModeFactory.create(course_id=self.course_overview.id, mode_slug='verified') self.user = UserFactory.create() - super(TestCourseDurationLimitConfig, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments + super().setUp() # lint-amnesty, pylint: disable=super-with-arguments @ddt.data( (True, True), @@ -188,7 +188,7 @@ class TestCourseDurationLimitConfig(CacheIsolationTestCase): ) for org_setting in (True, False, None): - test_org = "{}-{}".format(test_site_cfg.id, org_setting) + test_org = f"{test_site_cfg.id}-{org_setting}" test_site_cfg.site_values['course_org_filter'].append(test_org) test_site_cfg.save() @@ -199,7 +199,7 @@ class TestCourseDurationLimitConfig(CacheIsolationTestCase): for course_setting in (True, False, None): test_course = CourseOverviewFactory.create( org=test_org, - id=CourseLocator(test_org, 'test_course', 'run-{}'.format(course_setting)) + id=CourseLocator(test_org, 'test_course', f'run-{course_setting}') ) CourseDurationLimitConfig.objects.create( course=test_course, enabled=course_setting, enabled_as_of=datetime(2018, 1, 1, tzinfo=pytz.UTC) # lint-amnesty, pylint: disable=line-too-long