diff --git a/README.md b/README.md index 9d4e06b..5370052 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,10 @@ MAINTENANCE_MODE_STATE_BACKEND = "maintenance_mode.backends.LocalFileBackend" # alternatively it is possible to use the default storage backend MAINTENANCE_MODE_STATE_BACKEND = "maintenance_mode.backends.DefaultStorageBackend" + +# alternatively it is possible to use the static storage backend +# make sure that STATIC_ROOT and SATIC_URL are also set +MAINTENANCE_MODE_STATE_BACKEND = "maintenance_mode.backends.StaticStorageBackend" ``` ```python diff --git a/maintenance_mode/backends.py b/maintenance_mode/backends.py index 1be4ef6..13dc5b9 100644 --- a/maintenance_mode/backends.py +++ b/maintenance_mode/backends.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from django.conf import settings +from django.contrib.staticfiles.storage import staticfiles_storage from django.core.files.base import ContentFile from django.core.files.storage import default_storage @@ -55,6 +56,27 @@ def set_value(self, value): default_storage.save(filename, content) +class StaticStorageBackend(AbstractStateBackend): + """ + django-maintenance-mode backend which uses the staticfiles storage. + """ + + def get_value(self): + filename = settings.MAINTENANCE_MODE_STATE_FILE_NAME + try: + with staticfiles_storage.open(filename, "r") as statefile: + return self.from_str_to_bool_value(statefile.read()) + except IOError: + return False + + def set_value(self, value): + filename = settings.MAINTENANCE_MODE_STATE_FILE_NAME + if staticfiles_storage.exists(filename): + staticfiles_storage.delete(filename) + content = ContentFile(self.from_bool_to_str_value(value).encode()) + staticfiles_storage.save(filename, content) + + class LocalFileBackend(AbstractStateBackend): """ django-maintenance-mode backend which uses the local file-sistem. diff --git a/tests/tests.py b/tests/tests.py index e9b5f9d..665116b 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -232,6 +232,29 @@ def test_backend_default_storage(self): "maintenance_mode.backends.LocalFileBackend" ) + def test_backend_static_storage(self): + + self.__reset_state() + + settings.MAINTENANCE_MODE_STATE_BACKEND = ( + "maintenance_mode.backends.StaticStorageBackend" + ) + settings.STATIC_URL = "/static/" + settings.STATIC_ROOT = "static" + + backend = core.get_maintenance_mode_backend() + self.assertEqual(backend.get_value(), False) + + backend.set_value(True) + self.assertEqual(backend.get_value(), True) + + backend.set_value(False) + self.assertEqual(backend.get_value(), False) + + settings.MAINTENANCE_MODE_STATE_BACKEND = ( + "maintenance_mode.backends.LocalFileBackend" + ) + def test_backend_custom_invalid(self): self.__reset_state()