Source code for ferrosoft.apps.reporting.services

#  Copyright (c) 2025 Ferrosoft GmbH. All rights reserved.
import pickle
from dataclasses import dataclass
from datetime import timedelta

from django.utils.translation import gettext_lazy as _

from ferrosoft.apps.date_time import now_utc
from ferrosoft.apps.ferrobase.models import LocalUser, Directory, StoredFile
from ferrosoft.apps.reporting.models import Report


DEFAULT_FILE_NAME = _("Report")
DEFAULT_DIRECTORY_NAME = _("Reports")


[docs] @dataclass class Params: owner: LocalUser = None directory: Directory | None = None expiry_days: int = 7 file_name: str | None = None return_url: str | None = None media_type: str = "application/pdf"
[docs] def prepare_report( *args, params: Params = None, **kwargs, ) -> Report: """ Prepare an empty report whose contents can be generated by redirecting to Report.get_absolute_url. Args: params: Parameters for StoredFile and Report. *args: Function object and arguments. This function is called and should return a PDF blob. **kwargs: Function keyword arguments. Returns: Report model instance. """ if params is None: raise ValueError("Params are required") if len(args) == 0: raise ValueError("Args are required") func_obj = args[0] func_args = pickle.dumps(args[1:]) func_kwargs = pickle.dumps(kwargs) creation_time = now_utc() file = StoredFile.objects.create( creation_time=creation_time, directory=params.directory or Directory.get_or_create(str(DEFAULT_DIRECTORY_NAME)), expire_on=creation_time + timedelta(days=params.expiry_days), media_type=params.media_type, name=params.file_name or str(DEFAULT_FILE_NAME), owner=params.owner, ) return Report.objects.create( document=file, func_name="%s.%s" % (func_obj.__module__, func_obj.__name__), func_args=func_args, func_kwargs=func_kwargs, return_url=params.return_url, )