Coverage for opt/mealie/lib/python3.12/site-packages/mealie/services/group_services/group_service.py: 95%

37 statements  

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

1from pydantic import UUID4 

2 

3from mealie.core.config import get_app_settings 

4from mealie.pkgs.stats import fs_stats 

5from mealie.repos.all_repositories import get_repositories 

6from mealie.repos.repository_factory import AllRepositories 

7from mealie.schema.group.group_preferences import CreateGroupPreferences 

8from mealie.schema.group.group_statistics import GroupStorage 

9from mealie.schema.household.household import HouseholdCreate 

10from mealie.schema.household.household_preferences import CreateHouseholdPreferences 

11from mealie.schema.user.user import GroupBase 

12from mealie.services._base_service import BaseService 

13from mealie.services.household_services.household_service import HouseholdService 

14 

15ALLOWED_SIZE = 500 * fs_stats.megabyte 

16 

17 

18class GroupService(BaseService): 

19 def __init__(self, group_id: UUID4, repos: AllRepositories): 

20 self.group_id = group_id 

21 self.repos = repos 

22 super().__init__() 

23 

24 @staticmethod 

25 def create_group(repos: AllRepositories, g_base: GroupBase, prefs: CreateGroupPreferences | None = None): 

26 """ 

27 Creates a new group in the database with the required associated table references to ensure 

28 the group includes required preferences and default household. 

29 """ 

30 new_group = repos.groups.create(g_base) 

31 

32 if prefs is None: 32 ↛ 35line 32 didn't jump to line 35 because the condition on line 32 was always true

33 prefs = CreateGroupPreferences(group_id=new_group.id) 

34 else: 

35 prefs.group_id = new_group.id 

36 

37 group_repos = get_repositories(repos.session, group_id=new_group.id, household_id=None) 

38 group_preferences = group_repos.group_preferences.create(prefs) 

39 

40 settings = get_app_settings() 

41 household = HouseholdService.create_household( 

42 group_repos, 

43 HouseholdCreate(name=settings.DEFAULT_HOUSEHOLD, group_id=new_group.id), 

44 prefs=CreateHouseholdPreferences( 

45 private_household=group_preferences.private_group, 

46 recipe_public=not group_preferences.private_group, 

47 ), 

48 ) 

49 

50 new_group.preferences = group_preferences 

51 new_group.households = [household] 

52 

53 return new_group 

54 

55 def calculate_group_storage(self, group_id: None | UUID4 = None) -> GroupStorage: 

56 """ 

57 calculate_group_storage calculates the storage used by the group and returns 

58 a GroupStorage object. 

59 """ 

60 

61 # we need all recipes from all households, not just our household 

62 group_repos = get_repositories(self.repos.session, group_id=group_id, household_id=None) 

63 

64 target_id = group_id or self.group_id 

65 

66 all_ids = group_repos.recipes.all_ids(target_id) 

67 

68 used_size = sum( 

69 fs_stats.get_dir_size(f"{self.directories.RECIPE_DATA_DIR}/{recipe_id!s}") for recipe_id in all_ids 

70 ) 

71 

72 return GroupStorage.bytes(used_size, ALLOWED_SIZE)