Commit c8fe48b9 by Saleem Latif Committed by GitHub

Merge pull request #13127 from edx/saleem-latif/MAYN-207

MAYN-207: Update configuration helpers to take into account microsite configurations
parents 153843d7 cff28539
...@@ -168,19 +168,21 @@ def has_override_value(name): ...@@ -168,19 +168,21 @@ def has_override_value(name):
def get_value_for_org(org, val_name, default=None): def get_value_for_org(org, val_name, default=None):
""" """
This returns a configuration value for a site configuration which has an org_filter that matches This returns a configuration value for a site configuration or microsite configuration
what is passed in. which has an org_filter that matches with the argument.
Args: Args:
org (str): Course ord filter, this value will be used to filter out the correct site configuration. org (str): Course org filter, this value will be used to filter out the correct site configuration.
name (str): Name of the key for which to return configuration value. name (str): Name of the key for which to return configuration value.
default: default value tp return if key is not found in the configuration default: default value to return if key is not present in the configuration
Returns: Returns:
Configuration value for the given key. Configuration value for the given key.
""" """
if is_site_configuration_enabled(): # Here we first look for the asked org inside site configuration, and if org is not present in site configuration
# then we go ahead and look it inside microsite configuration.
if SiteConfiguration.has_org(org):
return SiteConfiguration.get_value_for_org(org, val_name, default) return SiteConfiguration.get_value_for_org(org, val_name, default)
else: else:
return microsite.get_value_for_org(org, val_name, default) return microsite.get_value_for_org(org, val_name, default)
...@@ -188,16 +190,16 @@ def get_value_for_org(org, val_name, default=None): ...@@ -188,16 +190,16 @@ def get_value_for_org(org, val_name, default=None):
def get_all_orgs(): def get_all_orgs():
""" """
This returns all of the orgs that are considered in site configurations, This can be used, This returns all of the orgs that are considered in site configurations or microsite configuration,
for example, to do filtering. This can be used, for example, to do filtering.
Returns: Returns:
Configuration value for the given key. A list of all organizations present in either microsite configuration or site configuration.
""" """
if is_site_configuration_enabled(): site_configuration_orgs = SiteConfiguration.get_all_orgs()
return SiteConfiguration.get_all_orgs() microsite_orgs = microsite.get_all_orgs()
else:
return microsite.get_all_orgs() return site_configuration_orgs.union(microsite_orgs)
def page_title_breadcrumbs(*crumbs, **kwargs): def page_title_breadcrumbs(*crumbs, **kwargs):
......
...@@ -89,15 +89,26 @@ class SiteConfiguration(models.Model): ...@@ -89,15 +89,26 @@ class SiteConfiguration(models.Model):
for example, to do filtering. for example, to do filtering.
Returns: Returns:
Configuration value for the given key. A list of all organizations present in site configuration.
""" """
org_filter_set = set() org_filter_set = set()
for configuration in cls.objects.filter(values__contains='course_org_filter', enabled=True).all(): for configuration in cls.objects.filter(values__contains='course_org_filter', enabled=True).all():
org_filter = configuration.get_value('course_org_filter', None) org_filter = configuration.get_value('course_org_filter', None)
if org_filter: if org_filter:
org_filter_set.add(org_filter) org_filter_set.add(org_filter)
return org_filter_set return org_filter_set
@classmethod
def has_org(cls, org):
"""
Check if the given organization is present in any of the site configuration.
Returns:
True if given organization is present in site configurations otherwise False.
"""
return org in cls.get_all_orgs()
class SiteConfigurationHistory(TimeStampedModel): class SiteConfigurationHistory(TimeStampedModel):
""" """
......
...@@ -148,11 +148,42 @@ class TestHelpers(TestCase): ...@@ -148,11 +148,42 @@ class TestHelpers(TestCase):
"default for non existent" "default for non existent"
) )
def test_get_value_for_org_2(self):
"""
Test that get_value_for_org returns correct value for any given key.
"""
test_org = test_config['course_org_filter']
with with_site_configuration_context(configuration=test_config):
# Make sure if ORG is not present in site configuration then microsite configuration is used instead
self.assertEqual(
configuration_helpers.get_value_for_org("TestSiteX", "email_from_address"),
"test_site@edx.org"
)
# Make sure 'default' is returned if org is present but key is not
self.assertEqual(
configuration_helpers.get_value_for_org(test_org, "email_from_address"),
None
)
# Make sure if ORG is not present in site configuration then microsite configuration is used instead
self.assertEqual(
configuration_helpers.get_value_for_org("LogistrationX", "email_from_address"),
"test_site@edx.org"
)
# This test must come after the above test
with with_site_configuration_context(configuration={"course_org_filter": "TestSiteX", "university": "Test"}):
# Make sure site configuration gets preference over microsite configuration
self.assertEqual(
configuration_helpers.get_value_for_org("TestSiteX", "university"),
"Test"
)
def test_get_all_orgs(self): def test_get_all_orgs(self):
""" """
Test that get_all_orgs returns correct values. Test that get_all_orgs returns organizations defined in both site configuration and microsite configuration.
""" """
test_orgs = [test_config['course_org_filter']] test_orgs = [test_config['course_org_filter'], "LogistrationX", "TestSiteX"]
with with_site_configuration_context(configuration=test_config): with with_site_configuration_context(configuration=test_config):
self.assertItemsEqual( self.assertItemsEqual(
list(configuration_helpers.get_all_orgs()), list(configuration_helpers.get_all_orgs()),
......
...@@ -26,9 +26,13 @@ def with_site_configuration(domain="test.localhost", configuration=None): ...@@ -26,9 +26,13 @@ def with_site_configuration(domain="test.localhost", configuration=None):
def _decorated(*args, **kwargs): # pylint: disable=missing-docstring def _decorated(*args, **kwargs): # pylint: disable=missing-docstring
# make a domain name out of directory name # make a domain name out of directory name
site, __ = Site.objects.get_or_create(domain=domain, name=domain) site, __ = Site.objects.get_or_create(domain=domain, name=domain)
site_configuration, __ = SiteConfiguration.objects.get_or_create( site_configuration, created = SiteConfiguration.objects.get_or_create(
site=site, enabled=True, values=configuration, site=site,
defaults={"enabled": True, "values": configuration},
) )
if not created:
site_configuration.values = configuration
site_configuration.save()
with patch('openedx.core.djangoapps.site_configuration.helpers.get_current_site_configuration', with patch('openedx.core.djangoapps.site_configuration.helpers.get_current_site_configuration',
return_value=site_configuration): return_value=site_configuration):
...@@ -48,9 +52,13 @@ def with_site_configuration_context(domain="test.localhost", configuration=None) ...@@ -48,9 +52,13 @@ def with_site_configuration_context(domain="test.localhost", configuration=None)
configuration (dict): configuration to use for the test site. configuration (dict): configuration to use for the test site.
""" """
site, __ = Site.objects.get_or_create(domain=domain, name=domain) site, __ = Site.objects.get_or_create(domain=domain, name=domain)
site_configuration, __ = SiteConfiguration.objects.get_or_create( site_configuration, created = SiteConfiguration.objects.get_or_create(
site=site, enabled=True, values=configuration, site=site,
defaults={"enabled": True, "values": configuration},
) )
if not created:
site_configuration.values = configuration
site_configuration.save()
with patch('openedx.core.djangoapps.site_configuration.helpers.get_current_site_configuration', with patch('openedx.core.djangoapps.site_configuration.helpers.get_current_site_configuration',
return_value=site_configuration): return_value=site_configuration):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment