From 67ede5d5336f276f8a4c5f85ac7bc8cd0057efbc Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Wed, 14 Dec 2022 13:59:46 +0100 Subject: [PATCH] feat: add parameters language and letter_head to `download_pdf` --- frappe/translate.py | 32 ++++++++++++++++++++++++++++++++ frappe/utils/print_format.py | 13 ++++++++++--- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/frappe/translate.py b/frappe/translate.py index 339ab6cb05..975d8f07f5 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -14,6 +14,7 @@ import json import operator import os import re +from contextlib import contextmanager from csv import reader from babel.messages.extract import extract_python @@ -1313,6 +1314,37 @@ def get_translated_doctypes(): return unique(dts + custom_dts) +@contextmanager +def print_language(language: str): + """Ensure correct globals for printing in a specific language. + + Usage: + + ``` + with print_language("de"): + html = frappe.get_print( ... ) + ``` + """ + if not language or language == frappe.local.lang: + # do nothing + yield + return + + # remember original values + _lang = frappe.local.lang + _jenv = frappe.local.jenv + + # set language, empty any existing lang_full_dict and jenv + frappe.local.lang = language + frappe.local.jenv = None + + yield + + # restore original values + frappe.local.lang = _lang + frappe.local.jenv = _jenv + + # Backward compatibility get_full_dict = get_all_translations load_lang = get_translations_from_apps diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py index 03d564b16c..2d6164e4bd 100644 --- a/frappe/utils/print_format.py +++ b/frappe/utils/print_format.py @@ -5,6 +5,7 @@ from PyPDF2 import PdfWriter import frappe from frappe import _ from frappe.core.doctype.access_log.access_log import make_access_log +from frappe.translate import print_language from frappe.utils.pdf import get_pdf no_cache = 1 @@ -118,15 +119,21 @@ def read_multi_pdf(output): @frappe.whitelist(allow_guest=True) -def download_pdf(doctype, name, format=None, doc=None, no_letterhead=0): +def download_pdf( + doctype, name, format=None, doc=None, no_letterhead=0, language=None, letter_head=None +): doc = doc or frappe.get_doc(doctype, name) validate_print_permission(doc) - html = frappe.get_print(doctype, name, format, doc=doc, no_letterhead=no_letterhead) + with print_language(language): + pdf_file = frappe.get_print( + doctype, name, format, doc=doc, as_pdf=True, letterhead=letter_head, no_letterhead=no_letterhead + ) + frappe.local.response.filename = "{name}.pdf".format( name=name.replace(" ", "-").replace("/", "-") ) - frappe.local.response.filecontent = get_pdf(html) + frappe.local.response.filecontent = pdf_file frappe.local.response.type = "pdf"