From 726444b687957230eee7b9dfe8bd9643355f5172 Mon Sep 17 00:00:00 2001 From: James Gillard Date: Sun, 7 Dec 2025 11:27:07 +0000 Subject: [PATCH] Fix AttributeError when AUDITLOG_LOGENTRY_MODEL is not set (#788) Use getattr() with default value in get_logentry_model() to handle cases where conf.py hasn't been imported yet due to import order. Adds regression test to verify the fix. --- auditlog/__init__.py | 7 +++---- auditlog_tests/tests.py | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/auditlog/__init__.py b/auditlog/__init__.py index 3f39bfd..a893596 100644 --- a/auditlog/__init__.py +++ b/auditlog/__init__.py @@ -10,10 +10,9 @@ __version__ = version("django-auditlog") def get_logentry_model(): + model_string = getattr(settings, "AUDITLOG_LOGENTRY_MODEL", "auditlog.LogEntry") try: - return django_apps.get_model( - settings.AUDITLOG_LOGENTRY_MODEL, require_ready=False - ) + return django_apps.get_model(model_string, require_ready=False) except ValueError: raise ImproperlyConfigured( "AUDITLOG_LOGENTRY_MODEL must be of the form 'app_label.model_name'" @@ -21,5 +20,5 @@ def get_logentry_model(): except LookupError: raise ImproperlyConfigured( "AUDITLOG_LOGENTRY_MODEL refers to model '%s' that has not been installed" - % settings.AUDITLOG_LOGENTRY_MODEL + % model_string ) diff --git a/auditlog_tests/tests.py b/auditlog_tests/tests.py index 3183015..aba766e 100644 --- a/auditlog_tests/tests.py +++ b/auditlog_tests/tests.py @@ -3248,3 +3248,22 @@ class GetLogEntryModelTest(TestCase): def test_invalid_appname(self): with self.assertRaises(ImproperlyConfigured): get_logentry_model() + + def test_logentry_model_default_when_setting_missing(self): + """Regression test for issue #788: AttributeError when AUDITLOG_LOGENTRY_MODEL is not set.""" + # Save and remove the setting to simulate the bug condition + original_value = getattr(settings, "AUDITLOG_LOGENTRY_MODEL", None) + if hasattr(settings, "AUDITLOG_LOGENTRY_MODEL"): + delattr(settings, "AUDITLOG_LOGENTRY_MODEL") + + try: + # This should NOT raise AttributeError - it should use the default + model = get_logentry_model() + self.assertEqual( + f"{model._meta.app_label}.{model._meta.object_name}", + "auditlog.LogEntry", + ) + finally: + # Restore the original setting + if original_value is not None: + settings.AUDITLOG_LOGENTRY_MODEL = original_value