diff --git a/frappe/printing/doctype/print_settings/print_settings.js b/frappe/printing/doctype/print_settings/print_settings.js
index ef552e6d30..7a8549253d 100644
--- a/frappe/printing/doctype/print_settings/print_settings.js
+++ b/frappe/printing/doctype/print_settings/print_settings.js
@@ -1,18 +1,34 @@
-// Copyright (c) 2017, Frappe Technologies and contributors
+// Copyright (c) 2018, Frappe Technologies and contributors
// For license information, please see license.txt
-frappe.ui.form.on("Print Settings", "print_style", function (frm) {
- frappe.db.get_value('Print Style', frm.doc.print_style, 'preview').then((r) => {
- if(r.message.preview) {
- frm.get_field("print_style_preview").$wrapper.html(
- ``);
- } else {
- frm.get_field("print_style_preview").$wrapper.html(
- `
${__("No Preview")}
`); +frappe.ui.form.on('Print Settings', { + print_style: function(frm) { + frappe.db.get_value('Print Style', frm.doc.print_style, 'preview').then((r) => { + if(r.message.preview) { + frm.get_field("print_style_preview").$wrapper.html( + `${__("No Preview")}
`); + } + }); + }, + onload: function (frm) { + frm.script_manager.trigger("print_style"); + }, + server_ip: function (frm) { + if(frm.doc.server_ip){ + frappe.call({ + "doc": frm.doc, + "method": "get_printers", + "args": { + ip: frm.doc.server_ip, + port: frm.doc.port + }, + callback: function (data) { + frm.set_df_property('printer_name', 'options', [""].concat(data.message)); + } + }); } - }); -}); - -frappe.ui.form.on("Print Settings", "onload", function (frm) { - frm.script_manager.trigger("print_style"); + } }); diff --git a/frappe/printing/doctype/print_settings/print_settings.json b/frappe/printing/doctype/print_settings/print_settings.json index 7e1bfa6861..d20f1c4c75 100644 --- a/frappe/printing/doctype/print_settings/print_settings.json +++ b/frappe/printing/doctype/print_settings/print_settings.json @@ -13,6 +13,7 @@ "fields": [ { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -38,10 +39,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -69,10 +72,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -100,10 +105,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -129,10 +136,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -160,10 +169,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -190,10 +201,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -221,10 +234,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -253,10 +268,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -285,10 +302,44 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "enable_print_server", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Enable Print Server", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -314,10 +365,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -345,10 +398,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -375,10 +430,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -406,10 +463,172 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.enable_print_server == 1", + "fieldname": "server_printer", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Print Server", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "server_ip", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Server IP", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "printer_name", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Printer Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_17", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "port", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Port", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -435,10 +654,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -466,10 +687,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -495,10 +718,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -524,10 +749,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -556,10 +783,12 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -586,6 +815,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -600,7 +830,7 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2017-08-18 01:04:26.692081", + "modified": "2018-06-27 01:23:57.477259", "modified_by": "Administrator", "module": "Printing", "name": "Print Settings", @@ -609,7 +839,6 @@ "permissions": [ { "amend": 0, - "apply_user_permissions": 0, "cancel": 0, "create": 1, "delete": 0, @@ -635,5 +864,6 @@ "sort_field": "modified", "sort_order": "DESC", "track_changes": 1, - "track_seen": 0 + "track_seen": 0, + "track_views": 0 } \ No newline at end of file diff --git a/frappe/printing/doctype/print_settings/print_settings.py b/frappe/printing/doctype/print_settings/print_settings.py index 3477ac6e62..95b6639bb1 100644 --- a/frappe/printing/doctype/print_settings/print_settings.py +++ b/frappe/printing/doctype/print_settings/print_settings.py @@ -4,8 +4,26 @@ from __future__ import unicode_literals import frappe +from frappe import _ +import cups + from frappe.model.document import Document class PrintSettings(Document): def on_update(self): frappe.clear_cache() + + @frappe.whitelist() + def get_printers(self,ip="localhost",port=631): + printer_list = [] + + try: + cups.setServer(self.server_ip) + cups.setPort(self.port) + conn = cups.Connection() + printers = conn.getPrinters() + for printer in printers: + printer_list.append(printers[printer]["printer-info"]) + except RuntimeError: + frappe.throw(_("Failed to connect to server")) + return printer_list diff --git a/frappe/printing/doctype/print_settings/test_print_settings.py b/frappe/printing/doctype/print_settings/test_print_settings.py new file mode 100644 index 0000000000..e655045e39 --- /dev/null +++ b/frappe/printing/doctype/print_settings/test_print_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestPrintSettings(unittest.TestCase): + pass diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index 914503457e..c2fd68c653 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -114,12 +114,12 @@ frappe.ui.form.PrintPreview = Class.extend({ }, set_default_print_language: function () { var print_format = this.get_print_format(); - + if (print_format.default_print_language) { this.lang_code = print_format.default_print_language; this.language_sel.val(this.lang_code); } else { - this.language_sel.val(frappe.boot.lang); + this.language_sel.val(frappe.boot.lang); } }, multilingual_preview: function () { @@ -155,7 +155,38 @@ frappe.ui.form.PrintPreview = Class.extend({ `); }, printit: function () { + let print_server ; + var me = this; + frappe.call({ + async: false, + "method": "frappe.client.get", + args: { + doctype: "Print Settings", + name: "enable_print_server" + }, + callback: function (data) { + print_server = data.message.enable_print_server; + } + }); + + if(print_server){ + frappe.call({ + async: false, + "method": "frappe.utils.print_format.print_by_server", + args: { + doctype: me.frm.doc.doctype, + name: me.frm.doc.name, + format: me.selected_format(), + no_letterhead: me.with_letterhead() + }, + callback: function (data) { + } + }); + + }else{ this.new_page_preview(true); + } + }, new_page_preview: function (printit) { var me = this; diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py index b9d064f50f..b235b2847c 100644 --- a/frappe/utils/print_format.py +++ b/frappe/utils/print_format.py @@ -6,7 +6,8 @@ from frappe import _ from frappe.modules import get_doc_path from jinja2 import TemplateNotFound from frappe.utils import cint, strip_html -from frappe.utils.pdf import get_pdf +from frappe.utils.pdf import get_pdf,cleanup +import cups from PyPDF2 import PdfFileWriter, PdfFileReader no_cache = 1 @@ -52,4 +53,27 @@ def download_pdf(doctype, name, format=None, doc=None, no_letterhead=0): def report_to_pdf(html, orientation="Landscape"): frappe.local.response.filename = "report.pdf" frappe.local.response.filecontent = get_pdf(html, {"orientation": orientation}) - frappe.local.response.type = "download" \ No newline at end of file + frappe.local.response.type = "download" + +@frappe.whitelist() +def print_by_server(doctype, name, format=None, doc=None, no_letterhead=0): + print_settings = frappe.get_doc("Print Settings") + try: + cups.setServer(print_settings.server_ip) + cups.setPort(print_settings.port) + conn = cups.Connection() + output = PdfFileWriter() + output = frappe.get_print(doctype, name, format, doc=doc, no_letterhead=no_letterhead, as_pdf = True, output = output) + file = os.path.join("/tmp", "frappe-pdf-{0}.pdf".format(frappe.generate_hash())) + output.write(open(file,"wb")) + conn.printFile("Generic-text-only",file , name, {}) + except IOError as e: + if ("ContentNotFoundError" in e.message + or "ContentOperationNotPermittedError" in e.message + or "UnknownContentError" in e.message + or "RemoteHostClosedError" in e.message): + frappe.throw(_("PDF generation failed")) + except cups.IPPError: + frappe.throw(_("Unsupported document-format 'application/pdf'.")) + finally: + cleanup(file,{}) diff --git a/requirements.txt b/requirements.txt index 5f358a402b..3d67201a84 100644 --- a/requirements.txt +++ b/requirements.txt @@ -55,3 +55,4 @@ google-auth-httplib2 google-auth-oauthlib faker stripe +pycups