Coverage for users/signals.py: 67%

25 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1import logging 

2 

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 

6 

7from netbox.config import get_config 

8from users.models import User, UserConfig 

9from utilities.request import get_client_ip 

10 

11 

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}") 

24 

25 

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 

36 

37 

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()