+ width="{% if header or (is_newsletter and not full_width) %}600{% else %}100%{% endif %}">
{{ header or "" }}
From 35d802ef68dbc853faaf0624b24117dd89a6afdc Mon Sep 17 00:00:00 2001
From: Pierre-Louis Bonicoli
Date: Thu, 7 Jan 2021 12:02:07 +0100
Subject: [PATCH 017/460] 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 018/460] 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 0d265bca059bee13bd912e48bd9f2dd571fc609a Mon Sep 17 00:00:00 2001
From: "hasnain2808@gmail.com"
Date: Wed, 27 Jan 2021 10:50:49 +0530
Subject: [PATCH 019/460] fix: Do not Allow Assignment Rule on Todo
---
.../doctype/assignment_rule/assignment_rule.js | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/frappe/automation/doctype/assignment_rule/assignment_rule.js b/frappe/automation/doctype/assignment_rule/assignment_rule.js
index ee1a076465..97bed4f8f3 100644
--- a/frappe/automation/doctype/assignment_rule/assignment_rule.js
+++ b/frappe/automation/doctype/assignment_rule/assignment_rule.js
@@ -9,6 +9,16 @@ frappe.ui.form.on('Assignment Rule', {
frm.events.rule(frm);
},
+ setup: function(frm) {
+ frm.set_query("document_type", () => {
+ return {
+ filters: {
+ name: ["!=", "ToDo"]
+ }
+ };
+ });
+ },
+
document_type: function(frm) {
frm.trigger('set_options');
},
From 7f2e645593035a03fd0c1b598bdd8dcac1645ef4 Mon Sep 17 00:00:00 2001
From: Deepesh Garg
Date: Wed, 27 Jan 2021 16:46:47 +0530
Subject: [PATCH 020/460] feat: Provision to rebuild NSM from treeview
---
frappe/public/js/frappe/views/treeview.js | 33 +++++++++++++++++++++--
frappe/utils/nestedset.py | 6 ++++-
2 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/frappe/public/js/frappe/views/treeview.js b/frappe/public/js/frappe/views/treeview.js
index 1a53c14974..ddddb33f9c 100644
--- a/frappe/public/js/frappe/views/treeview.js
+++ b/frappe/public/js/frappe/views/treeview.js
@@ -171,6 +171,24 @@ frappe.views.TreeView = Class.extend({
this.post_render();
},
+ rebuild_tree: function() {
+ let me = this;
+
+ frappe.call({
+ "method": "frappe.utils.nestedset.rebuild_tree",
+ "args": {
+ 'doctype': me.doctype,
+ 'parent_field': "parent_"+me.doctype.toLowerCase().replace(/ /g,'_'),
+ 'commit': 1
+ },
+ "callback": function(r) {
+ if (!r.exc) {
+ me.make_tree();
+ }
+ }
+ })
+ },
+
post_render: function() {
var me = this;
me.opts.post_render && me.opts.post_render(me);
@@ -359,7 +377,7 @@ frappe.views.TreeView = Class.extend({
});
});
},
- set_primary_action: function(){
+ set_primary_action: function() {
var me = this;
if (!this.opts.disable_add_node && this.can_create) {
me.page.set_primary_action(__("New"), function() {
@@ -367,7 +385,7 @@ frappe.views.TreeView = Class.extend({
}, "octicon octicon-plus")
}
},
- set_menu_item: function(){
+ set_menu_item: function() {
var me = this;
this.menu_items = [
@@ -392,6 +410,17 @@ frappe.views.TreeView = Class.extend({
},
];
+ if (frappe.user.has_role('System Manager')) {
+ this.menu_items.push(
+ {
+ label: __('Rebuild Tree'),
+ action: function() {
+ me.rebuild_tree();
+ }
+ }
+ )
+ }
+
if (me.opts.menu_items) {
me.menu_items.push.apply(me.menu_items, me.opts.menu_items)
}
diff --git a/frappe/utils/nestedset.py b/frappe/utils/nestedset.py
index ab426d2ce4..03200eb4ad 100644
--- a/frappe/utils/nestedset.py
+++ b/frappe/utils/nestedset.py
@@ -137,7 +137,8 @@ def update_move_node(doc, parent_field):
frappe.db.sql("""update `tab{0}` set lft = -lft + %s, rgt = -rgt + %s, modified=%s
where lft < 0""".format(doc.doctype), (new_diff, new_diff, n))
-def rebuild_tree(doctype, parent_field):
+@frappe.whitelist()
+def rebuild_tree(doctype, parent_field, commit=0):
"""
call rebuild_node for all root nodes
"""
@@ -151,6 +152,9 @@ def rebuild_tree(doctype, parent_field):
frappe.db.auto_commit_on_many_writes = 0
+ if commit:
+ frappe.db.commit()
+
def rebuild_node(doctype, parent, left, parent_field):
"""
reset lft, rgt and recursive call for all children
From 6934e6b89fdb57e7a515e0e9d59d5f23800c9cc4 Mon Sep 17 00:00:00 2001
From: KieranSmith892 <72951922+KieranSmith892@users.noreply.github.com>
Date: Thu, 28 Jan 2021 08:48:39 +0000
Subject: [PATCH 021/460] Update help_article.html
Correction to closing div in help-article-comments
---
frappe/website/doctype/help_article/templates/help_article.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/website/doctype/help_article/templates/help_article.html b/frappe/website/doctype/help_article/templates/help_article.html
index 92bb399797..9ef9a398f5 100644
--- a/frappe/website/doctype/help_article/templates/help_article.html
+++ b/frappe/website/doctype/help_article/templates/help_article.html
@@ -33,7 +33,7 @@
{{ _("More articles on {0}").format(category.name) }}
-
+
Comments
From c71438c67459f30495a45f9bb47c2e35ec423c0d Mon Sep 17 00:00:00 2001
From: theopen-institute
Date: Thu, 28 Jan 2021 14:52:57 +0000
Subject: [PATCH 022/460] rebase to develo
---
frappe/public/js/frappe/list/list_view.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js
index 5275b21cda..52f52bf471 100644
--- a/frappe/public/js/frappe/list/list_view.js
+++ b/frappe/public/js/frappe/list/list_view.js
@@ -682,7 +682,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList {
}
return `
+ title="${__(label)}: ${frappe.utils.escape_html(_value)}">
${html}
`;
};
From 7d2227dc1c2db58b9fec4131725830b4acddf005 Mon Sep 17 00:00:00 2001
From: "hasnain2808@gmail.com"
Date: Thu, 28 Jan 2021 21:47:02 +0530
Subject: [PATCH 023/460] fix: auto login redirect
---
frappe/website/utils.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/frappe/website/utils.py b/frappe/website/utils.py
index 2f8e2650f7..6e124bd40a 100644
--- a/frappe/website/utils.py
+++ b/frappe/website/utils.py
@@ -90,7 +90,10 @@ def get_home_page():
# global
if not home_page:
- home_page = frappe.db.get_value("Website Settings", None, "home_page") or "login"
+ home_page = frappe.db.get_value("Website Settings", None, "home_page")
+
+ if not home_page:
+ home_page = "login" if frappe.session.user == 'Guest' else "me"
home_page = home_page.strip('/')
From 3bc164893917bfc1e84504c3cf21ff511e885ffe Mon Sep 17 00:00:00 2001
From: Saqib Ansari
Date: Fri, 29 Jan 2021 12:47:37 +0530
Subject: [PATCH 024/460] fix: broken image rendering in print format
---
frappe/templates/print_formats/standard_macros.html | 4 ++--
frappe/utils/data.py | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/frappe/templates/print_formats/standard_macros.html b/frappe/templates/print_formats/standard_macros.html
index 7a0dce7f5e..b728a1a291 100644
--- a/frappe/templates/print_formats/standard_macros.html
+++ b/frappe/templates/print_formats/standard_macros.html
@@ -126,14 +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 in ("Image", "Attach Image") and frappe.utils.is_image(doc[doc.meta.get_field(df.fieldname).options]) %}
{% elif df.fieldtype=="Signature" %}
- {% elif df.fieldtype == "Attach" and doc[df.fieldname] and frappe.utils.is_image(doc[df.fieldname]) %}
+ {% elif df.fieldtype == "Attach" and frappe.utils.is_image(doc[df.fieldname]) %}
{% elif df.fieldtype=="HTML" %}
diff --git a/frappe/utils/data.py b/frappe/utils/data.py
index da2c910e20..e9bfc4ae26 100644
--- a/frappe/utils/data.py
+++ b/frappe/utils/data.py
@@ -824,7 +824,7 @@ def is_image(filepath):
from mimetypes import guess_type
# filepath can be https://example.com/bed.jpg?v=129
- filepath = filepath.split('?')[0]
+ filepath = (filepath or "").split('?')[0]
return (guess_type(filepath)[0] or "").startswith("image/")
def get_thumbnail_base64_for_image(src):
From 1e565ad066039d8d3eb686a56ed71ba28043d237 Mon Sep 17 00:00:00 2001
From: shariquerik
Date: Mon, 1 Feb 2021 14:07:05 +0530
Subject: [PATCH 025/460] fix: On Event creation assign to not working
---
frappe/public/js/frappe/views/interaction.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/views/interaction.js b/frappe/public/js/frappe/views/interaction.js
index 6f694801a6..ccb0b3cdc2 100644
--- a/frappe/public/js/frappe/views/interaction.js
+++ b/frappe/public/js/frappe/views/interaction.js
@@ -261,7 +261,7 @@ frappe.views.InteractionComposer = class InteractionComposer {
args: {
doctype: doc.doctype,
name: doc.name,
- assign_to: assignee,
+ assign_to: `["${assignee}"]`,
},
callback:function(r) {
if(!r.exc) {
From 215588fcc7dd7d8fdb2f34ab1dbefc92b859e9ff Mon Sep 17 00:00:00 2001
From: Saurabh
Date: Mon, 1 Feb 2021 16:17:40 +0530
Subject: [PATCH 026/460] 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 62889993fb61765a41ff2f47b01275e711179c2d Mon Sep 17 00:00:00 2001
From: Saurabh
Date: Mon, 1 Feb 2021 17:50:02 +0530
Subject: [PATCH 027/460] fix: validate the key type while updating the
password
---
frappe/core/doctype/user/user.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py
index dcca4f4a25..73e0f1c799 100644
--- a/frappe/core/doctype/user/user.py
+++ b/frappe/core/doctype/user/user.py
@@ -565,6 +565,10 @@ def get_perm_info(role):
@frappe.whitelist(allow_guest=True)
def update_password(new_password, logout_all_sessions=0, key=None, old_password=None):
+ #validate key to avoid key input like ['like', '%'], '', ['in', ['']]
+ if key and not isinstance(key, str):
+ frappe.throw(_('Invalid key type'))
+
result = test_password_strength(new_password, key, old_password)
feedback = result.get("feedback", None)
From 75f9eeeeaa1bc81d828a24a2d49b50280713dd2b Mon Sep 17 00:00:00 2001
From: Sagar Vora
Date: Tue, 2 Feb 2021 12:31:13 +0530
Subject: [PATCH 028/460] fix: reload workspace link in patch
---
frappe/patches/v13_0/rename_desk_page_to_workspace.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/frappe/patches/v13_0/rename_desk_page_to_workspace.py b/frappe/patches/v13_0/rename_desk_page_to_workspace.py
index 10308e8e53..36626815db 100644
--- a/frappe/patches/v13_0/rename_desk_page_to_workspace.py
+++ b/frappe/patches/v13_0/rename_desk_page_to_workspace.py
@@ -17,3 +17,4 @@ def execute():
rename_doc('DocType', 'Desk Link', 'Workspace Link', ignore_if_exists=True)
frappe.reload_doc('desk', 'doctype', 'workspace')
+ frappe.reload_doc('desk', 'doctype', 'workspace_link')
From 69d942a488ca92f955f2fb2e55d8b6b0451cb9f2 Mon Sep 17 00:00:00 2001
From: Sagar Vora
Date: Tue, 2 Feb 2021 15:59:42 +0530
Subject: [PATCH 029/460] fix: reload modified patch
---
frappe/patches.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/patches.txt b/frappe/patches.txt
index 8e8644342e..f076d5bd9c 100644
--- a/frappe/patches.txt
+++ b/frappe/patches.txt
@@ -327,5 +327,5 @@ execute:frappe.delete_doc_if_exists('Page', 'workspace')
execute:frappe.delete_doc_if_exists('Page', 'dashboard', force=1)
frappe.core.doctype.page.patches.drop_unused_pages
execute:frappe.get_doc('Role', 'Guest').save() # remove desk access
-frappe.patches.v13_0.rename_desk_page_to_workspace
+frappe.patches.v13_0.rename_desk_page_to_workspace # 02.02.2021
frappe.patches.v13_0.delete_package_publish_tool
From 8985130c807abbe3cdf8cc831119cd508beb7d6e Mon Sep 17 00:00:00 2001
From: Shariq Ansari <30859809+shariquerik@users.noreply.github.com>
Date: Tue, 2 Feb 2021 16:27:52 +0530
Subject: [PATCH 030/460] Update frappe/public/js/frappe/views/interaction.js
Co-authored-by: Prssanna Desai
---
frappe/public/js/frappe/views/interaction.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/frappe/public/js/frappe/views/interaction.js b/frappe/public/js/frappe/views/interaction.js
index ccb0b3cdc2..ab7570b5c5 100644
--- a/frappe/public/js/frappe/views/interaction.js
+++ b/frappe/public/js/frappe/views/interaction.js
@@ -261,7 +261,7 @@ frappe.views.InteractionComposer = class InteractionComposer {
args: {
doctype: doc.doctype,
name: doc.name,
- assign_to: `["${assignee}"]`,
+ assign_to: JSON.stringify([assignee]),
},
callback:function(r) {
if(!r.exc) {
@@ -336,4 +336,4 @@ function get_doc_mappings() {
};
return doc_map;
-}
\ No newline at end of file
+}
From 99fe0412b301254552cd2ce3fa3c22f85d160045 Mon Sep 17 00:00:00 2001
From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com>
Date: Tue, 2 Feb 2021 17:39:05 +0530
Subject: [PATCH 031/460] fix(patch): Pass if table is missing (#12302)
---
frappe/desk/utils.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/frappe/desk/utils.py b/frappe/desk/utils.py
index c19e531739..01b47ac106 100644
--- a/frappe/desk/utils.py
+++ b/frappe/desk/utils.py
@@ -7,12 +7,13 @@ def validate_route_conflict(doctype, name):
'''
Raises exception if name clashes with routes from other documents for /app routing
'''
- if frappe.flags.ignore_route_conflict_validation:
- return
all_names = []
for _doctype in ['Page', 'Workspace', 'DocType']:
- all_names.extend([slug(d) for d in frappe.get_all(_doctype, pluck='name') if (doctype != _doctype and d != name)])
+ try:
+ all_names.extend([slug(d) for d in frappe.get_all(_doctype, pluck='name') if (doctype != _doctype and d != name)])
+ except frappe.db.TableMissingError:
+ pass
if slug(name) in all_names:
frappe.msgprint(frappe._('Name already taken, please set a new name'))
From 3504fcf7b44f95ea130d993e246449775410bd54 Mon Sep 17 00:00:00 2001
From: Suraj Shetty
Date: Tue, 2 Feb 2021 18:08:06 +0530
Subject: [PATCH 032/460] fix: Desk Page rename patch
---
frappe/patches/v13_0/rename_desk_page_to_workspace.py | 5 +++--
.../patches/v13_0/update_icons_in_customized_desk_pages.py | 2 ++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/frappe/patches/v13_0/rename_desk_page_to_workspace.py b/frappe/patches/v13_0/rename_desk_page_to_workspace.py
index 36626815db..1801c4cf61 100644
--- a/frappe/patches/v13_0/rename_desk_page_to_workspace.py
+++ b/frappe/patches/v13_0/rename_desk_page_to_workspace.py
@@ -13,8 +13,9 @@ def execute():
rename_doc('DocType', 'Desk Chart', 'Workspace Chart', ignore_if_exists=True)
rename_doc('DocType', 'Desk Shortcut', 'Workspace Shortcut', ignore_if_exists=True)
- if frappe.db.exists('DocType', 'Desk Link'):
- rename_doc('DocType', 'Desk Link', 'Workspace Link', ignore_if_exists=True)
+ rename_doc('DocType', 'Desk Link', 'Workspace Link', ignore_if_exists=True)
frappe.reload_doc('desk', 'doctype', 'workspace')
frappe.reload_doc('desk', 'doctype', 'workspace_link')
+ frappe.reload_doc('desk', 'doctype', 'workspace_chart')
+ frappe.reload_doc('desk', 'doctype', 'workspace_shortcut')
diff --git a/frappe/patches/v13_0/update_icons_in_customized_desk_pages.py b/frappe/patches/v13_0/update_icons_in_customized_desk_pages.py
index da7d054682..93bf5c766e 100644
--- a/frappe/patches/v13_0/update_icons_in_customized_desk_pages.py
+++ b/frappe/patches/v13_0/update_icons_in_customized_desk_pages.py
@@ -2,6 +2,8 @@ from __future__ import unicode_literals
import frappe
def execute():
+ if not frappe.db.exists('Desk Page'): return
+
pages = frappe.get_all("Desk Page", filters={ "is_standard": False }, fields=["name", "extends", "for_user"])
default_icon = {}
for page in pages:
From bdcb769c188aa09222d0945d0af717c78461241c Mon Sep 17 00:00:00 2001
From: Suraj Shetty
Date: Tue, 2 Feb 2021 18:17:02 +0530
Subject: [PATCH 033/460] fix: Check if css file exists
---
frappe/email/email_body.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/frappe/email/email_body.py b/frappe/email/email_body.py
index 7aa70830e7..3fb1dfa0da 100755
--- a/frappe/email/email_body.py
+++ b/frappe/email/email_body.py
@@ -297,8 +297,9 @@ def inline_style_in_html(html):
for app in apps:
path = 'assets/{0}/css/email.css'.format(app)
- if os.path.exists(os.path.abspath(path)):
- css_files.append(path)
+ css_files.append(path)
+
+ css_files = [css_file for css_file in css_files if os.path.exists(os.path.abspath(css_file))]
p = Premailer(html=html, external_styles=css_files, strip_important=False)
From da7b930e53de0ad4b9430c0b276a3eb76944a864 Mon Sep 17 00:00:00 2001
From: DANY ROBERT
Date: Tue, 2 Feb 2021 19:18:22 +0530
Subject: [PATCH 034/460] 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 035/460] 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 5efe3a3bae462387eef1e7f6feff06491c91ceba Mon Sep 17 00:00:00 2001
From: Faris Ansari
Date: Tue, 2 Feb 2021 20:31:22 +0530
Subject: [PATCH 036/460] fix(patch): Force reload Workspace doctypes
Reload after rename doc doesn't actually update the workspace doctypes.
Fixing by adding the force flag.
---
frappe/patches/v13_0/rename_desk_page_to_workspace.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/frappe/patches/v13_0/rename_desk_page_to_workspace.py b/frappe/patches/v13_0/rename_desk_page_to_workspace.py
index 1801c4cf61..6483fc380c 100644
--- a/frappe/patches/v13_0/rename_desk_page_to_workspace.py
+++ b/frappe/patches/v13_0/rename_desk_page_to_workspace.py
@@ -15,7 +15,7 @@ def execute():
rename_doc('DocType', 'Desk Shortcut', 'Workspace Shortcut', ignore_if_exists=True)
rename_doc('DocType', 'Desk Link', 'Workspace Link', ignore_if_exists=True)
- frappe.reload_doc('desk', 'doctype', 'workspace')
- frappe.reload_doc('desk', 'doctype', 'workspace_link')
- frappe.reload_doc('desk', 'doctype', 'workspace_chart')
- frappe.reload_doc('desk', 'doctype', 'workspace_shortcut')
+ frappe.reload_doc('desk', 'doctype', 'workspace', force=True)
+ frappe.reload_doc('desk', 'doctype', 'workspace_link', force=True)
+ frappe.reload_doc('desk', 'doctype', 'workspace_chart', force=True)
+ frappe.reload_doc('desk', 'doctype', 'workspace_shortcut', force=True)
From de0f7fd9d9c4fc129ff916f27db9ae3bb6bd0c68 Mon Sep 17 00:00:00 2001
From: Ankush Menat
Date: Tue, 2 Feb 2021 19:28:31 +0530
Subject: [PATCH 037/460] docs: update docstring of top level module
---
frappe/__init__.py | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/frappe/__init__.py b/frappe/__init__.py
index 95d9c782a4..9b3ffc4662 100644
--- a/frappe/__init__.py
+++ b/frappe/__init__.py
@@ -1,8 +1,14 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
"""
-globals attached to frappe module
-+ some utility functions that should probably be moved
+Frappe - Low Code Open Source Framework in Python and JS
+
+Frappe, pronounced fra-pay, is a full stack, batteries-included, web
+framework written in Python and Javascript with MariaDB as the database.
+It is the framework which powers ERPNext. It is pretty generic and can
+be used to build database driven apps.
+
+Read the documentation: https://frappeframework.com/docs
"""
from __future__ import unicode_literals, print_function
From b440f1eb37002829f1b64f984c7c7030d626cfd2 Mon Sep 17 00:00:00 2001
From: Anupam
Date: Wed, 3 Feb 2021 14:45:44 +0530
Subject: [PATCH 038/460] fix: variable scope issue
---
frappe/public/js/frappe/utils/common.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/frappe/public/js/frappe/utils/common.js b/frappe/public/js/frappe/utils/common.js
index 113ba3ee60..cd3f35d830 100644
--- a/frappe/public/js/frappe/utils/common.js
+++ b/frappe/public/js/frappe/utils/common.js
@@ -191,9 +191,9 @@ window.strip = function (s, chars) {
window.lstrip = function lstrip(s, chars) {
if (!chars) chars = ['\n', '\t', ' '];
// strip left
- var first_char = s.substr(0, 1);
+ let first_char = s.substr(0, 1);
while (in_list(chars, first_char)) {
- var s = s.substr(1);
+ s = s.substr(1);
first_char = s.substr(0, 1);
}
return s;
@@ -201,9 +201,9 @@ window.lstrip = function lstrip(s, chars) {
window.rstrip = function (s, chars) {
if (!chars) chars = ['\n', '\t', ' '];
- var last_char = s.substr(s.length - 1);
+ let last_char = s.substr(s.length - 1);
while (in_list(chars, last_char)) {
- let s = s.substr(0, s.length - 1);
+ s = s.substr(0, s.length - 1);
last_char = s.substr(s.length - 1);
}
return s;
From d64c555515a725cefb4c969887d4444ed429eed2 Mon Sep 17 00:00:00 2001
From: DANY ROBERT
Date: Wed, 3 Feb 2021 15:01:33 +0530
Subject: [PATCH 039/460] 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 e439c02561ab0fe073bd1587fb01fc88a6af22df Mon Sep 17 00:00:00 2001
From: Rohan Bansal
Date: Wed, 3 Feb 2021 15:22:47 +0530
Subject: [PATCH 040/460] fix: move button to top of the page
---
.../page/background_jobs/background_jobs.js | 18 ++++++++++--------
.../page/background_jobs/background_jobs.py | 6 ++++--
2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/frappe/core/page/background_jobs/background_jobs.js b/frappe/core/page/background_jobs/background_jobs.js
index bcd938459d..920ee2155e 100644
--- a/frappe/core/page/background_jobs/background_jobs.js
+++ b/frappe/core/page/background_jobs/background_jobs.js
@@ -28,6 +28,16 @@ class BackgroundJobs {
}
});
+ // add a "Remove Failed Jobs button"
+ this.remove_failed_button = this.page.add_inner_button(__("Remove Failed Jobs"), () => {
+ frappe.call({
+ method: 'frappe.core.page.background_jobs.background_jobs.remove_failed_jobs',
+ callback: res => {
+ this.refresh_jobs();
+ }
+ })
+ });
+
$(frappe.render_template('background_jobs_outer')).appendTo(this.page.body);
this.content = $(this.page.body).find('.table-area');
}
@@ -56,14 +66,6 @@ class BackgroundJobs {
this.page.body.find('.list-jobs').remove();
$(frappe.render_template('background_jobs', { jobs: res.message || [] })).appendTo(this.content);
- // add a "Remove Failed Jobs button"
- let $remove_failed_btn = this.body.find('.remove-failed');
- if (res.message && res.message.length > 0) {
- $remove_failed_btn.show();
- } else {
- $remove_failed_btn.hide();
- }
-
if (frappe.get_route()[0] === 'background_jobs') {
setTimeout(() => this.refresh_jobs(), 2000);
}
diff --git a/frappe/core/page/background_jobs/background_jobs.py b/frappe/core/page/background_jobs/background_jobs.py
index baad40009b..92cc995eb4 100644
--- a/frappe/core/page/background_jobs/background_jobs.py
+++ b/frappe/core/page/background_jobs/background_jobs.py
@@ -1,12 +1,14 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
+import json
from typing import TYPE_CHECKING, Dict, List
+
from rq import Queue, Worker
import frappe
from frappe import _
-from frappe.utils import cint, convert_utc_to_user_timezone, format_datetime
+from frappe.utils import convert_utc_to_user_timezone, format_datetime
from frappe.utils.background_jobs import get_redis_conn
from frappe.utils.scheduler import is_scheduler_inactive
@@ -58,7 +60,7 @@ def get_info(show_failed=False) -> List[Dict]:
add_job(job, queue.name)
# show failed jobs, if requested
- if cint(show_failed):
+ if json.loads(show_failed):
for queue in queues:
fail_registry = queue.failed_job_registry
for job_id in fail_registry.get_job_ids():
From be1c68c07dd9b592fe2cce2abaf33dbc3cd3687d Mon Sep 17 00:00:00 2001
From: Rohan Bansal
Date: Wed, 3 Feb 2021 15:32:37 +0530
Subject: [PATCH 041/460] fix: sider
---
frappe/core/page/background_jobs/background_jobs.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/frappe/core/page/background_jobs/background_jobs.js b/frappe/core/page/background_jobs/background_jobs.js
index 920ee2155e..0b4d6792dc 100644
--- a/frappe/core/page/background_jobs/background_jobs.js
+++ b/frappe/core/page/background_jobs/background_jobs.js
@@ -32,10 +32,10 @@ class BackgroundJobs {
this.remove_failed_button = this.page.add_inner_button(__("Remove Failed Jobs"), () => {
frappe.call({
method: 'frappe.core.page.background_jobs.background_jobs.remove_failed_jobs',
- callback: res => {
+ callback: () => {
this.refresh_jobs();
}
- })
+ });
});
$(frappe.render_template('background_jobs_outer')).appendTo(this.page.body);
From 4e55c6c50b7d4a6983c96b7ce1861b66e6e52c1c Mon Sep 17 00:00:00 2001
From: prssanna
Date: Wed, 3 Feb 2021 15:49:43 +0530
Subject: [PATCH 042/460] 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 043/460] 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 044/460] 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 045/460] 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 046/460] 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 047/460] 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 70d663abf78125146bdd57ea52395b0d6350a280 Mon Sep 17 00:00:00 2001
From: "hasnain2808@gmail.com"
Date: Thu, 4 Feb 2021 10:33:30 +0530
Subject: [PATCH 048/460] fix: if incoming disabled it cannot be default
---
frappe/email/doctype/email_account/email_account.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py
index ca4dbb83e2..4f40a91a46 100755
--- a/frappe/email/doctype/email_account/email_account.py
+++ b/frappe/email/doctype/email_account/email_account.py
@@ -90,6 +90,12 @@ class EmailAccount(Document):
if self.append_to not in valid_doctypes:
frappe.throw(_("Append To can be one of {0}").format(comma_or(valid_doctypes)))
+ def before_save(self):
+ if not self.enable_incoming:
+ self.default_incoming = False
+ if not self.enable_outgoing:
+ self.default_outgoing = False
+
def on_update(self):
"""Check there is only one default of each type."""
from frappe.core.doctype.user.user import setup_user_email_inbox
From 83a8c8f7b550c42f6a942989dff80103928fe65e Mon Sep 17 00:00:00 2001
From: "hasnain2808@gmail.com"
Date: Thu, 4 Feb 2021 10:38:01 +0530
Subject: [PATCH 049/460] chore(Assignment Rule): fix translation
---
frappe/automation/doctype/assignment_rule/assignment_rule.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/frappe/automation/doctype/assignment_rule/assignment_rule.py b/frappe/automation/doctype/assignment_rule/assignment_rule.py
index d20398d564..fe9eae9f1a 100644
--- a/frappe/automation/doctype/assignment_rule/assignment_rule.py
+++ b/frappe/automation/doctype/assignment_rule/assignment_rule.py
@@ -18,6 +18,8 @@ class AssignmentRule(Document):
if not len(set(assignment_days)) == len(assignment_days):
repeated_days = get_repeated(assignment_days)
frappe.throw(_("Assignment Day {0} has been repeated.").format(frappe.bold(repeated_days)))
+ if self.document_type == 'ToDo':
+ frappe.throw('Assignment Rule Not Allowed on Document Type "ToDo"')
def on_update(self):
clear_assignment_rule_cache(self)
From 215cdc4422111c6344ff91085eaa9e4e8113113c Mon Sep 17 00:00:00 2001
From: Anuja P
Date: Thu, 4 Feb 2021 10:47:16 +0530
Subject: [PATCH 050/460] 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 79cb3f0596f263c989667864ee905a8df1d8bd9e Mon Sep 17 00:00:00 2001
From: Gavin D'souza
Date: Thu, 4 Feb 2021 14:06:09 +0530
Subject: [PATCH 051/460] feat: Rename "Custom Script" to "Client Script"
* Remove postfix "-Client" from ClientScript.autoname
---
frappe/core/doctype/doctype/doctype.json | 2 +-
frappe/core/workspace/build/build.json | 7 ++---
.../README.md | 0
.../__init__.py | 0
.../client_script.js} | 2 +-
.../client_script.json} | 23 ++++++----------
.../client_script.py} | 4 +--
.../test_client_script.py} | 4 +--
.../customization/customization.json | 17 ++++++++----
frappe/desk/form/meta.py | 2 +-
frappe/desk/form/utils.py | 2 +-
frappe/model/__init__.py | 2 +-
frappe/model/delete_doc.py | 2 +-
.../public/js/frappe/form/script_manager.js | 2 +-
frappe/public/js/frappe/model/model.js | 2 +-
frappe/tests/test_exporter_fixtures.py | 26 +++++++++----------
frappe/utils/fixtures.py | 6 ++---
17 files changed, 52 insertions(+), 51 deletions(-)
rename frappe/custom/doctype/{custom_script => client_script}/README.md (100%)
rename frappe/custom/doctype/{custom_script => client_script}/__init__.py (100%)
rename frappe/custom/doctype/{custom_script/custom_script.js => client_script/client_script.js} (97%)
rename frappe/custom/doctype/{custom_script/custom_script.json => client_script/client_script.json} (86%)
rename frappe/custom/doctype/{custom_script/custom_script.py => client_script/client_script.py} (84%)
rename frappe/custom/doctype/{custom_script/test_custom_script.py => client_script/test_client_script.py} (65%)
diff --git a/frappe/core/doctype/doctype/doctype.json b/frappe/core/doctype/doctype/doctype.json
index 569414e98b..3ccd1e7e09 100644
--- a/frappe/core/doctype/doctype/doctype.json
+++ b/frappe/core/doctype/doctype/doctype.json
@@ -555,7 +555,7 @@
},
{
"group": "Customization",
- "link_doctype": "Custom Script",
+ "link_doctype": "Client Script",
"link_fieldname": "dt"
},
{
diff --git a/frappe/core/workspace/build/build.json b/frappe/core/workspace/build/build.json
index c4bde55d7f..aefda698b1 100644
--- a/frappe/core/workspace/build/build.json
+++ b/frappe/core/workspace/build/build.json
@@ -11,6 +11,7 @@
"hide_custom": 0,
"icon": "tool",
"idx": 0,
+ "is_default": 0,
"is_standard": 1,
"label": "Build",
"links": [
@@ -163,8 +164,8 @@
{
"hidden": 0,
"is_query_report": 0,
- "label": "Custom Script",
- "link_to": "Custom Script",
+ "label": "Client Script",
+ "link_to": "Client Script",
"link_type": "DocType",
"onboard": 0,
"only_for": "",
@@ -181,7 +182,7 @@
"type": "Link"
}
],
- "modified": "2021-01-02 14:03:15.029699",
+ "modified": "2021-02-04 13:48:48.493146",
"modified_by": "Administrator",
"module": "Core",
"name": "Build",
diff --git a/frappe/custom/doctype/custom_script/README.md b/frappe/custom/doctype/client_script/README.md
similarity index 100%
rename from frappe/custom/doctype/custom_script/README.md
rename to frappe/custom/doctype/client_script/README.md
diff --git a/frappe/custom/doctype/custom_script/__init__.py b/frappe/custom/doctype/client_script/__init__.py
similarity index 100%
rename from frappe/custom/doctype/custom_script/__init__.py
rename to frappe/custom/doctype/client_script/__init__.py
diff --git a/frappe/custom/doctype/custom_script/custom_script.js b/frappe/custom/doctype/client_script/client_script.js
similarity index 97%
rename from frappe/custom/doctype/custom_script/custom_script.js
rename to frappe/custom/doctype/client_script/client_script.js
index 711e7d1796..21e7334b82 100644
--- a/frappe/custom/doctype/custom_script/custom_script.js
+++ b/frappe/custom/doctype/client_script/client_script.js
@@ -1,7 +1,7 @@
// Copyright (c) 2016, Frappe Technologies and contributors
// For license information, please see license.txt
-frappe.ui.form.on('Custom Script', {
+frappe.ui.form.on('Client Script', {
refresh(frm) {
if (frm.doc.dt && frm.doc.script) {
frm.add_custom_button(__('Go to {0}', [frm.doc.dt]),
diff --git a/frappe/custom/doctype/custom_script/custom_script.json b/frappe/custom/doctype/client_script/client_script.json
similarity index 86%
rename from frappe/custom/doctype/custom_script/custom_script.json
rename to frappe/custom/doctype/client_script/client_script.json
index 328b247c49..57e6c68094 100644
--- a/frappe/custom/doctype/custom_script/custom_script.json
+++ b/frappe/custom/doctype/client_script/client_script.json
@@ -2,7 +2,7 @@
"actions": [],
"allow_import": 1,
"creation": "2013-01-10 16:34:01",
- "description": "Adds a client custom script to a DocType",
+ "description": "Adds a custom client script to a DocType",
"doctype": "DocType",
"document_type": "Document",
"engine": "InnoDB",
@@ -22,9 +22,7 @@
"oldfieldname": "dt",
"oldfieldtype": "Link",
"options": "DocType",
- "reqd": 1,
- "show_days": 1,
- "show_seconds": 1
+ "reqd": 1
},
{
"fieldname": "script",
@@ -32,35 +30,29 @@
"label": "Script",
"oldfieldname": "script",
"oldfieldtype": "Code",
- "options": "JS",
- "show_days": 1,
- "show_seconds": 1
+ "options": "JS"
},
{
"fieldname": "sample",
"fieldtype": "HTML",
"label": "Sample",
- "options": "
Custom Script Help
\n
Custom Scripts are executed only on the client-side (i.e. in Forms). Here are some examples to get you started
\n
\n\n// fetch local_tax_no on selection of customer \n// cur_frm.add_fetch(link_field, source_fieldname, target_fieldname); \ncur_frm.add_fetch('customer', 'local_tax_no', 'local_tax_no');\n\n// additional validation on dates \nfrappe.ui.form.on('Task', 'validate', function(frm) {\n if (frm.doc.from_date < get_today()) {\n msgprint('You can not select past date in From Date');\n validated = false;\n } \n});\n\n// make a field read-only after saving \nfrappe.ui.form.on('Task', {\n refresh: function(frm) {\n // use the __islocal value of doc, to check if the doc is saved or not\n frm.set_df_property('myfield', 'read_only', frm.doc.__islocal ? 0 : 1);\n } \n});\n\n// additional permission check\nfrappe.ui.form.on('Task', {\n validate: function(frm) {\n if(user=='user1@example.com' && frm.doc.purpose!='Material Receipt') {\n msgprint('You are only allowed Material Receipt');\n validated = false;\n }\n } \n});\n\n// calculate sales incentive\nfrappe.ui.form.on('Sales Invoice', {\n validate: function(frm) {\n // calculate incentives for each person on the deal\n total_incentive = 0\n $.each(frm.doc.sales_team, function(i, d) {\n // calculate incentive\n var incentive_percent = 2;\n if(frm.doc.base_grand_total > 400) incentive_percent = 4;\n // actual incentive\n d.incentives = flt(frm.doc.base_grand_total) * incentive_percent / 100;\n total_incentive += flt(d.incentives)\n });\n frm.doc.total_incentive = total_incentive;\n } \n})\n\n
Client Scripts are executed only on the client-side (i.e. in Forms). Here are some examples to get you started
\n
\n\n// fetch local_tax_no on selection of customer \n// cur_frm.add_fetch(link_field, source_fieldname, target_fieldname); \ncur_frm.add_fetch('customer', 'local_tax_no', 'local_tax_no');\n\n// additional validation on dates \nfrappe.ui.form.on('Task', 'validate', function(frm) {\n if (frm.doc.from_date < get_today()) {\n msgprint('You can not select past date in From Date');\n validated = false;\n } \n});\n\n// make a field read-only after saving \nfrappe.ui.form.on('Task', {\n refresh: function(frm) {\n // use the __islocal value of doc, to check if the doc is saved or not\n frm.set_df_property('myfield', 'read_only', frm.doc.__islocal ? 0 : 1);\n } \n});\n\n// additional permission check\nfrappe.ui.form.on('Task', {\n validate: function(frm) {\n if(user=='user1@example.com' && frm.doc.purpose!='Material Receipt') {\n msgprint('You are only allowed Material Receipt');\n validated = false;\n }\n } \n});\n\n// calculate sales incentive\nfrappe.ui.form.on('Sales Invoice', {\n validate: function(frm) {\n // calculate incentives for each person on the deal\n total_incentive = 0\n $.each(frm.doc.sales_team, function(i, d) {\n // calculate incentive\n var incentive_percent = 2;\n if(frm.doc.base_grand_total > 400) incentive_percent = 4;\n // actual incentive\n d.incentives = flt(frm.doc.base_grand_total) * incentive_percent / 100;\n total_incentive += flt(d.incentives)\n });\n frm.doc.total_incentive = total_incentive;\n } \n})\n\n