From 1bae6a2b0b07494bfaecce6b9e9ec5fd0871992b Mon Sep 17 00:00:00 2001 From: Maharshi Patel <39730881+maharshivpatel@users.noreply.github.com> Date: Mon, 17 Apr 2023 19:03:53 +0530 Subject: [PATCH] feat: hooks added for print formats / pdf. (#20734) --- frappe/hooks.py | 5 +++++ frappe/utils/pdf.py | 45 +++++++++++++++++++++++++++++++---------- frappe/www/printview.py | 6 ++++-- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index b055f9dc8e4..a3355d54551 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -83,6 +83,11 @@ "frappe.core.doctype.session_default_settings.session_default_settings.clear_session_defaults" ) +# PDF +pdf_header_html = "frappe.utils.pdf.pdf_header_html" +pdf_body_html = "frappe.utils.pdf.pdf_body_html" +pdf_footer_html = "frappe.utils.pdf.pdf_footer_html" + # permissions permission_query_conditions = { diff --git a/frappe/utils/pdf.py b/frappe/utils/pdf.py index 678671bce25..0c273854f7f 100644 --- a/frappe/utils/pdf.py +++ b/frappe/utils/pdf.py @@ -23,6 +23,31 @@ ] +def pdf_header_html(soup, head, content, styles, html_id, css): + return frappe.render_template( + "templates/print_formats/pdf_header_footer.html", + { + "head": head, + "content": content, + "styles": styles, + "html_id": html_id, + "css": css, + "lang": frappe.local.lang, + "layout_direction": "rtl" if is_rtl() else "ltr", + }, + ) + + +def pdf_body_html(template, args, **kwargs): + return template.render(args, filters={"len": len}) + + +def pdf_footer_html(soup, head, content, styles, html_id, css): + return pdf_header_html( + soup=soup, head=head, content=content, styles=styles, html_id=html_id, css=css + ) + + def get_pdf(html, options=None, output: PdfWriter | None = None): html = scrub_urls(html) html, options = prepare_options(html, options) @@ -196,17 +221,15 @@ def prepare_header_footer(soup): tag.extract() toggle_visible_pdf(content) - html = frappe.render_template( - "templates/print_formats/pdf_header_footer.html", - { - "head": head, - "content": content, - "styles": styles, - "html_id": html_id, - "css": css, - "lang": frappe.local.lang, - "layout_direction": "rtl" if is_rtl() else "ltr", - }, + id_map = {"header-html": "pdf_header_html", "footer-html": "pdf_footer_html"} + hook_func = frappe.get_hooks(id_map.get(html_id)) + html = frappe.get_attr(hook_func[-1])( + soup=soup, + head=head, + content=content, + styles=styles, + html_id=html_id, + css=css, ) # create temp file diff --git a/frappe/www/printview.py b/frappe/www/printview.py index 38a0409e5f8..538893d8188 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -208,8 +208,10 @@ def get_template_from_string(): "print_settings": print_settings, } ) - - html = template.render(args, filters={"len": len}) + hook_func = frappe.get_hooks("pdf_body_html") + html = frappe.get_attr(hook_func[-1])( + jenv=jenv, template=template, print_format=print_format, args=args + ) if cint(trigger_print): html += trigger_print_script