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