From 874f40279409c4607208fa2fa4f4ce350d5d41f7 Mon Sep 17 00:00:00 2001 From: DANY ROBERT Date: Thu, 26 Nov 2020 19:42:50 +0530 Subject: [PATCH 001/172] Fix - Percentage difference calculation. 1. Percentage difference calculation was wrong. Formula is fixed now. 2. Calculation of previous result failed if a filter with timespan was kept. As timespan restricted the documents to cetain date range and to_date fell outside it. --- .../desk/doctype/number_card/number_card.py | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/frappe/desk/doctype/number_card/number_card.py b/frappe/desk/doctype/number_card/number_card.py index d4a2b00c57..575843f234 100644 --- a/frappe/desk/doctype/number_card/number_card.py +++ b/frappe/desk/doctype/number_card/number_card.py @@ -56,7 +56,7 @@ def has_permission(doc, ptype, user): return False @frappe.whitelist() -def get_result(doc, filters, to_date=None): +def get_result(doc, filters, to_date=None, cond=None): doc = frappe.parse_json(doc) fields = [] sql_function_map = { @@ -80,7 +80,10 @@ def get_result(doc, filters, to_date=None): filters = [] if to_date: - filters.append([doc.document_type, 'creation', '<', to_date]) + if cond: + filters.append([doc.document_type, cond, '<', to_date]) + else: + filters.append([doc.document_type, 'creation', '<', to_date]) res = frappe.db.get_list(doc.document_type, fields=fields, filters=filters) number = res[0]['result'] if res else 0 @@ -98,7 +101,10 @@ def get_percentage_difference(doc, filters, result): return previous_result = calculate_previous_result(doc, filters) - difference = (result - previous_result)/100.0 + if previous_result == 0: + difference = result + else: + difference = ((result/previous_result)-1)*100.0 return difference @@ -109,12 +115,27 @@ def calculate_previous_result(doc, filters): current_date = frappe.utils.now() if doc.stats_time_interval == 'Daily': previous_date = add_to_date(current_date, days=-1) + previous_date_from = add_to_date(current_date, days=-2) elif doc.stats_time_interval == 'Weekly': previous_date = add_to_date(current_date, weeks=-1) + previous_date_from = add_to_date(current_date, weeks=-2) elif doc.stats_time_interval == 'Monthly': previous_date = add_to_date(current_date, months=-1) + previous_date_from = add_to_date(current_date, months=-2) else: previous_date = add_to_date(current_date, years=-1) + previous_date_from = add_to_date(current_date, years=-2) + + filters = frappe.parse_json(filters) + old_filter = filters + filters = [] + cond = "" + for filter in old_filter: + if "Timespan" in filter: + cond = str(filter[1]) + filters.append([doc.document_type, cond, '>', previous_date_from]) + else: + filters.append(filter) number = get_result(doc, filters, previous_date) return number @@ -188,4 +209,4 @@ def add_card_to_dashboard(args): card.save() dashboard.append('cards', dashboard_link) - dashboard.save() \ No newline at end of file + dashboard.save() From 46b63d911f31fe6423bdaafab23313b703492d24 Mon Sep 17 00:00:00 2001 From: pateljannat Date: Mon, 21 Dec 2020 11:09:23 +0530 Subject: [PATCH 002/172] fix: letter head disabled and default validation issues --- frappe/printing/doctype/letter_head/letter_head.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/frappe/printing/doctype/letter_head/letter_head.py b/frappe/printing/doctype/letter_head/letter_head.py index 491d959755..ac779d5688 100644 --- a/frappe/printing/doctype/letter_head/letter_head.py +++ b/frappe/printing/doctype/letter_head/letter_head.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import frappe from frappe.utils import is_image from frappe.model.document import Document +from frappe import _ class LetterHead(Document): def before_insert(self): @@ -13,8 +14,14 @@ class LetterHead(Document): def validate(self): self.set_image() - if not self.is_default: - if not frappe.db.sql("""select count(*) from `tabLetter Head` where ifnull(is_default,0)=1"""): + self.validate_disabled_and_default() + + def validate_disabled_and_default(self): + if self.disabled and self.is_default: + frappe.throw(_("Letter Head cannot be both, {0} and {1}").format(frappe.bold("Disabled"), frappe.bold("Default"))) + + if not self.is_default and not self.disabled: + if not frappe.db.sql("""select count(*) from `tabLetter Head` where ifnull(is_default,0)=1""")[0][0]: self.is_default = 1 def set_image(self): From 6fb2de2c8bc070bafb3e01ec1ab218c21a653d2e Mon Sep 17 00:00:00 2001 From: DANY ROBERT Date: Sat, 26 Dec 2020 17:37:22 +0530 Subject: [PATCH 003/172] Update number_card.py --- frappe/desk/doctype/number_card/number_card.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/desk/doctype/number_card/number_card.py b/frappe/desk/doctype/number_card/number_card.py index 575843f234..75eb3da556 100644 --- a/frappe/desk/doctype/number_card/number_card.py +++ b/frappe/desk/doctype/number_card/number_card.py @@ -129,11 +129,11 @@ def calculate_previous_result(doc, filters): filters = frappe.parse_json(filters) old_filter = filters filters = [] - cond = "" for filter in old_filter: if "Timespan" in filter: cond = str(filter[1]) filters.append([doc.document_type, cond, '>', previous_date_from]) + filters.append([doc.document_type, cond, '<', previous_date]) else: filters.append(filter) From 3177bcd0acd9a453d641489806c4e9ae945e38d1 Mon Sep 17 00:00:00 2001 From: walstanb Date: Tue, 5 Jan 2021 18:38:22 +0530 Subject: [PATCH 004/172] feat: ability to attach photo from webcam --- .../js/frappe/file_uploader/FileUploader.vue | 31 +++++ frappe/public/js/frappe/ui/capture.js | 125 +++++++----------- 2 files changed, 80 insertions(+), 76 deletions(-) diff --git a/frappe/public/js/frappe/file_uploader/FileUploader.vue b/frappe/public/js/frappe/file_uploader/FileUploader.vue index 714fa49d2a..a6a1634fe4 100644 --- a/frappe/public/js/frappe/file_uploader/FileUploader.vue +++ b/frappe/public/js/frappe/file_uploader/FileUploader.vue @@ -55,6 +55,13 @@
{{ __('Link') }}
+
{{ upload_notes }} @@ -173,8 +180,12 @@ export default { currently_uploading: -1, show_file_browser: false, show_web_link: false, + allow_take_photo: false, } }, + created() { + this.allow_take_photo = window.navigator.mediaDevices; + }, watch: { files(newvalue, oldvalue) { if (!this.allow_multiple && newvalue.length > 1) { @@ -416,6 +427,26 @@ export default { xhr.send(form_data); }); + }, + urltoFile(url, filename, mimeType){ + return (fetch(url) + .then(function(res){return res.arrayBuffer();}) + .then(function(buf){return new File([buf], filename, {type:mimeType});}) + ); + }, + capture_image() { + const capture = new frappe.ui.Capture({ + animate: false, + error: true + }); + + capture.show(); + capture.submit(data_url => { + let filename = `capture_${frappe.datetime.now_date()}_${frappe.datetime.now_time().replaceAll(":", "-")}.png`; + this.urltoFile(data_url, filename, 'image/png').then((file) => { + return this.add_files([file]) + }); + }); } } } diff --git a/frappe/public/js/frappe/ui/capture.js b/frappe/public/js/frappe/ui/capture.js index f08257d394..ffe321202a 100644 --- a/frappe/public/js/frappe/ui/capture.js +++ b/frappe/public/js/frappe/ui/capture.js @@ -12,16 +12,16 @@ * // returns "data:image/pngbase64,..." */ frappe._.get_data_uri = element => { - const $element = $(element); - const width = $element.width(); - const height = $element.height(); + + const width = element.videoWidth; + const height = element.videoHeight; const $canvas = $(''); $canvas[0].width = width; $canvas[0].height = height; const context = $canvas[0].getContext('2d'); - context.drawImage($element[0], 0, 0, width, height); + context.drawImage(element, 0, 0, width, height); const data_uri = $canvas[0].toDataURL('image/png'); @@ -55,52 +55,56 @@ frappe.ui.Capture = class { render() { return navigator.mediaDevices.getUserMedia({ video: true }).then(stream => { + this.stream = stream; + this.dialog = new frappe.ui.Dialog({ title: this.options.title, animate: this.options.animate, - action: { - secondary: { - label: '×' - } - } }); + this.dialog.get_close_btn().on('click', () => { + this.hide(); + }); + + const set_take_photo_action = () => { + this.dialog.set_primary_action(__('Take Photo'), () => { + const data_url = frappe._.get_data_uri(video); + $e.find('.fc-p').attr('src', data_url); + + $e.find('.fc-s').hide(); + $e.find('.fc-p').show(); + + this.dialog.set_secondary_action_label(__('Retake')); + this.dialog.get_secondary_btn().show(); + + this.dialog.set_primary_action(__('Submit'), () => { + this.hide(); + if (this.callback) this.callback(data_url); + }); + }); + }; + + set_take_photo_action(); + + this.dialog.set_secondary_action(() => { + $e.find('.fc-p').hide(); + $e.find('.fc-s').show(); + + this.dialog.get_secondary_btn().hide(); + this.dialog.get_primary_btn().off('click'); + set_take_photo_action(); + }); + + this.dialog.get_secondary_btn().hide(); + const $e = $(frappe.ui.Capture.TEMPLATE); const video = $e.find('video')[0]; - video.srcObject = stream; + video.srcObject = this.stream; video.play(); - const $container = $(this.dialog.body); + $container.html($e); - - $e.find('.fc-btf').hide(); - - $e.find('.fc-bcp').click(() => { - const data_url = frappe._.get_data_uri(video); - $e.find('.fc-p').attr('src', data_url); - - $e.find('.fc-s').hide(); - $e.find('.fc-p').show(); - - $e.find('.fc-btu').hide(); - $e.find('.fc-btf').show(); - }); - - $e.find('.fc-br').click(() => { - $e.find('.fc-p').hide(); - $e.find('.fc-s').show(); - - $e.find('.fc-btf').hide(); - $e.find('.fc-btu').show(); - }); - - $e.find('.fc-bs').click(() => { - const data_url = frappe._.get_data_uri(video); - this.hide(); - - if (this.callback) this.callback(data_url); - }); }); } @@ -122,6 +126,9 @@ frappe.ui.Capture = class { } hide() { + if (this.stream) this.stream.getTracks().forEach((track) => { + track.stop(); + }); if (this.dialog) this.dialog.hide(); } @@ -138,43 +145,9 @@ frappe.ui.Capture.ERR_MESSAGE = __('Unable to load camera.'); frappe.ui.Capture.TEMPLATE = `
- -
- -
-
-
-
-
-
-
- -
-
-
-
- -
-
-
-
-
-
-
- ${''} -
-
-
- -
-
-
+
+ +
From 3a112f8a09665a68c7e54fcdce7dafee9ccaa65e Mon Sep 17 00:00:00 2001 From: pateljannat Date: Thu, 7 Jan 2021 11:13:09 +0530 Subject: [PATCH 005/172] fix: orm and message --- frappe/printing/doctype/letter_head/letter_head.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/printing/doctype/letter_head/letter_head.py b/frappe/printing/doctype/letter_head/letter_head.py index ac779d5688..0ea1d2f242 100644 --- a/frappe/printing/doctype/letter_head/letter_head.py +++ b/frappe/printing/doctype/letter_head/letter_head.py @@ -18,10 +18,10 @@ class LetterHead(Document): def validate_disabled_and_default(self): if self.disabled and self.is_default: - frappe.throw(_("Letter Head cannot be both, {0} and {1}").format(frappe.bold("Disabled"), frappe.bold("Default"))) + frappe.throw(_("Letter Head cannot be both disabled and default")) if not self.is_default and not self.disabled: - if not frappe.db.sql("""select count(*) from `tabLetter Head` where ifnull(is_default,0)=1""")[0][0]: + if not frappe.db.exists('Letter Head', dict(is_default=1)): self.is_default = 1 def set_image(self): From f4dcf5e05eae9ea72853f31495f756a13ac5ff01 Mon Sep 17 00:00:00 2001 From: pateljannat Date: Mon, 21 Dec 2020 11:09:23 +0530 Subject: [PATCH 006/172] fix: letter head disabled and default validation issues --- frappe/printing/doctype/letter_head/letter_head.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/frappe/printing/doctype/letter_head/letter_head.py b/frappe/printing/doctype/letter_head/letter_head.py index 491d959755..ac779d5688 100644 --- a/frappe/printing/doctype/letter_head/letter_head.py +++ b/frappe/printing/doctype/letter_head/letter_head.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import frappe from frappe.utils import is_image from frappe.model.document import Document +from frappe import _ class LetterHead(Document): def before_insert(self): @@ -13,8 +14,14 @@ class LetterHead(Document): def validate(self): self.set_image() - if not self.is_default: - if not frappe.db.sql("""select count(*) from `tabLetter Head` where ifnull(is_default,0)=1"""): + self.validate_disabled_and_default() + + def validate_disabled_and_default(self): + if self.disabled and self.is_default: + frappe.throw(_("Letter Head cannot be both, {0} and {1}").format(frappe.bold("Disabled"), frappe.bold("Default"))) + + if not self.is_default and not self.disabled: + if not frappe.db.sql("""select count(*) from `tabLetter Head` where ifnull(is_default,0)=1""")[0][0]: self.is_default = 1 def set_image(self): From 10f620572dbe922d44f21580a27d51172b08ae23 Mon Sep 17 00:00:00 2001 From: pateljannat Date: Thu, 7 Jan 2021 11:13:09 +0530 Subject: [PATCH 007/172] fix: orm and message --- frappe/printing/doctype/letter_head/letter_head.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/printing/doctype/letter_head/letter_head.py b/frappe/printing/doctype/letter_head/letter_head.py index ac779d5688..0ea1d2f242 100644 --- a/frappe/printing/doctype/letter_head/letter_head.py +++ b/frappe/printing/doctype/letter_head/letter_head.py @@ -18,10 +18,10 @@ class LetterHead(Document): def validate_disabled_and_default(self): if self.disabled and self.is_default: - frappe.throw(_("Letter Head cannot be both, {0} and {1}").format(frappe.bold("Disabled"), frappe.bold("Default"))) + frappe.throw(_("Letter Head cannot be both disabled and default")) if not self.is_default and not self.disabled: - if not frappe.db.sql("""select count(*) from `tabLetter Head` where ifnull(is_default,0)=1""")[0][0]: + if not frappe.db.exists('Letter Head', dict(is_default=1)): self.is_default = 1 def set_image(self): From 8da071edc353576d4b1039e0a189ab58f28eb543 Mon Sep 17 00:00:00 2001 From: Anuja P Date: Wed, 20 Jan 2021 18:25:11 +0530 Subject: [PATCH 008/172] fix: Preventing item qty from resetting to default on Add Multiple --- frappe/public/js/frappe/form/link_selector.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/form/link_selector.js b/frappe/public/js/frappe/form/link_selector.js index c72e74cafc..9ee9cddcc1 100644 --- a/frappe/public/js/frappe/form/link_selector.js +++ b/frappe/public/js/frappe/form/link_selector.js @@ -152,9 +152,13 @@ frappe.ui.form.LinkSelector = Class.extend({ d = me.target.add_new_row(); }, () => frappe.timeout(0.1), - () => frappe.model.set_value(d.doctype, d.name, me.fieldname, value), - () => frappe.timeout(0.5), - () => frappe.model.set_value(d.doctype, d.name, me.qty_fieldname, data.qty), + () => { + var args = {}; + args[me.fieldname] = value; + args[me.qty_fieldname] = data.qty; + + frappe.model.set_value(d.doctype, d.name, args); + }, () => frappe.show_alert(__("Added {0} ({1})", [value, data.qty])) ]); } From 619a4adfd5c3b353cd1fd73bdd857d06a41592df Mon Sep 17 00:00:00 2001 From: "hasnain2808@gmail.com" Date: Thu, 21 Jan 2021 13:10:06 +0530 Subject: [PATCH 009/172] fix: add patch for List View Settings Rename --- frappe/patches.txt | 1 + ...list_view_setting_to_list_view_settings.py | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py diff --git a/frappe/patches.txt b/frappe/patches.txt index 1a086303ba..c49c70ba64 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -318,3 +318,4 @@ frappe.patches.v13_0.remove_custom_link execute:frappe.delete_doc("DocType", "Footer Item") frappe.patches.v13_0.replace_field_target_with_open_in_new_tab frappe.patches.v13_0.delete_package_publish_tool +frappe.patches.v13_0.rename_list_view_setting_to_list_view_settings \ No newline at end of file diff --git a/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py b/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py new file mode 100644 index 0000000000..ee752ae085 --- /dev/null +++ b/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py @@ -0,0 +1,21 @@ +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors +# MIT License. See license.txt + +from __future__ import unicode_literals +import frappe + + +def execute(): + if frappe.db.table_exists('List View Setting'): + existing_list_view_settings = frappe.get_all('List View Settings', as_list=True) + for list_view_setting in frappe.get_all('List View Setting', fields = ['disable_count', 'disable_sidebar_stats', 'disable_auto_refresh', 'name']): + name = list_view_setting.pop('name') + if name not in [x[0] for x in existing_list_view_settings]: + list_view_setting['doctype'] = 'List View Settings' + list_view_settings = frappe.get_doc(list_view_setting) + # setting name here is necessary because autoname is set as prompt + list_view_settings.name = name + list_view_settings.insert() + frappe.delete_doc("DocType", "List View Setting", force=True) + frappe.db.commit() + frappe.db.sql("DROP TABLE IF EXISTS `tabList View Setting`") From 0c8c76ed1b69f76d5f747de73c27cfea3b024e7f Mon Sep 17 00:00:00 2001 From: Mohammad Hasnain Mohsin Rajan Date: Fri, 22 Jan 2021 12:49:23 +0530 Subject: [PATCH 010/172] fix: Do not manually drop the table --- .../v13_0/rename_list_view_setting_to_list_view_settings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py b/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py index ee752ae085..fcf8afc826 100644 --- a/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py +++ b/frappe/patches/v13_0/rename_list_view_setting_to_list_view_settings.py @@ -18,4 +18,3 @@ def execute(): list_view_settings.insert() frappe.delete_doc("DocType", "List View Setting", force=True) frappe.db.commit() - frappe.db.sql("DROP TABLE IF EXISTS `tabList View Setting`") From 35d802ef68dbc853faaf0624b24117dd89a6afdc Mon Sep 17 00:00:00 2001 From: Pierre-Louis Bonicoli Date: Thu, 7 Jan 2021 12:02:07 +0100 Subject: [PATCH 011/172] test: ensure rollback works with User entity --- frappe/core/doctype/user/test_user.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/frappe/core/doctype/user/test_user.py b/frappe/core/doctype/user/test_user.py index fb1fa4aff9..7a1ec56b8b 100644 --- a/frappe/core/doctype/user/test_user.py +++ b/frappe/core/doctype/user/test_user.py @@ -2,7 +2,7 @@ # MIT License. See license.txt from __future__ import unicode_literals -import frappe, unittest +import frappe, unittest, uuid from frappe.model.delete_doc import delete_doc from frappe.utils.data import today, add_to_date @@ -235,6 +235,29 @@ class TestUser(unittest.TestCase): self.assertRaises(frappe.ValidationError, user.reset_password, False) + def test_user_rollback(self): + """ """ + frappe.db.commit() + frappe.db.begin() + user_id = str(uuid.uuid4()) + email = f'{user_id}@example.com' + try: + frappe.flags.in_import = True # disable throttling + frappe.get_doc(dict( + doctype='User', + email=email, + first_name=user_id, + )).insert() + finally: + frappe.flags.in_import = False + + # Check user has been added + self.assertIsNotNone(frappe.db.get("User", {"email": email})) + + # Check that rollback works + frappe.db.rollback() + self.assertIsNone(frappe.db.get("User", {"email": email})) + def delete_contact(user): frappe.db.sql("DELETE FROM `tabContact` WHERE `email_id`= %s", user) From 0991911a460d2ec76bad376f59c29db272e2267f Mon Sep 17 00:00:00 2001 From: Pierre-Louis Bonicoli Date: Thu, 7 Jan 2021 14:15:15 +0100 Subject: [PATCH 012/172] fix: remove frappe.db.commit Call to frappe.db.commit has been added here 8ba51549d3697ea415ce5a7f722b927e75f22054, at this time the User entity wasn't using create_notification_settings. The User entity uses create_notification_settings since 338bbd4a84c6e951ca3a247701c10c82e3949aa5. --- .../desk/doctype/notification_settings/notification_settings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/desk/doctype/notification_settings/notification_settings.py b/frappe/desk/doctype/notification_settings/notification_settings.py index 9b124cd6f4..34726bdf8a 100644 --- a/frappe/desk/doctype/notification_settings/notification_settings.py +++ b/frappe/desk/doctype/notification_settings/notification_settings.py @@ -42,7 +42,6 @@ def create_notification_settings(user): _doc = frappe.new_doc('Notification Settings') _doc.name = user _doc.insert(ignore_permissions=True) - frappe.db.commit() @frappe.whitelist() From 215588fcc7dd7d8fdb2f34ab1dbefc92b859e9ff Mon Sep 17 00:00:00 2001 From: Saurabh Date: Mon, 1 Feb 2021 16:17:40 +0530 Subject: [PATCH 013/172] fix: set logout from all sessions true as default for all users --- frappe/core/doctype/user/user.json | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index 53e05bb916..8f40959799 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -302,7 +302,7 @@ "no_copy": 1 }, { - "default": "0", + "default": "1", "fieldname": "logout_all_sessions", "fieldtype": "Check", "label": "Logout From All Devices After Changing Password" @@ -629,11 +629,6 @@ "link_doctype": "User Permission", "link_fieldname": "user" }, - { - "group": "Settings", - "link_doctype": "Assignment Rule", - "link_fieldname": "user" - }, { "group": "Settings", "link_doctype": "Document Follow", @@ -656,7 +651,7 @@ } ], "max_attachments": 5, - "modified": "2020-10-18 15:18:53.126800", + "modified": "2021-02-01 16:11:06.037543", "modified_by": "Administrator", "module": "Core", "name": "User", From da7b930e53de0ad4b9430c0b276a3eb76944a864 Mon Sep 17 00:00:00 2001 From: DANY ROBERT Date: Tue, 2 Feb 2021 19:18:22 +0530 Subject: [PATCH 014/172] Update number_card.py --- .../desk/doctype/number_card/number_card.py | 26 +++++-------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/frappe/desk/doctype/number_card/number_card.py b/frappe/desk/doctype/number_card/number_card.py index 57bd86ad3f..3dc8f2825a 100644 --- a/frappe/desk/doctype/number_card/number_card.py +++ b/frappe/desk/doctype/number_card/number_card.py @@ -111,11 +111,12 @@ def get_percentage_difference(doc, filters, result): previous_result = calculate_previous_result(doc, filters) if previous_result == 0: - difference = result + return NaN else: - difference = ((result/previous_result)-1)*100.0 - - return difference + if result == previous_result: + return 0 + else: + return ((result/previous_result)-1)*100.0 def calculate_previous_result(doc, filters): @@ -124,28 +125,13 @@ def calculate_previous_result(doc, filters): current_date = frappe.utils.now() if doc.stats_time_interval == 'Daily': previous_date = add_to_date(current_date, days=-1) - previous_date_from = add_to_date(current_date, days=-2) elif doc.stats_time_interval == 'Weekly': previous_date = add_to_date(current_date, weeks=-1) - previous_date_from = add_to_date(current_date, weeks=-2) elif doc.stats_time_interval == 'Monthly': previous_date = add_to_date(current_date, months=-1) - previous_date_from = add_to_date(current_date, months=-2) else: previous_date = add_to_date(current_date, years=-1) - previous_date_from = add_to_date(current_date, years=-2) - - filters = frappe.parse_json(filters) - old_filter = filters - filters = [] - for filter in old_filter: - if "Timespan" in filter: - cond = str(filter[1]) - filters.append([doc.document_type, cond, '>', previous_date_from]) - filters.append([doc.document_type, cond, '<', previous_date]) - else: - filters.append(filter) - + number = get_result(doc, filters, previous_date) return number From 42836a2ec8622b09c2d65847cd2d88f64cd252f2 Mon Sep 17 00:00:00 2001 From: DANY ROBERT Date: Tue, 2 Feb 2021 19:20:25 +0530 Subject: [PATCH 015/172] Remove timespan filter. --- frappe/desk/doctype/number_card/number_card.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/desk/doctype/number_card/number_card.py b/frappe/desk/doctype/number_card/number_card.py index 3dc8f2825a..6ca7d1517b 100644 --- a/frappe/desk/doctype/number_card/number_card.py +++ b/frappe/desk/doctype/number_card/number_card.py @@ -131,7 +131,7 @@ def calculate_previous_result(doc, filters): previous_date = add_to_date(current_date, months=-1) else: previous_date = add_to_date(current_date, years=-1) - + number = get_result(doc, filters, previous_date) return number From d64c555515a725cefb4c969887d4444ed429eed2 Mon Sep 17 00:00:00 2001 From: DANY ROBERT Date: Wed, 3 Feb 2021 15:01:33 +0530 Subject: [PATCH 016/172] NaN to None --- frappe/desk/doctype/number_card/number_card.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/desk/doctype/number_card/number_card.py b/frappe/desk/doctype/number_card/number_card.py index 6ca7d1517b..dcf402e8be 100644 --- a/frappe/desk/doctype/number_card/number_card.py +++ b/frappe/desk/doctype/number_card/number_card.py @@ -111,7 +111,7 @@ def get_percentage_difference(doc, filters, result): previous_result = calculate_previous_result(doc, filters) if previous_result == 0: - return NaN + return None else: if result == previous_result: return 0 From 4e55c6c50b7d4a6983c96b7ce1861b66e6e52c1c Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 3 Feb 2021 15:49:43 +0530 Subject: [PATCH 017/172] fix: show NaN if percentage diff is undefined --- frappe/public/js/frappe/widgets/number_card_widget.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/widgets/number_card_widget.js b/frappe/public/js/frappe/widgets/number_card_widget.js index 93409a15a4..82d056bb31 100644 --- a/frappe/public/js/frappe/widgets/number_card_widget.js +++ b/frappe/public/js/frappe/widgets/number_card_widget.js @@ -231,9 +231,7 @@ export default class NumberCardWidget extends Widget { let color_class = ''; return this.get_percentage_stats().then(() => { - if (this.percentage_stat == undefined) return; - - if (this.percentage_stat == 0) { + if (this.percentage_stat == 0 || this.percentage_stat == undefined) { color_class = 'grey-stat'; } else if (this.percentage_stat > 0) { caret_html = @@ -258,6 +256,7 @@ export default class NumberCardWidget extends Widget { const stats_qualifier = stats_qualifier_map[this.card_doc.stats_time_interval]; let get_stat = () => { + if (this.percentage_stat == undefined) return NaN; const parts = this.percentage_stat.split(' '); const symbol = parts[1] || ''; return Math.abs(parts[0]) + ' ' + symbol; From adaf43a779c6eb4d4a30f77881f460bad5c60c6c Mon Sep 17 00:00:00 2001 From: DANY ROBERT Date: Wed, 3 Feb 2021 16:10:22 +0530 Subject: [PATCH 018/172] fix: remove 'cond' parameter --- frappe/desk/doctype/number_card/number_card.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/frappe/desk/doctype/number_card/number_card.py b/frappe/desk/doctype/number_card/number_card.py index dcf402e8be..7d1a697f6b 100644 --- a/frappe/desk/doctype/number_card/number_card.py +++ b/frappe/desk/doctype/number_card/number_card.py @@ -65,7 +65,7 @@ def has_permission(doc, ptype, user): return False @frappe.whitelist() -def get_result(doc, filters, to_date=None, cond=None): +def get_result(doc, filters, to_date=None): doc = frappe.parse_json(doc) fields = [] sql_function_map = { @@ -86,13 +86,10 @@ def get_result(doc, filters, to_date=None, cond=None): filters = frappe.parse_json(filters) if not filters: - filters = [] + filters = [] if to_date: - if cond: - filters.append([doc.document_type, cond, '<', to_date]) - else: - filters.append([doc.document_type, 'creation', '<', to_date]) + filters.append([doc.document_type, 'creation', '<', to_date]) res = frappe.db.get_list(doc.document_type, fields=fields, filters=filters) number = res[0]['result'] if res else 0 From 3ad56b2d5f9b2a5ccea445b72a0db1adfd5623e8 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Wed, 3 Feb 2021 15:46:00 +0100 Subject: [PATCH 019/172] fix: fetch contacts in auto repeat --- .../doctype/auto_repeat/auto_repeat.py | 11 ++++----- frappe/contacts/doctype/contact/contact.py | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/frappe/automation/doctype/auto_repeat/auto_repeat.py b/frappe/automation/doctype/auto_repeat/auto_repeat.py index 830af68de7..281e699640 100644 --- a/frappe/automation/doctype/auto_repeat/auto_repeat.py +++ b/frappe/automation/doctype/auto_repeat/auto_repeat.py @@ -15,6 +15,8 @@ from frappe.model.document import Document from frappe.core.doctype.communication.email import make from frappe.utils.background_jobs import get_jobs from frappe.automation.doctype.assignment_rule.assignment_rule import get_repeated +from frappe.contacts.doctype.contact.contact import get_contacts_linked_from +from frappe.contacts.doctype.contact.contact import get_contacts_linking_to month_map = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, 'Yearly': 12} week_map = {'Monday': 0, 'Tuesday': 1, 'Wednesday': 2, 'Thursday': 3, 'Friday': 4, 'Saturday': 5, 'Sunday': 6} @@ -328,13 +330,8 @@ class AutoRepeat(Document): def fetch_linked_contacts(self): if self.reference_doctype and self.reference_document: - res = frappe.db.get_all('Contact', - fields=['email_id'], - filters=[ - ['Dynamic Link', 'link_doctype', '=', self.reference_doctype], - ['Dynamic Link', 'link_name', '=', self.reference_document] - ]) - + res = get_contacts_linking_to(self.reference_doctype, self.reference_document, fields=['email_id']) + res += get_contacts_linked_from(self.reference_doctype, self.reference_document, fields=['email_id']) email_ids = list(set([d.email_id for d in res])) if not email_ids: frappe.msgprint(_('No contacts linked to document'), alert=True) diff --git a/frappe/contacts/doctype/contact/contact.py b/frappe/contacts/doctype/contact/contact.py index 987ba7d3d6..42fa039f74 100644 --- a/frappe/contacts/doctype/contact/contact.py +++ b/frappe/contacts/doctype/contact/contact.py @@ -256,3 +256,27 @@ def get_contact_with_phone_number(number): def get_contact_name(email_id): contact = frappe.get_list("Contact Email", filters={"email_id": email_id}, fields=["parent"], limit=1) return contact[0].parent if contact else None + +def get_contacts_linking_to(doctype, docname, fields=None): + """Return a list of contacts containing a link to the given document.""" + return frappe.get_list('Contact', fields=fields, filters=[ + ['Dynamic Link', 'link_doctype', '=', doctype], + ['Dynamic Link', 'link_name', '=', docname] + ]) + +def get_contacts_linked_from(doctype, docname, fields=None): + """Return a list of contacts that are contained in (linked from) the given document.""" + link_fields = frappe.get_meta(doctype).get('fields', { + 'fieldtype': 'Link', + 'options': 'Contact' + }) + if not link_fields: + return [] + + contact_names = frappe.get_value(doctype, docname, fieldname=[f.fieldname for f in link_fields]) + if not contact_names: + return [] + + return frappe.get_list('Contact', fields=fields, filters={ + 'name': ('in', contact_names) + }) From fdfdc6fa7f4c225f5e3ec5f80da0f945fa4c5a14 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 3 Feb 2021 22:10:42 +0530 Subject: [PATCH 020/172] chore(deps): [security] bump bleach from 3.1.4 to 3.3.0 (#12309) Bumps [bleach](https://github.com/mozilla/bleach) from 3.1.4 to 3.3.0. **This update includes a security fix.** - [Release notes](https://github.com/mozilla/bleach/releases) - [Changelog](https://github.com/mozilla/bleach/blob/master/CHANGES) - [Commits](https://github.com/mozilla/bleach/compare/v3.1.4...v3.3.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d99469daf6..a9e1a72481 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ Babel==2.6.0 beautifulsoup4==4.8.2 bleach-whitelist==0.0.10 -bleach==3.1.4 +bleach==3.3.0 boto3==1.10.18 braintree==3.57.1 chardet==3.0.4 From 9e5dfc2859d52b38deb48a50930f33e4bf53d251 Mon Sep 17 00:00:00 2001 From: Brian Pond Date: Wed, 3 Feb 2021 09:02:01 -0800 Subject: [PATCH 021/172] refactor: Remove unused args in get_doc_files (#12298) Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> --- frappe/model/sync.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/model/sync.py b/frappe/model/sync.py index e04d3d56b9..61983d322c 100644 --- a/frappe/model/sync.py +++ b/frappe/model/sync.py @@ -61,7 +61,7 @@ def sync_for(app_name, force=0, sync_everything = False, verbose=False, reset_pe for module_name in frappe.local.app_modules.get(app_name) or []: folder = os.path.dirname(frappe.get_module(app_name + "." + module_name).__file__) - get_doc_files(files, folder, force, sync_everything, verbose=verbose) + get_doc_files(files, folder) l = len(files) if l: @@ -77,7 +77,7 @@ def sync_for(app_name, force=0, sync_everything = False, verbose=False, reset_pe # print each progress bar on new line print() -def get_doc_files(files, start_path, force=0, sync_everything = False, verbose=False): +def get_doc_files(files, start_path): """walk and sync all doctypes and pages""" # load in sequence - warning for devs From 322dcfdad0cefd6520982df29da554c97518e64b Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Thu, 4 Feb 2021 04:12:43 +0100 Subject: [PATCH 022/172] fix: New currency symbol for Zimbabwe (#12308) * fix: New currency symbol for Zimbabwe * fix: re-run patch --- frappe/geo/country_info.json | 6 +++--- frappe/patches.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frappe/geo/country_info.json b/frappe/geo/country_info.json index e4c4e278b0..1e0ae161bc 100644 --- a/frappe/geo/country_info.json +++ b/frappe/geo/country_info.json @@ -2729,11 +2729,11 @@ }, "Zimbabwe": { "code": "zw", - "currency": "ZWD", - "currency_fraction": "Thebe", + "currency": "ZWL", + "currency_fraction": "Cent", "currency_fraction_units": 100, "currency_name": "Zimbabwe Dollar", - "currency_symbol": "P", + "currency_symbol": "ZWL$", "number_format": "# ###.##", "timezones": [ "Africa/Harare" diff --git a/frappe/patches.txt b/frappe/patches.txt index f076d5bd9c..0f37946398 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -209,7 +209,7 @@ frappe.patches.v9_1.resave_domain_settings frappe.patches.v9_1.revert_domain_settings frappe.patches.v9_1.move_feed_to_activity_log execute:frappe.delete_doc('Page', 'data-import-tool', ignore_missing=True) -frappe.patches.v10_0.reload_countries_and_currencies # 14-10-2020 +frappe.patches.v10_0.reload_countries_and_currencies # 2021-02-03 frappe.patches.v10_0.refactor_social_login_keys frappe.patches.v10_0.enable_chat_by_default_within_system_settings frappe.patches.v10_0.remove_custom_field_for_disabled_domain From 215cdc4422111c6344ff91085eaa9e4e8113113c Mon Sep 17 00:00:00 2001 From: Anuja P Date: Thu, 4 Feb 2021 10:47:16 +0530 Subject: [PATCH 023/172] fix: suggested changes --- frappe/public/js/frappe/form/link_selector.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/form/link_selector.js b/frappe/public/js/frappe/form/link_selector.js index 9ee9cddcc1..07cd6864c5 100644 --- a/frappe/public/js/frappe/form/link_selector.js +++ b/frappe/public/js/frappe/form/link_selector.js @@ -153,11 +153,11 @@ frappe.ui.form.LinkSelector = Class.extend({ }, () => frappe.timeout(0.1), () => { - var args = {}; + let args = {}; args[me.fieldname] = value; args[me.qty_fieldname] = data.qty; - frappe.model.set_value(d.doctype, d.name, args); + return frappe.model.set_value(d.doctype, d.name, args); }, () => frappe.show_alert(__("Added {0} ({1})", [value, data.qty])) ]); From a352dcd39cbc28c056a84a06a42f849bd8a1fe1e Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 4 Feb 2021 15:45:41 +0530 Subject: [PATCH 024/172] fix: Dont cache website rules in development --- frappe/website/render.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frappe/website/render.py b/frappe/website/render.py index 5c19a3eb25..a8feb2650e 100644 --- a/frappe/website/render.py +++ b/frappe/website/render.py @@ -278,6 +278,10 @@ def get_website_rules(): return rules + if frappe.local.dev_server: + # dont cache in development + return _get() + return frappe.cache().get_value('website_route_rules', _get) def set_content_type(response, data, path): From ab76d2d5192997c9c0cad0df9e86f1b2cd377914 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 4 Feb 2021 18:10:36 +0530 Subject: [PATCH 025/172] fix: setup wizard error state --- frappe/desk/page/setup_wizard/setup_wizard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index c39e7f52c0..f44a57e339 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -201,7 +201,7 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides { this.abort_setup(r.message.fail); } }, - error: this.abort_setup("Error in setup", true) + error: () => this.abort_setup("Error in setup") }); } From 8254ef96f34275821663f01a2fd9fd30ad1b8f54 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 4 Feb 2021 18:20:25 +0530 Subject: [PATCH 026/172] fix: increase page head z-index --- frappe/public/scss/desk/page.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/scss/desk/page.scss b/frappe/public/scss/desk/page.scss index 46bec46573..3d14794997 100644 --- a/frappe/public/scss/desk/page.scss +++ b/frappe/public/scss/desk/page.scss @@ -78,7 +78,7 @@ } .page-head { - z-index: 2; + z-index: 4; position: sticky; top: var(--navbar-height); background: var(--bg-color); From f180abf66d3c0edf6b2507436743e6e04da241a4 Mon Sep 17 00:00:00 2001 From: shariquerik Date: Thu, 4 Feb 2021 19:31:19 +0530 Subject: [PATCH 027/172] fix: RTL print preview issue --- frappe/printing/page/print/print.js | 6 ++++++ frappe/www/printview.py | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/frappe/printing/page/print/print.js b/frappe/printing/page/print/print.js index 7e1db1eddb..8d09a2c4df 100644 --- a/frappe/printing/page/print/print.js +++ b/frappe/printing/page/print/print.js @@ -412,6 +412,12 @@ frappe.ui.form.PrintView = class { ` ); + if (out.has_rtl){ + this.$print_format_body.find('head').append( + `` + ); + } + this.$print_format_body.find('body').html( `` ); diff --git a/frappe/www/printview.py b/frappe/www/printview.py index f80d9d6ef0..faea0306dd 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -204,7 +204,8 @@ def get_html_and_style(doc, name=None, print_format=None, meta=None, return { "html": html, - "style": get_print_style(style=style, print_format=print_format) + "style": get_print_style(style=style, print_format=print_format), + "has_rtl": True if frappe.local.lang in ["ar", "he", "fa"] else False } @frappe.whitelist() From b181b69894b71ddb412db3f7b96972821d4cda50 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 4 Feb 2021 22:19:39 +0530 Subject: [PATCH 028/172] feat: Set default site using FRAPPE_SITE env var Default site can now be set using the environment variable FRAPPE_SITE An attempt to deprecate the use of currentsite.txt --- frappe/tests/test_commands.py | 7 +++++++ frappe/utils/bench_helper.py | 2 ++ 2 files changed, 9 insertions(+) diff --git a/frappe/tests/test_commands.py b/frappe/tests/test_commands.py index 0786a0e14f..c214dbace6 100644 --- a/frappe/tests/test_commands.py +++ b/frappe/tests/test_commands.py @@ -382,3 +382,10 @@ class TestCommands(BaseTestCommands): os.remove(test1_path) os.remove(test2_path) + + def test_frappe_site_env(self): + os.putenv('FRAPPE_SITE', frappe.local.site) + self.execute("bench execute frappe.ping") + self.assertEquals(self.returncode, 0) + self.assertIn("pong", self.stdout) + diff --git a/frappe/utils/bench_helper.py b/frappe/utils/bench_helper.py index c46b42b132..633d867306 100644 --- a/frappe/utils/bench_helper.py +++ b/frappe/utils/bench_helper.py @@ -54,6 +54,8 @@ def get_sites(site_arg): return frappe.utils.get_sites() elif site_arg: return [site_arg] + elif os.environ.get('FRAPPE_SITE'): + return [os.environ.get('FRAPPE_SITE')] elif os.path.exists('currentsite.txt'): with open('currentsite.txt') as f: site = f.read().strip() From e9be875b61df22e01b7b12da99462196f4b108e9 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 4 Feb 2021 22:31:35 +0530 Subject: [PATCH 029/172] fix: No need to prefetch emojis --- frappe/public/js/frappe/chat.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/frappe/public/js/frappe/chat.js b/frappe/public/js/frappe/chat.js index f63005278d..813205ecd0 100644 --- a/frappe/public/js/frappe/chat.js +++ b/frappe/public/js/frappe/chat.js @@ -1305,8 +1305,6 @@ class { this.set_wrapper(selector ? selector : "body") this.set_options(options) - // Load Emojis. - frappe.chat.emoji() } /** From f95d34918dbdcab99741533a864a7624e9f29833 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 5 Feb 2021 08:47:58 +0530 Subject: [PATCH 030/172] chore(Snyk): Security upgrade markdown2 from 2.3.9 to 2.4.0 (#12331) The following vulnerabilities are fixed by pinning transitive dependencies: - https://snyk.io/vuln/SNYK-PYTHON-MARKDOWN2-1063233 Co-authored-by: snyk-bot --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a9e1a72481..194853dcfe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,7 +27,7 @@ html5lib==1.0.1 ipython==7.14.0 Jinja2==2.11.3 ldap3==2.7 -markdown2==2.3.9 +markdown2==2.4.0 maxminddb-geolite2==2018.703 ndg-httpsclient==0.5.1 num2words==0.5.10 From 898922f03ed08ecc387a7f4af912815398c253f1 Mon Sep 17 00:00:00 2001 From: prssanna Date: Fri, 5 Feb 2021 11:45:40 +0530 Subject: [PATCH 031/172] fix: letterhead image doesn't show up in pdf --- frappe/printing/doctype/letter_head/letter_head.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/printing/doctype/letter_head/letter_head.py b/frappe/printing/doctype/letter_head/letter_head.py index 491d959755..b47040e50b 100644 --- a/frappe/printing/doctype/letter_head/letter_head.py +++ b/frappe/printing/doctype/letter_head/letter_head.py @@ -20,7 +20,7 @@ class LetterHead(Document): def set_image(self): if self.source=='Image': if self.image and is_image(self.image): - self.content = ''.format(self.image) + self.content = ''.format(self.image) frappe.msgprint(frappe._('Header HTML set from attachment {0}').format(self.image), alert = True) else: frappe.msgprint(frappe._('Please attach an image file to set HTML'), alert = True, indicator = 'orange') From 46d2ede2e363ef4158595aa9c99cd0dc4693ae5a Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Fri, 5 Feb 2021 13:05:14 +0530 Subject: [PATCH 032/172] fix: Use hooks for handling /desk and /app routes No need for random if statements, use the framework! --- frappe/hooks.py | 5 +++++ frappe/website/render.py | 7 ------- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index 97a8b70953..3e206f0ad3 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -58,6 +58,11 @@ website_route_rules = [ {"from_route": "/kb/", "to_route": "Help Article"}, {"from_route": "/newsletters", "to_route": "Newsletter"}, {"from_route": "/profile", "to_route": "me"}, + {"from_route": "/app/", "to_route": "app"}, +] + +website_redirects = [ + {"source": r"/desk(.*)", "target": r"/app\1"}, ] base_template = "templates/base.html" diff --git a/frappe/website/render.py b/frappe/website/render.py index 5c19a3eb25..af3b18b233 100644 --- a/frappe/website/render.py +++ b/frappe/website/render.py @@ -252,13 +252,6 @@ def resolve_path(path): if path != "index": path = resolve_from_map(path) - if path.startswith("app"): - path = "app" - - # to keep backward compatibility - if path.startswith("desk"): - path = "app" - return path def resolve_from_map(path): From 90f3aeb39bfe7e001312d1ac6815f494950d89db Mon Sep 17 00:00:00 2001 From: "hasnain2808@gmail.com" Date: Fri, 5 Feb 2021 20:28:17 +0530 Subject: [PATCH 033/172] fix: Attach image not displaying in print view --- frappe/templates/print_formats/standard_macros.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frappe/templates/print_formats/standard_macros.html b/frappe/templates/print_formats/standard_macros.html index 7a0dce7f5e..9f5f4cf12c 100644 --- a/frappe/templates/print_formats/standard_macros.html +++ b/frappe/templates/print_formats/standard_macros.html @@ -126,10 +126,14 @@ data-fieldname="{{ df.fieldname }}" data-fieldtype="{{ df.fieldtype }}" {% include doc.print_templates[df.fieldname] %} {% elif df.fieldtype=="Check" %} - {% elif df.fieldtype in ("Image", "Attach Image") %} + {% elif df.fieldtype=="Image" %} + {% elif df.fieldtype=="Attach Image" %} + {% elif df.fieldtype=="Signature" %} From 521968e72b40af06a2e3aeebc8f318515ea5d5c7 Mon Sep 17 00:00:00 2001 From: "hasnain2808@gmail.com" Date: Fri, 5 Feb 2021 21:54:12 +0530 Subject: [PATCH 034/172] fix: trailing spaces match only when re compile --- frappe/core/doctype/doctype/doctype.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 80a576230c..b3878f2b36 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -669,7 +669,8 @@ class DocType(Document): flags = {"flags": re.ASCII} if six.PY3 else {} # a DocType name should not start or end with an empty space - if re.match("^[ \t\n\r]+|[ \t\n\r]+$", name, **flags): + lead_trail_whitespace_re = re.compile("^[ \t\n\r]+|[ \t\n\r]+$", **flags) + if lead_trail_whitespace_re.findall(name): frappe.throw(_("DocType's name should not start or end with whitespace"), frappe.NameError) # a DocType's name should not start with a number or underscore From 81a7626815028fe03667b773f22ffddde1976df7 Mon Sep 17 00:00:00 2001 From: "hasnain2808@gmail.com" Date: Sat, 6 Feb 2021 00:06:40 +0530 Subject: [PATCH 035/172] fix: use search instead of match --- frappe/core/doctype/doctype/doctype.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index b3878f2b36..4fbaf0cc38 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -669,8 +669,7 @@ class DocType(Document): flags = {"flags": re.ASCII} if six.PY3 else {} # a DocType name should not start or end with an empty space - lead_trail_whitespace_re = re.compile("^[ \t\n\r]+|[ \t\n\r]+$", **flags) - if lead_trail_whitespace_re.findall(name): + if re.search("^[ \t\n\r]+|[ \t\n\r]+$", name, **flags): frappe.throw(_("DocType's name should not start or end with whitespace"), frappe.NameError) # a DocType's name should not start with a number or underscore From 4d9b8f86f6479ac797fe615d0b8bf70c363cb12c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 6 Feb 2021 11:45:10 +0530 Subject: [PATCH 036/172] fix: Anomalous behaviour of save button (bp #12326) (#12336) Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Co-authored-by: Suraj Shetty --- .../js/frappe/form/controls/base_input.js | 7 ------- frappe/public/js/frappe/form/controls/data.js | 17 +++++++++++++++-- frappe/public/js/frappe/form/controls/date.js | 2 +- frappe/public/js/frappe/form/controls/link.js | 1 + frappe/public/js/frappe/form/form.js | 7 +------ 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/base_input.js b/frappe/public/js/frappe/form/controls/base_input.js index 3c5faf4a9a..46ab62b717 100644 --- a/frappe/public/js/frappe/form/controls/base_input.js +++ b/frappe/public/js/frappe/form/controls/base_input.js @@ -127,13 +127,6 @@ frappe.ui.form.ControlInput = frappe.ui.form.Control.extend({ let display_value = frappe.format(value, this.df, { no_icon: true, inline: true }, doc); this.disp_area && $(this.disp_area).html(display_value); }, - - bind_change_event: function() { - var me = this; - this.$input && this.$input.on("change", this.change || function(e) { - me.parse_validate_and_set_in_model(me.get_input_value(), e); - }); - }, set_label: function(label) { if(label) this.df.label = label; diff --git a/frappe/public/js/frappe/form/controls/data.js b/frappe/public/js/frappe/form/controls/data.js index 401de2ed5d..48b4d9da35 100644 --- a/frappe/public/js/frappe/form/controls/data.js +++ b/frappe/public/js/frappe/form/controls/data.js @@ -3,6 +3,7 @@ frappe.provide('frappe.phone_call'); frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ html_element: "input", input_type: "text", + trigger_change_on_input_event: true, make_input: function() { if(this.$input) return; @@ -22,8 +23,20 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ this.has_input = true; this.bind_change_event(); this.setup_autoname_check(); - // somehow this event does not bubble up to document - // after v7, if you can debug, remove this + }, + bind_change_event: function() { + const change_handler = e => { + if (this.change) this.change(e); + else { + let value = this.get_input_value(); + this.parse_validate_and_set_in_model(value, e); + } + }; + this.$input.on("change", change_handler); + if (this.trigger_change_on_input_event) { + // debounce to avoid repeated validations on value change + this.$input.on("input", frappe.utils.debounce(change_handler, 500)); + } }, setup_autoname_check: function() { if (!this.df.parent) return; diff --git a/frappe/public/js/frappe/form/controls/date.js b/frappe/public/js/frappe/form/controls/date.js index da214029be..ca214ca0fa 100644 --- a/frappe/public/js/frappe/form/controls/date.js +++ b/frappe/public/js/frappe/form/controls/date.js @@ -1,5 +1,5 @@ - frappe.ui.form.ControlDate = frappe.ui.form.ControlData.extend({ + trigger_change_on_input_event: false, make_input: function() { this._super(); this.make_picker(); diff --git a/frappe/public/js/frappe/form/controls/link.js b/frappe/public/js/frappe/form/controls/link.js index b9c3dc80ec..4ed0c40d33 100644 --- a/frappe/public/js/frappe/form/controls/link.js +++ b/frappe/public/js/frappe/form/controls/link.js @@ -9,6 +9,7 @@ import Awesomplete from 'awesomplete'; frappe.ui.form.recent_link_validations = {}; frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({ + trigger_change_on_input_event: false, make_input: function() { var me = this; // line-height: 1 is for Mozilla 51, shows extra padding otherwise diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index 987b94c0f9..a70797e295 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -564,13 +564,8 @@ frappe.ui.form.Form = class FrappeForm { let me = this; return new Promise((resolve, reject) => { btn && $(btn).prop("disabled", true); - $(document.activeElement).blur(); - frappe.ui.form.close_grid_form(); - // let any pending js process finish - setTimeout(function() { - me.validate_and_save(save_action, callback, btn, on_error, resolve, reject); - }, 100); + me.validate_and_save(save_action, callback, btn, on_error, resolve, reject); }).then(() => { me.show_success_action(); }).catch((e) => { From e992e638f94ddb1cfbdceaee3e8449b7f18b82da Mon Sep 17 00:00:00 2001 From: shariquerik Date: Sun, 7 Feb 2021 12:42:06 +0530 Subject: [PATCH 037/172] fix: Added has_rtl function on client side --- frappe/printing/page/print/print.js | 6 +++++- frappe/www/printview.py | 3 +-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/frappe/printing/page/print/print.js b/frappe/printing/page/print/print.js index 8d09a2c4df..45c19b5a4d 100644 --- a/frappe/printing/page/print/print.js +++ b/frappe/printing/page/print/print.js @@ -362,6 +362,10 @@ frappe.ui.form.PrintView = class { this.lang_code = this.language_sel.val(); } + has_rtl(){ + return ["ar", "he", "fa"].includes(this.lang_code); + } + get_language_options() { return frappe.get_languages(); } @@ -412,7 +416,7 @@ frappe.ui.form.PrintView = class { ` ); - if (out.has_rtl){ + if (this.has_rtl()){ this.$print_format_body.find('head').append( `` ); diff --git a/frappe/www/printview.py b/frappe/www/printview.py index faea0306dd..f80d9d6ef0 100644 --- a/frappe/www/printview.py +++ b/frappe/www/printview.py @@ -204,8 +204,7 @@ def get_html_and_style(doc, name=None, print_format=None, meta=None, return { "html": html, - "style": get_print_style(style=style, print_format=print_format), - "has_rtl": True if frappe.local.lang in ["ar", "he", "fa"] else False + "style": get_print_style(style=style, print_format=print_format) } @frappe.whitelist() From 1133f40dd24a2cab3b73737a9d2953639cf71596 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sun, 7 Feb 2021 12:49:43 +0530 Subject: [PATCH 038/172] fix: Don't overwrite source_name if source_name is defined (bp #12280) (#12341) Co-authored-by: Richard Case <64409021+casesolved-co-uk@users.noreply.github.com> Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> --- frappe/public/js/frappe/model/create_new.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/model/create_new.js b/frappe/public/js/frappe/model/create_new.js index 396d6f59b3..dc6ee56fca 100644 --- a/frappe/public/js/frappe/model/create_new.js +++ b/frappe/public/js/frappe/model/create_new.js @@ -362,9 +362,7 @@ $.extend(frappe.model, { ); } else if (!opts.source_name && opts.frm) { opts.source_name = opts.frm.doc.name; - - // Allow opening a mapped doc without a source document name - } else if (!opts.frm) { + } else if (!opts.frm && !opts.source_name) { opts.source_name = null; } From 05fdd6d0dae30e2b64acdc67819ae7c17db5137b Mon Sep 17 00:00:00 2001 From: prssanna Date: Mon, 8 Feb 2021 11:43:50 +0530 Subject: [PATCH 039/172] fix: dashboard shortcut route on workspace --- frappe/public/js/frappe/utils/utils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 5f6126b81f..de888fcd4a 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -708,7 +708,7 @@ Object.assign(frappe.utils, { title = frappe._title_prefix + " " + title.replace(/<[^>]*>/g, ""); } document.title = title; - + // save for re-routing const sub_path = frappe.router.get_sub_path(); frappe.route_titles[sub_path] = title; @@ -1172,7 +1172,7 @@ Object.assign(frappe.utils, { } else if (type === "page") { route = item.name; } else if (type === "dashboard") { - route = "dashboard/" + item.name; + route = `dashboard-view/${item.name}`; } } else { From 15969a2f83e1fad07a709ed8f32fc1cfbf4d85cf Mon Sep 17 00:00:00 2001 From: prssanna Date: Mon, 8 Feb 2021 11:44:11 +0530 Subject: [PATCH 040/172] fix: remove deleted file from build --- frappe/public/build.json | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/public/build.json b/frappe/public/build.json index 35e9d62436..f2a4d65582 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -194,7 +194,6 @@ "public/js/frappe/ui/toolbar/search.js", "public/js/frappe/ui/toolbar/tag_utils.js", "public/js/frappe/ui/toolbar/search.html", - "public/js/frappe/ui/toolbar/search_header.html", "public/js/frappe/ui/toolbar/search_utils.js", "public/js/frappe/ui/toolbar/about.js", "public/js/frappe/ui/toolbar/navbar.html", From 473cb160932defa07b08fd4f8b9c54155400e78a Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Mon, 8 Feb 2021 12:05:37 +0530 Subject: [PATCH 041/172] fix: Miscellaneous changes (#12343) --- .codacy.yml | 2 - .deepsource.toml | 17 ------ .eslintignore | 3 +- frappe/.stylelintrc => .stylelintrc | 0 ci/fix-mariadb.sh | 11 ---- ci/my_config.h.patch | 22 -------- .../user_profile/user_profile_controller.js | 52 +++++++++---------- frappe/public/scss/desk/css_variables.scss | 3 +- frappe/public/scss/desk/form.scss | 4 +- frappe/public/scss/desk/global_search.scss | 8 +-- 10 files changed, 32 insertions(+), 90 deletions(-) delete mode 100644 .codacy.yml delete mode 100644 .deepsource.toml rename frappe/.stylelintrc => .stylelintrc (100%) delete mode 100755 ci/fix-mariadb.sh delete mode 100644 ci/my_config.h.patch diff --git a/.codacy.yml b/.codacy.yml deleted file mode 100644 index 4754a63e7e..0000000000 --- a/.codacy.yml +++ /dev/null @@ -1,2 +0,0 @@ -exclude_paths: - - '**.sql' \ No newline at end of file diff --git a/.deepsource.toml b/.deepsource.toml deleted file mode 100644 index f5edb47a13..0000000000 --- a/.deepsource.toml +++ /dev/null @@ -1,17 +0,0 @@ -version = 1 - -test_patterns = [ - "**/test_*.py" -] - -exclude_patterns = [ - "frappe/patches/**", - "*.min.js" -] - -[[analyzers]] -name = "python" -enabled = true - - [analyzers.meta] - runtime_version = "3.x.x" diff --git a/.eslintignore b/.eslintignore index 2fd65d307d..baf9bb2cc5 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,5 +5,4 @@ frappe/core/doctype/doctype/boilerplate/* frappe/core/doctype/report/boilerplate/* frappe/public/js/frappe/class.js frappe/templates/includes/* -frappe/tests/testcafe/* -frappe/www/website_script.js \ No newline at end of file +frappe/www/website_script.js diff --git a/frappe/.stylelintrc b/.stylelintrc similarity index 100% rename from frappe/.stylelintrc rename to .stylelintrc diff --git a/ci/fix-mariadb.sh b/ci/fix-mariadb.sh deleted file mode 100755 index 886ec5e0d0..0000000000 --- a/ci/fix-mariadb.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -# stolen from http://cgit.drupalcode.org/octopus/commit/?id=db4f837 -includedir=`mysql_config --variable=pkgincludedir` -thiscwd=`pwd` -_THIS_DB_VERSION=`mysql -V 2>&1 | tr -d "\n" | cut -d" " -f6 | awk '{ print $1}' | cut -d"-" -f1 | awk '{ print $1}' | sed "s/[\,']//g"` -if [ "$_THIS_DB_VERSION" = "5.5.40" ] && [ ! -e "$includedir-$_THIS_DB_VERSION-fixed.log" ] ; then - cd $includedir - sudo patch -p1 < $thiscwd/ci/my_config.h.patch &> /dev/null - sudo touch $includedir-$_THIS_DB_VERSION-fixed.log -fi diff --git a/ci/my_config.h.patch b/ci/my_config.h.patch deleted file mode 100644 index 5247b5b39b..0000000000 --- a/ci/my_config.h.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff -burp a/my_config.h b/my_config.h ---- a/my_config.h 2014-10-09 19:32:46.000000000 -0400 -+++ b/my_config.h 2014-10-09 19:35:12.000000000 -0400 -@@ -641,17 +641,4 @@ - #define SIZEOF_TIME_T 8 - /* #undef TIME_T_UNSIGNED */ - --/* -- stat structure (from ) is conditionally defined -- to have different layout and size depending on the defined macros. -- The correct macro is defined in my_config.h, which means it MUST be -- included first (or at least before - so, practically, -- before including any system headers). -- -- __GLIBC__ is defined in --*/ --#ifdef __GLIBC__ --#error MUST be included first! --#endif -- - #endif - diff --git a/frappe/desk/page/user_profile/user_profile_controller.js b/frappe/desk/page/user_profile/user_profile_controller.js index 61f8ec3c06..c1a89f316e 100644 --- a/frappe/desk/page/user_profile/user_profile_controller.js +++ b/frappe/desk/page/user_profile/user_profile_controller.js @@ -151,32 +151,30 @@ class UserProfile { // eslint-disable-next-line no-unused-vars render_percentage_chart(field, title) { - // REDESIGN-TODO: chart seems to be broken. Enable this once fixed. - this.wrapper.find('.percentage-chart-container').hide(); - // frappe.xcall('frappe.desk.page.user_profile.user_profile.get_energy_points_percentage_chart_data', { - // user: this.user_id, - // field: field - // }).then(chart => { - // if (chart.labels.length) { - // this.percentage_chart = new frappe.Chart('.performance-percentage-chart', { - // type: 'percentage', - // data: { - // labels: chart.labels, - // datasets: chart.datasets - // }, - // truncateLegends: 1, - // barOptions: { - // height: 11, - // depth: 1 - // }, - // height: 200, - // maxSlices: 8, - // colors: ['purple', 'blue', 'cyan', 'teal', 'pink', 'red', 'orange', 'yellow'], - // }); - // } else { - // this.wrapper.find('.percentage-chart-container').hide(); - // } - // }); + frappe.xcall('frappe.desk.page.user_profile.user_profile.get_energy_points_percentage_chart_data', { + user: this.user_id, + field: field + }).then(chart => { + if (chart.labels.length) { + this.percentage_chart = new frappe.Chart('.performance-percentage-chart', { + type: 'percentage', + data: { + labels: chart.labels, + datasets: chart.datasets + }, + truncateLegends: 1, + barOptions: { + height: 11, + depth: 1 + }, + height: 200, + maxSlices: 8, + colors: ['purple', 'blue', 'cyan', 'teal', 'pink', 'red', 'orange', 'yellow'], + }); + } else { + this.wrapper.find('.percentage-chart-container').hide(); + } + }); } create_line_chart_filters() { @@ -452,4 +450,4 @@ class UserProfileTimeline extends BaseTimeline { } frappe.provide('frappe.ui'); -frappe.ui.UserProfile = UserProfile; \ No newline at end of file +frappe.ui.UserProfile = UserProfile; diff --git a/frappe/public/scss/desk/css_variables.scss b/frappe/public/scss/desk/css_variables.scss index ed389227fe..2b98c858c4 100644 --- a/frappe/public/scss/desk/css_variables.scss +++ b/frappe/public/scss/desk/css_variables.scss @@ -24,6 +24,7 @@ $input-height: 28px !default; --fg-hover-color: var(--gray-100); --card-bg: var(--fg-color); --disabled-text-color: var(--gray-700); + --disabled-control-bg: var(--gray-50); --control-bg: var(--gray-100); --control-bg-on-gray: var(--gray-200); --awesomebar-focus-bg: var(--fg-color); @@ -56,4 +57,4 @@ $input-height: 28px !default; --timeline-item-bottom-margin: var(--margin-sm); --timeline-content-max-width: 700px; --timeline-left-padding: calc(var(--padding-xl) + var(--timeline-item-icon-size) / 2); -} \ No newline at end of file +} diff --git a/frappe/public/scss/desk/form.scss b/frappe/public/scss/desk/form.scss index 79cb84e9a2..1a6ce49b5e 100644 --- a/frappe/public/scss/desk/form.scss +++ b/frappe/public/scss/desk/form.scss @@ -91,7 +91,7 @@ padding: 8px 12px; cursor: default; color: var(--disabled-text-color); - background-color: var(--control-bg); + background-color: var(--disabled-control-bg); } .form-control:disabled, .form-control[readonly] { @@ -297,4 +297,4 @@ font-feature-settings: "tnum" 1; margin-top: 0px; } -} \ No newline at end of file +} diff --git a/frappe/public/scss/desk/global_search.scss b/frappe/public/scss/desk/global_search.scss index cffccc1128..396b685d30 100644 --- a/frappe/public/scss/desk/global_search.scss +++ b/frappe/public/scss/desk/global_search.scss @@ -89,16 +89,12 @@ .result { @include flex(flex, null, center, null); padding: 8px 0; - color: var(--gray-800); + color: var(--text-light); .result-image { margin-right: var(--margin-sm); } - a { - color: var(--gray-800); - } - mark { display: inline-flex; padding: 0; @@ -121,4 +117,4 @@ padding-bottom: var(--padding-xs); } } -} \ No newline at end of file +} From b42c3d05cc016ac7a4bfb18a1b5747779569dc3b Mon Sep 17 00:00:00 2001 From: shariquerik Date: Mon, 8 Feb 2021 12:32:07 +0530 Subject: [PATCH 042/172] fix: updated is_rtl function --- frappe/printing/page/print/print.js | 6 +----- frappe/public/js/frappe/utils/utils.js | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/frappe/printing/page/print/print.js b/frappe/printing/page/print/print.js index 45c19b5a4d..9eca40586d 100644 --- a/frappe/printing/page/print/print.js +++ b/frappe/printing/page/print/print.js @@ -362,10 +362,6 @@ frappe.ui.form.PrintView = class { this.lang_code = this.language_sel.val(); } - has_rtl(){ - return ["ar", "he", "fa"].includes(this.lang_code); - } - get_language_options() { return frappe.get_languages(); } @@ -416,7 +412,7 @@ frappe.ui.form.PrintView = class { ` ); - if (this.has_rtl()){ + if (frappe.utils.is_rtl(this.lang_code)){ this.$print_format_body.find('head').append( `` ); diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 5f6126b81f..b096d2dc43 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -922,8 +922,8 @@ Object.assign(frappe.utils, { message: __('Copied to clipboard.') }); }, - is_rtl() { - return ["ar", "he", "fa"].includes(frappe.boot.lang); + is_rtl(lang=null) { + return ["ar", "he", "fa"].includes(lang || frappe.boot.lang); }, bind_actions_with_object($el, object) { // remove previously bound event From 9b6d353b4d11e5a90606f6d28427e07f4bd0bf97 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 8 Feb 2021 13:23:01 +0530 Subject: [PATCH 043/172] fix: Stop media stream on dialog hide --- frappe/public/js/frappe/ui/capture.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/ui/capture.js b/frappe/public/js/frappe/ui/capture.js index ffe321202a..676c997b31 100644 --- a/frappe/public/js/frappe/ui/capture.js +++ b/frappe/public/js/frappe/ui/capture.js @@ -60,6 +60,7 @@ frappe.ui.Capture = class { this.dialog = new frappe.ui.Dialog({ title: this.options.title, animate: this.options.animate, + on_hide: () => this.stop_media_stream() }); this.dialog.get_close_btn().on('click', () => { @@ -126,10 +127,16 @@ frappe.ui.Capture = class { } hide() { - if (this.stream) this.stream.getTracks().forEach((track) => { - track.stop(); - }); if (this.dialog) this.dialog.hide(); + this.stop_media_stream(); + } + + stop_media_stream() { + if (this.stream) { + this.stream.getTracks().forEach((track) => { + track.stop(); + }); + } } submit(fn) { From ce4cf6035ee955db3702e37db760216602f9f18e Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 8 Feb 2021 13:23:24 +0530 Subject: [PATCH 044/172] fix: formatting and cleanup --- .../js/frappe/file_uploader/FileUploader.vue | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/frappe/public/js/frappe/file_uploader/FileUploader.vue b/frappe/public/js/frappe/file_uploader/FileUploader.vue index a6a1634fe4..18cfabc5ed 100644 --- a/frappe/public/js/frappe/file_uploader/FileUploader.vue +++ b/frappe/public/js/frappe/file_uploader/FileUploader.vue @@ -10,7 +10,7 @@ >
- {{ __('Drag and drop files here or') }} + {{ __('Drag and drop files here or upload from') }}
{{ __('Link') }}
@@ -180,12 +181,8 @@ export default { currently_uploading: -1, show_file_browser: false, show_web_link: false, - allow_take_photo: false, } }, - created() { - this.allow_take_photo = window.navigator.mediaDevices; - }, watch: { files(newvalue, oldvalue) { if (!this.allow_multiple && newvalue.length > 1) { @@ -198,6 +195,9 @@ export default { return this.files.length > 0 && this.files.every( file => file.total !== 0 && file.progress === file.total); + }, + allow_take_photo() { + return window.navigator.mediaDevices; } }, methods: { @@ -428,26 +428,24 @@ export default { xhr.send(form_data); }); }, - urltoFile(url, filename, mimeType){ - return (fetch(url) - .then(function(res){return res.arrayBuffer();}) - .then(function(buf){return new File([buf], filename, {type:mimeType});}) - ); - }, capture_image() { const capture = new frappe.ui.Capture({ animate: false, error: true }); - capture.show(); capture.submit(data_url => { - let filename = `capture_${frappe.datetime.now_date()}_${frappe.datetime.now_time().replaceAll(":", "-")}.png`; - this.urltoFile(data_url, filename, 'image/png').then((file) => { - return this.add_files([file]) - }); + let filename = `capture_${frappe.datetime.now_datetime().replaceAll(/[: -]/g, '_')}.png`; + this.url_to_file(data_url, filename, 'image/png').then((file) => + this.add_files([file]) + ); }); - } + }, + url_to_file(url, filename, mime_type) { + return fetch(url) + .then(res => res.arrayBuffer()) + .then(buffer => new File([buffer], filename, { type: mime_type })); + }, } } From 196a534c0e6d3901eb2fe15c0c7b1d31ea128276 Mon Sep 17 00:00:00 2001 From: walstanb Date: Mon, 8 Feb 2021 15:56:12 +0530 Subject: [PATCH 045/172] fix: failing ui test cases --- cypress/support/commands.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 7f0afdf035..416d782ffe 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -275,7 +275,7 @@ Cypress.Commands.add('get_open_dialog', () => { }); Cypress.Commands.add('hide_dialog', () => { - cy.wait(200); + cy.wait(300); cy.get_open_dialog().find('.btn-modal-close').click(); cy.get('.modal:visible').should('not.exist'); }); From 3c2708d66f365f1609bce0c0a973383bb621e5ae Mon Sep 17 00:00:00 2001 From: prssanna Date: Mon, 8 Feb 2021 16:52:14 +0530 Subject: [PATCH 046/172] fix: restricted button style --- frappe/public/icons/timeless/symbol-defs.svg | 3 +++ frappe/public/js/frappe/list/list_view.js | 2 +- frappe/public/scss/desk/list.scss | 12 ++++++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/frappe/public/icons/timeless/symbol-defs.svg b/frappe/public/icons/timeless/symbol-defs.svg index d6852c620f..78cca81520 100644 --- a/frappe/public/icons/timeless/symbol-defs.svg +++ b/frappe/public/icons/timeless/symbol-defs.svg @@ -677,4 +677,7 @@ + + + diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 6e8bd63676..2f1f278ecc 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -165,7 +165,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { if (match_rules_list.length) { this.restricted_list = $( `` ).click(() => this.show_restrictions(match_rules_list)).appendTo(this.page.page_form); } diff --git a/frappe/public/scss/desk/list.scss b/frappe/public/scss/desk/list.scss index d95bcaffd1..f1eadd6b3a 100644 --- a/frappe/public/scss/desk/list.scss +++ b/frappe/public/scss/desk/list.scss @@ -372,13 +372,17 @@ input.list-check-all, input.list-row-checkbox { margin-top: var(--margin-xs); height: var(--margin-xl); - .icon use { - stroke: var(--text-on-yellow); + .icon { + width: 14px; + height: 14px; + use { + stroke: var(--yellow-800); + } } &.btn { - box-shadow: none; - border: 1px solid; + box-shadow: none !important; + border: none; @include button-variant( $background: $light-yellow, $border: darken($light-yellow, 5%), From 0d693d72e6d8649709065d4214fab2975e3b6335 Mon Sep 17 00:00:00 2001 From: prssanna Date: Mon, 8 Feb 2021 16:52:59 +0530 Subject: [PATCH 047/172] fix: dark theme button styles --- frappe/public/scss/common/buttons.scss | 8 ++++++++ frappe/public/scss/common/css_variables.scss | 2 ++ frappe/public/scss/desk/dark.scss | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/frappe/public/scss/common/buttons.scss b/frappe/public/scss/common/buttons.scss index b7d7bf1e5e..74d864afa1 100644 --- a/frappe/public/scss/common/buttons.scss +++ b/frappe/public/scss/common/buttons.scss @@ -86,4 +86,12 @@ .btn.btn-danger { background-color: var(--red-400); color: $white; +} + + +[data-theme="dark"] { + .btn-primary-light { + background-color: var(--bg-dark-blue); + box-shadow: none; + } } \ No newline at end of file diff --git a/frappe/public/scss/common/css_variables.scss b/frappe/public/scss/common/css_variables.scss index 2276acd533..afda26fac3 100644 --- a/frappe/public/scss/common/css_variables.scss +++ b/frappe/public/scss/common/css_variables.scss @@ -141,6 +141,7 @@ // Background Text Color Pairs --bg-blue: var(--blue-100); --bg-light-blue: var(--blue-50); + --bg-dark-blue: var(--blue-300); --bg-green: var(--dark-green-50); --bg-yellow: var(--yellow-50); --bg-orange: var(--orange-50); @@ -151,6 +152,7 @@ --text-on-blue: var(--blue-600); --text-on-light-blue: var(--blue-500); + --text-on-dark-blue: var(--blue-700); --text-on-blue: var(--blue-600); --text-on-green: var(--dark-green-500); --text-on-yellow: var(--yellow-500); diff --git a/frappe/public/scss/desk/dark.scss b/frappe/public/scss/desk/dark.scss index 01ca5103ec..b4b2627163 100644 --- a/frappe/public/scss/desk/dark.scss +++ b/frappe/public/scss/desk/dark.scss @@ -42,6 +42,7 @@ // Background Text Color Pairs --bg-blue: var(--blue-600); --bg-light-blue: var(--blue-400); + --bg-dark-blue: var(--blue-900); --bg-green: var(--dark-green-500); --bg-yellow: var(--yellow-500); --bg-orange: var(--orange-500); @@ -52,6 +53,7 @@ --text-on-blue: var(--blue-50); --text-on-light-blue: var(--blue-100); + --text-on-dark-blue: var(--blue-300); --text-on-green: var(--dark-green-50); --text-on-yellow: var(--yellow-50); --text-on-orange: var(--orange-100); @@ -72,6 +74,10 @@ .frappe-card { .btn-default { background-color: var(--bg-color); + + &:hover { + background-color: var(--fg-hover-color); + } } } From 79b2f17dd1b6f444c70ac883b79723b44b7439d7 Mon Sep 17 00:00:00 2001 From: walstanb Date: Mon, 8 Feb 2021 18:25:43 +0530 Subject: [PATCH 048/172] fix: centered buttons --- frappe/public/js/frappe/file_uploader/FileUploader.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/file_uploader/FileUploader.vue b/frappe/public/js/frappe/file_uploader/FileUploader.vue index 18cfabc5ed..1029f9b41d 100644 --- a/frappe/public/js/frappe/file_uploader/FileUploader.vue +++ b/frappe/public/js/frappe/file_uploader/FileUploader.vue @@ -12,7 +12,7 @@
{{ __('Drag and drop files here or upload from') }}
-
+
` ).click(() => this.show_restrictions(match_rules_list)).appendTo(this.page.page_form); @@ -676,7 +676,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { if (col.type === "Tag") { const tags_display_class = !this.tags_shown ? 'hide' : ''; - let tags_html = doc._user_tags ? this.get_tags_html(doc._user_tags) : '
-
'; + let tags_html = doc._user_tags ? this.get_tags_html(doc._user_tags, 2) : '
-
'; return `