Coverage for opt/mealie/lib/python3.12/site-packages/mealie/services/user_services/user_service.py: 62%

25 statements  

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

1from datetime import UTC, datetime 

2 

3from mealie.repos.repository_factory import AllRepositories 

4from mealie.schema.user.user import PrivateUser 

5from mealie.services._base_service import BaseService 

6 

7 

8class UserService(BaseService): 

9 def __init__(self, repos: AllRepositories) -> None: 

10 self.repos = repos 

11 super().__init__() 

12 

13 def get_locked_users(self) -> list[PrivateUser]: 

14 return self.repos.users.get_locked_users() 

15 

16 def reset_locked_users(self, force: bool = False) -> int: 

17 """ 

18 Queriers that database for all locked users and resets their locked_at field to None 

19 if more than the set time has passed since the user was locked 

20 """ 

21 locked_users = self.get_locked_users() 

22 

23 unlocked = 0 

24 

25 for user in locked_users: 25 ↛ 26line 25 didn't jump to line 26 because the loop on line 25 never started

26 if force or not user.is_locked and user.locked_at is not None: 

27 self.unlock_user(user) 

28 unlocked += 1 

29 

30 return unlocked 

31 

32 def lock_user(self, user: PrivateUser) -> PrivateUser: 

33 user.locked_at = datetime.now(UTC) 

34 return self.repos.users.update(user.id, user) 

35 

36 def unlock_user(self, user: PrivateUser) -> PrivateUser: 

37 user.locked_at = None 

38 user.login_attemps = 0 

39 return self.repos.users.update(user.id, user)