Skip to content

Commit

Permalink
Abstract and test function for updating setting values #4089
Browse files Browse the repository at this point in the history
  • Loading branch information
joemull committed May 29, 2024
1 parent 7aeaf24 commit 197974b
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 26 deletions.
34 changes: 9 additions & 25 deletions src/core/migrations/0074_auto_20220721_1448.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
from __future__ import unicode_literals

from django.db import migrations
from django.utils import translation
from django.conf import settings as django_settings
from utils import migration_utils


OLD_DEFAULT_VALUE = 'Dear {{ review_assignment.reviewer.full_name }},<br/><br/>We are requesting that you undertake a review of "{{ article.title }}" in {{ article.journal.name }}.<br/><br/>We would be most grateful for your time as the feedback from our reviewers is of the utmost importance to our editorial decision-making processes.<br/><br/>You can let us know your decision or decline to undertake the review: {{ review_url }} <br/><br/>{{ article_details }}<br/><br/>Regards,<br/>{{ request.user.signature|safe }}'
Expand All @@ -15,29 +14,14 @@


def update_default_setting(apps, schema_editor):
"""
Updates the review_assignment setting for a journal where it has not been edited.
"""
with translation.override('en'):
SettingValue = apps.get_model('core', 'SettingValue')
setting_value = SettingValue.objects.filter(
setting__name='review_assignment',
journal=None,
).first()

if setting_value:
language_var = "value_{}".format('en')
setattr(setting_value, language_var, NEW_VALUE)
setting_value.save()

variants_to_delete = SettingValue.objects.filter(
setting__name='review_assignment',
journal__isnull=False,
)

for variant in variants_to_delete:
if getattr(variant, language_var) in [OLD_DEFAULT_VALUE, VARIANT_ONE, VARIANT_TWO]:
variant.delete()

migration_utils.update_default_setting_values(
apps,
setting_name='review_assignment',
group_name='email',
values_to_replace=[OLD_DEFAULT_VALUE, VARIANT_ONE, VARIANT_TWO],
replacement_value=NEW_VALUE,
)


class Migration(migrations.Migration):
Expand Down
30 changes: 30 additions & 0 deletions src/utils/migration_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

def update_translated_settings(apps, setting_name, group_name, values_to_replace, replacement_value):
"""
Deprecated in 1.6, because it only works with an older translation
setup that Janeway used to have.
Gets a setting then iterates through available languages replacing a list of strings with a
replacement string.
"""
Expand All @@ -36,3 +38,31 @@ def update_translated_settings(apps, setting_name, group_name, values_to_replace
setting_value.value = value
setting_value.save()


def update_default_setting_values(apps, setting_name, group_name, values_to_replace, replacement_value):
"""
Updates the specified default setting value where it has not been edited.
Accounts for translatable settings that use django-modeltranslation.
"""
with translation.override('en'):
SettingValue = apps.get_model('core', 'SettingValue')
setting_value = SettingValue.objects.filter(
setting__name=setting_name,
setting__group__name=group_name,
journal=None,
).first()

if setting_value:
language_var = "value_{}".format('en')
setattr(setting_value, language_var, replacement_value)
setting_value.save()

variants_to_delete = SettingValue.objects.filter(
setting__name=setting_name,
setting__group__name=group_name,
journal__isnull=False,
)

for variant in variants_to_delete:
if getattr(variant, language_var) in values_to_replace:
variant.delete()
20 changes: 20 additions & 0 deletions src/utils/testing/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from copyediting import models as copyediting_models
from comms import models as comms_models
from cms import models as cms_models
from utils import setting_handler
from utils.install import update_xsl_files, update_settings, update_issue_types
from repository import models as repo_models
from utils.logic import get_aware_datetime
Expand Down Expand Up @@ -618,3 +619,22 @@ def create_contact(content_type, object_id, **kwargs):
email=email,
role=role,
)

def create_setting(
setting_group_name='test_group',
setting_name='test_setting',
setting_type='rich-text',
pretty_name='Test Setting',
description='A test setting.',
is_translatable=True,
default_value='Default setting value',
):
return setting_handler.create_setting(
setting_group_name,
setting_name,
setting_type,
pretty_name,
description,
is_translatable=is_translatable,
default_value=default_value,
)
33 changes: 32 additions & 1 deletion src/utils/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
import io
import os

from django.apps import apps
from django.test import TestCase, override_settings
from django.utils import timezone
from django.utils import timezone, translation
from django.core import mail
from django.core.management import call_command
from django.contrib.admin.sites import site
Expand All @@ -22,6 +23,7 @@
oidc,
template_override_middleware,
logic,
migration_utils,
)

from utils import install
Expand Down Expand Up @@ -1103,3 +1105,32 @@ def test_mailgun_webhook(self):
}
logic.parse_mailgun_webhook(fake_mailgun_post)
self.assertEqual(self.editor.email, mail.outbox[0].to[0])


class TestMigrationUtils(TestCase):

@classmethod
def setUpTestData(cls):
cls.press = helpers.create_press()
cls.setting = helpers.create_setting()
cls.setting_value = cls.setting.settingvalue_set.first()

def test_update_default_setting_values(self):
with translation.override('en'):
new_value = 'Updated default setting value'
migration_utils.update_default_setting_values(
apps,
self.setting.name,
self.setting.group.name,
values_to_replace=['Default setting value'],
replacement_value=new_value,
)
saved_value = setting_handler.get_setting(
self.setting.group.name,
self.setting.name,
None,
).processed_value
self.assertEqual(
new_value,
saved_value,
)

0 comments on commit 197974b

Please sign in to comment.