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 17:29 +0000
« prev ^ index » next coverage.py v7.10.6, created at 2025-11-25 17:29 +0000
1from pydantic import UUID4 1a
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
15ALLOWED_SIZE = 500 * fs_stats.megabyte 1a
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__()
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
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
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
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 )
50 new_group.preferences = group_preferences 1ab
51 new_group.households = [household] 1ab
53 return new_group 1ab
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 """
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)
64 target_id = group_id or self.group_id
66 all_ids = group_repos.recipes.all_ids(target_id)
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 )
72 return GroupStorage.bytes(used_size, ALLOWED_SIZE)