diff --git a/HISTORY.rst b/HISTORY.rst index 686b923e57..296f6543bd 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,8 @@ Rob de Canha-Knight (@rssfed23) for the report and the research. - Update instances of the word "weblink" to "web link". - Unify the creation of the temporary config file used in tests. +- Update all 0001 setting migrations to not accept manually migrated + settings. 3.3.4 (2019-12-09) ================== diff --git a/mayan/apps/common/setting_migrations.py b/mayan/apps/common/setting_migrations.py index 4bf1332f9c..e0876d8b2e 100644 --- a/mayan/apps/common/setting_migrations.py +++ b/mayan/apps/common/setting_migrations.py @@ -1,8 +1,7 @@ from __future__ import unicode_literals from mayan.apps.smart_settings.classes import NamespaceMigration - -from .serialization import yaml_load +from mayan.apps.smart_settings.utils import smart_yaml_load class CommonSettingMigration(NamespaceMigration): @@ -11,6 +10,4 @@ class CommonSettingMigration(NamespaceMigration): but YAML valid too. Changed in version 3.3. """ def common_shared_storage_arguments_0001(self, value): - return yaml_load( - stream=value or '{}', - ) + return smart_yaml_load(value=value) diff --git a/mayan/apps/common/tests/test_setting_migrations.py b/mayan/apps/common/tests/test_setting_migrations.py index 07d73ecbbd..b2c2183b4a 100644 --- a/mayan/apps/common/tests/test_setting_migrations.py +++ b/mayan/apps/common/tests/test_setting_migrations.py @@ -1,35 +1,30 @@ from __future__ import unicode_literals -from django.conf import settings -from django.utils.encoding import force_bytes - from mayan.apps.common.tests.base import BaseTestCase -from mayan.apps.common.tests.mixins import EnvironmentTestCaseMixin -from mayan.apps.smart_settings.classes import Setting -from mayan.apps.storage.utils import NamedTemporaryFile +from mayan.apps.smart_settings.tests.mixins import SmartSettingTestMixin from ..settings import setting_shared_storage_arguments -class CommonSettingMigrationTestCase(EnvironmentTestCaseMixin, BaseTestCase): +class CommonSettingMigrationTestCase(SmartSettingTestMixin, BaseTestCase): def test_common_shared_storage_arguments_0001_migration(self): - test_value = {'location': 'test value'} + self.test_setting = setting_shared_storage_arguments + self.test_config_value = '{}'.format(test_value) + self._create_test_config_file() - with NamedTemporaryFile() as file_object: - settings.CONFIGURATION_FILEPATH = file_object.name - file_object.write( - force_bytes( - '{}: {}'.format( - 'COMMON_SHARED_STORAGE_ARGUMENTS', - '"{}"'.format(Setting.serialize_value(value=test_value)) - ) - ) - ) - file_object.seek(0) - Setting._config_file_cache = None + self.assertEqual( + setting_shared_storage_arguments.value, + test_value + ) - self.assertEqual( - setting_shared_storage_arguments.value, - test_value - ) + def test_common_shared_storage_arguments_0001_migration_with_dict(self): + test_value = {'location': 'test value'} + self.test_setting = setting_shared_storage_arguments + self.test_config_value = test_value + self._create_test_config_file() + + self.assertEqual( + setting_shared_storage_arguments.value, + test_value + ) diff --git a/mayan/apps/converter/setting_migrations.py b/mayan/apps/converter/setting_migrations.py index 11ed7cc02e..a5c3387515 100644 --- a/mayan/apps/converter/setting_migrations.py +++ b/mayan/apps/converter/setting_migrations.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals -from mayan.apps.common.serialization import yaml_load from mayan.apps.smart_settings.classes import NamespaceMigration +from mayan.apps.smart_settings.utils import smart_yaml_load class ConvertSettingMigration(NamespaceMigration): @@ -10,6 +10,4 @@ class ConvertSettingMigration(NamespaceMigration): but YAML valid too. Changed in version 3.3. """ def converter_graphics_backend_arguments_0001(self, value): - return yaml_load( - stream=value or '{}', - ) + return smart_yaml_load(value=value) diff --git a/mayan/apps/converter/tests/test_setting_migrations.py b/mayan/apps/converter/tests/test_setting_migrations.py index 028fdd3de4..b2af057eaf 100644 --- a/mayan/apps/converter/tests/test_setting_migrations.py +++ b/mayan/apps/converter/tests/test_setting_migrations.py @@ -1,39 +1,32 @@ from __future__ import unicode_literals -from django.conf import settings -from django.utils.encoding import force_bytes - from mayan.apps.common.tests.base import BaseTestCase -from mayan.apps.common.tests.mixins import EnvironmentTestCaseMixin -from mayan.apps.smart_settings.classes import Setting -from mayan.apps.storage.utils import NamedTemporaryFile +from mayan.apps.smart_settings.tests.mixins import SmartSettingTestMixin from ..settings import setting_graphics_backend_arguments class ConverterSettingMigrationTestCase( - EnvironmentTestCaseMixin, BaseTestCase + SmartSettingTestMixin, BaseTestCase ): def test_converter_graphics_backend_arguments_0001_migration(self): - test_value = {'location': 'test value'} + self.test_setting = setting_graphics_backend_arguments + self.test_config_value = '{}'.format(test_value) + self._create_test_config_file() - with NamedTemporaryFile() as file_object: - settings.CONFIGURATION_FILEPATH = file_object.name - file_object.write( - force_bytes( - '{}: {}'.format( - 'CONVERTER_GRAPHICS_BACKEND_ARGUMENTS', - '"{}"'.format( - Setting.serialize_value(value=test_value) - ) - ) - ) - ) - file_object.seek(0) - Setting._config_file_cache = None + self.assertEqual( + setting_graphics_backend_arguments.value, + test_value + ) - self.assertEqual( - setting_graphics_backend_arguments.value, - test_value - ) + def test_converter_graphics_backend_arguments_0001_migration_with_dict(self): + test_value = {'location': 'test value'} + self.test_setting = setting_graphics_backend_arguments + self.test_config_value = test_value + self._create_test_config_file() + + self.assertEqual( + setting_graphics_backend_arguments.value, + test_value + ) diff --git a/mayan/apps/document_signatures/setting_migrations.py b/mayan/apps/document_signatures/setting_migrations.py index 232048637c..3442b1ebb8 100644 --- a/mayan/apps/document_signatures/setting_migrations.py +++ b/mayan/apps/document_signatures/setting_migrations.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals -from mayan.apps.common.serialization import yaml_load from mayan.apps.smart_settings.classes import NamespaceMigration +from mayan.apps.smart_settings.utils import smart_yaml_load class DocumentSignaturesSettingMigration(NamespaceMigration): @@ -10,6 +10,4 @@ class DocumentSignaturesSettingMigration(NamespaceMigration): but YAML valid too. Changed in version 3.3. """ def signatures_storage_backend_arguments_0001(self, value): - return yaml_load( - stream=value or '{}', - ) + return smart_yaml_load(value=value) diff --git a/mayan/apps/document_signatures/tests/test_setting_migrations.py b/mayan/apps/document_signatures/tests/test_setting_migrations.py index 76fc83a7c3..2c76b2d66a 100644 --- a/mayan/apps/document_signatures/tests/test_setting_migrations.py +++ b/mayan/apps/document_signatures/tests/test_setting_migrations.py @@ -1,39 +1,32 @@ from __future__ import unicode_literals -from django.conf import settings -from django.utils.encoding import force_bytes - from mayan.apps.common.tests.base import BaseTestCase -from mayan.apps.common.tests.mixins import EnvironmentTestCaseMixin -from mayan.apps.smart_settings.classes import Setting -from mayan.apps.storage.utils import NamedTemporaryFile +from mayan.apps.smart_settings.tests.mixins import SmartSettingTestMixin from ..settings import setting_storage_backend_arguments class DocumentSignaturesSettingMigrationTestCase( - EnvironmentTestCaseMixin, BaseTestCase + SmartSettingTestMixin, BaseTestCase ): def test_signatures_storage_backend_arguments_0001_migration(self): - test_value = {'location': 'test value'} + self.test_setting = setting_storage_backend_arguments + self.test_config_value = '{}'.format(test_value) + self._create_test_config_file() - with NamedTemporaryFile() as file_object: - settings.CONFIGURATION_FILEPATH = file_object.name - file_object.write( - force_bytes( - '{}: {}'.format( - 'SIGNATURES_STORAGE_BACKEND_ARGUMENTS', - '"{}"'.format( - Setting.serialize_value(value=test_value) - ) - ) - ) - ) - file_object.seek(0) - Setting._config_file_cache = None + self.assertEqual( + setting_storage_backend_arguments.value, + test_value + ) - self.assertEqual( - setting_storage_backend_arguments.value, - test_value - ) + def test_signatures_storage_backend_arguments_0001_migration_with_dict(self): + test_value = {'location': 'test value'} + self.test_setting = setting_storage_backend_arguments + self.test_config_value = test_value + self._create_test_config_file() + + self.assertEqual( + setting_storage_backend_arguments.value, + test_value + ) diff --git a/mayan/apps/documents/setting_migrations.py b/mayan/apps/documents/setting_migrations.py index d45a470d22..1043135e17 100644 --- a/mayan/apps/documents/setting_migrations.py +++ b/mayan/apps/documents/setting_migrations.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals -from mayan.apps.common.serialization import yaml_load from mayan.apps.smart_settings.classes import NamespaceMigration +from mayan.apps.smart_settings.utils import smart_yaml_load class DocumentsSettingMigration(NamespaceMigration): @@ -10,11 +10,7 @@ class DocumentsSettingMigration(NamespaceMigration): but YAML valid too. Changed in version 3.3. """ def documents_cache_storage_backend_arguments_0001(self, value): - return yaml_load( - stream=value or '{}', - ) + return smart_yaml_load(value=value) def documents_storage_backend_arguments_0001(self, value): - return yaml_load( - stream=value or '{}', - ) + return smart_yaml_load(value=value) diff --git a/mayan/apps/documents/tests/test_setting_migrations.py b/mayan/apps/documents/tests/test_setting_migrations.py index 3690689323..fabab41ab6 100644 --- a/mayan/apps/documents/tests/test_setting_migrations.py +++ b/mayan/apps/documents/tests/test_setting_migrations.py @@ -1,12 +1,7 @@ from __future__ import unicode_literals -from django.conf import settings -from django.utils.encoding import force_bytes - from mayan.apps.common.tests.base import BaseTestCase -from mayan.apps.common.tests.mixins import EnvironmentTestCaseMixin -from mayan.apps.smart_settings.classes import Setting -from mayan.apps.storage.utils import NamedTemporaryFile +from mayan.apps.smart_settings.tests.mixins import SmartSettingTestMixin from ..settings import ( setting_documentimagecache_storage_arguments, @@ -14,49 +9,47 @@ from ..settings import ( ) -class DocumentSettingMigrationTestCase(EnvironmentTestCaseMixin, BaseTestCase): +class DocumentSettingMigrationTestCase(SmartSettingTestMixin, BaseTestCase): def test_documents_storage_backend_arguments_0001(self): test_value = {'location': 'test value'} + self.test_setting = setting_documentimagecache_storage_arguments + self.test_config_value = '{}'.format(test_value) + self._create_test_config_file() - with NamedTemporaryFile() as file_object: - settings.CONFIGURATION_FILEPATH = file_object.name - file_object.write( - force_bytes( - '{}: {}'.format( - 'DOCUMENTS_CACHE_STORAGE_BACKEND_ARGUMENTS', - '"{}"'.format( - Setting.serialize_value(value=test_value) - ) - ) - ) - ) - file_object.seek(0) - Setting._config_file_cache = None + self.assertEqual( + setting_documentimagecache_storage_arguments.value, + test_value + ) - self.assertEqual( - setting_documentimagecache_storage_arguments.value, - test_value - ) + def test_documents_storage_backend_arguments_0001_with_dict(self): + test_value = {'location': 'test value'} + self.test_setting = setting_documentimagecache_storage_arguments + self.test_config_value = test_value + self._create_test_config_file() + + self.assertEqual( + setting_documentimagecache_storage_arguments.value, + test_value + ) def test_documents_cache_storage_backend_arguments_0001(self): test_value = {'location': 'test value'} + self.test_setting = setting_storage_backend_arguments + self.test_config_value = '{}'.format(test_value) + self._create_test_config_file() - with NamedTemporaryFile() as file_object: - settings.CONFIGURATION_FILEPATH = file_object.name - file_object.write( - force_bytes( - '{}: {}'.format( - 'DOCUMENTS_STORAGE_BACKEND_ARGUMENTS', - '"{}"'.format( - Setting.serialize_value(value=test_value) - ) - ) - ) - ) - file_object.seek(0) - Setting._config_file_cache = None + self.assertEqual( + setting_storage_backend_arguments.value, + test_value + ) - self.assertEqual( - setting_storage_backend_arguments.value, - test_value - ) + def test_documents_cache_storage_backend_arguments_0001_with_dict(self): + test_value = {'location': 'test value'} + self.test_setting = setting_storage_backend_arguments + self.test_config_value = test_value + self._create_test_config_file() + + self.assertEqual( + setting_storage_backend_arguments.value, + test_value + ) diff --git a/mayan/apps/file_metadata/setting_migrations.py b/mayan/apps/file_metadata/setting_migrations.py index 9dc7732480..9fe39238bd 100644 --- a/mayan/apps/file_metadata/setting_migrations.py +++ b/mayan/apps/file_metadata/setting_migrations.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals -from mayan.apps.common.serialization import yaml_load from mayan.apps.smart_settings.classes import NamespaceMigration +from mayan.apps.smart_settings.utils import smart_yaml_load class FileMetadataSettingMigration(NamespaceMigration): @@ -10,6 +10,4 @@ class FileMetadataSettingMigration(NamespaceMigration): but YAML valid too. Changed in version 3.3. """ def file_metadata_drivers_arguments_0001(self, value): - return yaml_load( - stream=value or '{}', - ) + return smart_yaml_load(value=value) diff --git a/mayan/apps/file_metadata/tests/test_setting_migrations.py b/mayan/apps/file_metadata/tests/test_setting_migrations.py index ee5398f8e7..67b3d9175e 100644 --- a/mayan/apps/file_metadata/tests/test_setting_migrations.py +++ b/mayan/apps/file_metadata/tests/test_setting_migrations.py @@ -1,39 +1,32 @@ from __future__ import unicode_literals -from django.conf import settings -from django.utils.encoding import force_bytes - from mayan.apps.common.tests.base import BaseTestCase -from mayan.apps.common.tests.mixins import EnvironmentTestCaseMixin -from mayan.apps.smart_settings.classes import Setting -from mayan.apps.storage.utils import NamedTemporaryFile +from mayan.apps.smart_settings.tests.mixins import SmartSettingTestMixin from ..settings import setting_drivers_arguments class FileMetadataSettingMigrationTestCase( - EnvironmentTestCaseMixin, BaseTestCase + SmartSettingTestMixin, BaseTestCase ): def test_file_metadata_drivers_arguments_0001_migration(self): - test_value = {'location': 'test value'} + self.test_setting = setting_drivers_arguments + self.test_config_value = '{}'.format(test_value) + self._create_test_config_file() - with NamedTemporaryFile() as file_object: - settings.CONFIGURATION_FILEPATH = file_object.name - file_object.write( - force_bytes( - '{}: {}'.format( - 'FILE_METADATA_DRIVERS_ARGUMENTS', - '"{}"'.format( - Setting.serialize_value(value=test_value) - ) - ) - ) - ) - file_object.seek(0) - Setting._config_file_cache = None + self.assertEqual( + setting_drivers_arguments.value, + test_value + ) - self.assertEqual( - setting_drivers_arguments.value, - test_value - ) + def test_file_metadata_drivers_arguments_0001_migration_with_dict(self): + test_value = {'location': 'test value'} + self.test_setting = setting_drivers_arguments + self.test_config_value = test_value + self._create_test_config_file() + + self.assertEqual( + setting_drivers_arguments.value, + test_value + ) diff --git a/mayan/apps/ocr/setting_migrations.py b/mayan/apps/ocr/setting_migrations.py index 5ee961a085..ed4f15a55a 100644 --- a/mayan/apps/ocr/setting_migrations.py +++ b/mayan/apps/ocr/setting_migrations.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals -from mayan.apps.common.serialization import yaml_load from mayan.apps.smart_settings.classes import NamespaceMigration +from mayan.apps.smart_settings.utils import smart_yaml_load class OCRSettingMigration(NamespaceMigration): @@ -10,6 +10,4 @@ class OCRSettingMigration(NamespaceMigration): but YAML valid too. Changed in version 3.3. """ def ocr_backend_arguments_0001(self, value): - return yaml_load( - stream=value or '{}', - ) + return smart_yaml_load(value=value) diff --git a/mayan/apps/ocr/tests/test_setting_migrations.py b/mayan/apps/ocr/tests/test_setting_migrations.py index fa768a04fe..39d87cf316 100644 --- a/mayan/apps/ocr/tests/test_setting_migrations.py +++ b/mayan/apps/ocr/tests/test_setting_migrations.py @@ -1,36 +1,28 @@ from __future__ import unicode_literals -from django.conf import settings -from django.utils.encoding import force_bytes - from mayan.apps.common.tests.base import BaseTestCase -from mayan.apps.common.tests.mixins import EnvironmentTestCaseMixin -from mayan.apps.smart_settings.classes import Setting -from mayan.apps.storage.utils import NamedTemporaryFile +from mayan.apps.smart_settings.tests.mixins import SmartSettingTestMixin from ..settings import setting_ocr_backend_arguments -class OCRSettingMigrationTestCase(EnvironmentTestCaseMixin, BaseTestCase): +class OCRSettingMigrationTestCase(SmartSettingTestMixin, BaseTestCase): def test_ocr_backend_arguments_0001(self): - test_value = {'location': 'test value'} + self.test_setting = setting_ocr_backend_arguments + self.test_config_value = '{}'.format(test_value) + self._create_test_config_file() - with NamedTemporaryFile() as file_object: - settings.CONFIGURATION_FILEPATH = file_object.name - file_object.write( - force_bytes( - '{}: {}'.format( - 'OCR_BACKEND_ARGUMENTS', - '"{}"'.format( - Setting.serialize_value(value=test_value) - ) - ) - ) - ) - file_object.seek(0) - Setting._config_file_cache = None + self.assertEqual( + setting_ocr_backend_arguments.value, test_value + ) - self.assertEqual( - setting_ocr_backend_arguments.value, test_value - ) + def test_ocr_backend_arguments_0001_with_dict(self): + test_value = {'location': 'test value'} + self.test_setting = setting_ocr_backend_arguments + self.test_config_value = test_value + self._create_test_config_file() + + self.assertEqual( + setting_ocr_backend_arguments.value, test_value + ) diff --git a/mayan/apps/smart_settings/tests/mixins.py b/mayan/apps/smart_settings/tests/mixins.py index d6d4a20f0c..c238f22166 100644 --- a/mayan/apps/smart_settings/tests/mixins.py +++ b/mayan/apps/smart_settings/tests/mixins.py @@ -3,6 +3,7 @@ from __future__ import absolute_import, unicode_literals from django.conf import settings from django.utils.encoding import force_bytes +from mayan.apps.common.tests.mixins import EnvironmentTestCaseMixin from mayan.apps.storage.utils import fs_cleanup, NamedTemporaryFile from ..classes import Namespace, Setting @@ -36,7 +37,7 @@ class SmartSettingsTestCaseMixin(object): Namespace.invalidate_cache_all() -class SmartSettingTestMixin(object): +class SmartSettingTestMixin(EnvironmentTestCaseMixin): test_setting_global_name = None test_config_file_object = None diff --git a/mayan/apps/smart_settings/utils.py b/mayan/apps/smart_settings/utils.py index b120ca5567..94b58dd719 100644 --- a/mayan/apps/smart_settings/utils.py +++ b/mayan/apps/smart_settings/utils.py @@ -5,6 +5,7 @@ import os import yaml +from mayan.apps.common.compat import dict_type from mayan.apps.common.serialization import yaml_load from .literals import ( @@ -219,6 +220,15 @@ class MediaBootstrapSetting(FilesystemBootstrapSetting): ) +def smart_yaml_load(value): + if isinstance(value, dict_type): + return value + else: + return yaml_load( + stream=value or '{}', + ) + + # FilesystemBootstrapSetting settings SettingNamespaceSingleton.register_setting( diff --git a/mayan/apps/sources/setting_migrations.py b/mayan/apps/sources/setting_migrations.py index 40af240d56..05265bf224 100644 --- a/mayan/apps/sources/setting_migrations.py +++ b/mayan/apps/sources/setting_migrations.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals -from mayan.apps.common.serialization import yaml_load from mayan.apps.smart_settings.classes import NamespaceMigration +from mayan.apps.smart_settings.utils import smart_yaml_load class SourcesSettingMigration(NamespaceMigration): @@ -10,6 +10,4 @@ class SourcesSettingMigration(NamespaceMigration): but YAML valid too. Changed in version 3.3. """ def sources_staging_file_cache_storage_backend_arguments_0001(self, value): - return yaml_load( - stream=value or '{}', - ) + return smart_yaml_load(value=value) diff --git a/mayan/apps/sources/tests/test_setting_migrations.py b/mayan/apps/sources/tests/test_setting_migrations.py index 5d748bdbe8..e922bafa3c 100644 --- a/mayan/apps/sources/tests/test_setting_migrations.py +++ b/mayan/apps/sources/tests/test_setting_migrations.py @@ -1,35 +1,33 @@ from __future__ import unicode_literals -from django.conf import settings -from django.utils.encoding import force_bytes - from mayan.apps.common.tests.base import BaseTestCase -from mayan.apps.common.tests.mixins import EnvironmentTestCaseMixin -from mayan.apps.smart_settings.classes import Setting -from mayan.apps.storage.utils import NamedTemporaryFile +from mayan.apps.smart_settings.tests.mixins import SmartSettingTestMixin from ..settings import setting_staging_file_image_cache_storage_arguments -class SourceSettingMigrationTestCase(EnvironmentTestCaseMixin, BaseTestCase): +class SourceSettingMigrationTestCase( + SmartSettingTestMixin, BaseTestCase +): def test_setting_staging_file_image_cache_storage_arguments_0001_migration(self): + test_value = {'location': 'test value'} + self.test_setting = setting_staging_file_image_cache_storage_arguments + self.test_config_value = '{}'.format(test_value) + self._create_test_config_file() + self.assertEqual( + setting_staging_file_image_cache_storage_arguments.value, + test_value + ) + + def test_setting_staging_file_image_cache_storage_arguments_0001_migration_with_dict(self): test_value = {'location': 'test value'} - with NamedTemporaryFile() as file_object: - settings.CONFIGURATION_FILEPATH = file_object.name - file_object.write( - force_bytes( - '{}: {}'.format( - 'SOURCES_STAGING_FILE_CACHE_STORAGE_BACKEND_ARGUMENTS', - '"{}"'.format(Setting.serialize_value(value=test_value)) - ) - ) - ) - file_object.seek(0) - Setting._config_file_cache = None + self.test_setting = setting_staging_file_image_cache_storage_arguments + self.test_config_value = test_value + self._create_test_config_file() - self.assertEqual( - setting_staging_file_image_cache_storage_arguments.value, - test_value - ) + self.assertEqual( + setting_staging_file_image_cache_storage_arguments.value, + test_value + )