From ec938c960e6fe3c7d0683953fa4e83c9ff5c352f Mon Sep 17 00:00:00 2001 From: Anupam Date: Thu, 9 Sep 2021 11:13:39 +0530 Subject: [PATCH] feat: provision to add multiple network printers --- .../doctype/print_settings/print_settings.js | 22 ------ .../print_settings/print_settings.json | 36 +++------ .../doctype/print_settings/print_settings.py | 20 ----- .../doctype/printer_settings/__init__.py | 0 .../printer_settings/printer_settings.js | 32 ++++++++ .../printer_settings/printer_settings.json | 74 +++++++++++++++++++ .../printer_settings/printer_settings.py | 40 ++++++++++ .../printer_settings/test_printer_settings.py | 8 ++ frappe/printing/page/print/print.js | 34 ++++++++- frappe/utils/print_format.py | 6 +- 10 files changed, 201 insertions(+), 71 deletions(-) create mode 100644 frappe/printing/doctype/printer_settings/__init__.py create mode 100644 frappe/printing/doctype/printer_settings/printer_settings.js create mode 100644 frappe/printing/doctype/printer_settings/printer_settings.json create mode 100644 frappe/printing/doctype/printer_settings/printer_settings.py create mode 100644 frappe/printing/doctype/printer_settings/test_printer_settings.py diff --git a/frappe/printing/doctype/print_settings/print_settings.js b/frappe/printing/doctype/print_settings/print_settings.js index 9616892a31..b1311166ee 100644 --- a/frappe/printing/doctype/print_settings/print_settings.js +++ b/frappe/printing/doctype/print_settings/print_settings.js @@ -15,27 +15,5 @@ frappe.ui.form.on('Print Settings', { }, onload: function(frm) { frm.script_manager.trigger("print_style"); - }, - server_ip: function(frm) { - frm.trigger("connect_print_server"); - }, - port:function(frm) { - frm.trigger("connect_print_server"); - }, - connect_print_server:function(frm) { - if(frm.doc.server_ip && frm.doc.port){ - 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)); - }, - error: (data) => frm.set_value("enable_print_server", 0) - }); - } } }); diff --git a/frappe/printing/doctype/print_settings/print_settings.json b/frappe/printing/doctype/print_settings/print_settings.json index 31962be050..9a052a1f18 100644 --- a/frappe/printing/doctype/print_settings/print_settings.json +++ b/frappe/printing/doctype/print_settings/print_settings.json @@ -19,9 +19,7 @@ "allow_print_for_cancelled", "server_printer", "enable_print_server", - "server_ip", - "printer_name", - "port", + "default_printer_setting", "raw_printing_section", "enable_raw_printing", "print_style_section", @@ -107,29 +105,11 @@ }, { "default": "0", + "depends_on": "enable_print_server", "fieldname": "enable_print_server", "fieldtype": "Check", - "label": "Enable Print Server" - }, - { - "default": "localhost", - "depends_on": "enable_print_server", - "fieldname": "server_ip", - "fieldtype": "Data", - "label": "Server IP" - }, - { - "depends_on": "enable_print_server", - "fieldname": "printer_name", - "fieldtype": "Select", - "label": "Printer Name" - }, - { - "default": "631", - "depends_on": "enable_print_server", - "fieldname": "port", - "fieldtype": "Int", - "label": "Port" + "label": "Enable Print Server", + "mandatory_depends_on": "enable_print_server" }, { "fieldname": "raw_printing_section", @@ -177,13 +157,19 @@ "fieldname": "font_size", "fieldtype": "Float", "label": "Font Size" + }, + { + "fieldname": "default_printer_setting", + "fieldtype": "Link", + "label": "Default Printer Setting", + "options": "Printer Settings" } ], "icon": "fa fa-cog", "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2021-02-15 14:16:18.474254", + "modified": "2021-09-09 11:07:23.042310", "modified_by": "Administrator", "module": "Printing", "name": "Print Settings", diff --git a/frappe/printing/doctype/print_settings/print_settings.py b/frappe/printing/doctype/print_settings/print_settings.py index a7e59c9078..ff00317cf8 100644 --- a/frappe/printing/doctype/print_settings/print_settings.py +++ b/frappe/printing/doctype/print_settings/print_settings.py @@ -12,26 +12,6 @@ class PrintSettings(Document): def on_update(self): frappe.clear_cache() - @frappe.whitelist() - def get_printers(self,ip="localhost",port=631): - printer_list = [] - try: - import cups - except ImportError: - frappe.throw(_("You need to install pycups to use this feature!")) - return - try: - cups.setServer(self.server_ip) - cups.setPort(self.port) - conn = cups.Connection() - printers = conn.getPrinters() - printer_list = printers.keys() - except RuntimeError: - frappe.throw(_("Failed to connect to server")) - except frappe.ValidationError: - frappe.throw(_("Failed to connect to server")) - return printer_list - @frappe.whitelist() def is_print_server_enabled(): if not hasattr(frappe.local, 'enable_print_server'): diff --git a/frappe/printing/doctype/printer_settings/__init__.py b/frappe/printing/doctype/printer_settings/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/printing/doctype/printer_settings/printer_settings.js b/frappe/printing/doctype/printer_settings/printer_settings.js new file mode 100644 index 0000000000..dd4dbf603e --- /dev/null +++ b/frappe/printing/doctype/printer_settings/printer_settings.js @@ -0,0 +1,32 @@ +// Copyright (c) 2021, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Printer Settings', { + onload (frm) { + if(!frm.is_new()) { + frm.trigger("connect_print_server"); + } + }, + server_ip (frm) { + frm.trigger("connect_print_server"); + }, + port (frm) { + frm.trigger("connect_print_server"); + }, + connect_print_server (frm) { + if(frm.doc.server_ip && frm.doc.port){ + frappe.call({ + "doc": frm.doc, + "method": "get_printers_list", + "args": { + ip: frm.doc.server_ip, + port: frm.doc.port + }, + callback: function(data) { + console.log(data.message); + frm.set_df_property('printer_name', 'options', [""].concat(data.message)); + } + }); + } + } +}); diff --git a/frappe/printing/doctype/printer_settings/printer_settings.json b/frappe/printing/doctype/printer_settings/printer_settings.json new file mode 100644 index 0000000000..b8f377404d --- /dev/null +++ b/frappe/printing/doctype/printer_settings/printer_settings.json @@ -0,0 +1,74 @@ +{ + "actions": [], + "autoname": "format:{server_ip}-{printer_name}", + "creation": "2021-09-07 11:13:57.724404", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "server_ip", + "printer_name", + "port", + "column_break_4", + "reference_doctype" + ], + "fields": [ + { + "default": "localhost", + "fieldname": "server_ip", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Server IP", + "reqd": 1 + }, + { + "fieldname": "printer_name", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Printer Name", + "reqd": 1 + }, + { + "default": "631", + "fieldname": "port", + "fieldtype": "Int", + "in_list_view": 1, + "label": "Port", + "reqd": 1 + }, + { + "fieldname": "column_break_4", + "fieldtype": "Column Break" + }, + { + "fieldname": "reference_doctype", + "fieldtype": "Link", + "label": "Reference DocType", + "options": "DocType" + } + ], + "index_web_pages_for_search": 1, + "links": [], + "modified": "2021-09-07 13:17:26.978129", + "modified_by": "Administrator", + "module": "Printing", + "name": "Printer Settings", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/printing/doctype/printer_settings/printer_settings.py b/frappe/printing/doctype/printer_settings/printer_settings.py new file mode 100644 index 0000000000..e0e708c5fa --- /dev/null +++ b/frappe/printing/doctype/printer_settings/printer_settings.py @@ -0,0 +1,40 @@ +# Copyright (c) 2021, Frappe Technologies and contributors +# For license information, please see license.txt + +import frappe +from frappe.model.document import Document +from frappe import _ + +class PrinterSettings(Document): + @frappe.whitelist() + def get_printers_list(self,ip="localhost",port=631): + print("``````````````````````````````````") + print(ip) + print(port) + printer_list = [] + try: + import cups + except ImportError: + frappe.throw(_("You need to install pycups to use this feature!")) + return + try: + cups.setServer(self.server_ip) + cups.setPort(self.port) + conn = cups.Connection() + printers = conn.getPrinters() + for printer_id,printer in printers.items(): + printer_list.append({ + 'value': printer_id, + 'label': printer['printer-make-and-model'] + }) + print(printer_list) + print("``````````````````````````````````") + except RuntimeError: + frappe.throw(_("Failed to connect to server")) + except frappe.ValidationError: + frappe.throw(_("Failed to connect to server")) + return printer_list + +@frappe.whitelist() +def get_printer_setting(doctype): + return frappe.db.get_value('Printer Settings', {'reference_doctype': doctype}) \ No newline at end of file diff --git a/frappe/printing/doctype/printer_settings/test_printer_settings.py b/frappe/printing/doctype/printer_settings/test_printer_settings.py new file mode 100644 index 0000000000..81ac1bb289 --- /dev/null +++ b/frappe/printing/doctype/printer_settings/test_printer_settings.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, Frappe Technologies and Contributors +# See license.txt + +# import frappe +import unittest + +class TestPrinterSettings(unittest.TestCase): + pass diff --git a/frappe/printing/page/print/print.js b/frappe/printing/page/print/print.js index da34dfda96..32db49ea54 100644 --- a/frappe/printing/page/print/print.js +++ b/frappe/printing/page/print/print.js @@ -113,6 +113,17 @@ frappe.ui.form.PrintView = class { }, ).$input; + if(cint(this.print_settings.enable_print_server)) { + this.printer_sel = this.add_sidebar_item({ + fieldtype:'Link', + fieldname: 'printer', + placeholder: __('Printer'), + options:'Printer Settings', + default: this.printer_setting + }).$input; + this.get_printer_settings(); + } + this.letterhead_selector_df = this.add_sidebar_item( { fieldtype: 'Autocomplete', @@ -150,6 +161,26 @@ frappe.ui.form.PrintView = class { return field; } + get_printer_settings() { + let route = frappe.get_route(); + let doctype = route[1]; + let me = this + frappe.call({ + method: 'frappe.printing.doctype.printer_settings.printer_settings.get_printer_setting', + args: { + doctype: doctype, + }, + callback: function(r) { + if (r.message) { + me.printer_setting = r.message; + } + else { + me.printer_setting = me.print_settings.default_printer_setting; + } + me.printer_sel.val(me.printer_setting); + }, + }); + } get_default_option_for_select(value) { return { label: value, @@ -470,9 +501,10 @@ frappe.ui.form.PrintView = class { args: { doctype: me.frm.doc.doctype, name: me.frm.doc.name, + printer_setting: me.printer_sel.val(), print_format: me.selected_format(), no_letterhead: me.with_letterhead(), - letterhead: this.get_letterhead(), + letterhead: me.get_letterhead(), }, callback: function() {}, }); diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py index 40a393a2cc..6ced99e9ce 100644 --- a/frappe/utils/print_format.py +++ b/frappe/utils/print_format.py @@ -98,8 +98,8 @@ def report_to_pdf(html, orientation="Landscape"): frappe.local.response.type = "pdf" @frappe.whitelist() -def print_by_server(doctype, name, print_format=None, doc=None, no_letterhead=0): - print_settings = frappe.get_doc("Print Settings") +def print_by_server(doctype, name, printer_setting, print_format=None, doc=None, no_letterhead=0): + print_settings = frappe.get_doc("Printer Settings", printer_setting) try: import cups except ImportError: @@ -123,4 +123,4 @@ def print_by_server(doctype, name, print_format=None, doc=None, no_letterhead=0) except cups.IPPError: frappe.throw(_("Printing failed")) finally: - cleanup(file,{}) + return