From 5447e86307da0d60e69f1d239d1976f1964ec9fc Mon Sep 17 00:00:00 2001 From: Nimisha Asthagiri Date: Tue, 31 Mar 2020 12:08:20 -0400 Subject: [PATCH] Django2 StackedConfigurationModel: Fix query filter BOM-1432 --- .../djangoapps/config_model_utils/models.py | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) 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