Skip to content

Commit 7c22f45

Browse files
committed
feat(networks): per-network domain overrides for nav links
Most networks live at {slug}.{NAV_DEFAULT_DOMAIN}, but some have their own external Commons domains that differ per environment — MSU is msucommons-dev.org on dev and commons.msu.edu on production. Adds NETWORK_DOMAIN_OVERRIDES ({slug: {environment: domain}}, env- overridable JSON, MSU seeded as default) consulted with the new NETWORK_DOMAIN_ENVIRONMENT key (main by default, dev on the dev settings module, anything else via env var). Networks or environments without an entry fall back to the subdomain form, and the Works link never follows these overrides — it stays on the hcommons domains.
1 parent 206551f commit 7c22f45

4 files changed

Lines changed: 103 additions & 1 deletion

File tree

config/settings/base.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,29 @@
634634
# the nav URLs so environment-tracking defaults can derive from it.
635635
NAV_DEFAULT_DOMAIN = env("NAV_DEFAULT_DOMAIN", default="hcommons.org")
636636

637+
# Which environment key NETWORK_DOMAIN_OVERRIDES is consulted with:
638+
# "main" on production, "dev" on dev (overridden in dev.py), and any
639+
# other key a deployment chooses (e.g. "test") via the env var.
640+
NETWORK_DOMAIN_ENVIRONMENT = env(
641+
"NETWORK_DOMAIN_ENVIRONMENT", default="main"
642+
)
643+
644+
# Per-network domain overrides for the network-aware nav links, keyed
645+
# by network slug then environment. Most networks live at
646+
# {slug}.{NAV_DEFAULT_DOMAIN}; networks listed here use their own
647+
# external domain instead (per environment, falling back to the
648+
# subdomain form when the environment has no entry). The Works link
649+
# never follows these — it stays on the hcommons domains.
650+
NETWORK_DOMAIN_OVERRIDES = env.json(
651+
"NETWORK_DOMAIN_OVERRIDES",
652+
default={
653+
"msu": {
654+
"dev": "msucommons-dev.org",
655+
"main": "commons.msu.edu",
656+
},
657+
},
658+
)
659+
637660
NAV_NEWS_FEED_URL = env(
638661
"NAV_NEWS_FEED_URL", default="https://hcommons.org/activity/"
639662
)

config/settings/dev.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
"https://*.profile.hcommons-dev.org",
3535
]
3636

37+
# Consult NETWORK_DOMAIN_OVERRIDES with this environment's key
38+
NETWORK_DOMAIN_ENVIRONMENT = env("NETWORK_DOMAIN_ENVIRONMENT", default="dev")
39+
3740
# Share the login session (and CSRF cookie) between the apex and the
3841
# network subdomains (e.g. stemedplus.profile.hcommons-dev.org). The
3942
# IDMS broker service inherits this module (config.settings.idms_dev),

knowledge_commons_profiles/newprofile/context_processors.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@ def _rewrite_domain(url, default_domain, target_domain):
3434
)
3535

3636

37+
def _network_domain(network_slug, default_domain):
38+
"""
39+
The Commons domain for a network's community links.
40+
41+
Most networks live at {slug}.{default_domain}; networks with an
42+
entry in NETWORK_DOMAIN_OVERRIDES for this deployment's
43+
NETWORK_DOMAIN_ENVIRONMENT use their own external domain instead
44+
(e.g. msu -> commons.msu.edu on main, msucommons-dev.org on dev).
45+
"""
46+
overrides = getattr(settings, "NETWORK_DOMAIN_OVERRIDES", {})
47+
environment = getattr(settings, "NETWORK_DOMAIN_ENVIRONMENT", "main")
48+
override = overrides.get(network_slug.lower(), {}).get(environment)
49+
return override or f"{network_slug}.{default_domain}"
50+
51+
3752
def nav_links(request):
3853
urls = {
3954
"NAV_NEWS_FEED_URL": settings.NAV_NEWS_FEED_URL,
@@ -53,7 +68,7 @@ def nav_links(request):
5368
# precedence over the referer-derived session domain below
5469
network_slug = getattr(request, "network_slug", None)
5570
if network_slug:
56-
network_domain = f"{network_slug}.{default_domain}"
71+
network_domain = _network_domain(network_slug, default_domain)
5772
return {
5873
key: (
5974
_rewrite_domain(url, default_domain, network_domain)

knowledge_commons_profiles/newprofile/tests/test_network_nav_links.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,67 @@ def test_network_beats_referer_session_domain(self):
9191
)
9292

9393

94+
DOMAIN_OVERRIDES = {
95+
"msu": {
96+
"dev": "msucommons-dev.org",
97+
"main": "commons.msu.edu",
98+
},
99+
}
100+
101+
102+
@override_settings(**NAV_SETTINGS, NETWORK_DOMAIN_OVERRIDES=DOMAIN_OVERRIDES)
103+
class NetworkDomainOverrideTests(TestCase):
104+
def _nav_for_network(self, slug):
105+
request = RequestFactory().get("/members/")
106+
request.network_slug = slug
107+
request.network = slug
108+
request.session = {}
109+
return nav_links(request)
110+
111+
@override_settings(NETWORK_DOMAIN_ENVIRONMENT="dev")
112+
def test_overridden_network_uses_environment_domain_on_dev(self):
113+
urls = self._nav_for_network("msu")
114+
self.assertEqual(
115+
urls["NAV_GROUPS_URL"], "https://msucommons-dev.org/groups/"
116+
)
117+
self.assertEqual(
118+
urls["NAV_NEWS_FEED_URL"],
119+
"https://msucommons-dev.org/activity/",
120+
)
121+
self.assertEqual(
122+
urls["NAV_SITES_URL"], "https://msucommons-dev.org/sites/"
123+
)
124+
125+
@override_settings(NETWORK_DOMAIN_ENVIRONMENT="main")
126+
def test_overridden_network_uses_environment_domain_on_main(self):
127+
urls = self._nav_for_network("msu")
128+
self.assertEqual(
129+
urls["NAV_GROUPS_URL"], "https://commons.msu.edu/groups/"
130+
)
131+
132+
@override_settings(NETWORK_DOMAIN_ENVIRONMENT="dev")
133+
def test_works_link_ignores_domain_overrides(self):
134+
urls = self._nav_for_network("msu")
135+
self.assertEqual(
136+
urls["NAV_WORKS_URL"], "https://works.hcommons.org/"
137+
)
138+
139+
@override_settings(NETWORK_DOMAIN_ENVIRONMENT="dev")
140+
def test_network_without_override_uses_subdomain_of_default(self):
141+
urls = self._nav_for_network("up")
142+
self.assertEqual(
143+
urls["NAV_GROUPS_URL"], "https://up.hcommons.org/groups/"
144+
)
145+
146+
@override_settings(NETWORK_DOMAIN_ENVIRONMENT="test")
147+
def test_override_without_environment_entry_falls_back(self):
148+
# msu has dev/main entries but nothing for this environment
149+
urls = self._nav_for_network("msu")
150+
self.assertEqual(
151+
urls["NAV_GROUPS_URL"], "https://msu.hcommons.org/groups/"
152+
)
153+
154+
94155
@override_settings(
95156
**NAV_SETTINGS,
96157
ALLOWED_HOSTS=["*"],

0 commit comments

Comments
 (0)