Browse Source

feat: provision to add multiple network printers

version-14
Anupam 3 years ago
committed by Leela vadlamudi
parent
commit
ec938c960e
10 changed files with 201 additions and 71 deletions
  1. +0
    -22
      frappe/printing/doctype/print_settings/print_settings.js
  2. +11
    -25
      frappe/printing/doctype/print_settings/print_settings.json
  3. +0
    -20
      frappe/printing/doctype/print_settings/print_settings.py
  4. +0
    -0
      frappe/printing/doctype/printer_settings/__init__.py
  5. +32
    -0
      frappe/printing/doctype/printer_settings/printer_settings.js
  6. +74
    -0
      frappe/printing/doctype/printer_settings/printer_settings.json
  7. +40
    -0
      frappe/printing/doctype/printer_settings/printer_settings.py
  8. +8
    -0
      frappe/printing/doctype/printer_settings/test_printer_settings.py
  9. +33
    -1
      frappe/printing/page/print/print.js
  10. +3
    -3
      frappe/utils/print_format.py

+ 0
- 22
frappe/printing/doctype/print_settings/print_settings.js View File

@@ -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)
});
}
}
});

+ 11
- 25
frappe/printing/doctype/print_settings/print_settings.json View File

@@ -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",


+ 0
- 20
frappe/printing/doctype/print_settings/print_settings.py View File

@@ -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'):


+ 0
- 0
frappe/printing/doctype/printer_settings/__init__.py View File


+ 32
- 0
frappe/printing/doctype/printer_settings/printer_settings.js View File

@@ -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));
}
});
}
}
});

+ 74
- 0
frappe/printing/doctype/printer_settings/printer_settings.json View File

@@ -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
}

+ 40
- 0
frappe/printing/doctype/printer_settings/printer_settings.py View File

@@ -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})

+ 8
- 0
frappe/printing/doctype/printer_settings/test_printer_settings.py View File

@@ -0,0 +1,8 @@
# Copyright (c) 2021, Frappe Technologies and Contributors
# See license.txt

# import frappe
import unittest

class TestPrinterSettings(unittest.TestCase):
pass

+ 33
- 1
frappe/printing/page/print/print.js View File

@@ -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() {},
});


+ 3
- 3
frappe/utils/print_format.py View File

@@ -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

Loading…
Cancel
Save