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,
+ )