Coverage for opt/mealie/lib/python3.12/site-packages/mealie/services/exporter/exporter.py: 100%
28 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
1import datetime
2import shutil
3import zipfile
4from pathlib import Path
5from uuid import UUID, uuid4
7from mealie.pkgs.stats.fs_stats import pretty_size
8from mealie.repos.all_repositories import AllRepositories
9from mealie.schema.group.group_exports import GroupDataExport
10from mealie.schema.user import GroupInDB
12from .._base_service import BaseService
13from ._abc_exporter import ABCExporter
16class Exporter(BaseService):
17 def __init__(self, group_id: UUID, temp_zip: Path, exporters: list[ABCExporter]) -> None:
18 super().__init__()
20 self.group_id = group_id
21 self.temp_path = temp_zip
22 self.exporters = exporters
24 def run(self, db: AllRepositories) -> GroupDataExport:
25 # Create Zip File
26 self.temp_path.touch()
28 # Open Zip File
29 with zipfile.ZipFile(self.temp_path, "w") as zip:
30 for exporter in self.exporters:
31 exporter.export(zip)
33 export_id = uuid4()
35 export_path = GroupInDB.get_export_directory(self.group_id) / f"{export_id}.zip"
37 shutil.copy(self.temp_path, export_path)
39 group_data_export = GroupDataExport(
40 id=export_id,
41 group_id=self.group_id,
42 path=str(export_path),
43 name="Data Export",
44 size=pretty_size(export_path.stat().st_size),
45 filename=export_path.name,
46 expires=datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=1),
47 )
49 db.group_exports.create(group_data_export)
51 return group_data_export