Skip to content

Commit 038a651

Browse files
authored
Merge branch 'master' into pwnage101/ENT-11563
2 parents 21bbffd + 2fd5857 commit 038a651

1,423 files changed

Lines changed: 22205 additions & 9243 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: Create quarterly issues for GitHub audit
2+
on:
3+
schedule:
4+
- cron: 0 0 1 1,4,7,10 *
5+
workflow_dispatch: {}
6+
7+
env:
8+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
9+
10+
jobs:
11+
create_issue:
12+
name: Create quarterly constraint check issue
13+
runs-on: ubuntu-latest
14+
permissions:
15+
issues: write
16+
steps:
17+
- run: |
18+
# Platform constraints audit
19+
new_issue_url=$(gh issue create --repo "openedx/openedx-platform" \
20+
--title "Quarterly audit of openedx-platform constraints" \
21+
--label "code health" \
22+
--body "It is time to perform the quartely audit of constrained dependencies in \`openedx-platform\`. The goal is to remove any constraints that are no longer necessary to proactively prevent version conflicts and keep us up to date with security patches. The playbook for performing the audit can be found [here](https://openedx.atlassian.net/wiki/spaces/AC/pages/6340968449/Quarterly+Platform+Constraints+Audit).")
23+
echo "NEW_ISSUE_URL=$new_issue_url" >> $GITHUB_ENV
24+
25+
- name: Comment on issue
26+
run: gh issue comment $NEW_ISSUE_URL --body "@openedx/wg-maintenance-openedx-platform-oncall heads up on this request"

README.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,11 @@ Code of Conduct
293293

294294
Please read the `Community Code of Conduct`_ for interacting with this repository.
295295

296+
AI Contribution Policy
297+
**********************
298+
299+
Note that contributions are expected to follow the Open edX `AI Contribution Policy`_.
300+
296301
Reporting Security Issues
297302
*************************
298303

@@ -302,6 +307,7 @@ security@openedx.org.
302307
.. _individual contributor agreement: https://openedx.org/cla
303308
.. _CONTRIBUTING: https://github.com/openedx/.github/blob/master/CONTRIBUTING.md
304309
.. _Community Code of Conduct: https://openedx.org/code-of-conduct/
310+
.. _AI Contribution Policy: https://github.com/openedx/.github/blob/master/AI_POLICY.md
305311

306312
People
307313
******

cms/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@
2121
# This will make sure the app is always imported when Django starts so
2222
# that shared_task will use this app, and also ensures that the celery
2323
# singleton is always configured for the CMS.
24-
from .celery import APP as CELERY_APP # lint-amnesty, pylint: disable=wrong-import-position # noqa: F401
24+
from .celery import APP as CELERY_APP # pylint: disable=wrong-import-position # noqa: F401

cms/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,4 @@ def _django_clear_site_cache():
4040
clearing mechanism actually works. So override this fixture to not mess
4141
with what has been working for us so far.
4242
"""
43-
pass # lint-amnesty, pylint: disable=unnecessary-pass
43+
pass # pylint: disable=unnecessary-pass

cms/djangoapps/api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
# lint-amnesty, pylint: disable=missing-module-docstring
1+
# pylint: disable=missing-module-docstring

cms/djangoapps/api/v1/serializers/course_runs.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from cms.djangoapps.contentstore.views.course import create_new_course, get_course_and_check_access, rerun_course
1414
from common.djangoapps.student.models import CourseAccessRole
1515
from openedx.core.lib.courses import course_image_url
16-
from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order
16+
from xmodule.modulestore.django import modulestore # pylint: disable=wrong-import-order
1717

1818
IMAGE_TYPES = {
1919
'image/jpeg': 'jpg',
@@ -23,29 +23,29 @@
2323
log = logging.getLogger(__name__)
2424

2525

26-
class CourseAccessRoleSerializer(serializers.ModelSerializer): # lint-amnesty, pylint: disable=missing-class-docstring
26+
class CourseAccessRoleSerializer(serializers.ModelSerializer): # pylint: disable=missing-class-docstring
2727
user = serializers.SlugRelatedField(slug_field='username', queryset=User.objects.all())
2828

2929
class Meta:
3030
model = CourseAccessRole
3131
fields = ('user', 'role',)
3232

3333

34-
class CourseRunScheduleSerializer(serializers.Serializer): # lint-amnesty, pylint: disable=abstract-method
34+
class CourseRunScheduleSerializer(serializers.Serializer): # pylint: disable=abstract-method
3535
start = serializers.DateTimeField()
3636
end = serializers.DateTimeField()
3737
enrollment_start = serializers.DateTimeField(allow_null=True, required=False)
3838
enrollment_end = serializers.DateTimeField(allow_null=True, required=False)
3939

4040

41-
class CourseRunTeamSerializer(serializers.Serializer): # lint-amnesty, pylint: disable=abstract-method, missing-class-docstring
41+
class CourseRunTeamSerializer(serializers.Serializer): # pylint: disable=abstract-method, missing-class-docstring
4242
def to_internal_value(self, data):
4343
"""Overriding this to support deserialization, for write operations."""
4444
for member in data:
4545
try:
4646
User.objects.get(username=member['user'])
4747
except User.DoesNotExist:
48-
raise serializers.ValidationError( # lint-amnesty, pylint: disable=raise-missing-from # noqa: B904
48+
raise serializers.ValidationError( # pylint: disable=raise-missing-from # noqa: B904
4949
_('Course team user does not exist')
5050
)
5151

@@ -61,10 +61,10 @@ def get_attribute(self, instance):
6161
return instance
6262

6363

64-
class CourseRunTeamSerializerMixin(serializers.Serializer): # lint-amnesty, pylint: disable=abstract-method, missing-class-docstring
64+
class CourseRunTeamSerializerMixin(serializers.Serializer): # pylint: disable=abstract-method, missing-class-docstring
6565
team = CourseRunTeamSerializer(required=False)
6666

67-
def update_team(self, instance, team): # lint-amnesty, pylint: disable=missing-function-docstring
67+
def update_team(self, instance, team): # pylint: disable=missing-function-docstring
6868
# Existing data should remain intact when performing a partial update.
6969
if not self.partial:
7070
CourseAccessRole.objects.filter(course_id=instance.id).delete()
@@ -81,7 +81,7 @@ def update_team(self, instance, team): # lint-amnesty, pylint: disable=missing-
8181
)
8282

8383

84-
class CourseRunImageField(serializers.ImageField): # lint-amnesty, pylint: disable=missing-class-docstring
84+
class CourseRunImageField(serializers.ImageField): # pylint: disable=missing-class-docstring
8585

8686
def get_attribute(self, instance):
8787
return course_image_url(instance)
@@ -92,15 +92,15 @@ def to_representation(self, value):
9292
return request.build_absolute_uri(value)
9393

9494

95-
class CourseRunPacingTypeField(serializers.ChoiceField): # lint-amnesty, pylint: disable=missing-class-docstring
95+
class CourseRunPacingTypeField(serializers.ChoiceField): # pylint: disable=missing-class-docstring
9696
def to_representation(self, value):
9797
return 'self_paced' if value else 'instructor_paced'
9898

9999
def to_internal_value(self, data):
100100
return data == 'self_paced'
101101

102102

103-
class CourseRunImageSerializer(serializers.Serializer): # lint-amnesty, pylint: disable=abstract-method, missing-class-docstring
103+
class CourseRunImageSerializer(serializers.Serializer): # pylint: disable=abstract-method, missing-class-docstring
104104
# We set an empty default to prevent the parent serializer from attempting
105105
# to save this value to the Course object.
106106
card_image = CourseRunImageField(source='course_image', default=empty)
@@ -115,13 +115,13 @@ def update(self, instance, validated_data):
115115
return instance
116116

117117

118-
class CourseRunSerializerCommonFieldsMixin(serializers.Serializer): # lint-amnesty, pylint: disable=abstract-method
118+
class CourseRunSerializerCommonFieldsMixin(serializers.Serializer): # pylint: disable=abstract-method
119119
schedule = CourseRunScheduleSerializer(source='*', required=False)
120120
pacing_type = CourseRunPacingTypeField(source='self_paced', required=False,
121121
choices=((False, 'instructor_paced'), (True, 'self_paced'),))
122122

123123

124-
class CourseRunSerializer(CourseRunSerializerCommonFieldsMixin, CourseRunTeamSerializerMixin, serializers.Serializer): # lint-amnesty, pylint: disable=abstract-method, missing-class-docstring
124+
class CourseRunSerializer(CourseRunSerializerCommonFieldsMixin, CourseRunTeamSerializerMixin, serializers.Serializer): # pylint: disable=abstract-method, missing-class-docstring
125125
id = serializers.CharField(read_only=True)
126126
title = serializers.CharField(source='display_name')
127127
images = CourseRunImageSerializer(source='*', required=False)
@@ -139,7 +139,7 @@ def update(self, instance, validated_data):
139139
return instance
140140

141141

142-
class CourseRunCreateSerializer(CourseRunSerializer): # lint-amnesty, pylint: disable=missing-class-docstring
142+
class CourseRunCreateSerializer(CourseRunSerializer): # pylint: disable=missing-class-docstring
143143
org = serializers.CharField(source='id.org')
144144
number = serializers.CharField(source='id.course')
145145
run = serializers.CharField(source='id.run')
@@ -155,7 +155,7 @@ def create(self, validated_data):
155155
return instance
156156

157157

158-
class CourseRunRerunSerializer(CourseRunSerializerCommonFieldsMixin, CourseRunTeamSerializerMixin, # lint-amnesty, pylint: disable=abstract-method, missing-class-docstring
158+
class CourseRunRerunSerializer(CourseRunSerializerCommonFieldsMixin, CourseRunTeamSerializerMixin, # pylint: disable=abstract-method, missing-class-docstring
159159
serializers.Serializer):
160160
title = serializers.CharField(source='display_name', required=False)
161161
number = serializers.CharField(source='id.course', required=False)
@@ -171,7 +171,7 @@ def validate(self, attrs):
171171
with store.default_store('split'):
172172
new_course_run_key = store.make_course_key(course_run_key.org, number, run)
173173
except InvalidKeyError:
174-
raise serializers.ValidationError( # lint-amnesty, pylint: disable=raise-missing-from # noqa: B904
174+
raise serializers.ValidationError( # pylint: disable=raise-missing-from # noqa: B904
175175
'Invalid key supplied. Ensure there are no special characters in the Course Number.'
176176
)
177177
if store.has_course(new_course_run_key, ignore_case=True):
@@ -200,7 +200,7 @@ def update(self, instance, validated_data):
200200
return course_run
201201

202202

203-
class CourseCloneSerializer(serializers.Serializer): # lint-amnesty, pylint: disable=abstract-method, missing-class-docstring
203+
class CourseCloneSerializer(serializers.Serializer): # pylint: disable=abstract-method, missing-class-docstring
204204
source_course_id = serializers.CharField()
205205
destination_course_id = serializers.CharField()
206206

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@
1111
from common.djangoapps.student.tests.factories import UserFactory
1212
from openedx.core.lib.courses import course_image_url
1313
from xmodule.modulestore.tests.django_utils import (
14-
ModuleStoreTestCase, # lint-amnesty, pylint: disable=wrong-import-order
14+
ModuleStoreTestCase, # pylint: disable=wrong-import-order
1515
)
16-
from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=wrong-import-order
16+
from xmodule.modulestore.tests.factories import CourseFactory # pylint: disable=wrong-import-order
1717

1818
from ...serializers.course_runs import CourseRunSerializer
1919
from ..utils import serialize_datetime
2020

2121

2222
@ddt.ddt
23-
class CourseRunSerializerTests(ModuleStoreTestCase): # lint-amnesty, pylint: disable=missing-class-docstring
23+
class CourseRunSerializerTests(ModuleStoreTestCase): # pylint: disable=missing-class-docstring
2424

2525
def setUp(self):
2626
super().setUp()

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33

44
import datetime
5-
from unittest.mock import patch # lint-amnesty, pylint: disable=unused-import # noqa: F401
5+
from unittest.mock import patch # pylint: disable=unused-import # noqa: F401
66

77
import ddt
88
import pytz
@@ -16,14 +16,14 @@
1616
from common.djangoapps.student.models import CourseAccessRole
1717
from common.djangoapps.student.tests.factories import TEST_PASSWORD, AdminFactory, UserFactory
1818
from openedx.core.lib.courses import course_image_url
19-
from xmodule.contentstore.content import StaticContent # lint-amnesty, pylint: disable=wrong-import-order
20-
from xmodule.contentstore.django import contentstore # lint-amnesty, pylint: disable=wrong-import-order
21-
from xmodule.exceptions import NotFoundError # lint-amnesty, pylint: disable=wrong-import-order
22-
from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order
19+
from xmodule.contentstore.content import StaticContent # pylint: disable=wrong-import-order
20+
from xmodule.contentstore.django import contentstore # pylint: disable=wrong-import-order
21+
from xmodule.exceptions import NotFoundError # pylint: disable=wrong-import-order
22+
from xmodule.modulestore.django import modulestore # pylint: disable=wrong-import-order
2323
from xmodule.modulestore.tests.django_utils import (
24-
ModuleStoreTestCase, # lint-amnesty, pylint: disable=wrong-import-order
24+
ModuleStoreTestCase, # pylint: disable=wrong-import-order
2525
)
26-
from xmodule.modulestore.tests.factories import ( # lint-amnesty, pylint: disable=wrong-import-order
26+
from xmodule.modulestore.tests.factories import ( # pylint: disable=wrong-import-order
2727
CourseFactory,
2828
ToyCourseFactory,
2929
)
@@ -336,15 +336,15 @@ def test_rerun(self, pacing_type, expected_self_paced_value, number):
336336
original_course_run = ToyCourseFactory()
337337
add_organization({
338338
'name': 'Test Organization',
339-
'short_name': original_course_run.id.org, # lint-amnesty, pylint: disable=no-member
339+
'short_name': original_course_run.id.org, # pylint: disable=no-member
340340
'description': 'Testing Organization Description',
341341
})
342342
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
343343
end = start + datetime.timedelta(days=30)
344344
user = UserFactory()
345345
role = 'instructor'
346346
run = '3T2017'
347-
url = reverse('api:v1:course_run-rerun', kwargs={'pk': str(original_course_run.id)}) # lint-amnesty, pylint: disable=no-member
347+
url = reverse('api:v1:course_run-rerun', kwargs={'pk': str(original_course_run.id)}) # pylint: disable=no-member
348348
data = {
349349
'run': run,
350350
'schedule': {
@@ -374,16 +374,16 @@ def test_rerun(self, pacing_type, expected_self_paced_value, number):
374374

375375
if number:
376376
assert course_run.id.course == number
377-
assert course_run.id.course != original_course_run.id.course # lint-amnesty, pylint: disable=no-member
377+
assert course_run.id.course != original_course_run.id.course # pylint: disable=no-member
378378
else:
379-
assert course_run.id.course == original_course_run.id.course # lint-amnesty, pylint: disable=no-member
379+
assert course_run.id.course == original_course_run.id.course # pylint: disable=no-member
380380

381381
self.assert_course_run_schedule(course_run, start, end)
382382
self.assert_access_role(course_run, user, role)
383383
self.assert_course_access_role_count(course_run, 1)
384384
course_orgs = get_course_organizations(course_run_key)
385385
self.assertEqual(len(course_orgs), 1) # noqa: PT009
386-
self.assertEqual(course_orgs[0]['short_name'], original_course_run.id.org) # lint-amnesty, pylint: disable=no-member # noqa: PT009
386+
self.assertEqual(course_orgs[0]['short_name'], original_course_run.id.org) # pylint: disable=no-member # noqa: PT009
387387

388388
def test_rerun_duplicate_run(self):
389389
course_run = ToyCourseFactory()
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
# lint-amnesty, pylint: disable=missing-module-docstring
1+
# pylint: disable=missing-module-docstring
22
def serialize_datetime(d):
33
return d.strftime('%Y-%m-%dT%H:%M:%S.%fZ')

cms/djangoapps/api/v1/views/course_runs.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
)
2020

2121

22-
class CourseRunViewSet(viewsets.GenericViewSet): # lint-amnesty, pylint: disable=missing-class-docstring
22+
class CourseRunViewSet(viewsets.GenericViewSet): # pylint: disable=missing-class-docstring
2323
lookup_value_regex = settings.COURSE_KEY_REGEX
2424
permission_classes = (permissions.IsAdminUser,)
2525
serializer_class = CourseRunSerializer
@@ -42,18 +42,18 @@ def get_object(self):
4242

4343
raise Http404
4444

45-
def list(self, request, *args, **kwargs): # lint-amnesty, pylint: disable=unused-argument
45+
def list(self, request, *args, **kwargs): # pylint: disable=unused-argument
4646
course_runs, __ = _accessible_courses_iter(request)
4747
page = self.paginate_queryset(list(course_runs))
4848
serializer = self.get_serializer(page, many=True)
4949
return self.get_paginated_response(serializer.data)
5050

51-
def retrieve(self, request, *args, **kwargs): # lint-amnesty, pylint: disable=unused-argument
51+
def retrieve(self, request, *args, **kwargs): # pylint: disable=unused-argument
5252
course_run = self.get_object()
5353
serializer = self.get_serializer(course_run)
5454
return Response(serializer.data)
5555

56-
def update(self, request, *args, **kwargs): # lint-amnesty, pylint: disable=missing-function-docstring, unused-argument
56+
def update(self, request, *args, **kwargs): # pylint: disable=missing-function-docstring, unused-argument
5757
course_run = self.get_object()
5858

5959
partial = kwargs.pop('partial', False)
@@ -66,7 +66,7 @@ def partial_update(self, request, *args, **kwargs):
6666
kwargs['partial'] = True
6767
return self.update(request, *args, **kwargs)
6868

69-
def create(self, request, *args, **kwargs): # lint-amnesty, pylint: disable=unused-argument
69+
def create(self, request, *args, **kwargs): # pylint: disable=unused-argument
7070
serializer = CourseRunCreateSerializer(data=request.data, context=self.get_serializer_context())
7171
serializer.is_valid(raise_exception=True)
7272
serializer.save()
@@ -77,15 +77,15 @@ def create(self, request, *args, **kwargs): # lint-amnesty, pylint: disable=unu
7777
methods=['post', 'put'],
7878
parser_classes=(parsers.FormParser, parsers.MultiPartParser,),
7979
serializer_class=CourseRunImageSerializer)
80-
def images(self, request, *args, **kwargs): # lint-amnesty, pylint: disable=missing-function-docstring, unused-argument
80+
def images(self, request, *args, **kwargs): # pylint: disable=missing-function-docstring, unused-argument
8181
course_run = self.get_object()
8282
serializer = CourseRunImageSerializer(course_run, data=request.data, context=self.get_serializer_context())
8383
serializer.is_valid(raise_exception=True)
8484
serializer.save()
8585
return Response(serializer.data)
8686

8787
@action(detail=True, methods=['post'])
88-
def rerun(self, request, *args, **kwargs): # lint-amnesty, pylint: disable=missing-function-docstring, unused-argument
88+
def rerun(self, request, *args, **kwargs): # pylint: disable=missing-function-docstring, unused-argument
8989
course_run = self.get_object()
9090
serializer = CourseRunRerunSerializer(course_run, data=request.data, context=self.get_serializer_context())
9191
serializer.is_valid(raise_exception=True)
@@ -94,7 +94,7 @@ def rerun(self, request, *args, **kwargs): # lint-amnesty, pylint: disable=miss
9494
return Response(serializer.data, status=status.HTTP_201_CREATED)
9595

9696
@action(detail=False, methods=['post'])
97-
def clone(self, request, *args, **kwargs): # lint-amnesty, pylint: disable=unused-argument
97+
def clone(self, request, *args, **kwargs): # pylint: disable=unused-argument
9898
"""
9999
**Use Case**
100100

0 commit comments

Comments
 (0)