From fb13d2f6a12801a6ac01147c8236cabc0db73594 Mon Sep 17 00:00:00 2001 From: shariquerik Date: Thu, 26 Aug 2021 01:14:39 +0530 Subject: [PATCH 01/16] fix: Reloading doc before Setting Property After Alert --- frappe/email/doctype/notification/notification.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/email/doctype/notification/notification.py b/frappe/email/doctype/notification/notification.py index 57418515f5..b93cdc16fc 100644 --- a/frappe/email/doctype/notification/notification.py +++ b/frappe/email/doctype/notification/notification.py @@ -146,6 +146,7 @@ def get_context(context): if doc.meta.get_field(fieldname).fieldtype in frappe.model.numeric_fieldtypes: value = frappe.utils.cint(value) + doc.reload() doc.set(fieldname, value) doc.flags.updater_reference = { 'doctype': self.doctype, From 0fc092a98e8c46e8b58cb1638ab8b7cc2cb494d9 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 31 Aug 2021 18:33:32 +0530 Subject: [PATCH 02/16] test: Added test to check change in property value after alert --- .../doctype/notification/test_notification.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/frappe/email/doctype/notification/test_notification.py b/frappe/email/doctype/notification/test_notification.py index 2629050c1b..716daa0f7b 100644 --- a/frappe/email/doctype/notification/test_notification.py +++ b/frappe/email/doctype/notification/test_notification.py @@ -20,6 +20,8 @@ class TestNotification(unittest.TestCase): notification.event = 'Value Change' notification.value_changed = 'status' notification.send_to_all_assignees = 1 + notification.set_property_after_alert = 'description' + notification.property_value = 'Changed by Notification' notification.save() if not frappe.db.exists('Notification', {'name': 'Contact Status Update'}, 'name'): @@ -269,4 +271,19 @@ class TestNotification(unittest.TestCase): self.assertTrue('test2@example.com' in recipients) self.assertTrue('test1@example.com' in recipients) + def test_change_property_value_after_alert(self): + todo = frappe.new_doc('ToDo') + todo.description = 'Test Property Change after Alert' + todo.save() + + #change status of todo + todo.status = 'Closed' + todo.save() + + email_queue = frappe.get_doc('Email Queue', {'reference_doctype': 'ToDo', + 'reference_name': todo.name}) + + self.assertTrue(email_queue) + self.assertEquals(todo.description, 'Changed by Notification') + From a27db796f9fb15e3b8eda6d2dd1a0d591755d447 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 1 Sep 2021 15:33:23 +0530 Subject: [PATCH 03/16] test: minor fix --- .../doctype/notification/test_notification.py | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/frappe/email/doctype/notification/test_notification.py b/frappe/email/doctype/notification/test_notification.py index 716daa0f7b..803113e8ea 100644 --- a/frappe/email/doctype/notification/test_notification.py +++ b/frappe/email/doctype/notification/test_notification.py @@ -239,6 +239,9 @@ class TestNotification(unittest.TestCase): self.assertTrue(email_queue) + # check if description is changed after alert since set_property_after_alert is set + self.assertEquals(todo.description, 'Changed by Notification') + recipients = [d.recipient for d in email_queue.recipients] self.assertTrue('test2@example.com' in recipients) self.assertTrue('test1@example.com' in recipients) @@ -271,19 +274,4 @@ class TestNotification(unittest.TestCase): self.assertTrue('test2@example.com' in recipients) self.assertTrue('test1@example.com' in recipients) - def test_change_property_value_after_alert(self): - todo = frappe.new_doc('ToDo') - todo.description = 'Test Property Change after Alert' - todo.save() - - #change status of todo - todo.status = 'Closed' - todo.save() - - email_queue = frappe.get_doc('Email Queue', {'reference_doctype': 'ToDo', - 'reference_name': todo.name}) - - self.assertTrue(email_queue) - self.assertEquals(todo.description, 'Changed by Notification') - From 4d1a49f4fec975f2e282b68aa37893e1c9ffec53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 06:12:46 +0000 Subject: [PATCH 04/16] chore(deps): bump nth-check from 2.0.0 to 2.0.1 Bumps [nth-check](https://github.com/fb55/nth-check) from 2.0.0 to 2.0.1. - [Release notes](https://github.com/fb55/nth-check/releases) - [Commits](https://github.com/fb55/nth-check/compare/v2.0.0...v2.0.1) --- updated-dependencies: - dependency-name: nth-check dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index cd28dfa7cc..2cf748606c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2938,9 +2938,9 @@ normalize-url@^4.5.0: set-blocking "~2.0.0" nth-check@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" - integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== dependencies: boolbase "^1.0.0" From a76445bcf581bdf2ebf4fbdd4f882f83c9c3983f Mon Sep 17 00:00:00 2001 From: leela Date: Wed, 22 Sep 2021 15:19:00 +0530 Subject: [PATCH 05/16] fix: use decimal digits precision 9 instead of 6 while creating schema Currently we use DECIMAL(18, 6) datatype for float, currency and percent. But in the system settings we provide a configuration to change the precision up to 9 digits. This obviously does not work because we do not store 9 digit precision in database. Fixed by changing the decimal datatype scale. --- frappe/database/mariadb/database.py | 8 ++++---- frappe/database/postgres/database.py | 8 ++++---- frappe/database/schema.py | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/frappe/database/mariadb/database.py b/frappe/database/mariadb/database.py index 5ed7991a82..2f6d640743 100644 --- a/frappe/database/mariadb/database.py +++ b/frappe/database/mariadb/database.py @@ -22,11 +22,11 @@ class MariaDBDatabase(Database): def setup_type_map(self): self.db_type = 'mariadb' self.type_map = { - 'Currency': ('decimal', '18,6'), + 'Currency': ('decimal', '21,9'), 'Int': ('int', '11'), 'Long Int': ('bigint', '20'), - 'Float': ('decimal', '18,6'), - 'Percent': ('decimal', '18,6'), + 'Float': ('decimal', '21,9'), + 'Percent': ('decimal', '21,9'), 'Check': ('int', '1'), 'Small Text': ('text', ''), 'Long Text': ('longtext', ''), @@ -51,7 +51,7 @@ class MariaDBDatabase(Database): 'Color': ('varchar', self.VARCHAR_LEN), 'Barcode': ('longtext', ''), 'Geolocation': ('longtext', ''), - 'Duration': ('decimal', '18,6'), + 'Duration': ('decimal', '21,9'), 'Icon': ('varchar', self.VARCHAR_LEN) } diff --git a/frappe/database/postgres/database.py b/frappe/database/postgres/database.py index a06abb1013..bfa5515111 100644 --- a/frappe/database/postgres/database.py +++ b/frappe/database/postgres/database.py @@ -32,11 +32,11 @@ class PostgresDatabase(Database): def setup_type_map(self): self.db_type = 'postgres' self.type_map = { - 'Currency': ('decimal', '18,6'), + 'Currency': ('decimal', '21,9'), 'Int': ('bigint', None), 'Long Int': ('bigint', None), - 'Float': ('decimal', '18,6'), - 'Percent': ('decimal', '18,6'), + 'Float': ('decimal', '21,9'), + 'Percent': ('decimal', '21,9'), 'Check': ('smallint', None), 'Small Text': ('text', ''), 'Long Text': ('text', ''), @@ -61,7 +61,7 @@ class PostgresDatabase(Database): 'Color': ('varchar', self.VARCHAR_LEN), 'Barcode': ('text', ''), 'Geolocation': ('text', ''), - 'Duration': ('decimal', '18,6'), + 'Duration': ('decimal', '21,9'), 'Icon': ('varchar', self.VARCHAR_LEN) } diff --git a/frappe/database/schema.py b/frappe/database/schema.py index 31f11dbd5e..ce9fcb4147 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -303,6 +303,8 @@ def get_definition(fieldtype, precision=None, length=None): size = d[1] if d[1] else None if size: + # This check needs to exist for backward compatibility. + # Till V13, default size used for float, currency and percent are (18, 6). if fieldtype in ["Float", "Currency", "Percent"] and cint(precision) > 6: size = '21,9' From cb696d296617add260f767255a616aedf7a31880 Mon Sep 17 00:00:00 2001 From: leela Date: Wed, 1 Sep 2021 08:23:04 +0530 Subject: [PATCH 06/16] fix: rq utiliy module conflicts with redis queue's rq package --- frappe/commands/__init__.py | 2 +- frappe/commands/{redis.py => redis_utils.py} | 2 +- frappe/tests/test_redis.py | 2 +- frappe/utils/background_jobs.py | 2 +- frappe/utils/{rq.py => redis_queue.py} | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename frappe/commands/{redis.py => redis_utils.py} (97%) rename frappe/utils/{rq.py => redis_queue.py} (100%) diff --git a/frappe/commands/__init__.py b/frappe/commands/__init__.py index 6fb33a51b7..82a71ce7b4 100644 --- a/frappe/commands/__init__.py +++ b/frappe/commands/__init__.py @@ -102,7 +102,7 @@ def get_commands(): from .site import commands as site_commands from .translate import commands as translate_commands from .utils import commands as utils_commands - from .redis import commands as redis_commands + from .redis_utils import commands as redis_commands clickable_link = ( "\x1b]8;;https://frappeframework.com/docs\afrappeframework.com\x1b]8;;\a" diff --git a/frappe/commands/redis.py b/frappe/commands/redis_utils.py similarity index 97% rename from frappe/commands/redis.py rename to frappe/commands/redis_utils.py index 38a46c2142..3556050782 100644 --- a/frappe/commands/redis.py +++ b/frappe/commands/redis_utils.py @@ -3,7 +3,7 @@ import os import click import frappe -from frappe.utils.rq import RedisQueue +from frappe.utils.redis_queue import RedisQueue from frappe.installer import update_site_config @click.command('create-rq-users') diff --git a/frappe/tests/test_redis.py b/frappe/tests/test_redis.py index 72af1ac699..8dd50f2373 100644 --- a/frappe/tests/test_redis.py +++ b/frappe/tests/test_redis.py @@ -5,7 +5,7 @@ import redis import frappe from frappe.utils import get_bench_id -from frappe.utils.rq import RedisQueue +from frappe.utils.redis_queue import RedisQueue from frappe.utils.background_jobs import get_redis_conn def version_tuple(version): diff --git a/frappe/utils/background_jobs.py b/frappe/utils/background_jobs.py index b8f3372540..b2592e9e8f 100755 --- a/frappe/utils/background_jobs.py +++ b/frappe/utils/background_jobs.py @@ -16,7 +16,7 @@ import frappe from frappe import _ import frappe.monitor from frappe.utils import cstr, get_bench_id -from frappe.utils.rq import RedisQueue +from frappe.utils.redis_queue import RedisQueue from frappe.utils.commands import log diff --git a/frappe/utils/rq.py b/frappe/utils/redis_queue.py similarity index 100% rename from frappe/utils/rq.py rename to frappe/utils/redis_queue.py From 1c48bd81f5a7225fd9c7c1ef9381634cfc5472f6 Mon Sep 17 00:00:00 2001 From: bhavesh95863 Date: Tue, 21 Sep 2021 14:46:07 +0000 Subject: [PATCH 07/16] fix: change field type data to small text (cherry picked from commit a6b73541ff3f252da12203b6c42c591eb2d6b446) --- .../doctype/sms_settings/sms_settings.json | 290 ++++-------------- 1 file changed, 66 insertions(+), 224 deletions(-) diff --git a/frappe/core/doctype/sms_settings/sms_settings.json b/frappe/core/doctype/sms_settings/sms_settings.json index 073fb88bc7..d29949af45 100755 --- a/frappe/core/doctype/sms_settings/sms_settings.json +++ b/frappe/core/doctype/sms_settings/sms_settings.json @@ -1,238 +1,80 @@ { - "allow_copy": 1, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2013-01-10 16:34:24", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "editable_grid": 0, + "actions": [], + "allow_copy": 1, + "creation": "2013-01-10 16:34:24", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "sms_gateway_url", + "message_parameter", + "receiver_parameter", + "static_parameters_section", + "parameters", + "use_post" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Eg. smsgateway.com/api/send_sms.cgi", - "fieldname": "sms_gateway_url", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "SMS Gateway URL", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "description": "Eg. smsgateway.com/api/send_sms.cgi", + "fieldname": "sms_gateway_url", + "fieldtype": "Small Text", + "in_list_view": 1, + "label": "SMS Gateway URL", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Enter url parameter for message", - "fieldname": "message_parameter", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Message Parameter", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "description": "Enter url parameter for message", + "fieldname": "message_parameter", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Message Parameter", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Enter url parameter for receiver nos", - "fieldname": "receiver_parameter", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Receiver Parameter", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "description": "Enter url parameter for receiver nos", + "fieldname": "receiver_parameter", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Receiver Parameter", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "static_parameters_section", - "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, - "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, - "unique": 0, + "fieldname": "static_parameters_section", + "fieldtype": "Column Break", "width": "50%" - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Enter static url parameters here (Eg. sender=ERPNext, username=ERPNext, password=1234 etc.)", - "fieldname": "parameters", - "fieldtype": "Table", - "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": "Static Parameters", - "length": 0, - "no_copy": 0, - "options": "SMS Parameter", - "permlevel": 0, - "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, - "unique": 0 - }, + "description": "Enter static url parameters here (Eg. sender=ERPNext, username=ERPNext, password=1234 etc.)", + "fieldname": "parameters", + "fieldtype": "Table", + "label": "Static Parameters", + "options": "SMS Parameter" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "use_post", - "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": "Use POST", - "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, - "unique": 0 + "default": "0", + "fieldname": "use_post", + "fieldtype": "Check", + "label": "Use POST" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-cog", - "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 1, - "istable": 0, - "max_attachments": 0, - "modified": "2021-03-02 18:06:00.868688", - "modified_by": "Administrator", - "module": "Core", - "name": "SMS Settings", - "owner": "Administrator", + ], + "icon": "fa fa-cog", + "idx": 1, + "issingle": 1, + "links": [], + "modified": "2021-09-21 19:45:26.809793", + "modified_by": "Administrator", + "module": "Core", + "name": "SMS Settings", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "read": 1, + "role": "System Manager", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "track_changes": 1, - "track_seen": 0 -} + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file From ec938c960e6fe3c7d0683953fa4e83c9ff5c352f Mon Sep 17 00:00:00 2001 From: Anupam Date: Thu, 9 Sep 2021 11:13:39 +0530 Subject: [PATCH 08/16] 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 From 55bd04f91b2e72799fd843ee1b56f1c5244a2acc Mon Sep 17 00:00:00 2001 From: Anupam Date: Thu, 9 Sep 2021 11:32:55 +0530 Subject: [PATCH 09/16] fix: sider issues --- .../doctype/printer_settings/printer_settings.js | 5 ++--- frappe/printing/page/print/print.js | 11 +++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/frappe/printing/doctype/printer_settings/printer_settings.js b/frappe/printing/doctype/printer_settings/printer_settings.js index dd4dbf603e..7324344a94 100644 --- a/frappe/printing/doctype/printer_settings/printer_settings.js +++ b/frappe/printing/doctype/printer_settings/printer_settings.js @@ -3,7 +3,7 @@ frappe.ui.form.on('Printer Settings', { onload (frm) { - if(!frm.is_new()) { + if (!frm.is_new()) { frm.trigger("connect_print_server"); } }, @@ -14,7 +14,7 @@ frappe.ui.form.on('Printer Settings', { frm.trigger("connect_print_server"); }, connect_print_server (frm) { - if(frm.doc.server_ip && frm.doc.port){ + if (frm.doc.server_ip && frm.doc.port) { frappe.call({ "doc": frm.doc, "method": "get_printers_list", @@ -23,7 +23,6 @@ frappe.ui.form.on('Printer Settings', { 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/page/print/print.js b/frappe/printing/page/print/print.js index 32db49ea54..6df738b10d 100644 --- a/frappe/printing/page/print/print.js +++ b/frappe/printing/page/print/print.js @@ -113,12 +113,12 @@ frappe.ui.form.PrintView = class { }, ).$input; - if(cint(this.print_settings.enable_print_server)) { + if (cint(this.print_settings.enable_print_server)) { this.printer_sel = this.add_sidebar_item({ - fieldtype:'Link', + fieldtype: 'Link', fieldname: 'printer', placeholder: __('Printer'), - options:'Printer Settings', + options: 'Printer Settings', default: this.printer_setting }).$input; this.get_printer_settings(); @@ -164,7 +164,7 @@ frappe.ui.form.PrintView = class { get_printer_settings() { let route = frappe.get_route(); let doctype = route[1]; - let me = this + let me = this; frappe.call({ method: 'frappe.printing.doctype.printer_settings.printer_settings.get_printer_setting', args: { @@ -173,8 +173,7 @@ frappe.ui.form.PrintView = class { callback: function(r) { if (r.message) { me.printer_setting = r.message; - } - else { + } else { me.printer_setting = me.print_settings.default_printer_setting; } me.printer_sel.val(me.printer_setting); From be2abdbc56131c555249257d34eccda55c54d1a7 Mon Sep 17 00:00:00 2001 From: Anupam Date: Mon, 13 Sep 2021 17:38:07 +0530 Subject: [PATCH 10/16] fix: removing print statements --- .../doctype/printer_settings/printer_settings.json | 11 +++++++++-- .../doctype/printer_settings/printer_settings.py | 6 +----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/frappe/printing/doctype/printer_settings/printer_settings.json b/frappe/printing/doctype/printer_settings/printer_settings.json index b8f377404d..51563bc659 100644 --- a/frappe/printing/doctype/printer_settings/printer_settings.json +++ b/frappe/printing/doctype/printer_settings/printer_settings.json @@ -10,7 +10,8 @@ "printer_name", "port", "column_break_4", - "reference_doctype" + "reference_doctype", + "reference_name" ], "fields": [ { @@ -45,11 +46,17 @@ "fieldtype": "Link", "label": "Reference DocType", "options": "DocType" + }, + { + "fieldname": "reference_name", + "fieldtype": "Dynamic Link", + "label": "Reference Name", + "options": "reference_doctype" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2021-09-07 13:17:26.978129", + "modified": "2021-09-13 17:19:30.713385", "modified_by": "Administrator", "module": "Printing", "name": "Printer Settings", diff --git a/frappe/printing/doctype/printer_settings/printer_settings.py b/frappe/printing/doctype/printer_settings/printer_settings.py index e0e708c5fa..db1800b96d 100644 --- a/frappe/printing/doctype/printer_settings/printer_settings.py +++ b/frappe/printing/doctype/printer_settings/printer_settings.py @@ -8,9 +8,6 @@ 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 @@ -27,8 +24,7 @@ class PrinterSettings(Document): '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: From cfe4dc41c007fbf968e11ffe66532609f389cc3e Mon Sep 17 00:00:00 2001 From: Anupam Date: Fri, 17 Sep 2021 16:38:31 +0530 Subject: [PATCH 11/16] review changes --- .../__init__.py | 0 .../network_printer_settings.js} | 2 +- .../network_printer_settings.json} | 33 +-- .../network_printer_settings.py} | 6 +- .../test_network_printer_settings.py} | 2 +- .../print_settings/print_settings.json | 9 +- frappe/printing/page/print/print.js | 197 +++++++++--------- frappe/utils/print_format.py | 2 +- 8 files changed, 119 insertions(+), 132 deletions(-) rename frappe/printing/doctype/{printer_settings => network_printer_settings}/__init__.py (100%) rename frappe/printing/doctype/{printer_settings/printer_settings.js => network_printer_settings/network_printer_settings.js} (93%) rename frappe/printing/doctype/{printer_settings/printer_settings.json => network_printer_settings/network_printer_settings.json} (66%) rename frappe/printing/doctype/{printer_settings/printer_settings.py => network_printer_settings/network_printer_settings.py} (85%) rename frappe/printing/doctype/{printer_settings/test_printer_settings.py => network_printer_settings/test_network_printer_settings.py} (68%) diff --git a/frappe/printing/doctype/printer_settings/__init__.py b/frappe/printing/doctype/network_printer_settings/__init__.py similarity index 100% rename from frappe/printing/doctype/printer_settings/__init__.py rename to frappe/printing/doctype/network_printer_settings/__init__.py diff --git a/frappe/printing/doctype/printer_settings/printer_settings.js b/frappe/printing/doctype/network_printer_settings/network_printer_settings.js similarity index 93% rename from frappe/printing/doctype/printer_settings/printer_settings.js rename to frappe/printing/doctype/network_printer_settings/network_printer_settings.js index 7324344a94..6e33e20792 100644 --- a/frappe/printing/doctype/printer_settings/printer_settings.js +++ b/frappe/printing/doctype/network_printer_settings/network_printer_settings.js @@ -1,7 +1,7 @@ // Copyright (c) 2021, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Printer Settings', { +frappe.ui.form.on('Network Printer Settings', { onload (frm) { if (!frm.is_new()) { frm.trigger("connect_print_server"); diff --git a/frappe/printing/doctype/printer_settings/printer_settings.json b/frappe/printing/doctype/network_printer_settings/network_printer_settings.json similarity index 66% rename from frappe/printing/doctype/printer_settings/printer_settings.json rename to frappe/printing/doctype/network_printer_settings/network_printer_settings.json index 51563bc659..cbef4b8ba4 100644 --- a/frappe/printing/doctype/printer_settings/printer_settings.json +++ b/frappe/printing/doctype/network_printer_settings/network_printer_settings.json @@ -1,17 +1,15 @@ { "actions": [], - "autoname": "format:{server_ip}-{printer_name}", - "creation": "2021-09-07 11:13:57.724404", + "autoname": "Prompt", + "creation": "2021-09-17 11:26:06.943999", "doctype": "DocType", "editable_grid": 1, "engine": "InnoDB", "field_order": [ "server_ip", - "printer_name", "port", "column_break_4", - "reference_doctype", - "reference_name" + "printer_name" ], "fields": [ { @@ -22,13 +20,6 @@ "label": "Server IP", "reqd": 1 }, - { - "fieldname": "printer_name", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Printer Name", - "reqd": 1 - }, { "default": "631", "fieldname": "port", @@ -42,24 +33,18 @@ "fieldtype": "Column Break" }, { - "fieldname": "reference_doctype", - "fieldtype": "Link", - "label": "Reference DocType", - "options": "DocType" - }, - { - "fieldname": "reference_name", - "fieldtype": "Dynamic Link", - "label": "Reference Name", - "options": "reference_doctype" + "fieldname": "printer_name", + "fieldtype": "Select", + "label": "Printer Name", + "reqd": 1 } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2021-09-13 17:19:30.713385", + "modified": "2021-09-17 11:30:16.781655", "modified_by": "Administrator", "module": "Printing", - "name": "Printer Settings", + "name": "Network Printer Settings", "owner": "Administrator", "permissions": [ { diff --git a/frappe/printing/doctype/printer_settings/printer_settings.py b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py similarity index 85% rename from frappe/printing/doctype/printer_settings/printer_settings.py rename to frappe/printing/doctype/network_printer_settings/network_printer_settings.py index db1800b96d..d24d0695db 100644 --- a/frappe/printing/doctype/printer_settings/printer_settings.py +++ b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py @@ -5,7 +5,7 @@ import frappe from frappe.model.document import Document from frappe import _ -class PrinterSettings(Document): +class NetworkPrinterSettings(Document): @frappe.whitelist() def get_printers_list(self,ip="localhost",port=631): printer_list = [] @@ -32,5 +32,5 @@ class PrinterSettings(Document): 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 +def get_network_printer_settings(): + return frappe.db.get_list('Network Printer Settings', pluck='name') diff --git a/frappe/printing/doctype/printer_settings/test_printer_settings.py b/frappe/printing/doctype/network_printer_settings/test_network_printer_settings.py similarity index 68% rename from frappe/printing/doctype/printer_settings/test_printer_settings.py rename to frappe/printing/doctype/network_printer_settings/test_network_printer_settings.py index 81ac1bb289..86509b239f 100644 --- a/frappe/printing/doctype/printer_settings/test_printer_settings.py +++ b/frappe/printing/doctype/network_printer_settings/test_network_printer_settings.py @@ -4,5 +4,5 @@ # import frappe import unittest -class TestPrinterSettings(unittest.TestCase): +class TestNetworkPrinterSettings(unittest.TestCase): pass diff --git a/frappe/printing/doctype/print_settings/print_settings.json b/frappe/printing/doctype/print_settings/print_settings.json index 9a052a1f18..babbae248d 100644 --- a/frappe/printing/doctype/print_settings/print_settings.json +++ b/frappe/printing/doctype/print_settings/print_settings.json @@ -19,7 +19,6 @@ "allow_print_for_cancelled", "server_printer", "enable_print_server", - "default_printer_setting", "raw_printing_section", "enable_raw_printing", "print_style_section", @@ -157,19 +156,13 @@ "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-09-09 11:07:23.042310", + "modified": "2021-09-17 12:59:14.783694", "modified_by": "Administrator", "module": "Printing", "name": "Print Settings", diff --git a/frappe/printing/page/print/print.js b/frappe/printing/page/print/print.js index 6df738b10d..0b2620c3f4 100644 --- a/frappe/printing/page/print/print.js +++ b/frappe/printing/page/print/print.js @@ -113,17 +113,6 @@ 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', @@ -161,25 +150,6 @@ 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, @@ -195,10 +165,7 @@ frappe.ui.form.PrintView = class { frappe.set_route('Form', 'Print Settings'); }); - if ( - frappe.model.get_doc(':Print Settings', 'Print Settings') - .enable_raw_printing == '1' - ) { + if (this.print_settings.enable_raw_printing == '1') { this.page.add_menu_item(__('Raw Printing Setting'), () => { this.printer_setting_dialog(); }); @@ -209,6 +176,12 @@ frappe.ui.form.PrintView = class { this.edit_print_format() ); } + + if (this.print_settings.enable_print_server) { + this.page.add_menu_item(__('Select Network Printer'), () => + this.network_printer_setting_dialog() + ); + } } show(frm) { @@ -490,73 +463,109 @@ frappe.ui.form.PrintView = class { printit() { let me = this; - frappe.call({ - method: - 'frappe.printing.doctype.print_settings.print_settings.is_print_server_enabled', - callback: function(data) { - if (data.message) { - frappe.call({ - method: 'frappe.utils.print_format.print_by_server', - 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: me.get_letterhead(), - }, - callback: function() {}, - }); - } else if (me.get_mapped_printer().length === 1) { - // printer is already mapped in localstorage (applies for both raw and pdf ) - if (me.is_raw_printing()) { - me.get_raw_commands(function(out) { - frappe.ui.form - .qz_connect() - .then(function() { - let printer_map = me.get_mapped_printer()[0]; - let data = [out.raw_commands]; - let config = qz.configs.create(printer_map.printer); - return qz.print(config, data); - }) - .then(frappe.ui.form.qz_success) - .catch((err) => { - frappe.ui.form.qz_fail(err); - }); + + if (me.print_settings.enable_print_server) { + if (localStorage.getItem('network_printer')) { + me.print_by_server(); + } else { + me.network_printer_setting_dialog(() => me.print_by_server()); + } + } else if (me.get_mapped_printer().length === 1) { + // printer is already mapped in localstorage (applies for both raw and pdf ) + if (me.is_raw_printing()) { + me.get_raw_commands(function(out) { + frappe.ui.form + .qz_connect() + .then(function() { + let printer_map = me.get_mapped_printer()[0]; + let data = [out.raw_commands]; + let config = qz.configs.create(printer_map.printer); + return qz.print(config, data); + }) + .then(frappe.ui.form.qz_success) + .catch((err) => { + frappe.ui.form.qz_fail(err); }); - } else { - frappe.show_alert( + }); + } else { + frappe.show_alert( + { + message: __('PDF printing via "Raw Print" is not supported.'), + subtitle: __( + 'Please remove the printer mapping in Printer Settings and try again.' + ), + indicator: 'info', + }, + 14 + ); + //Note: need to solve "Error: Cannot parse (FILE) as a PDF file" to enable qz pdf printing. + } + } else if (me.is_raw_printing()) { + // printer not mapped in localstorage and the current print format is raw printing + frappe.show_alert( + { + message: __('Printer mapping not set.'), + subtitle: __( + 'Please set a printer mapping for this print format in the Printer Settings' + ), + indicator: 'warning', + }, + 14 + ); + me.printer_setting_dialog(); + } else { + me.render_page('/printview?', true); + } + } + + print_by_server() { + let me = this; + if (localStorage.getItem('network_printer')) { + frappe.call({ + method: 'frappe.utils.print_format.print_by_server', + args: { + doctype: me.frm.doc.doctype, + name: me.frm.doc.name, + printer_setting: localStorage.getItem('network_printer'), + print_format: me.selected_format(), + no_letterhead: me.with_letterhead(), + letterhead: me.get_letterhead(), + }, + callback: function() {}, + }); + } + } + network_printer_setting_dialog(callback) { + let me = this; + frappe.call({ + method: 'frappe.printing.doctype.network_printer_settings.network_printer_settings.get_network_printer_settings', + callback: function(r) { + if(r.message) { + let d = new frappe.ui.Dialog({ + title: __('Select Network Printer'), + fields: [ { - message: __('PDF printing via "Raw Print" is not supported.'), - subtitle: __( - 'Please remove the printer mapping in Printer Settings and try again.' - ), - indicator: 'info', - }, - 14 - ); - //Note: need to solve "Error: Cannot parse (FILE) as a PDF file" to enable qz pdf printing. - } - } else if (me.is_raw_printing()) { - // printer not mapped in localstorage and the current print format is raw printing - frappe.show_alert( - { - message: __('Printer mapping not set.'), - subtitle: __( - 'Please set a printer mapping for this print format in the Printer Settings' - ), - indicator: 'warning', + "label" : "Printer", + "fieldname": "printer", + "fieldtype": "Select", + "reqd": 1, + "options": r.message + } + ], + primary_action: function() { + localStorage.setItem('network_printer', d.get_values().printer); + if (typeof callback == "function") { + callback(); + } + d.hide(); }, - 14 - ); - me.printer_setting_dialog(); - } else { - me.render_page('/printview?', true); + primary_action_label: __('Select') + }); + d.show(); } }, }); } - render_page(method, printit = false) { let w = window.open( frappe.urllib.get_full_url( diff --git a/frappe/utils/print_format.py b/frappe/utils/print_format.py index 6ced99e9ce..130ee24f21 100644 --- a/frappe/utils/print_format.py +++ b/frappe/utils/print_format.py @@ -99,7 +99,7 @@ def report_to_pdf(html, orientation="Landscape"): @frappe.whitelist() 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) + print_settings = frappe.get_doc("Network Printer Settings", printer_setting) try: import cups except ImportError: From 2bd2ee36557780d03086d986e945f372604f47de Mon Sep 17 00:00:00 2001 From: Anupam Date: Mon, 20 Sep 2021 10:13:14 +0530 Subject: [PATCH 12/16] fix: sider issues --- .../network_printer_settings/network_printer_settings.js | 4 +--- frappe/printing/page/print/print.js | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/frappe/printing/doctype/network_printer_settings/network_printer_settings.js b/frappe/printing/doctype/network_printer_settings/network_printer_settings.js index 6e33e20792..043afd388f 100644 --- a/frappe/printing/doctype/network_printer_settings/network_printer_settings.js +++ b/frappe/printing/doctype/network_printer_settings/network_printer_settings.js @@ -3,9 +3,7 @@ frappe.ui.form.on('Network Printer Settings', { onload (frm) { - if (!frm.is_new()) { - frm.trigger("connect_print_server"); - } + frm.trigger("connect_print_server"); }, server_ip (frm) { frm.trigger("connect_print_server"); diff --git a/frappe/printing/page/print/print.js b/frappe/printing/page/print/print.js index 0b2620c3f4..d3b1c69815 100644 --- a/frappe/printing/page/print/print.js +++ b/frappe/printing/page/print/print.js @@ -536,16 +536,15 @@ frappe.ui.form.PrintView = class { } } network_printer_setting_dialog(callback) { - let me = this; frappe.call({ method: 'frappe.printing.doctype.network_printer_settings.network_printer_settings.get_network_printer_settings', callback: function(r) { - if(r.message) { + if (r.message) { let d = new frappe.ui.Dialog({ title: __('Select Network Printer'), fields: [ { - "label" : "Printer", + "label": "Printer", "fieldname": "printer", "fieldtype": "Select", "reqd": 1, From 3f0df6946e763dc475f394db0b368727a7b00e6b Mon Sep 17 00:00:00 2001 From: Anupam Date: Thu, 23 Sep 2021 10:49:30 +0530 Subject: [PATCH 13/16] fix: error message --- .../network_printer_settings/network_printer_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/printing/doctype/network_printer_settings/network_printer_settings.py b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py index d24d0695db..4ef9b55350 100644 --- a/frappe/printing/doctype/network_printer_settings/network_printer_settings.py +++ b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py @@ -12,7 +12,7 @@ class NetworkPrinterSettings(Document): try: import cups except ImportError: - frappe.throw(_("You need to install pycups to use this feature!")) + frappe.throw(_("This feature can not be used as dependencies are missing. Please contact your system manager to enable this by installing pycups!")) return try: cups.setServer(self.server_ip) From 06667968ab4022801de9a44b08abae3f9f7fa03b Mon Sep 17 00:00:00 2001 From: Anupam Date: Thu, 23 Sep 2021 10:54:39 +0530 Subject: [PATCH 14/16] fix: error message --- .../network_printer_settings/network_printer_settings.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/printing/doctype/network_printer_settings/network_printer_settings.py b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py index 4ef9b55350..94d1d2f302 100644 --- a/frappe/printing/doctype/network_printer_settings/network_printer_settings.py +++ b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py @@ -12,7 +12,8 @@ class NetworkPrinterSettings(Document): try: import cups except ImportError: - frappe.throw(_("This feature can not be used as dependencies are missing. Please contact your system manager to enable this by installing pycups!")) + frappe.throw(_('''This feature can not be used as dependencies are missing. + Please contact your system manager to enable this by installing pycups!''')) return try: cups.setServer(self.server_ip) From f10d2251e11988d4353491d41fbead69e6a9eaf0 Mon Sep 17 00:00:00 2001 From: Anupam Date: Thu, 23 Sep 2021 13:44:20 +0530 Subject: [PATCH 15/16] fix: sider issue --- .../network_printer_settings/network_printer_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/printing/doctype/network_printer_settings/network_printer_settings.py b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py index 94d1d2f302..e42ed818c7 100644 --- a/frappe/printing/doctype/network_printer_settings/network_printer_settings.py +++ b/frappe/printing/doctype/network_printer_settings/network_printer_settings.py @@ -13,7 +13,7 @@ class NetworkPrinterSettings(Document): import cups except ImportError: frappe.throw(_('''This feature can not be used as dependencies are missing. - Please contact your system manager to enable this by installing pycups!''')) + Please contact your system manager to enable this by installing pycups!''')) return try: cups.setServer(self.server_ip) From 37a1a15b8704bc8288802bf1788bc7afd3e4e1d5 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Fri, 24 Sep 2021 16:17:15 +0200 Subject: [PATCH 16/16] fix: set correct title (cherry picked from commit b35391d339b2e2be15f1615011e5ea609eba01f5) --- frappe/contacts/address_and_contact.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/contacts/address_and_contact.py b/frappe/contacts/address_and_contact.py index 6b71ec50f9..79c3358665 100644 --- a/frappe/contacts/address_and_contact.py +++ b/frappe/contacts/address_and_contact.py @@ -178,4 +178,4 @@ def set_link_title(doc): for link in doc.links: if not link.link_title: linked_doc = frappe.get_doc(link.link_doctype, link.link_name) - link.link_title = linked_doc.get("title_field") or linked_doc.get("name") + link.link_title = linked_doc.get_title() or link.link_name