Skip to content

Commit c5f9b7b

Browse files
committed
Try direct mod
1 parent b3d8301 commit c5f9b7b

File tree

2 files changed

+94
-16
lines changed

2 files changed

+94
-16
lines changed

astra_app/core/tests/test_views_selfservice_settings_pages.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,63 @@ def test_settings_save_all_profile_country_can_save_when_other_tabs_invalid_but_
450450
self.assertEqual(response["Location"], reverse("settings") + "#profile")
451451
self.assertEqual(mocked_update.call_count, 1)
452452

453+
@override_settings(
454+
FREEIPA_HOST="ipa.test",
455+
FREEIPA_VERIFY_SSL=False,
456+
FREEIPA_SERVICE_USER="svc",
457+
FREEIPA_SERVICE_PASSWORD="pw",
458+
SELF_SERVICE_ADDRESS_COUNTRY_ATTR="st",
459+
)
460+
def test_settings_profile_country_uses_direct_attr_update_for_st(self):
461+
factory = RequestFactory()
462+
463+
fake_user = SimpleNamespace(
464+
username="alice",
465+
466+
is_authenticated=True,
467+
_user_data={
468+
"givenname": ["Alice"],
469+
"sn": ["User"],
470+
"cn": ["Alice User"],
471+
"st": ["CH"],
472+
},
473+
)
474+
475+
request = factory.post(
476+
"/settings/",
477+
data={
478+
"tab": "profile",
479+
"givenname": "Alice",
480+
"sn": "User",
481+
"country_code": "US",
482+
"fasPronoun": "",
483+
"fasLocale": "",
484+
"fasTimezone": "",
485+
"fasWebsiteUrl": "",
486+
"fasRssUrl": "",
487+
"fasIRCNick": "",
488+
"fasGitHubUsername": "",
489+
"fasGitLabUsername": "",
490+
"fasIsPrivate": "",
491+
},
492+
)
493+
self._add_session_and_messages(request)
494+
request.user = self._auth_user("alice")
495+
496+
with patch("core.views_settings._get_full_user", autospec=True, return_value=fake_user):
497+
with patch("core.views_settings._update_user_attrs", autospec=True) as mocked_update:
498+
mocked_update.return_value = ([], True)
499+
response = views_settings.settings_root(request)
500+
501+
self.assertEqual(response.status_code, 302)
502+
self.assertEqual(response["Location"], reverse("settings") + "#profile")
503+
504+
kwargs = mocked_update.call_args.kwargs
505+
direct_updates = kwargs.get("direct_updates", {})
506+
setattrs = kwargs.get("setattrs", [])
507+
self.assertEqual(direct_updates.get("o_st"), "US")
508+
self.assertNotIn("st=US", setattrs)
509+
453510
@override_settings(
454511
FREEIPA_HOST="ipa.test",
455512
FREEIPA_VERIFY_SSL=False,

astra_app/core/views_settings.py

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ def settings_root(request: HttpRequest) -> HttpResponse:
197197
data = fu._user_data
198198

199199
country_attr = str(settings.SELF_SERVICE_ADDRESS_COUNTRY_ATTR).strip() or "c"
200+
country_attr_lower = country_attr.lower()
200201

201202
# --- Profile ---
202203
# Use the FreeIPA attribute data as the source of truth. This avoids relying on
@@ -674,14 +675,24 @@ def _user_can_reauth(password: str) -> bool:
674675
current_value=profile_initial.get("fasGitLabUsername"),
675676
new_value=profile_form.cleaned_data["fasGitLabUsername"],
676677
)
677-
_add_change_setattr(
678-
setattrs=profile_setattrs,
679-
delattrs=profile_delattrs,
680-
attr=country_attr,
681-
current_value=profile_initial.get("country_code"),
682-
new_value=profile_form.cleaned_data["country_code"],
683-
transform=str.upper,
684-
)
678+
if country_attr_lower in {"c", "st", "l", "postalcode"}:
679+
_add_change(
680+
updates=profile_direct_updates,
681+
delattrs=profile_delattrs,
682+
attr=country_attr_lower,
683+
current_value=profile_initial.get("country_code"),
684+
new_value=profile_form.cleaned_data["country_code"],
685+
transform=str.upper,
686+
)
687+
else:
688+
_add_change_setattr(
689+
setattrs=profile_setattrs,
690+
delattrs=profile_delattrs,
691+
attr=country_attr,
692+
current_value=profile_initial.get("country_code"),
693+
new_value=profile_form.cleaned_data["country_code"],
694+
transform=str.upper,
695+
)
685696

686697
current_private = profile_initial["fasIsPrivate"]
687698
new_private = profile_form.cleaned_data["fasIsPrivate"]
@@ -973,14 +984,24 @@ def _user_can_reauth(password: str) -> bool:
973984
current_value=profile_initial.get("fasGitLabUsername"),
974985
new_value=profile_form.cleaned_data["fasGitLabUsername"],
975986
)
976-
_add_change_setattr(
977-
setattrs=setattrs,
978-
delattrs=delattrs,
979-
attr=country_attr,
980-
current_value=profile_initial.get("country_code"),
981-
new_value=profile_form.cleaned_data["country_code"],
982-
transform=str.upper,
983-
)
987+
if country_attr_lower in {"c", "st", "l", "postalcode"}:
988+
_add_change(
989+
updates=direct_updates,
990+
delattrs=delattrs,
991+
attr=country_attr_lower,
992+
current_value=profile_initial.get("country_code"),
993+
new_value=profile_form.cleaned_data["country_code"],
994+
transform=str.upper,
995+
)
996+
else:
997+
_add_change_setattr(
998+
setattrs=setattrs,
999+
delattrs=delattrs,
1000+
attr=country_attr,
1001+
current_value=profile_initial.get("country_code"),
1002+
new_value=profile_form.cleaned_data["country_code"],
1003+
transform=str.upper,
1004+
)
9841005

9851006
current_private = profile_initial["fasIsPrivate"]
9861007
new_private = profile_form.cleaned_data["fasIsPrivate"]

0 commit comments

Comments
 (0)