diff --git a/src/core/migrations/0074_auto_20220721_1448.py b/src/core/migrations/0074_auto_20220721_1448.py index 1676878ce6..5401146ea8 100644 --- a/src/core/migrations/0074_auto_20220721_1448.py +++ b/src/core/migrations/0074_auto_20220721_1448.py @@ -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 }},

We are requesting that you undertake a review of "{{ article.title }}" in {{ article.journal.name }}.

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.

You can let us know your decision or decline to undertake the review: {{ review_url }}

{{ article_details }}

Regards,
{{ request.user.signature|safe }}' @@ -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): diff --git a/src/utils/migration_utils.py b/src/utils/migration_utils.py index 6c9e838efe..333bd850ef 100644 --- a/src/utils/migration_utils.py +++ b/src/utils/migration_utils.py @@ -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. """ @@ -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() diff --git a/src/utils/testing/helpers.py b/src/utils/testing/helpers.py index fcc5323ad2..881c2d1d56 100755 --- a/src/utils/testing/helpers.py +++ b/src/utils/testing/helpers.py @@ -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 @@ -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, + ) diff --git a/src/utils/tests.py b/src/utils/tests.py index 56f8ee4085..69b026b416 100644 --- a/src/utils/tests.py +++ b/src/utils/tests.py @@ -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 @@ -22,6 +23,7 @@ oidc, template_override_middleware, logic, + migration_utils, ) from utils import install @@ -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, + )