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

37 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-11-25 15:48 +0000

1from pydantic import UUID4 1a

2 

3from mealie.core.config import get_app_settings 1a

4from mealie.pkgs.stats import fs_stats 1a

5from mealie.repos.all_repositories import get_repositories 1a

6from mealie.repos.repository_factory import AllRepositories 1a

7from mealie.schema.group.group_preferences import CreateGroupPreferences 1a

8from mealie.schema.group.group_statistics import GroupStorage 1a

9from mealie.schema.household.household import HouseholdCreate 1a

10from mealie.schema.household.household_preferences import CreateHouseholdPreferences 1a

11from mealie.schema.user.user import GroupBase 1a

12from mealie.services._base_service import BaseService 1a

13from mealie.services.household_services.household_service import HouseholdService 1a

14 

15ALLOWED_SIZE = 500 * fs_stats.megabyte 1a

16 

17 

18class GroupService(BaseService): 1a

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

20 self.group_id = group_id 

21 self.repos = repos 

22 super().__init__() 

23 

24 @staticmethod 1a

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

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) 1ab

31 

32 if prefs is None: 1ab

33 prefs = CreateGroupPreferences(group_id=new_group.id) 1a

34 else: 

35 prefs.group_id = new_group.id 1b

36 

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

38 group_preferences = group_repos.group_preferences.create(prefs) 1ab

39 

40 settings = get_app_settings() 1ab

41 household = HouseholdService.create_household( 1ab

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 1ab

51 new_group.households = [household] 1ab

52 

53 return new_group 1ab

54 

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

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)