Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions lms/djangoapps/discussion/tests/test_signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ def setUp(self):
@mock.patch('lms.djangoapps.discussion.signals.handlers.send_message')
def test_comment_created_signal_sends_message(self, mock_send_message, mock_get_current_site):
site_config = SiteConfigurationFactory.create(site=self.site)
site_config.values[ENABLE_FORUM_NOTIFICATIONS_FOR_SITE_KEY] = True
enable_notifications_cfg = {ENABLE_FORUM_NOTIFICATIONS_FOR_SITE_KEY: True}
site_config.site_values = enable_notifications_cfg
site_config.values = enable_notifications_cfg
site_config.save()
mock_get_current_site.return_value = self.site
signals.comment_created.send(sender=self.sender, user=self.user, post=self.post)
Expand Down Expand Up @@ -56,7 +58,9 @@ def test_comment_created_signal_msg_not_sent_with_site_config_disabled(
self, mock_send_message, mock_get_current_site
):
site_config = SiteConfigurationFactory.create(site=self.site)
site_config.values[ENABLE_FORUM_NOTIFICATIONS_FOR_SITE_KEY] = False
enable_notifications_cfg = {ENABLE_FORUM_NOTIFICATIONS_FOR_SITE_KEY: False}
site_config.site_values = enable_notifications_cfg
site_config.values = enable_notifications_cfg
site_config.save()
mock_get_current_site.return_value = self.site
signals.comment_created.send(sender=self.sender, user=self.user, post=self.post)
Expand Down
14 changes: 12 additions & 2 deletions lms/djangoapps/instructor/tests/views/test_instructor_dashboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,12 @@ def test_membership_reason_field_visibility(self, enbale_reason_field):
"ENABLE_MANUAL_ENROLLMENT_REASON_FIELD": enbale_reason_field
}
site = Site.objects.first()
SiteConfiguration.objects.create(site=site, values=configuration_values, enabled=True)
SiteConfiguration.objects.create(
site=site,
site_values=configuration_values,
values=configuration_values,
enabled=True
)

url = reverse(
'instructor_dashboard',
Expand Down Expand Up @@ -194,7 +199,12 @@ def test_membership_site_configuration_role(self):
]
}
site = Site.objects.first()
SiteConfiguration.objects.create(site=site, values=configuration_values, enabled=True)
SiteConfiguration.objects.create(
site=site,
site_values=configuration_values,
values=configuration_values,
enabled=True
)
url = reverse(
'instructor_dashboard',
kwargs={
Expand Down
3 changes: 3 additions & 0 deletions openedx/core/djangoapps/ace_common/tests/test_tracking.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,9 @@ def test_missing_settings(self):
@override_settings(GOOGLE_ANALYTICS_TRACKING_ID='UA-123456-1')
def test_site_config_override(self):
site_config = SiteConfigurationFactory.create(
site_values=dict(
GOOGLE_ANALYTICS_ACCOUNT='UA-654321-1'
),
values=dict(
GOOGLE_ANALYTICS_ACCOUNT='UA-654321-1'
)
Expand Down
1 change: 1 addition & 0 deletions openedx/core/djangoapps/catalog/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ def cache_programs(request):
SiteConfiguration.objects.create(
site=request.site,
enabled=True,
site_values={"COURSE_CATALOG_API_URL": "{catalog_url}/api/v1/".format(catalog_url=CATALOG_STUB_URL)},
values={"COURSE_CATALOG_API_URL": "{catalog_url}/api/v1/".format(catalog_url=CATALOG_STUB_URL)}
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ def test_page_size(self):
@mock.patch(COMMAND_MODULE + '.handle_cert_change')
def test_site(self, mock_grade_interesting, mock_cert_change):
site_config = SiteConfigurationFactory.create(
site_values={'course_org_filter': ['testX']},
values={'course_org_filter': ['testX']},
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ def test_send_grade_without_issuance_enabled(self, _mock_is_course_run_in_a_prog
def test_send_grade_records_enabled(self, _mock_is_course_run_in_a_program, mock_send_grade_to_credentials,
_mock_is_learner_issuance_enabled):
site_config = SiteConfigurationFactory.create(
site_values={'course_org_filter': [self.key.org]},
values={'course_org_filter': [self.key.org]},
)

Expand Down
1 change: 1 addition & 0 deletions openedx/core/djangoapps/programs/tests/test_signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ def test_records_enabled(self, mock_is_learner_issuance_enabled, mock_task):
mock_is_learner_issuance_enabled.return_value = True

site_config = SiteConfigurationFactory.create(
site_values={'course_org_filter': ['edX']},
values={'course_org_filter': ['edX']},
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,8 +307,14 @@ def test_enqueue_config(self, is_enabled):
def test_site_config(self, this_org_list, other_org_list, expected_message_count, mock_ace):
filtered_org = 'filtered_org'
unfiltered_org = 'unfiltered_org'
this_config = SiteConfigurationFactory.create(values={'course_org_filter': this_org_list})
other_config = SiteConfigurationFactory.create(values={'course_org_filter': other_org_list})
this_config = SiteConfigurationFactory.create(
site_values={'course_org_filter': this_org_list},
values={'course_org_filter': this_org_list}
)
other_config = SiteConfigurationFactory.create(
site_values={'course_org_filter': other_org_list},
values={'course_org_filter': other_org_list}
)

for config in (this_config, other_config):
ScheduleConfigFactory.create(site=config.site)
Expand Down
1 change: 1 addition & 0 deletions openedx/core/djangoapps/schedules/tests/test_resolvers.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ def test_get_course_org_filter_include__in(self, course_org_filter, expected_org
)
def test_get_course_org_filter_exclude__in(self, course_org_filter, expected_org_list):
SiteConfigurationFactory.create(
site_values={'course_org_filter': course_org_filter},
values={'course_org_filter': course_org_filter},
)
mock_query = Mock()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ def handle(self, *args, **options):
site_configuration.values.update(site_configuration_values)
else:
site_configuration.values = site_configuration_values
if site_configuration.site_values:
site_configuration.site_values.update(site_configuration_values)
else:
site_configuration.site_values = site_configuration_values

if enabled is not None:
site_configuration.enabled = enabled
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.28 on 2020-02-19 16:50
from __future__ import unicode_literals

import collections
from django.db import migrations
import jsonfield.encoder
import jsonfield.fields


class Migration(migrations.Migration):

dependencies = [
('site_configuration', '0003_auto_20200217_1058'),
]

operations = [
migrations.AddField(
model_name='siteconfiguration',
name='site_values',
field=jsonfield.fields.JSONField(blank=True, default=dict, dump_kwargs={'cls': jsonfield.encoder.JSONEncoder, 'separators': (',', ':')}, load_kwargs={'object_pairs_hook': collections.OrderedDict}),
),
migrations.AddField(
model_name='siteconfigurationhistory',
name='site_values',
field=jsonfield.fields.JSONField(blank=True, dump_kwargs={'cls': jsonfield.encoder.JSONEncoder, 'separators': (',', ':')}, load_kwargs={'object_pairs_hook': collections.OrderedDict}),
),
]
23 changes: 21 additions & 2 deletions openedx/core/djangoapps/site_configuration/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,23 @@ class SiteConfiguration(models.Model):

Fields:
site (OneToOneField): one to one field relating each configuration to a single site
values (JSONField): json field to store configurations for a site
site_values (JSONField): json field to store configurations for a site

.. no_pii:
"""
site = models.OneToOneField(Site, related_name='configuration', on_delete=models.CASCADE)
enabled = models.BooleanField(default=False, verbose_name=u"Enabled")
site_values = JSONField(
null=False,
blank=True,
# The actual default value is determined by calling the given callable.
# Therefore, the default here is just {}, since that is the result of
# calling `dict`.
default=dict,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is the only change since #22692.

load_kwargs={'object_pairs_hook': collections.OrderedDict}
)
# TODO: Delete this deprecated field during the later stages of the rollout
# which renames 'values' to 'site_values'.
values = JSONField(
null=False,
blank=True,
Expand Down Expand Up @@ -146,12 +157,19 @@ class SiteConfigurationHistory(TimeStampedModel):

Fields:
site (ForeignKey): foreign-key to django Site
values (JSONField): json field to store configurations for a site
site_values (JSONField): json field to store configurations for a site

.. no_pii:
"""
site = models.ForeignKey(Site, related_name='configuration_histories', on_delete=models.CASCADE)
enabled = models.BooleanField(default=False, verbose_name=u"Enabled")
site_values = JSONField(
null=False,
blank=True,
load_kwargs={'object_pairs_hook': collections.OrderedDict}
)
# TODO: Delete this deprecated field during the later stages of the rollout
# which renames 'values' to 'site_values'.
values = JSONField(
null=False,
blank=True,
Expand Down Expand Up @@ -185,6 +203,7 @@ def update_site_configuration_history(sender, instance, **kwargs): # pylint: di
"""
SiteConfigurationHistory.objects.create(
site=instance.site,
site_values=instance.values,
values=instance.values,
enabled=instance.enabled,
)
42 changes: 25 additions & 17 deletions openedx/core/djangoapps/site_configuration/tests/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,33 +14,39 @@ def setUp(self):
super(SiteMixin, self).setUp()

self.site = SiteFactory.create()
site_config = {
"SITE_NAME": self.site.domain,
"course_email_from_addr": "fake@example.com",
"course_email_template_name": "fake_email_template",
"course_org_filter": "fakeX"
}
self.site_configuration = SiteConfigurationFactory.create(
site=self.site,
values={
"SITE_NAME": self.site.domain,
"course_email_from_addr": "fake@example.com",
"course_email_template_name": "fake_email_template",
"course_org_filter": "fakeX"
}
site_values=site_config,
# TODO: Remove this deprecated value eventually.
values=site_config
)

self.site_other = SiteFactory.create(
domain='testserver.fakeother',
name='testserver.fakeother'
)
site_config_other = {
"SITE_NAME": self.site_other.domain,
"SESSION_COOKIE_DOMAIN": self.site_other.domain,
"course_org_filter": "fakeOtherX",
"ENABLE_MKTG_SITE": True,
"SHOW_ECOMMERCE_REPORTS": True,
"MKTG_URLS": {
"ROOT": "https://marketing.fakeother",
"ABOUT": "/fake-about"
}
}
self.site_configuration_other = SiteConfigurationFactory.create(
site=self.site_other,
values={
"SITE_NAME": self.site_other.domain,
"SESSION_COOKIE_DOMAIN": self.site_other.domain,
"course_org_filter": "fakeOtherX",
"ENABLE_MKTG_SITE": True,
"SHOW_ECOMMERCE_REPORTS": True,
"MKTG_URLS": {
"ROOT": "https://marketing.fakeother",
"ABOUT": "/fake-about"
}
}
site_values=site_config_other,
# TODO: Remove this deprecated value eventually.
values=site_config_other
)

# Initialize client with default site domain
Expand All @@ -56,6 +62,8 @@ def set_up_site(self, domain, site_configuration_values):
)
__ = SiteConfigurationFactory.create(
site=site,
site_values=site_configuration_values,
# TODO: Remove this deprecated value eventually.
values=site_configuration_values
)
self.use_site(site)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ def setUp(self):
)
self.site_configuration = SiteConfigurationFactory.create(
site=self.site,
site_values={
"SESSION_COOKIE_DOMAIN": self.site.domain,
},
values={
"SESSION_COOKIE_DOMAIN": self.site.domain,
}
Expand Down Expand Up @@ -73,6 +76,9 @@ def setUp(self):
)
self.site_configuration = SiteConfigurationFactory.create(
site=self.site,
site_values={
"SESSION_COOKIE_DOMAIN": self.site.domain,
},
values={
"SESSION_COOKIE_DOMAIN": self.site.domain,
}
Expand Down
22 changes: 22 additions & 0 deletions openedx/core/djangoapps/site_configuration/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ def test_site_configuration_post_update_receiver(self):
site=self.site,
)

site_configuration.site_values = {'test': 'test'}
# TODO: Remove this deprecated value eventually.
site_configuration.values = {'test': 'test'}
site_configuration.save()

Expand Down Expand Up @@ -131,6 +133,8 @@ def test_get_value(self):
# add SiteConfiguration to database
site_configuration = SiteConfigurationFactory.create(
site=self.site,
site_values=self.test_config1,
# TODO: Remove this deprecated value eventually.
values=self.test_config1,
)

Expand Down Expand Up @@ -179,6 +183,8 @@ def test_invalid_data_error_on_get_value(self):
# add SiteConfiguration to database
site_configuration = SiteConfigurationFactory.create(
site=self.site,
site_values=invalid_data,
# TODO: Remove this deprecated value eventually.
values=invalid_data,
)

Expand All @@ -200,10 +206,14 @@ def test_get_value_for_org(self):
# add SiteConfiguration to database
SiteConfigurationFactory.create(
site=self.site,
site_values=self.test_config1,
# TODO: Remove this deprecated value eventually.
values=self.test_config1,
)
SiteConfigurationFactory.create(
site=self.site2,
site_values=self.test_config2,
# TODO: Remove this deprecated value eventually.
values=self.test_config2,
)

Expand Down Expand Up @@ -285,10 +295,14 @@ def test_get_site_for_org(self):
# add SiteConfiguration to database
config1 = SiteConfigurationFactory.create(
site=self.site,
site_values=self.test_config1,
# TODO: Remove this deprecated value eventually.
values=self.test_config1,
)
config2 = SiteConfigurationFactory.create(
site=self.site2,
site_values=self.test_config2,
# TODO: Remove this deprecated value eventually.
values=self.test_config2,
)

Expand All @@ -314,10 +328,14 @@ def test_get_all_orgs(self):
# add SiteConfiguration to database
SiteConfigurationFactory.create(
site=self.site,
site_values=self.test_config1,
# TODO: Remove this deprecated value eventually.
values=self.test_config1,
)
SiteConfigurationFactory.create(
site=self.site2,
site_values=self.test_config2,
# TODO: Remove this deprecated value eventually.
values=self.test_config2,
)

Expand All @@ -332,11 +350,15 @@ def test_get_all_orgs_returns_only_enabled(self):
# add SiteConfiguration to database
SiteConfigurationFactory.create(
site=self.site,
site_values=self.test_config1,
# TODO: Remove this deprecated value eventually.
values=self.test_config1,
enabled=False,
)
SiteConfigurationFactory.create(
site=self.site2,
site_values=self.test_config2,
# TODO: Remove this deprecated value eventually.
values=self.test_config2,
)

Expand Down
Loading