From 0a97603cce1adf7de12aa0b73d1b70f1204f3592 Mon Sep 17 00:00:00 2001 From: Sakari Kapanen Date: Wed, 9 Oct 2019 19:02:45 +0300 Subject: [PATCH] Add AXES_ENABLE_ADMIN flag to configure showing Axes in admin (#499) --- axes/admin.py | 8 ++++++-- axes/conf.py | 3 +++ axes/tests/test_admin.py | 28 ++++++++++++++++++++++++++++ docs/4_configuration.rst | 3 +++ 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 axes/tests/test_admin.py diff --git a/axes/admin.py b/axes/admin.py index b4ba2ca..3bf52bc 100644 --- a/axes/admin.py +++ b/axes/admin.py @@ -1,10 +1,10 @@ +from django.conf import settings from django.contrib import admin from django.utils.translation import gettext_lazy as _ from axes.models import AccessAttempt, AccessLog -@admin.register(AccessAttempt) class AccessAttemptAdmin(admin.ModelAdmin): list_display = ( "attempt_time", @@ -43,7 +43,6 @@ class AccessAttemptAdmin(admin.ModelAdmin): return False -@admin.register(AccessLog) class AccessLogAdmin(admin.ModelAdmin): list_display = ( "attempt_time", @@ -77,3 +76,8 @@ class AccessLogAdmin(admin.ModelAdmin): def has_add_permission(self, request): return False + + +if settings.AXES_ENABLE_ADMIN: + admin.site.register(AccessAttempt, AccessAttemptAdmin) + admin.site.register(AccessLog, AccessLogAdmin) diff --git a/axes/conf.py b/axes/conf.py index 67c5e47..f3c7848 100644 --- a/axes/conf.py +++ b/axes/conf.py @@ -23,6 +23,9 @@ class AxesAppConf(AppConf): # lock out just for admin site ONLY_ADMIN_SITE = False + # show Axes logs in admin + ENABLE_ADMIN = True + # lock out with the user agent, has no effect when ONLY_USER_FAILURES is set USE_USER_AGENT = False diff --git a/axes/tests/test_admin.py b/axes/tests/test_admin.py new file mode 100644 index 0000000..7857420 --- /dev/null +++ b/axes/tests/test_admin.py @@ -0,0 +1,28 @@ +from contextlib import suppress +from importlib import reload + +from django.contrib import admin +from django.test import override_settings + +import axes.admin +from axes.models import AccessAttempt, AccessLog +from axes.tests.base import AxesTestCase + + +class AxesEnableAdminFlag(AxesTestCase): + def setUp(self): + with suppress(admin.sites.NotRegistered): + admin.site.unregister(AccessAttempt) + with suppress(admin.sites.NotRegistered): + admin.site.unregister(AccessLog) + + @override_settings(AXES_ENABLE_ADMIN=False) + def test_disable_admin(self): + reload(axes.admin) + self.assertFalse(admin.site.is_registered(AccessAttempt)) + self.assertFalse(admin.site.is_registered(AccessLog)) + + def test_enable_admin_by_default(self): + reload(axes.admin) + self.assertTrue(admin.site.is_registered(AccessAttempt)) + self.assertTrue(admin.site.is_registered(AccessLog)) diff --git a/docs/4_configuration.rst b/docs/4_configuration.rst index c6649ad..69b49ab 100644 --- a/docs/4_configuration.rst +++ b/docs/4_configuration.rst @@ -38,6 +38,9 @@ The following ``settings.py`` options are available for customizing Axes behavio and never lock based on IP if attempts exceed the limit. Otherwise utilize the existing IP and user locking logic. Default: ``False`` +* ``AXES_ENABLE_ADMIN``: If ``True``, admin views for access attempts and + logins are shown in Django admin interface. + Default: ``True`` * ``AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IP``: If ``True``, prevent login from IP under a particular username if the attempt limit has been exceeded, otherwise lock out based on IP.