from __future__ import annotations from sqlalchemy import select from sqlalchemy.orm import Session from app.models.report_settings import ( OrionImagePosition, OrionImageSize, OrionLayoutProfile, OrionLogoSize, OrionPageMargin, OrionReportSettings, OrionReportSettingsScope, OrionSignatureMode, OrionSpacing, OrionTableFontSize, ) from app.models.user import User from app.schemas.domain import OrionReportSettingsUpdate class OrionReportSettingsService: def __init__(self, session: Session) -> None: self.session = session def get_global(self) -> OrionReportSettings: settings = self.session.scalar( select(OrionReportSettings).where( OrionReportSettings.scope == OrionReportSettingsScope.global_.value ) ) if settings is not None: return settings settings = OrionReportSettings( scope=OrionReportSettingsScope.global_.value, layout_profile=OrionLayoutProfile.standard.value, show_cover_result_text=True, signature_mode=OrionSignatureMode.technical_only.value, image_size=OrionImageSize.medium.value, page_break_before_main_chapters=True, page_margin=OrionPageMargin.standard.value, section_spacing=OrionSpacing.standard.value, table_layout=OrionSpacing.standard.value, table_font_size=OrionTableFontSize.standard.value, image_position=OrionImagePosition.side_by_side.value, max_images_per_page=2, show_image_captions=True, show_header=True, show_footer=True, logo_size=OrionLogoSize.medium.value, compact_cover=False, ) self.session.add(settings) self.session.flush() return settings def update_global(self, payload: OrionReportSettingsUpdate, user: User) -> OrionReportSettings: settings = self.get_global() settings.layout_profile = payload.layout_profile.value settings.show_cover_result_text = payload.show_cover_result_text settings.signature_mode = payload.signature_mode.value settings.image_size = payload.image_size.value settings.page_break_before_main_chapters = payload.page_break_before_main_chapters settings.page_margin = payload.page_margin.value settings.section_spacing = payload.section_spacing.value settings.table_layout = payload.table_layout.value settings.table_font_size = payload.table_font_size.value settings.image_position = payload.image_position.value settings.max_images_per_page = payload.max_images_per_page settings.show_image_captions = payload.show_image_captions settings.show_header = payload.show_header settings.show_footer = payload.show_footer settings.logo_size = payload.logo_size.value settings.compact_cover = payload.compact_cover settings.updated_by_user_id = user.id self.session.flush() return settings