diff --git a/openedx/core/djangoapps/config_model_utils/models.py b/openedx/core/djangoapps/config_model_utils/models.py index 5a46541a93..466baddf03 100644 --- a/openedx/core/djangoapps/config_model_utils/models.py +++ b/openedx/core/djangoapps/config_model_utils/models.py @@ -183,19 +183,20 @@ class StackedConfigurationModel(ConfigurationModel): values = field_defaults.copy() - global_override_q = Q(site=None, org=None, org_course=None, course_id=None) - site_override_q = Q(site=site, org=None, org_course=None, course_id=None) - org_override_q = Q(site=None, org=org, org_course=None, course_id=None) - org_course_override_q = Q(site=None, org=None, org_course=org_course, course_id=None) - course_override_q = Q(site=None, org=None, org_course=None, course_id=course_key) + # Build a multi_filter_query that defaults to querying for the global-level setting and adds queries + # for the stacked-level settings when applicable. + # Note: Django2+ requires checking for 'isnull' rather than passing 'None' in the queries. + multi_filter_query = Q(site__isnull=True, org__isnull=True, org_course__isnull=True, course_id__isnull=True) + if site: + multi_filter_query |= Q(site=site, org__isnull=True, org_course__isnull=True, course_id__isnull=True) + if org: + multi_filter_query |= Q(site__isnull=True, org=org, org_course__isnull=True, course_id__isnull=True) + if org_course: + multi_filter_query |= Q(site__isnull=True, org__isnull=True, org_course=org_course, course_id__isnull=True) + if course_key: + multi_filter_query |= Q(site__isnull=True, org__isnull=True, org_course__isnull=True, course_id=course_key) - overrides = cls.objects.current_set().filter( - global_override_q | - site_override_q | - org_override_q | - org_course_override_q | - course_override_q - ) + overrides = cls.objects.current_set().filter(multi_filter_query) provenances = defaultdict(lambda: Provenance.default) # We are sorting in python to avoid doing a filesort in the database for