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,
)