grantforge-api / backend /core /project_markdown.py
GrantForge Bot
Deploy sha-9a5957fcdef15b7e2623f8b147cda6026475aee0 — source build (no GHCR)
3a3734f
Raw
History Blame Contribute Delete
4.34 kB
"""Wspólne składanie markdown wniosku z sekcji projektu (PL tytuły)."""
from scripts.seed_section_templates import TEMPLATES
UNIVERSAL_FALLBACK_MAP = {
"project_summary": "Streszczenie Projektu",
"company_potential": "Opis przedsiębiorstwa i potencjał",
"innovation_description": "Opis innowacji / B+R",
"market_analysis": "Analiza rynku i konkurencji",
"research_agenda": "Agenda badawcza / cele",
"trl_levels": "Poziom gotowości technologii (TRL)",
"budget_and_costs": "Budżet i kwalifikowalność kosztów",
"work_schedule": "Harmonogram rzeczowo-finansowy",
"project_team": "Zespół projektowy",
"risk_management": "Zarządzanie ryzykiem",
"social_impact_dnsh": "Wpływ społeczny i środowiskowy (DNSH)",
"intellectual_property": "Prawa własności intelektualnej",
"success_metrics": "Wskaźniki sukcesu i ewaluacja",
"final_document": "Dokument końcowy",
"FINAL_DOCUMENT": "Wniosek końcowy",
"PROJECT_SUMMARY": "Streszczenie Projektu",
"BUDGET": "Budżet i kwalifikowalność kosztów",
"company_overview": "Przegląd firmy",
"company": "Informacje o firmie",
"dnsh": "Zasada DNSH",
"risk": "Analiza Ryzyka",
"schedule": "Harmonogram Projektu",
"kpi": "Wskaźniki KPI",
"budget_details": "Szczegóły Budżetu",
"applicant": "Wnioskodawca i powiązania",
"team": "Zespół zarządzający i projektowy",
"market": "Analiza zapotrzebowania i rynku",
"innovation": "Innowacyjność (TRL) i znaczenie projektu",
"module_br": "Moduł B+R: Plan prac",
"module_implementation": "Moduł Wdrożenie Innowacji",
"module_infrastructure": "Moduł Infrastruktura B+R",
"module_digitalization": "Moduł Cyfryzacja",
"module_green": "Moduł Zazielenienie przedsiębiorstw",
"module_internationalization": "Moduł Internacjonalizacja",
"module_competence": "Moduł Kompetencje",
"sustainable": "Zrównoważony rozwój i zasada DNSH",
"budget": "Budżet",
"kpi_risk": "Wskaźniki KPI i analiza ryzyka",
"attachments": "Załączniki i Oświadczenia",
"description": "Opis inwestycji",
"animals": "Dobrostan zwierząt / modernizacja",
"profitability": "Analiza opłacalności",
"environment": "Wpływ na środowisko",
"technical_attachments": "Załączniki techniczne",
"risk_assessment": "Ocena ryzyka zawodowego",
"improvement_plan": "Plan poprawy warunków pracy",
"scope": "Zakres inwestycji BHP",
"results": "Oczekiwane efekty",
}
def get_template_titles_for_project(project) -> dict:
titles = {}
for tmpl in TEMPLATES:
if tmpl["program_type"] == project.program_type:
titles[tmpl["section_type"]] = tmpl["title"]
return titles
def resolve_section_title(section, template_titles: dict | None = None) -> str:
explicit = getattr(section, "title", None)
if explicit and str(explicit).strip():
return str(explicit).strip()
section_type = getattr(section, "section_type", "") or ""
if template_titles and section_type in template_titles:
return template_titles[section_type]
return UNIVERSAL_FALLBACK_MAP.get(
section_type,
section_type.replace("_", " ").title(),
)
def build_markdown_from_sections(project, sections, template_titles: dict | None = None) -> str:
template_titles = template_titles or {}
company_name = ""
if project.external_context and "company_data" in project.external_context:
company_name = project.external_context["company_data"].get("name", "")
header = (
f"# Wniosek o dofinansowanie - {company_name}"
if company_name
else "# Wniosek o dofinansowanie"
)
toc = ["## Spis Treści\n"]
body_parts = []
section_num = 0
for sec in sections:
if not sec.content or not str(sec.content).strip():
continue
section_num += 1
title = resolve_section_title(sec, template_titles)
toc.append(f"{section_num}. {title}")
body_parts.append(f"## {section_num}. {title}\n\n{str(sec.content).strip()}")
if not body_parts:
return ""
return header + "\n\n" + "\n".join(toc) + "\n\n" + "\n\n".join(body_parts)