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
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
1from pydantic import UUID4
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
15ALLOWED_SIZE = 500 * fs_stats.megabyte
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__()
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)
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
37 group_repos = get_repositories(repos.session, group_id=new_group.id, household_id=None)
38 group_preferences = group_repos.group_preferences.create(prefs)
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 )
50 new_group.preferences = group_preferences
51 new_group.households = [household]
53 return new_group
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 """
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)