Skip to content

Commit a2bae8d

Browse files
committed
feat: add AccountSettingsReadOnlyFieldsRequested filter
ENT-11510
1 parent da2326a commit a2bae8d

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

openedx_filters/learning/filters.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,3 +1445,41 @@ def run_filter(cls, schedules: QuerySet) -> QuerySet | None:
14451445
"""
14461446
data = super().run_pipeline(schedules=schedules)
14471447
return data.get("schedules")
1448+
1449+
1450+
class AccountSettingsReadOnlyFieldsRequested(OpenEdxPublicFilter):
1451+
"""
1452+
Filter used to expand the set of read-only fields on the account settings API.
1453+
1454+
Purpose:
1455+
This filter is triggered when the account settings API validates which fields
1456+
may be updated for a given user. Pipeline steps may add field names to
1457+
``readonly_fields`` to mark those fields as read-only for the requesting user.
1458+
1459+
Filter Type:
1460+
org.openedx.learning.account.settings.read_only_fields.requested.v1
1461+
1462+
Trigger:
1463+
- Repository: openedx/edx-platform
1464+
- Path: openedx/core/djangoapps/user_api/accounts/api.py
1465+
- Function or Method: _validate_read_only_fields
1466+
"""
1467+
1468+
filter_type = "org.openedx.learning.account.settings.read_only_fields.requested.v1"
1469+
1470+
@classmethod
1471+
def run_filter(cls, readonly_fields: set, user: Any) -> set:
1472+
"""
1473+
Process the readonly_fields set using the configured pipeline steps.
1474+
1475+
Arguments:
1476+
readonly_fields (set): the set of field names the caller considers read-only.
1477+
Pipeline steps add field names to this set to mark additional fields as
1478+
read-only.
1479+
user (User): the Django User whose account settings are being updated.
1480+
1481+
Returns:
1482+
set: the (possibly expanded) set of read-only field names.
1483+
"""
1484+
data = super().run_pipeline(readonly_fields=readonly_fields, user=user)
1485+
return data.get("readonly_fields", set())

openedx_filters/learning/tests/test_filters.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from django.test import TestCase
99

1010
from openedx_filters.learning.filters import (
11+
AccountSettingsReadOnlyFieldsRequested,
1112
AccountSettingsRenderStarted,
1213
CertificateCreationRequested,
1314
CertificateRenderStarted,
@@ -801,3 +802,33 @@ def test_schedule_requested(self):
801802
result = ScheduleQuerySetRequested.run_filter(schedules)
802803

803804
self.assertEqual(schedules, result)
805+
806+
807+
class TestAccountSettingsReadOnlyFieldsRequestedFilter(TestCase):
808+
"""
809+
Tests for the AccountSettingsReadOnlyFieldsRequested filter.
810+
"""
811+
812+
def test_run_filter_returns_empty_set_unchanged_when_no_pipeline(self):
813+
"""
814+
When no pipeline steps are configured, run_filter returns the original readonly_fields.
815+
"""
816+
readonly_fields = set()
817+
user = Mock()
818+
819+
with patch.object(
820+
AccountSettingsReadOnlyFieldsRequested,
821+
"run_pipeline",
822+
return_value={"readonly_fields": readonly_fields},
823+
):
824+
result = AccountSettingsReadOnlyFieldsRequested.run_filter(
825+
readonly_fields=readonly_fields, user=user
826+
)
827+
828+
self.assertEqual(result, readonly_fields)
829+
830+
def test_filter_type(self):
831+
self.assertEqual(
832+
AccountSettingsReadOnlyFieldsRequested.filter_type,
833+
"org.openedx.learning.account.settings.read_only_fields.requested.v1",
834+
)

0 commit comments

Comments
 (0)