Source code for ferrosoft.apps.emiflow.forms.reporting
# Copyright (c) 2025 Ferrosoft GmbH. All rights reserved.
from django import forms
from django.utils.translation import gettext_lazy as _
from ferrosoft.apps.date_time import now_utc
from ferrosoft.apps.emiflow.models import Report, ReportTemplate, Settings
from ferrosoft.apps.emiflow.services.reporting import DocumentOutput
from ferrosoft.apps.ferrobase.models import (
StoredFile,
LocalUser,
AccessSubject,
AccessMode,
)
from ferrosoft.apps.reporting.models import Report as UpstreamReport
[docs]
class ReportForm(forms.ModelForm):
[docs]
class Meta:
model = Report
fields = [
"reference",
"name",
"type",
"proportional_emissions",
]
[docs]
class ReportTemplateForm(forms.ModelForm):
[docs]
class Meta:
model = ReportTemplate
fields = [
"name",
"document_title",
"document_sender",
"document_preamble",
"document_epilogue",
"company_logo_orientation",
"company_logo_aspect_ratio",
"company_logo_width",
]
widgets = {
"document_preamble": forms.Textarea(attrs={"class": "document_texts"}),
"document_epilogue": forms.Textarea(attrs={"class": "document_texts"}),
}
company_logo = forms.ImageField(required=False, label=_("Company Logo"))
def __init__(self, *args, **kwargs):
self.user: LocalUser = kwargs.pop("user")
super().__init__(*args, **kwargs)
[docs]
def save(self, commit=True):
instance: ReportTemplate = super().save(commit)
# Image has to be handled specially because it is a StoredFile.
if "company_logo" in self.files:
uploaded_logo = self.files["company_logo"]
logo_file = instance.company_logo
if logo_file is None:
logo_file = StoredFile.objects.create_with_access_grants(
name=uploaded_logo.name,
content=uploaded_logo,
media_type=StoredFile.guess_media_type(uploaded_logo.name),
directory=Settings.get_instance().get_company_logo_directory(),
creation_time=now_utc(),
owner=self.user,
grants={
AccessSubject.OWNER: [AccessMode.READ, AccessMode.WRITE],
AccessSubject.ORGANIZATION: [AccessMode.READ],
},
)
instance.company_logo = logo_file
else:
logo_file.name = uploaded_logo.name
logo_file.content = uploaded_logo
logo_file.media_type = StoredFile.guess_media_type(uploaded_logo.name)
logo_file.creation_time = now_utc()
if commit:
logo_file.save(
update_fields=["name", "content", "media_type", "creation_time"]
)
if commit:
instance.save()
return instance
[docs]
class ReportTemplateSelectionForm(forms.Form):
template = forms.ModelChoiceField(
queryset=ReportTemplate.objects.all(),
label=_("Report Template"),
required=False,
widget=forms.Select(attrs={"class": "form-select-sm"}),
)
[docs]
class ReportOutputSelectionForm(forms.Form):
def __init__(
self,
*args,
reports: list[tuple[DocumentOutput, UpstreamReport]],
**kwargs,
):
super().__init__(*args, **kwargs)
self.fields["report"].choices = self.get_report_choices(reports)
[docs]
def get_report_choices(
self, reports: list[tuple[DocumentOutput, UpstreamReport]]
) -> list[tuple[str, str]]:
return [(str(report.pk), output.title) for output, report in reports]
report = forms.ChoiceField(
# Choices are filled through __init__
choices=[],
label=_("Report"),
required=False,
widget=forms.Select(attrs={"class": "form-select-sm"}),
)