Skip to content

Commit 938653c

Browse files
pwnage101kiram15
andauthored
feat: add AccountSettingsReadOnlyFieldsRequested filter (#334)
* feat: add AccountSettingsReadOnlyFieldsRequested filter ENT-11510 * fix: update ref to openedx-platform. * fix: PR requests * fix: fixing the docstring --------- Co-authored-by: Kira Miller <31229189+kiram15@users.noreply.github.com>
1 parent b225264 commit 938653c

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

openedx_filters/learning/filters.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,3 +1445,43 @@ 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/openedx-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) -> tuple[Any, Any]:
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+
tuple[Any | Any]:
1483+
Any: the (possibly expanded) set of read-only field names.
1484+
Any: the Django User object.
1485+
"""
1486+
data = super().run_pipeline(readonly_fields=readonly_fields, user=user)
1487+
return (data.get("readonly_fields"), data.get("user"))

openedx_filters/learning/tests/test_filters.py

Lines changed: 27 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,29 @@ 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_inputs_unchanged_when_no_pipeline(self):
813+
"""
814+
When no pipeline steps are configured, run_filter returns the original inputs unchanged.
815+
"""
816+
readonly_fields = {"username"}
817+
user = Mock()
818+
819+
result_fields, result_user = AccountSettingsReadOnlyFieldsRequested.run_filter(
820+
readonly_fields=readonly_fields, user=user
821+
)
822+
823+
self.assertEqual(result_fields, readonly_fields)
824+
self.assertEqual(result_user, user)
825+
826+
def test_filter_type(self):
827+
self.assertEqual(
828+
AccountSettingsReadOnlyFieldsRequested.filter_type,
829+
"org.openedx.learning.account.settings.read_only_fields.requested.v1",
830+
)

0 commit comments

Comments
 (0)