Coverage for users/signals.py: 67%
25 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1import logging
3from django.contrib.auth.signals import user_logged_in, user_login_failed
4from django.db.models.signals import post_save
5from django.dispatch import receiver
7from netbox.config import get_config
8from users.models import User, UserConfig
9from utilities.request import get_client_ip
12@receiver(user_login_failed)
13def log_user_login_failed(sender, credentials, request, **kwargs):
14 logger = logging.getLogger('netbox.auth.login')
15 username = credentials.get("username")
16 if client_ip := get_client_ip(request): 16 ↛ 19line 16 didn't jump to line 19 because the condition on line 16 was always true
17 logger.info(f"Failed login attempt for username: {username} from {client_ip}")
18 else:
19 logger.warning(
20 "Client IP address could not be determined for validation. Check that the HTTP server is properly "
21 "configured to pass the required header(s)."
22 )
23 logger.info(f"Failed login attempt for username: {username}")
26@receiver(user_logged_in)
27def set_language_on_login(sender, user, request, **kwargs):
28 """
29 Store the user's preferred language on the request so that middleware can set the language cookie. This ensures the
30 language preference is applied even when logging in via an external auth provider (e.g. social-app-django) that
31 does not go through NetBox's LoginView.
32 """
33 if hasattr(user, 'config'):
34 if language := user.config.get('locale.language'):
35 request._language_cookie = language
38@receiver(post_save, sender=User)
39def create_userconfig(instance, created, raw=False, **kwargs):
40 """
41 Automatically create a new UserConfig when a new User is created. Skip this if importing a user from a fixture.
42 """
43 if created and not raw: 43 ↛ exitline 43 didn't return from function 'create_userconfig' because the condition on line 43 was always true
44 config = get_config()
45 UserConfig(user=instance, data=config.DEFAULT_USER_PREFERENCES).save()