+ - Create a Package by selecting the Documents and filters in the Package table.
+ - Add the Remote Instance's URL, Username and Password to the Instances table.
+ - Once the above details are filled, Deploy button will be visible and the Package will be deployed on click.
+
+ `);
}
});
@@ -115,4 +146,4 @@ frappe.ui.form.on('Package Detail', {
});
});
},
-});
+});
\ No newline at end of file
diff --git a/frappe/custom/doctype/package/package.json b/frappe/custom/doctype/package_publish_tool/package_publish_tool.json
similarity index 62%
rename from frappe/custom/doctype/package/package.json
rename to frappe/custom/doctype/package_publish_tool/package_publish_tool.json
index 2bec7f9b79..cdb6f0ce84 100644
--- a/frappe/custom/doctype/package/package.json
+++ b/frappe/custom/doctype/package_publish_tool/package_publish_tool.json
@@ -1,59 +1,57 @@
{
"actions": [],
- "creation": "2020-03-14 11:20:14.850552",
+ "creation": "2020-05-13 15:54:38.082657",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
+ "html_info",
+ "sb_00",
"package_details",
- "section_break_2",
+ "sb_01",
"instances",
- "import_section",
- "attach",
- "import"
+ "last_deployed_on"
],
"fields": [
- {
- "collapsible": 1,
- "collapsible_depends_on": "attach",
- "fieldname": "import_section",
- "fieldtype": "Section Break",
- "label": "Import Package"
- },
- {
- "fieldname": "import",
- "fieldtype": "Button",
- "label": "Import"
- },
- {
- "fieldname": "attach",
- "fieldtype": "Attach",
- "label": "Attach Package"
- },
{
"description": "Click on the row for accessing filters.",
"fieldname": "package_details",
"fieldtype": "Table",
- "label": "Package Details",
+ "label": "Package",
"options": "Package Detail"
},
- {
- "fieldname": "section_break_2",
- "fieldtype": "Section Break"
- },
{
"fieldname": "instances",
"fieldtype": "Table",
"label": "Instances",
- "options": "Deploy Instance"
+ "options": "Package Publish Target"
+ },
+ {
+ "fieldname": "html_info",
+ "fieldtype": "HTML"
+ },
+ {
+ "fieldname": "last_deployed_on",
+ "fieldtype": "Datetime",
+ "hidden": 1,
+ "label": "Last Deployed On",
+ "read_only": 1
+ },
+ {
+ "fieldname": "sb_00",
+ "fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "sb_01",
+ "fieldtype": "Section Break"
}
],
"issingle": 1,
"links": [],
- "modified": "2020-04-14 13:50:50.779396",
+ "modified": "2020-05-14 15:09:38.092918",
"modified_by": "Administrator",
"module": "Custom",
- "name": "Package",
+ "name": "Package Publish Tool",
"owner": "Administrator",
"permissions": [
{
diff --git a/frappe/custom/doctype/package/package.py b/frappe/custom/doctype/package_publish_tool/package_publish_tool.py
similarity index 68%
rename from frappe/custom/doctype/package/package.py
rename to frappe/custom/doctype/package_publish_tool/package_publish_tool.py
index b4427d55bc..f4d71a9fd9 100644
--- a/frappe/custom/doctype/package/package.py
+++ b/frappe/custom/doctype/package_publish_tool/package_publish_tool.py
@@ -15,57 +15,46 @@ from frappe.frappeclient import FrappeClient
from frappe.model.naming import make_autoname
from frappe.utils.password import get_decrypted_password
-class Package(Document):
- def import_from_package(self):
- filters = {"attached_to_doctype": "Package", "attached_to_name": "Package"}
- files = frappe.get_list("File", filters=filters, limit=1, order_by="creation desc")
- if not files:
- frappe.msgprint(_("No file attach for Importing."))
- return
+class PackagePublishTool(Document):
+ pass
- for f in files:
- fname, fcontents = get_file(f.name)
- import_package(fcontents)
+@frappe.whitelist()
+def deploy_package():
+ package, doc = export_package()
- frappe.msgprint(_("Package Imported."))
+ file_name = make_autoname("Package.####")
+ save_file(file_name, json.dumps(package), "Package Publish Tool", "Package Publish Tool")
- def deploy_package(self):
- package = export_package()
+ length = len(doc.instances)
+ for idx, instance in enumerate(doc.instances):
+ frappe.publish_realtime("package", {"progress": idx, "total": length, "message": instance.instance_url, "prefix": _("Deploying")},
+ user=frappe.session.user)
- for dt_file in frappe.get_list("File", filters={"attached_to_doctype": "Release", "attached_to_name": "Release"}):
- frappe.delete_doc_if_exists("File", dt_file.name)
+ install_package_to_remote(package, instance)
- file_name = make_autoname("Package")
- save_file(file_name, json.dumps(package), "Package", "Package")
+ frappe.db.set_value("Package Publish Tool", "Package Publish Tool", "last_deployed_on", frappe.utils.now_datetime())
- length = len(self.instances)
- for idx, instance in enumerate(self.instances):
- frappe.publish_realtime("package", {"progress": idx, "total": length, "message": instance.instance_url, "prefix": _("Deploying")},
- user=frappe.session.user)
+def install_package_to_remote(package, instance):
+ return
+ try:
+ connection = FrappeClient(instance.instance_url, instance.username, get_decrypted_password(instance.doctype, instance.name))
+ except Exception:
+ frappe.log_error(frappe.get_traceback())
+ frappe.throw(_("Couldn't connect to site {0}. Please check Error Logs.").format(instance.instance_url))
- self.install_package_to_remote(package, instance)
-
- def install_package_to_remote(self, package, instance):
- print((instance.doctype, instance.name))
- try:
- connection = FrappeClient(instance.instance_url, instance.username, get_decrypted_password(instance.doctype, instance.name))
- except Exception:
- frappe.log_error(frappe.get_traceback())
- frappe.throw(_("Couldn't connect to site {0}. Please check Error Logs.").format(instance.instance_url))
-
- try:
- connection.post_request({
- "cmd": "frappe.custom.doctype.package.package.import_package",
- "package": json.dumps(package)
- })
- except Exception:
- frappe.log_error(frappe.get_traceback())
- frappe.throw(_("Error while installing package to site {0}. Please check Error Logs.").format(instance.instance_url))
+ try:
+ connection.post_request({
+ "cmd": "frappe.custom.doctype.package_publish_tool.package_publish_tool.import_package",
+ "package": json.dumps(package)
+ })
+ except Exception:
+ frappe.log_error(frappe.get_traceback())
+ frappe.throw(_("Error while installing package to site {0}. Please check Error Logs.").format(instance.instance_url))
@frappe.whitelist()
def export_package():
"""Export package as JSON."""
- package_doc = frappe.get_single("Package")
+ package_doc = frappe.get_single("Package Publish Tool")
package = []
for doctype in package_doc.package_details:
@@ -108,7 +97,7 @@ def export_package():
package.append(document)
- return post_process(package)
+ return post_process(package), package_doc
@frappe.whitelist()
def import_package(package=None):
diff --git a/frappe/custom/doctype/package/test_package.py b/frappe/custom/doctype/package_publish_tool/test_package_publish_tool.py
similarity index 78%
rename from frappe/custom/doctype/package/test_package.py
rename to frappe/custom/doctype/package_publish_tool/test_package_publish_tool.py
index 3a17d51260..8332240543 100644
--- a/frappe/custom/doctype/package/test_package.py
+++ b/frappe/custom/doctype/package_publish_tool/test_package_publish_tool.py
@@ -6,5 +6,5 @@ from __future__ import unicode_literals
# import frappe
import unittest
-class TestPackage(unittest.TestCase):
+class TestPackagePublishTool(unittest.TestCase):
pass
diff --git a/frappe/public/js/frappe/utils/pretty_date.js b/frappe/public/js/frappe/utils/pretty_date.js
index ef235ed3b1..7618d58829 100644
--- a/frappe/public/js/frappe/utils/pretty_date.js
+++ b/frappe/public/js/frappe/utils/pretty_date.js
@@ -76,6 +76,7 @@ window.comment_when = function(datetime, mini) {
+ prettyDate(datetime, mini) + '';
};
frappe.datetime.comment_when = comment_when;
+frappe.datetime.prettyDate = prettyDate;
frappe.datetime.refresh_when = function() {
if (jQuery) {
From 94b6fa4319a0bff37428f7875e8843a06bc1607e Mon Sep 17 00:00:00 2001
From: Saqib Ansari
Date: Thu, 14 May 2020 15:27:17 +0530
Subject: [PATCH 142/274] fix: report filters in dialog
---
frappe/public/js/frappe/views/reports/query_report.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js
index 5105494862..e79e43ae02 100644
--- a/frappe/public/js/frappe/views/reports/query_report.js
+++ b/frappe/public/js/frappe/views/reports/query_report.js
@@ -330,8 +330,8 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
evaluate_depends_on_value(expression, filter_label) {
let out = null;
- let filters = this.get_filter_values();
- if (filters) {
+ let doc = this.get_filter_values();
+ if (doc) {
if (typeof expression === 'boolean') {
out = expression;
} else if (expression.substr(0, 5) == 'eval:') {
@@ -341,7 +341,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList {
frappe.throw(__(`Invalid "depends_on" expression set in filter ${filter_label}`));
}
} else {
- var value = filters[expression];
+ var value = doc[expression];
if ($.isArray(value)) {
out = !!value.length;
} else {
From e5d5d0b6bb6c74007da312fb647d9a16b3f2e61d Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 14 May 2020 16:07:57 +0530
Subject: [PATCH 143/274] feat: allow linking dashboard in desk page
---
frappe/desk/desktop.py | 2 ++
frappe/desk/doctype/desk_shortcut/desk_shortcut.json | 4 ++--
frappe/public/js/frappe/widgets/utils.js | 2 ++
frappe/public/js/frappe/widgets/widget_dialog.js | 2 +-
4 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py
index ddcfb670d4..e2fe020eca 100644
--- a/frappe/desk/desktop.py
+++ b/frappe/desk/desktop.py
@@ -127,6 +127,8 @@ class Workspace:
return name in self.allowed_reports
if item_type == "help":
return True
+ if item_type == "dashboard":
+ return True
return False
diff --git a/frappe/desk/doctype/desk_shortcut/desk_shortcut.json b/frappe/desk/doctype/desk_shortcut/desk_shortcut.json
index 550ea609c8..f3fd546a77 100644
--- a/frappe/desk/doctype/desk_shortcut/desk_shortcut.json
+++ b/frappe/desk/doctype/desk_shortcut/desk_shortcut.json
@@ -23,7 +23,7 @@
"fieldtype": "Select",
"in_list_view": 1,
"label": "Type",
- "options": "DocType\nReport\nPage",
+ "options": "DocType\nReport\nPage\nDashboard",
"reqd": 1
},
{
@@ -88,7 +88,7 @@
],
"istable": 1,
"links": [],
- "modified": "2020-05-13 19:26:34.229669",
+ "modified": "2020-05-14 16:02:15.420993",
"modified_by": "Administrator",
"module": "Desk",
"name": "Desk Shortcut",
diff --git a/frappe/public/js/frappe/widgets/utils.js b/frappe/public/js/frappe/widgets/utils.js
index 0d93bb3784..f336335d1c 100644
--- a/frappe/public/js/frappe/widgets/utils.js
+++ b/frappe/public/js/frappe/widgets/utils.js
@@ -24,6 +24,8 @@ function generate_route(item) {
route = "List/" + item.doctype + "/Report/" + item.name;
} else if (type === "page") {
route = item.name;
+ } else if (type === "dashboard") {
+ route = "dashboard/" + item.name;
}
route = "#" + route;
diff --git a/frappe/public/js/frappe/widgets/widget_dialog.js b/frappe/public/js/frappe/widgets/widget_dialog.js
index 31215a40c3..5c44533b37 100644
--- a/frappe/public/js/frappe/widgets/widget_dialog.js
+++ b/frappe/public/js/frappe/widgets/widget_dialog.js
@@ -145,7 +145,7 @@ class ShortcutDialog extends WidgetDialog {
fieldname: "type",
label: "Type",
reqd: 1,
- options: "DocType\nReport\nPage",
+ options: "DocType\nReport\nPage\nDashboard",
onchange: () => {
if (this.dialog.get_value("type") == "DocType") {
this.dialog.fields_dict.link_to.get_query = () => {
From b55d168f2ab7b0564c531048a83fa38950d7ecd0 Mon Sep 17 00:00:00 2001
From: Himanshu Warekar
Date: Thu, 14 May 2020 16:10:58 +0530
Subject: [PATCH 144/274] fix: show alert while deploying
---
.../doctype/package_publish_tool/package_publish_tool.js | 5 +++++
.../package_publish_tool/package_publish_tool.json | 8 +++++---
.../doctype/package_publish_tool/package_publish_tool.py | 1 -
3 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/frappe/custom/doctype/package_publish_tool/package_publish_tool.js b/frappe/custom/doctype/package_publish_tool/package_publish_tool.js
index 3d84a50820..7822299f21 100644
--- a/frappe/custom/doctype/package_publish_tool/package_publish_tool.js
+++ b/frappe/custom/doctype/package_publish_tool/package_publish_tool.js
@@ -42,6 +42,11 @@ frappe.ui.form.on('Package Publish Tool', {
set_deploy_primary_action: function(frm) {
if (frm.doc.package_details.length && frm.doc.instances.length){
frm.page.set_primary_action(__("Deploy"), function () {
+ frappe.show_alert({
+ message: __("Deploying Package"),
+ indicator: "green"
+ });
+
frappe.call({
method: "frappe.custom.doctype.package_publish_tool.package_publish_tool.deploy_package",
callback: function(r) {
diff --git a/frappe/custom/doctype/package_publish_tool/package_publish_tool.json b/frappe/custom/doctype/package_publish_tool/package_publish_tool.json
index cdb6f0ce84..9b1db2c2ff 100644
--- a/frappe/custom/doctype/package_publish_tool/package_publish_tool.json
+++ b/frappe/custom/doctype/package_publish_tool/package_publish_tool.json
@@ -18,13 +18,15 @@
"fieldname": "package_details",
"fieldtype": "Table",
"label": "Package",
- "options": "Package Detail"
+ "options": "Package Detail",
+ "reqd": 1
},
{
"fieldname": "instances",
"fieldtype": "Table",
"label": "Instances",
- "options": "Package Publish Target"
+ "options": "Package Publish Target",
+ "reqd": 1
},
{
"fieldname": "html_info",
@@ -48,7 +50,7 @@
],
"issingle": 1,
"links": [],
- "modified": "2020-05-14 15:09:38.092918",
+ "modified": "2020-05-14 16:06:19.714596",
"modified_by": "Administrator",
"module": "Custom",
"name": "Package Publish Tool",
diff --git a/frappe/custom/doctype/package_publish_tool/package_publish_tool.py b/frappe/custom/doctype/package_publish_tool/package_publish_tool.py
index f4d71a9fd9..09549107be 100644
--- a/frappe/custom/doctype/package_publish_tool/package_publish_tool.py
+++ b/frappe/custom/doctype/package_publish_tool/package_publish_tool.py
@@ -35,7 +35,6 @@ def deploy_package():
frappe.db.set_value("Package Publish Tool", "Package Publish Tool", "last_deployed_on", frappe.utils.now_datetime())
def install_package_to_remote(package, instance):
- return
try:
connection = FrappeClient(instance.instance_url, instance.username, get_decrypted_password(instance.doctype, instance.name))
except Exception:
From c14b6c592a1eacd4158801ad9865dd7ed00c9a87 Mon Sep 17 00:00:00 2001
From: Himanshu Warekar
Date: Thu, 14 May 2020 16:27:34 +0530
Subject: [PATCH 145/274] fix: move code to meta.py
---
.../custom/doctype/custom_link/custom_link.js | 4 +++
.../custom/doctype/custom_link/custom_link.py | 33 ------------------
frappe/model/meta.py | 34 ++++++++++++++++++-
3 files changed, 37 insertions(+), 34 deletions(-)
diff --git a/frappe/custom/doctype/custom_link/custom_link.js b/frappe/custom/doctype/custom_link/custom_link.js
index f1c06daeeb..9540ec5662 100644
--- a/frappe/custom/doctype/custom_link/custom_link.js
+++ b/frappe/custom/doctype/custom_link/custom_link.js
@@ -12,5 +12,9 @@ frappe.ui.form.on('Custom Link', {
}
}
});
+
+ frm.add_custom_button(__('Go to {0} List', [frm.doc.document_type]), function() {
+ frappe.set_route('List', frm.doc.document_type);
+ });
}
});
diff --git a/frappe/custom/doctype/custom_link/custom_link.py b/frappe/custom/doctype/custom_link/custom_link.py
index b9a88b58f2..be57d256f2 100644
--- a/frappe/custom/doctype/custom_link/custom_link.py
+++ b/frappe/custom/doctype/custom_link/custom_link.py
@@ -8,36 +8,3 @@ from frappe.model.document import Document
class CustomLink(Document):
pass
-
-def get_custom_doctype_links(doctype, data):
- if frappe.get_all("Custom Link", {"document_type": doctype}):
- doc = frappe.get_doc("Custom Link", doctype)
-
- if not data.transactions:
- # init groups
- data.transactions = []
- data.non_standard_fieldnames = {}
-
- for link in doc.links:
- link.added = False
- for group in data.transactions:
- # group found
- if group.get("label") == link.group:
- if not link.link_doctype in group.get("items"):
- group.get("items").append(link.link_doctype)
- link.added = True
-
- if not link.added:
- # group not found, make a new group
- data.transactions.append({
- "label": link.group,
- "items": [link.link_doctype]
- })
-
- if link.link_fieldname != data.fieldname:
- if data.fieldname:
- data.non_standard_fieldnames[link.link_doctype] = link.link_fieldname
- else:
- data.fieldname = link.link_fieldname
-
- return data
\ No newline at end of file
diff --git a/frappe/model/meta.py b/frappe/model/meta.py
index 156fe2dba3..717070a217 100644
--- a/frappe/model/meta.py
+++ b/frappe/model/meta.py
@@ -26,7 +26,6 @@ from frappe.model.base_document import BaseDocument
from frappe.modules import load_doctype_module
from frappe.model.workflow import get_workflow_name
from frappe import _
-from frappe.custom.doctype.custom_link.custom_link import get_custom_doctype_links
def get_meta(doctype, cached=True):
if cached:
@@ -609,3 +608,36 @@ def trim_tables(doctype=None):
query = """alter table `tab{doctype}` {columns}""".format(
doctype=doctype, columns=columns_to_remove)
frappe.db.sql_ddl(query)
+
+def get_custom_doctype_links(doctype, data):
+ if frappe.get_all("Custom Link", {"document_type": doctype}):
+ doc = frappe.get_doc("Custom Link", doctype)
+
+ if not data.transactions:
+ # init groups
+ data.transactions = []
+ data.non_standard_fieldnames = {}
+
+ for link in doc.links:
+ link.added = False
+ for group in data.transactions:
+ # group found
+ if group.get("label") == link.group:
+ if not link.link_doctype in group.get("items"):
+ group.get("items").append(link.link_doctype)
+ link.added = True
+
+ if not link.added:
+ # group not found, make a new group
+ data.transactions.append({
+ "label": link.group,
+ "items": [link.link_doctype]
+ })
+
+ if link.link_fieldname != data.fieldname:
+ if data.fieldname:
+ data.non_standard_fieldnames[link.link_doctype] = link.link_fieldname
+ else:
+ data.fieldname = link.link_fieldname
+
+ return data
\ No newline at end of file
From aa98d6ffb6f32af4f9a15701350b05fce104967c Mon Sep 17 00:00:00 2001
From: Himanshu Warekar
Date: Thu, 14 May 2020 16:37:14 +0530
Subject: [PATCH 146/274] fix: sider changes
---
frappe/custom/doctype/custom_link/custom_link.js | 2 +-
frappe/custom/doctype/custom_link/custom_link.py | 2 +-
frappe/model/meta.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/frappe/custom/doctype/custom_link/custom_link.js b/frappe/custom/doctype/custom_link/custom_link.js
index 9540ec5662..8662724b1a 100644
--- a/frappe/custom/doctype/custom_link/custom_link.js
+++ b/frappe/custom/doctype/custom_link/custom_link.js
@@ -10,7 +10,7 @@ frappe.ui.form.on('Custom Link', {
istable: 0,
module: ['not in', ["Email", "Core", "Custom", "Event Streaming", "Social", "Data Migration", "Geo", "Desk"]]
}
- }
+ };
});
frm.add_custom_button(__('Go to {0} List', [frm.doc.document_type]), function() {
diff --git a/frappe/custom/doctype/custom_link/custom_link.py b/frappe/custom/doctype/custom_link/custom_link.py
index be57d256f2..11316d5751 100644
--- a/frappe/custom/doctype/custom_link/custom_link.py
+++ b/frappe/custom/doctype/custom_link/custom_link.py
@@ -3,7 +3,7 @@
# For license information, please see license.txt
from __future__ import unicode_literals
-import frappe
+# import frappe
from frappe.model.document import Document
class CustomLink(Document):
diff --git a/frappe/model/meta.py b/frappe/model/meta.py
index 717070a217..a9ae19af6d 100644
--- a/frappe/model/meta.py
+++ b/frappe/model/meta.py
@@ -623,7 +623,7 @@ def get_custom_doctype_links(doctype, data):
for group in data.transactions:
# group found
if group.get("label") == link.group:
- if not link.link_doctype in group.get("items"):
+ if link.link_doctype not in group.get("items"):
group.get("items").append(link.link_doctype)
link.added = True
From 69afa4f10cabc89846fc321c96c9856c32132460 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 14 May 2020 16:57:35 +0530
Subject: [PATCH 147/274] feat: onboarding enhancements (#10356)
* feat: added go to path option in onboarding step
* feat: added show full form check and doctype cleanup
* feat: added show full form controller to onboarding widget
* feat: don't mark complete step on go to page
* feat: make callback message optional
* feat: mark go to page as non mandatory
* feat: use check for skipped step
* fix: spaces
* feat: set form as dirty on routing
* style: remove unused variable
---
.../onboarding_step/onboarding_step.json | 59 ++++++++++++++--
.../onboarding_step/onboarding_step.py | 4 ++
.../js/frappe/widgets/onboarding_widget.js | 68 ++++++++++++++++---
3 files changed, 116 insertions(+), 15 deletions(-)
diff --git a/frappe/desk/doctype/onboarding_step/onboarding_step.json b/frappe/desk/doctype/onboarding_step/onboarding_step.json
index 3bc9d5f286..37d1d63dbe 100644
--- a/frappe/desk/doctype/onboarding_step/onboarding_step.json
+++ b/frappe/desk/doctype/onboarding_step/onboarding_step.json
@@ -15,11 +15,16 @@
"action",
"column_break_7",
"reference_document",
+ "show_full_form",
"is_single",
"reference_report",
"report_reference_doctype",
"report_type",
"report_description",
+ "path",
+ "callback_title",
+ "callback_message",
+ "validate_action",
"field",
"value_to_validate",
"video_url"
@@ -58,7 +63,7 @@
"fieldname": "action",
"fieldtype": "Select",
"label": "Action",
- "options": "Create Entry\nUpdate Settings\nShow Form Tour\nView Report\nWatch Video",
+ "options": "Create Entry\nUpdate Settings\nShow Form Tour\nView Report\nGo to Page\nWatch Video",
"reqd": 1
},
{
@@ -70,6 +75,7 @@
"fieldname": "reference_document",
"fieldtype": "Link",
"label": "Reference Document",
+ "mandatory_depends_on": "eval:doc.action == \"Create Entry\" || doc.action == \"Update Settings\" || doc.action == \"Create Entry\" || doc.action == \"Show Form Tour\"",
"options": "DocType"
},
{
@@ -84,7 +90,8 @@
"depends_on": "eval:doc.action == \"Watch Video\"",
"fieldname": "video_url",
"fieldtype": "Data",
- "label": "Video URL"
+ "label": "Video URL",
+ "mandatory_depends_on": "eval:doc.action == \"Watch Video\""
},
{
"depends_on": "eval:doc.action == \"View Report\"",
@@ -102,17 +109,19 @@
"label": "Is Skipped"
},
{
- "depends_on": "eval:doc.action == \"Update Settings\"",
+ "depends_on": "eval:doc.action == \"Update Settings\" && doc.validate_action",
"fieldname": "field",
"fieldtype": "Select",
- "label": "Field"
+ "label": "Field",
+ "mandatory_depends_on": "eval:doc.action == \"Update Settings\" && doc.validate_action"
},
{
- "depends_on": "eval:doc.action == \"Update Settings\"",
+ "depends_on": "eval:doc.action == \"Update Settings\" && doc.validate_action",
"description": "Use % for any non empty value.",
"fieldname": "value_to_validate",
"fieldtype": "Data",
- "label": "Value to Validate"
+ "label": "Value to Validate",
+ "mandatory_depends_on": "eval:doc.action == \"Update Settings\" && doc.validate_action"
},
{
"depends_on": "eval:doc.action == \"View Report\"",
@@ -136,10 +145,46 @@
"fieldname": "is_single",
"fieldtype": "Check",
"label": "Is Single"
+ },
+ {
+ "depends_on": "eval:doc.action == \"Go to Page\"",
+ "description": "Example: #Tree/Account",
+ "fieldname": "path",
+ "fieldtype": "Data",
+ "label": "Path",
+ "mandatory_depends_on": "eval:doc.action == \"Go to Page\""
+ },
+ {
+ "depends_on": "eval:doc.action == \"Go to Page\"",
+ "fieldname": "callback_title",
+ "fieldtype": "Data",
+ "label": "Callback Title"
+ },
+ {
+ "depends_on": "eval:doc.action == \"Go to Page\"",
+ "description": "This will be shown in a modal after routing",
+ "fieldname": "callback_message",
+ "fieldtype": "Small Text",
+ "label": "Callback Message"
+ },
+ {
+ "default": "1",
+ "depends_on": "eval:doc.action == \"Update Settings\"",
+ "fieldname": "validate_action",
+ "fieldtype": "Check",
+ "label": "Validate Field"
+ },
+ {
+ "default": "0",
+ "depends_on": "eval:doc.action == \"Create Entry\"",
+ "description": "Show full form instead of a quick entry modal",
+ "fieldname": "show_full_form",
+ "fieldtype": "Check",
+ "label": "Show Full Form?"
}
],
"links": [],
- "modified": "2020-05-11 13:24:05.457160",
+ "modified": "2020-05-14 15:10:05.627706",
"modified_by": "Administrator",
"module": "Desk",
"name": "Onboarding Step",
diff --git a/frappe/desk/doctype/onboarding_step/onboarding_step.py b/frappe/desk/doctype/onboarding_step/onboarding_step.py
index e1cc5dfba4..8086acbb2a 100644
--- a/frappe/desk/doctype/onboarding_step/onboarding_step.py
+++ b/frappe/desk/doctype/onboarding_step/onboarding_step.py
@@ -10,3 +10,7 @@ class OnboardingStep(Document):
def before_export(self, doc):
doc.is_complete = 0
doc.is_skipped = 0
+
+ def validate(self):
+ if self.action == "Go to Page":
+ self.is_mandatory = 0
diff --git a/frappe/public/js/frappe/widgets/onboarding_widget.js b/frappe/public/js/frappe/widgets/onboarding_widget.js
index e347a70036..e869b281ae 100644
--- a/frappe/public/js/frappe/widgets/onboarding_widget.js
+++ b/frappe/public/js/frappe/widgets/onboarding_widget.js
@@ -25,7 +25,7 @@ export default class OnboardingWidget extends Widget {
if (step.is_skipped) {
status = "skipped";
- icon_class = "fa-times-circle-o";
+ icon_class = "fa-check-circle-o";
}
if (step.is_complete) {
@@ -56,10 +56,17 @@ export default class OnboardingWidget extends Widget {
// Setup actions
let actions = {
"Watch Video": () => this.show_video(step),
- "Create Entry": () => this.show_quick_entry(step),
+ "Create Entry": () => {
+ if (step.show_full_form) {
+ this.create_entry(step);
+ } else {
+ this.show_quick_entry(step);
+ }
+ },
"Show Form Tour": () => this.show_form_tour(step),
"Update Settings": () => this.update_settings(step),
"View Report": () => this.open_report(step),
+ "Go to Page": () => this.go_to_page(step),
};
$step.find("#title").on("click", actions[step.action]);
@@ -68,6 +75,24 @@ export default class OnboardingWidget extends Widget {
return $step;
}
+ go_to_page(step) {
+ frappe.set_route(step.path).then(() => {
+ if (step.callback_message) {
+ let msg_dialog = frappe.msgprint({
+ message: __(step.callback_message),
+ title: __(step.callback_title),
+ primary_action: {
+ action: () => {
+ msg_dialog.hide();
+ },
+ label: () => __("Continue"),
+ },
+ wide: true,
+ });
+ }
+ });
+ }
+
open_report(step) {
let route = generate_route({
name: step.reference_report,
@@ -75,10 +100,9 @@ export default class OnboardingWidget extends Widget {
is_query_report: ["Query Report", "Script Report"].includes(
step.report_type
),
- doctype: step.report_reference_doctype
+ doctype: step.report_reference_doctype,
});
-
let current_route = frappe.get_route();
frappe.set_route(route).then(() => {
@@ -133,7 +157,7 @@ export default class OnboardingWidget extends Widget {
msg_dialog.hide();
},
label: () => __("Continue"),
- }
+ },
});
});
};
@@ -147,6 +171,7 @@ export default class OnboardingWidget extends Widget {
frappe.route_hooks = {};
frappe.route_hooks.after_load = (frm) => {
frm.scroll_to_field(step.field);
+ frm.doc.__unsaved = true;
};
frappe.route_hooks.after_save = (frm) => {
@@ -204,6 +229,33 @@ export default class OnboardingWidget extends Widget {
frappe.set_route("Form", step.reference_document);
}
+ create_entry(step) {
+ let current_route = frappe.get_route();
+
+ frappe.route_hooks = {};
+
+ frappe.route_hooks.after_save = () => {
+ frappe.msgprint({
+ message: __("You're doing great, let's take you back to the onboarding page."),
+ title: __("Good Work 🎉"),
+ primary_action: {
+ action: () => {
+ frappe.set_route(current_route).then(() => {
+ this.mark_complete(step);
+ });
+ },
+ label: __("Continue"),
+ },
+ });
+
+ frappe.msg_dialog.custom_onhide = () => {
+ this.mark_complete(step);
+ };
+ };
+
+ frappe.set_route(`Form/${step.reference_document}/New ${step.reference_document} 1`);
+ }
+
show_quick_entry(step) {
let current_route = frappe.get_route_str();
frappe.ui.form.make_quick_entry(
@@ -221,7 +273,7 @@ export default class OnboardingWidget extends Widget {
});
},
label: __("Continue"),
- }
+ },
});
frappe.msg_dialog.custom_onhide = () => {
@@ -271,7 +323,7 @@ export default class OnboardingWidget extends Widget {
update_step_status(step, status, value, callback) {
let icon_class = {
is_complete: "fa-check-circle-o",
- is_skipped: "fa-times-circle-o",
+ is_skipped: "fa-check-circle-o",
};
frappe
@@ -394,4 +446,4 @@ export default class OnboardingWidget extends Widget {
});
dismiss.appendTo(this.action_area);
}
-}
\ No newline at end of file
+}
From 79f41fd43f6e311dcddc617cac8d792f7380d01b Mon Sep 17 00:00:00 2001
From: Himanshu Warekar
Date: Thu, 14 May 2020 17:05:44 +0530
Subject: [PATCH 148/274] fix: rename to __attachments
---
.../package_detail/package_detail.json | 65 -------------------
.../__init__.py | 0
.../package_document_type.json | 65 +++++++++++++++++++
.../package_document_type.py} | 2 +-
.../package_publish_tool.json | 4 +-
.../package_publish_tool.py | 12 ++--
6 files changed, 74 insertions(+), 74 deletions(-)
delete mode 100644 frappe/custom/doctype/package_detail/package_detail.json
rename frappe/custom/doctype/{package_detail => package_document_type}/__init__.py (100%)
create mode 100644 frappe/custom/doctype/package_document_type/package_document_type.json
rename frappe/custom/doctype/{package_detail/package_detail.py => package_document_type/package_document_type.py} (86%)
diff --git a/frappe/custom/doctype/package_detail/package_detail.json b/frappe/custom/doctype/package_detail/package_detail.json
deleted file mode 100644
index f749587a42..0000000000
--- a/frappe/custom/doctype/package_detail/package_detail.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "engine": "InnoDB",
- "field_order": [
- "document_type",
- "column_break_2",
- "attachments",
- "overwrite",
- "section_break_4",
- "filters_json"
- ],
- "istable": 1,
- "modified_by": "Administrator",
- "name": "Package Detail",
- "links": [],
- "fields": [
- {
- "label": "Document Type",
- "in_list_view": 1,
- "fieldtype": "Link",
- "reqd": 1,
- "fieldname": "document_type",
- "options": "DocType"
- },
- {
- "fieldname": "column_break_2",
- "fieldtype": "Column Break"
- },
- {
- "default": "0",
- "in_list_view": 1,
- "fieldname": "attachments",
- "fieldtype": "Check",
- "label": "Include Attachments"
- },
- {
- "default": "0",
- "in_list_view": 1,
- "fieldname": "overwrite",
- "fieldtype": "Check",
- "label": "Overwrite"
- },
- {
- "fieldname": "section_break_4",
- "fieldtype": "Section Break"
- },
- {
- "options": "JSON",
- "fieldname": "filters_json",
- "fieldtype": "Code",
- "label": "Filters"
- }
- ],
- "track_changes": 1,
- "creation": "2020-04-06 12:59:59.657816",
- "doctype": "DocType",
- "actions": [],
- "modified": "2020-04-06 12:59:59.657816",
- "sort_order": "DESC",
- "module": "Custom",
- "owner": "Administrator",
- "sort_field": "modified",
- "editable_grid": 1,
- "quick_entry": 1,
- "permissions": []
-}
\ No newline at end of file
diff --git a/frappe/custom/doctype/package_detail/__init__.py b/frappe/custom/doctype/package_document_type/__init__.py
similarity index 100%
rename from frappe/custom/doctype/package_detail/__init__.py
rename to frappe/custom/doctype/package_document_type/__init__.py
diff --git a/frappe/custom/doctype/package_document_type/package_document_type.json b/frappe/custom/doctype/package_document_type/package_document_type.json
new file mode 100644
index 0000000000..6d011bd4e4
--- /dev/null
+++ b/frappe/custom/doctype/package_document_type/package_document_type.json
@@ -0,0 +1,65 @@
+{
+ "actions": [],
+ "creation": "2020-05-14 16:45:47.196395",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "document_type",
+ "column_break_2",
+ "attachments",
+ "overwrite",
+ "section_break_4",
+ "filters_json"
+ ],
+ "fields": [
+ {
+ "fieldname": "document_type",
+ "fieldtype": "Link",
+ "in_list_view": 1,
+ "label": "Document Type",
+ "options": "DocType",
+ "reqd": 1
+ },
+ {
+ "fieldname": "column_break_2",
+ "fieldtype": "Column Break"
+ },
+ {
+ "default": "0",
+ "fieldname": "attachments",
+ "fieldtype": "Check",
+ "in_list_view": 1,
+ "label": "Include Attachments"
+ },
+ {
+ "default": "0",
+ "fieldname": "overwrite",
+ "fieldtype": "Check",
+ "in_list_view": 1,
+ "label": "Overwrite"
+ },
+ {
+ "fieldname": "section_break_4",
+ "fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "filters_json",
+ "fieldtype": "Code",
+ "label": "Filters",
+ "options": "JSON"
+ }
+ ],
+ "istable": 1,
+ "links": [],
+ "modified": "2020-05-14 16:45:47.196395",
+ "modified_by": "Administrator",
+ "module": "Custom",
+ "name": "Package Document Type",
+ "owner": "Administrator",
+ "permissions": [],
+ "quick_entry": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/frappe/custom/doctype/package_detail/package_detail.py b/frappe/custom/doctype/package_document_type/package_document_type.py
similarity index 86%
rename from frappe/custom/doctype/package_detail/package_detail.py
rename to frappe/custom/doctype/package_document_type/package_document_type.py
index 0460329d85..6e166eecbd 100644
--- a/frappe/custom/doctype/package_detail/package_detail.py
+++ b/frappe/custom/doctype/package_document_type/package_document_type.py
@@ -6,5 +6,5 @@ from __future__ import unicode_literals
# import frappe
from frappe.model.document import Document
-class PackageDetail(Document):
+class PackageDocumentType(Document):
pass
diff --git a/frappe/custom/doctype/package_publish_tool/package_publish_tool.json b/frappe/custom/doctype/package_publish_tool/package_publish_tool.json
index 9b1db2c2ff..59d22f6ad4 100644
--- a/frappe/custom/doctype/package_publish_tool/package_publish_tool.json
+++ b/frappe/custom/doctype/package_publish_tool/package_publish_tool.json
@@ -18,7 +18,7 @@
"fieldname": "package_details",
"fieldtype": "Table",
"label": "Package",
- "options": "Package Detail",
+ "options": "Package Document Type",
"reqd": 1
},
{
@@ -50,7 +50,7 @@
],
"issingle": 1,
"links": [],
- "modified": "2020-05-14 16:06:19.714596",
+ "modified": "2020-05-14 16:46:20.374773",
"modified_by": "Administrator",
"module": "Custom",
"name": "Package Publish Tool",
diff --git a/frappe/custom/doctype/package_publish_tool/package_publish_tool.py b/frappe/custom/doctype/package_publish_tool/package_publish_tool.py
index 09549107be..415839322c 100644
--- a/frappe/custom/doctype/package_publish_tool/package_publish_tool.py
+++ b/frappe/custom/doctype/package_publish_tool/package_publish_tool.py
@@ -12,7 +12,7 @@ from frappe.utils.file_manager import save_file, get_file
from frappe import _
from six import string_types
from frappe.frappeclient import FrappeClient
-from frappe.model.naming import make_autoname
+from frappe.utils import get_datetime_str, get_datetime
from frappe.utils.password import get_decrypted_password
class PackagePublishTool(Document):
@@ -22,7 +22,7 @@ class PackagePublishTool(Document):
def deploy_package():
package, doc = export_package()
- file_name = make_autoname("Package.####")
+ file_name = "Package-" + get_datetime_str(get_datetime())
save_file(file_name, json.dumps(package), "Package Publish Tool", "Package Publish Tool")
length = len(doc.instances)
@@ -90,8 +90,8 @@ def export_package():
})
document.update({
- "attachments": attachments,
- "overwrite": True if doctype.overwrite else False
+ "__attachments": attachments,
+ "__overwrite": True if doctype.overwrite else False
})
package.append(document)
@@ -106,8 +106,8 @@ def import_package(package=None):
for doc in package:
modified = doc.pop("modified")
- overwrite = doc.pop("overwrite")
- attachments = doc.pop("attachments")
+ overwrite = doc.pop("__overwrite")
+ attachments = doc.pop("__attachments")
exists = frappe.db.exists(doc.get("doctype"), doc.get("name"))
if not exists:
From 8df9cb6bede5733ba372f75e413cb89f76ea87cc Mon Sep 17 00:00:00 2001
From: Gavin D'souza
Date: Thu, 14 May 2020 17:09:27 +0530
Subject: [PATCH 149/274] chore: optimize imports, style fixes
---
frappe/utils/remote_migrations.py | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/frappe/utils/remote_migrations.py b/frappe/utils/remote_migrations.py
index 656fb803de..90f8db0b74 100644
--- a/frappe/utils/remote_migrations.py
+++ b/frappe/utils/remote_migrations.py
@@ -1,5 +1,4 @@
# imports - standard imports
-import functools
import getpass
import json
import re
@@ -78,7 +77,6 @@ def choose_plan(plans_list):
@padme
def check_app_compat(available_group):
- frappe_upgrade_msg = ""
is_compat = True
incompatible_apps, filtered_apps, branch_msgs = [], [], []
existing_group = [(app["app_name"], app["branch"]) for app in get_installed_apps_info()]
@@ -135,7 +133,7 @@ def filter_apps(app_groups):
app_group_index = click.prompt("Select App Group #", type=int) - 1
try:
selected_group = app_groups[app_group_index]
- except:
+ except IndexError:
print("Invalid Selection ❌")
break
@@ -169,7 +167,7 @@ def create_session():
@padme
def get_subdomain(domain):
while True:
- subdomain = click.prompt("Enter subdomain: ").strip()
+ subdomain = click.prompt("Enter subdomain").strip()
if is_valid_subdomain(subdomain) and is_subdomain_available(subdomain):
print("Site Domain: {}.{}".format(subdomain, domain))
return subdomain
From 30a4fd7ac0a4a30dc33baee8745f0d89986ba43b Mon Sep 17 00:00:00 2001
From: Gavin D'souza
Date: Thu, 14 May 2020 17:16:37 +0530
Subject: [PATCH 150/274] fix: allow validations for all fieldtypes
---
frappe/public/js/frappe/form/controls/data.js | 3 ---
1 file changed, 3 deletions(-)
diff --git a/frappe/public/js/frappe/form/controls/data.js b/frappe/public/js/frappe/form/controls/data.js
index 25f3ef76af..c943ec89bb 100644
--- a/frappe/public/js/frappe/form/controls/data.js
+++ b/frappe/public/js/frappe/form/controls/data.js
@@ -87,9 +87,6 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({
return val==null ? "" : val;
},
validate: function(v) {
- if (this.df.fieldtype !== "Data") {
- return v;
- }
if (!v) {
return '';
}
From e5a2171a66f19e1900d5316f2a1c7e17cc6f54b8 Mon Sep 17 00:00:00 2001
From: prssanna
Date: Thu, 14 May 2020 17:18:05 +0530
Subject: [PATCH 151/274] fix: set query report object for chart filters
---
.../doctype/dashboard_chart/dashboard_chart.js | 14 +++-----------
frappe/public/js/frappe/widgets/chart_widget.js | 12 +++---------
2 files changed, 6 insertions(+), 20 deletions(-)
diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js
index f8d5886b26..fb6f9252ce 100644
--- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js
+++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js
@@ -283,17 +283,7 @@ frappe.ui.form.on('Dashboard Chart', {
});
}
} else if (frm.chart_filters.length) {
- fields = frm.chart_filters.filter(f => {
- if (f.on_change && !f.reqd) {
- return false;
- }
- if (f.get_query || f.get_data) {
- f.read_only = 1;
- }
-
- return f.fieldname;
- });
-
+ fields = frm.chart_filters.filter(f => f.fieldname);
fields.map( f => {
if (filters[f.fieldname]) {
let condition = '=';
@@ -353,6 +343,8 @@ frappe.ui.form.on('Dashboard Chart', {
}
dialog.show();
+ //Set query report object so that it can be used while fetching filter values in the report
+ frappe.query_report = new frappe.views.QueryReport({'filters': dialog.fields_list});
dialog.set_values(filters);
});
},
diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js
index a50acfcd9d..b4c622f151 100644
--- a/frappe/public/js/frappe/widgets/chart_widget.js
+++ b/frappe/public/js/frappe/widgets/chart_widget.js
@@ -332,15 +332,7 @@ export default class ChartWidget extends Widget {
}
];
} else {
- fields = filters.filter(f => {
- if (f.on_change && !f.reqd) {
- return false;
- }
- if (f.get_query || f.get_data) {
- f.read_only = 1;
- }
- return f.fieldname;
- });
+ fields = filters.filter(f => f.fieldname);
}
} else {
fields = [
@@ -384,6 +376,8 @@ export default class ChartWidget extends Widget {
}
dialog.show();
+ //Set query report object so that it can be used while fetching filter values in the report
+ frappe.query_report = new frappe.views.QueryReport({'filters': dialog.fields_list});
dialog.set_values(this.filters);
}
From 12ca630c522f668e92995a4451b177f83a42d1a8 Mon Sep 17 00:00:00 2001
From: Himanshu Warekar
Date: Thu, 14 May 2020 17:22:51 +0530
Subject: [PATCH 152/274] fix: merge code
---
frappe/model/meta.py | 89 +++++++++++++++-----------------------------
1 file changed, 31 insertions(+), 58 deletions(-)
diff --git a/frappe/model/meta.py b/frappe/model/meta.py
index a9ae19af6d..c8fd1a2ac2 100644
--- a/frappe/model/meta.py
+++ b/frappe/model/meta.py
@@ -434,7 +434,6 @@ class Meta(Document):
pass
self.add_doctype_links(data)
- get_custom_doctype_links(self.name, data)
if not self.custom:
for hook in frappe.get_hooks("override_doctype_dashboards", {}).get(self.name, []):
@@ -444,34 +443,41 @@ class Meta(Document):
def add_doctype_links(self, data):
'''add `links` child table in standard link dashboard format'''
+ dashboard_links = []
+
if hasattr(self, 'links') and self.links:
- if not data.transactions:
- # init groups
- data.transactions = []
- data.non_standard_fieldnames = {}
+ dashboard_links.extend(self.links)
- for link in self.links:
- link.added = False
- for group in data.transactions:
- group = frappe._dict(group)
- # group found
- if link.group and group.label == link.group:
- if link.link_doctype not in group.get('items'):
- group.get('items').append(link.link_doctype)
- link.added = True
+ if frappe.get_all("Custom Link", {"document_type": self.name}):
+ dashboard_links.extend(frappe.get_doc("Custom Link", self.name).links)
- if not link.added:
- # group not found, make a new group
- data.transactions.append(dict(
- label = link.group,
- items = [link.link_doctype]
- ))
+ if not data.transactions:
+ # init groups
+ data.transactions = []
+ data.non_standard_fieldnames = {}
- if link.link_fieldname != data.fieldname:
- if data.fieldname:
- data.non_standard_fieldnames[link.link_doctype] = link.link_fieldname
- else:
- data.fieldname = link.link_fieldname
+ for link in dashboard_links:
+ link.added = False
+ for group in data.transactions:
+ group = frappe._dict(group)
+ # group found
+ if link.group and group.label == link.group:
+ if link.link_doctype not in group.get('items'):
+ group.get('items').append(link.link_doctype)
+ link.added = True
+
+ if not link.added:
+ # group not found, make a new group
+ data.transactions.append(dict(
+ label = link.group,
+ items = [link.link_doctype]
+ ))
+
+ if link.link_fieldname != data.fieldname:
+ if data.fieldname:
+ data.non_standard_fieldnames[link.link_doctype] = link.link_fieldname
+ else:
+ data.fieldname = link.link_fieldname
def get_row_template(self):
@@ -608,36 +614,3 @@ def trim_tables(doctype=None):
query = """alter table `tab{doctype}` {columns}""".format(
doctype=doctype, columns=columns_to_remove)
frappe.db.sql_ddl(query)
-
-def get_custom_doctype_links(doctype, data):
- if frappe.get_all("Custom Link", {"document_type": doctype}):
- doc = frappe.get_doc("Custom Link", doctype)
-
- if not data.transactions:
- # init groups
- data.transactions = []
- data.non_standard_fieldnames = {}
-
- for link in doc.links:
- link.added = False
- for group in data.transactions:
- # group found
- if group.get("label") == link.group:
- if link.link_doctype not in group.get("items"):
- group.get("items").append(link.link_doctype)
- link.added = True
-
- if not link.added:
- # group not found, make a new group
- data.transactions.append({
- "label": link.group,
- "items": [link.link_doctype]
- })
-
- if link.link_fieldname != data.fieldname:
- if data.fieldname:
- data.non_standard_fieldnames[link.link_doctype] = link.link_fieldname
- else:
- data.fieldname = link.link_fieldname
-
- return data
\ No newline at end of file
From f4b9f8a31453c02733d2ee82a5db5f63c3014fbd Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 14 May 2020 19:27:09 +0530
Subject: [PATCH 153/274] feat: trigger after insert for submittable quick
entry
---
frappe/public/js/frappe/form/quick_entry.js | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/form/quick_entry.js b/frappe/public/js/frappe/form/quick_entry.js
index 9996389a4e..dbb3792262 100644
--- a/frappe/public/js/frappe/form/quick_entry.js
+++ b/frappe/public/js/frappe/form/quick_entry.js
@@ -213,8 +213,15 @@ frappe.ui.form.QuickEntryForm = Class.extend({
me.dialog.doc = r.message;
if (frappe._from_link) {
frappe.ui.form.update_calling_link(me.dialog.doc);
+ } else {
+ if(me.after_insert) {
+ me.after_insert(me.dialog.doc);
+ } else {
+ me.open_form_if_not_list();
+ }
}
- cur_frm.reload_doc();
+
+ cur_frm && cur_frm.reload_doc();
}
});
},
From 657d001eefda12759f075d416044cf39c8609ac5 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 14 May 2020 19:28:08 +0530
Subject: [PATCH 154/274] feat: don't show full link option if force is set in
quick entry
---
frappe/public/js/frappe/form/quick_entry.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/form/quick_entry.js b/frappe/public/js/frappe/form/quick_entry.js
index dbb3792262..5b427feb1c 100644
--- a/frappe/public/js/frappe/form/quick_entry.js
+++ b/frappe/public/js/frappe/form/quick_entry.js
@@ -107,7 +107,7 @@ frappe.ui.form.QuickEntryForm = Class.extend({
});
this.register_primary_action();
- this.render_edit_in_full_page_link();
+ !this.force && this.render_edit_in_full_page_link();
// ctrl+enter to save
this.dialog.wrapper.keydown(function(e) {
if((e.ctrlKey || e.metaKey) && e.which==13) {
From dae9eb5a2a5a24fd2b63079a7052a21a66986065 Mon Sep 17 00:00:00 2001
From: prssanna
Date: Thu, 14 May 2020 19:32:01 +0530
Subject: [PATCH 155/274] fix: don't get filters if string type
---
frappe/desk/notifications.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/frappe/desk/notifications.py b/frappe/desk/notifications.py
index 109dd25f4f..4a1302788b 100644
--- a/frappe/desk/notifications.py
+++ b/frappe/desk/notifications.py
@@ -212,7 +212,10 @@ def get_notification_config():
def get_filters_for(doctype):
'''get open filters for doctype'''
config = get_notification_config()
- return config.get("for_doctype").get(doctype, {})
+ doctype_config = config.get("for_doctype").get(doctype, {})
+ filters = doctype_config if not isinstance(doctype_config, string_types) else None
+
+ return filters
@frappe.whitelist()
@frappe.read_only()
From 21d7926d60288a3fac6f46b5da9a2cba1548667d Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 14 May 2020 19:41:55 +0530
Subject: [PATCH 156/274] fix: linting
---
frappe/public/js/frappe/form/quick_entry.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/form/quick_entry.js b/frappe/public/js/frappe/form/quick_entry.js
index 5b427feb1c..68444c8a3b 100644
--- a/frappe/public/js/frappe/form/quick_entry.js
+++ b/frappe/public/js/frappe/form/quick_entry.js
@@ -214,7 +214,7 @@ frappe.ui.form.QuickEntryForm = Class.extend({
if (frappe._from_link) {
frappe.ui.form.update_calling_link(me.dialog.doc);
} else {
- if(me.after_insert) {
+ if (me.after_insert) {
me.after_insert(me.dialog.doc);
} else {
me.open_form_if_not_list();
From 76c8e62e354f30a7e21ecbe7d86831d3ac047543 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 14 May 2020 19:51:58 +0530
Subject: [PATCH 157/274] feat: store if document is submitable
---
frappe/desk/desktop.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py
index e2fe020eca..06aff0b714 100644
--- a/frappe/desk/desktop.py
+++ b/frappe/desk/desktop.py
@@ -274,6 +274,8 @@ class Workspace:
for doc in self.onboarding_doc.get_steps():
step = doc.as_dict().copy()
step.label = _(doc.title)
+ if step.action == "Create Entry":
+ step.is_submittable = frappe.db.get_value("DocType", step.reference_document, 'is_submittable')
steps.append(step)
return steps
@@ -516,4 +518,5 @@ def update_onboarding_step(name, field, value):
value: Value to be updated
"""
+ return
frappe.db.set_value("Onboarding Step", name, field, value)
From 5fe6ef8c4a91915a30862d3f9d68fac67a8e47f9 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 14 May 2020 19:52:08 +0530
Subject: [PATCH 158/274] feat: added after submit hooks
---
frappe/public/js/frappe/form/form.js | 6 ++++++
.../js/frappe/widgets/onboarding_widget.js | 17 +++++++++++++++--
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js
index 01dfbf81f9..bad7c877fc 100644
--- a/frappe/public/js/frappe/form/form.js
+++ b/frappe/public/js/frappe/form/form.js
@@ -651,6 +651,12 @@ frappe.ui.form.Form = class FrappeForm {
callback && callback();
me.script_manager.trigger("on_submit")
.then(() => resolve(me));
+ if (frappe.route_hooks.after_submit) {
+ let route_callback = frappe.route_hooks.after_submit;
+ delete frappe.route_hooks.after_submit;
+
+ route_callback(me);
+ }
}
}, btn, () => me.handle_save_fail(btn, on_error), resolve);
});
diff --git a/frappe/public/js/frappe/widgets/onboarding_widget.js b/frappe/public/js/frappe/widgets/onboarding_widget.js
index e869b281ae..821824a2d2 100644
--- a/frappe/public/js/frappe/widgets/onboarding_widget.js
+++ b/frappe/public/js/frappe/widgets/onboarding_widget.js
@@ -233,8 +233,7 @@ export default class OnboardingWidget extends Widget {
let current_route = frappe.get_route();
frappe.route_hooks = {};
-
- frappe.route_hooks.after_save = () => {
+ let callback = () => {
frappe.msgprint({
message: __("You're doing great, let's take you back to the onboarding page."),
title: __("Good Work 🎉"),
@@ -253,6 +252,18 @@ export default class OnboardingWidget extends Widget {
};
};
+ if (step.is_submittable) {
+ frappe.route_hooks.after_save = () => {
+ frappe.msgprint({
+ message: __("Submit this document to complete this step."),
+ title: __("Great")
+ });
+ };
+ frappe.route_hooks.after_submit = callback;
+ } else {
+ frappe.route_hooks.after_save = callback;
+ }
+
frappe.set_route(`Form/${step.reference_document}/New ${step.reference_document} 1`);
}
@@ -325,6 +336,8 @@ export default class OnboardingWidget extends Widget {
is_complete: "fa-check-circle-o",
is_skipped: "fa-check-circle-o",
};
+ // Clear any hooks
+ frappe.route_hooks = {};
frappe
.call("frappe.desk.desktop.update_onboarding_step", {
From 0091f514b5c984c71467f7093b86b09bacf253d5 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 14 May 2020 20:00:34 +0530
Subject: [PATCH 159/274] fix: remove return
---
frappe/desk/desktop.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py
index 06aff0b714..29f9aea4be 100644
--- a/frappe/desk/desktop.py
+++ b/frappe/desk/desktop.py
@@ -518,5 +518,4 @@ def update_onboarding_step(name, field, value):
value: Value to be updated
"""
- return
frappe.db.set_value("Onboarding Step", name, field, value)
From ba2da078af338530543a29d070e4ac2b24c19ff7 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 14 May 2020 20:00:43 +0530
Subject: [PATCH 160/274] feat: use cached db value
---
frappe/desk/desktop.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py
index 29f9aea4be..512b3f2890 100644
--- a/frappe/desk/desktop.py
+++ b/frappe/desk/desktop.py
@@ -275,7 +275,7 @@ class Workspace:
step = doc.as_dict().copy()
step.label = _(doc.title)
if step.action == "Create Entry":
- step.is_submittable = frappe.db.get_value("DocType", step.reference_document, 'is_submittable')
+ step.is_submittable = frappe.db.get_value("DocType", step.reference_document, 'is_submittable', cache=True)
steps.append(step)
return steps
From 0f94edd87cceaa741cd400a078b0f83d361e69f0 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Thu, 14 May 2020 21:31:02 +0530
Subject: [PATCH 161/274] feat: allow overriding filters in dashboards
---
frappe/public/js/frappe/widgets/chart_widget.js | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js
index 35ddaab4cf..c42e6053eb 100644
--- a/frappe/public/js/frappe/widgets/chart_widget.js
+++ b/frappe/public/js/frappe/widgets/chart_widget.js
@@ -361,7 +361,12 @@ export default class ChartWidget extends Widget {
}
];
} else {
- fields = filters.filter(f => f.fieldname);
+ fields = filters
+ .filter(df => df.fieldname)
+ .map(df => {
+ Object.assign(df, df.dashboard_config || {});
+ return df;
+ });
}
} else {
fields = [
From bc8620d42038d1974e9c8e286395d2cc7522662a Mon Sep 17 00:00:00 2001
From: prssanna
Date: Tue, 28 Apr 2020 16:46:22 +0530
Subject: [PATCH 162/274] feat: add default custom options to dashboard
---
frappe/desk/doctype/dashboard/dashboard.json | 10 +++-
frappe/desk/doctype/dashboard/dashboard.py | 8 ++-
.../dashboard_chart/dashboard_chart.json | 2 +-
.../public/js/frappe/widgets/chart_widget.js | 53 +++++++++++++++++++
4 files changed, 70 insertions(+), 3 deletions(-)
diff --git a/frappe/desk/doctype/dashboard/dashboard.json b/frappe/desk/doctype/dashboard/dashboard.json
index c17bc3235c..a3a6d492f1 100644
--- a/frappe/desk/doctype/dashboard/dashboard.json
+++ b/frappe/desk/doctype/dashboard/dashboard.json
@@ -9,6 +9,7 @@
"dashboard_name",
"is_default",
"charts",
+ "default_chart_custom_options",
"cards"
],
"fields": [
@@ -33,6 +34,13 @@
"options": "Dashboard Chart Link",
"reqd": 1
},
+ {
+ "description": "Set Default Options for all charts on this Dashboard (Ex: \"colors\": [\"#d1d8dd\", \"#ff5858\"])",
+ "fieldname": "default_chart_custom_options",
+ "fieldtype": "Code",
+ "label": "Default Chart Custom Options",
+ "options": "JSON"
+ },
{
"fieldname": "cards",
"fieldtype": "Table",
@@ -41,7 +49,7 @@
}
],
"links": [],
- "modified": "2020-04-19 17:44:36.237163",
+ "modified": "2020-04-28 14:17:02.391084",
"modified_by": "Administrator",
"module": "Desk",
"name": "Dashboard",
diff --git a/frappe/desk/doctype/dashboard/dashboard.py b/frappe/desk/doctype/dashboard/dashboard.py
index b85e135071..952db21042 100644
--- a/frappe/desk/doctype/dashboard/dashboard.py
+++ b/frappe/desk/doctype/dashboard/dashboard.py
@@ -19,7 +19,13 @@ def get_permitted_charts(dashboard_name):
dashboard = frappe.get_doc('Dashboard', dashboard_name)
for chart in dashboard.charts:
if frappe.has_permission('Dashboard Chart', doc=chart.chart):
- permitted_charts.append(chart)
+ chart_dict = frappe._dict()
+ chart_dict.update(chart.as_dict())
+
+ if dashboard.get('default_chart_custom_options'):
+ chart_dict.custom_options = dashboard.get('default_chart_custom_options')
+ permitted_charts.append(chart_dict)
+
return permitted_charts
@frappe.whitelist()
diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.json b/frappe/desk/doctype/dashboard_chart/dashboard_chart.json
index e377ef740e..472d02a75e 100644
--- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.json
+++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.json
@@ -219,7 +219,7 @@
"options": "Dashboard Chart Field"
},
{
- "description": "Ex: \"colors\": [\"#d1d8dd\", \"#ff5858\"]",
+ "description": " Ex: \"colors\": [\"#d1d8dd\", \"#ff5858\"] (the options set here will override the default custom options set in the Dashboard)",
"fieldname": "custom_options",
"fieldtype": "Code",
"label": "Custom Options"
diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js
index c42e6053eb..a0211284bf 100644
--- a/frappe/public/js/frappe/widgets/chart_widget.js
+++ b/frappe/public/js/frappe/widgets/chart_widget.js
@@ -593,6 +593,59 @@ export default class ChartWidget extends Widget {
}
}
+ get_chart_args() {
+ let colors = this.get_chart_colors();
+
+ const chart_type_map = {
+ Line: "line",
+ Bar: "bar",
+ Percentage: "percentage",
+ Pie: "pie",
+ Donut: "donut"
+ };
+
+ let chart_args = {
+ data: this.data,
+ type: chart_type_map[this.chart_doc.type],
+ colors: colors,
+ height: this.height,
+ axisOptions: {
+ xIsSeries: this.chart_doc.timeseries,
+ shortenYAxisNumbers: 1
+ }
+ };
+
+ let set_options = (options) => {
+ let custom_options = JSON.parse(options);
+ for (let key in custom_options) {
+ chart_args[key] = custom_options[key];
+ }
+ };
+
+ if (this.custom_options) {
+ set_options(this.custom_options);
+ }
+
+ if (this.chart_doc.custom_options) {
+ set_options(this.chart_doc.custom_options);
+ }
+
+ return chart_args;
+ }
+
+ get_chart_colors() {
+ let colors = [];
+ if (this.chart_doc.y_axis.length) {
+ this.chart_doc.y_axis.map(field => {
+ colors.push(field.color);
+ });
+ } else if (["Line", "Bar"].includes(this.chart_doc.type)) {
+ colors = [this.chart_doc.color || "light-blue"];
+ }
+
+ return colors;
+ }
+
update_last_synced() {
let last_synced_text = __("Last synced {0}", [
comment_when(this.chart_doc.last_synced_on)
From 08f740acf8cb3fc5704fc4be1e971fcba0f11fbd Mon Sep 17 00:00:00 2001
From: prssanna
Date: Wed, 29 Apr 2020 13:30:05 +0530
Subject: [PATCH 163/274] fix: better naming
---
frappe/desk/doctype/dashboard/dashboard.json | 6 +++++-
frappe/desk/doctype/dashboard/dashboard.py | 4 ++--
frappe/desk/doctype/dashboard_chart/dashboard_chart.json | 2 +-
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/frappe/desk/doctype/dashboard/dashboard.json b/frappe/desk/doctype/dashboard/dashboard.json
index a3a6d492f1..e17fb66436 100644
--- a/frappe/desk/doctype/dashboard/dashboard.json
+++ b/frappe/desk/doctype/dashboard/dashboard.json
@@ -9,8 +9,12 @@
"dashboard_name",
"is_default",
"charts",
+<<<<<<< HEAD
"default_chart_custom_options",
"cards"
+=======
+ "chart_options"
+>>>>>>> fix: better naming
],
"fields": [
{
@@ -49,7 +53,7 @@
}
],
"links": [],
- "modified": "2020-04-28 14:17:02.391084",
+ "modified": "2020-04-29 13:26:37.362482",
"modified_by": "Administrator",
"module": "Desk",
"name": "Dashboard",
diff --git a/frappe/desk/doctype/dashboard/dashboard.py b/frappe/desk/doctype/dashboard/dashboard.py
index 952db21042..9368315343 100644
--- a/frappe/desk/doctype/dashboard/dashboard.py
+++ b/frappe/desk/doctype/dashboard/dashboard.py
@@ -22,8 +22,8 @@ def get_permitted_charts(dashboard_name):
chart_dict = frappe._dict()
chart_dict.update(chart.as_dict())
- if dashboard.get('default_chart_custom_options'):
- chart_dict.custom_options = dashboard.get('default_chart_custom_options')
+ if dashboard.get('chart_options'):
+ chart_dict.custom_options = dashboard.get('chart_options')
permitted_charts.append(chart_dict)
return permitted_charts
diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.json b/frappe/desk/doctype/dashboard_chart/dashboard_chart.json
index 472d02a75e..3332534de6 100644
--- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.json
+++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.json
@@ -219,7 +219,7 @@
"options": "Dashboard Chart Field"
},
{
- "description": " Ex: \"colors\": [\"#d1d8dd\", \"#ff5858\"] (the options set here will override the default custom options set in the Dashboard)",
+ "description": " Ex: \"colors\": [\"#d1d8dd\", \"#ff5858\"] (the options set here will override the chart options set in the Dashboard)",
"fieldname": "custom_options",
"fieldtype": "Code",
"label": "Custom Options"
From d5364f759bb47139b35adc714b15abb497d69f40 Mon Sep 17 00:00:00 2001
From: prssanna
Date: Wed, 29 Apr 2020 18:47:14 +0530
Subject: [PATCH 164/274] fix: validate chart options json
---
frappe/desk/doctype/dashboard/dashboard.py | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/frappe/desk/doctype/dashboard/dashboard.py b/frappe/desk/doctype/dashboard/dashboard.py
index 9368315343..3d86a1e48a 100644
--- a/frappe/desk/doctype/dashboard/dashboard.py
+++ b/frappe/desk/doctype/dashboard/dashboard.py
@@ -5,6 +5,7 @@
from __future__ import unicode_literals
from frappe.model.document import Document
import frappe
+import json
class Dashboard(Document):
def on_update(self):
@@ -13,6 +14,16 @@ class Dashboard(Document):
frappe.db.sql('''update
tabDashboard set is_default = 0 where name != %s''', self.name)
+ def validate(self):
+ self.validate_custom_options()
+
+ def validate_custom_options(self):
+ if self.chart_options:
+ try:
+ json.loads(self.chart_options)
+ except ValueError as error:
+ frappe.throw("Invalid json added in the custom options: %s" % error)
+
@frappe.whitelist()
def get_permitted_charts(dashboard_name):
permitted_charts = []
From e34e8715d360195c7e3356f57b916e5a584447d2 Mon Sep 17 00:00:00 2001
From: prssanna
Date: Tue, 5 May 2020 12:17:04 +0530
Subject: [PATCH 165/274] fix: translate messages
---
frappe/desk/doctype/dashboard/dashboard.py | 2 +-
frappe/desk/doctype/dashboard_chart/dashboard_chart.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/frappe/desk/doctype/dashboard/dashboard.py b/frappe/desk/doctype/dashboard/dashboard.py
index 3d86a1e48a..daf065949c 100644
--- a/frappe/desk/doctype/dashboard/dashboard.py
+++ b/frappe/desk/doctype/dashboard/dashboard.py
@@ -22,7 +22,7 @@ class Dashboard(Document):
try:
json.loads(self.chart_options)
except ValueError as error:
- frappe.throw("Invalid json added in the custom options: %s" % error)
+ frappe.throw(_("Invalid json added in the custom options: %s" % error))
@frappe.whitelist()
def get_permitted_charts(dashboard_name):
diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py
index e7e4aefe09..4044a66638 100644
--- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py
+++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py
@@ -435,11 +435,11 @@ class DashboardChart(Document):
def check_document_type(self):
if frappe.get_meta(self.document_type).issingle:
- frappe.throw("You cannot create a dashboard chart from single DocTypes")
+ frappe.throw(_("You cannot create a dashboard chart from single DocTypes"))
def validate_custom_options(self):
if self.custom_options:
try:
json.loads(self.custom_options)
except ValueError as error:
- frappe.throw("Invalid json added in the custom options: %s" % error)
\ No newline at end of file
+ frappe.throw(_("Invalid json added in the custom options: %s" % error))
\ No newline at end of file
From 7425e5cc6c2f2e5798d4edd144b043964f852e06 Mon Sep 17 00:00:00 2001
From: prssanna
Date: Tue, 5 May 2020 12:29:21 +0530
Subject: [PATCH 166/274] fix: invalid json
---
frappe/desk/doctype/dashboard/dashboard.json | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/frappe/desk/doctype/dashboard/dashboard.json b/frappe/desk/doctype/dashboard/dashboard.json
index e17fb66436..c0e2bddcf8 100644
--- a/frappe/desk/doctype/dashboard/dashboard.json
+++ b/frappe/desk/doctype/dashboard/dashboard.json
@@ -9,12 +9,8 @@
"dashboard_name",
"is_default",
"charts",
-<<<<<<< HEAD
- "default_chart_custom_options",
+ "chart_options",
"cards"
-=======
- "chart_options"
->>>>>>> fix: better naming
],
"fields": [
{
@@ -40,9 +36,9 @@
},
{
"description": "Set Default Options for all charts on this Dashboard (Ex: \"colors\": [\"#d1d8dd\", \"#ff5858\"])",
- "fieldname": "default_chart_custom_options",
+ "fieldname": "chart_options",
"fieldtype": "Code",
- "label": "Default Chart Custom Options",
+ "label": "Chart Options",
"options": "JSON"
},
{
From 58d75ad5d7f40ba71f3ba40685d03354321ef2ed Mon Sep 17 00:00:00 2001
From: prssanna
Date: Tue, 5 May 2020 12:40:15 +0530
Subject: [PATCH 167/274] fix: import _
---
frappe/desk/doctype/dashboard/dashboard.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/frappe/desk/doctype/dashboard/dashboard.py b/frappe/desk/doctype/dashboard/dashboard.py
index daf065949c..621ab19ecd 100644
--- a/frappe/desk/doctype/dashboard/dashboard.py
+++ b/frappe/desk/doctype/dashboard/dashboard.py
@@ -5,6 +5,7 @@
from __future__ import unicode_literals
from frappe.model.document import Document
import frappe
+from frappe import _
import json
class Dashboard(Document):
From 3a090e71382c19cda42ca3bce5b7c6bb5dd4fad4 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Fri, 8 May 2020 16:18:49 +0530
Subject: [PATCH 168/274] fix: translation
---
frappe/desk/doctype/dashboard/dashboard.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/desk/doctype/dashboard/dashboard.py b/frappe/desk/doctype/dashboard/dashboard.py
index 621ab19ecd..af0c48d9c6 100644
--- a/frappe/desk/doctype/dashboard/dashboard.py
+++ b/frappe/desk/doctype/dashboard/dashboard.py
@@ -23,7 +23,7 @@ class Dashboard(Document):
try:
json.loads(self.chart_options)
except ValueError as error:
- frappe.throw(_("Invalid json added in the custom options: %s" % error))
+ frappe.throw(_("Invalid json added in the custom options: {0}").format(error))
@frappe.whitelist()
def get_permitted_charts(dashboard_name):
From ee292ed2d0b5f51791fddb98c6994304c86833e8 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Fri, 8 May 2020 16:20:35 +0530
Subject: [PATCH 169/274] style: remove leading space
---
frappe/desk/doctype/dashboard_chart/dashboard_chart.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.json b/frappe/desk/doctype/dashboard_chart/dashboard_chart.json
index 3332534de6..72f5c43316 100644
--- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.json
+++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.json
@@ -219,7 +219,7 @@
"options": "Dashboard Chart Field"
},
{
- "description": " Ex: \"colors\": [\"#d1d8dd\", \"#ff5858\"] (the options set here will override the chart options set in the Dashboard)",
+ "description": "Ex: \"colors\": [\"#d1d8dd\", \"#ff5858\"] (the options set here will override the chart options set in the Dashboard)",
"fieldname": "custom_options",
"fieldtype": "Code",
"label": "Custom Options"
@@ -283,4 +283,4 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1
-}
\ No newline at end of file
+}
From 0bba2e8c28b0d434bc09a3e0fb6d6ecff42c4e5d Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Fri, 8 May 2020 16:20:52 +0530
Subject: [PATCH 170/274] fix: minor translation issue
---
frappe/desk/doctype/dashboard_chart/dashboard_chart.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py
index 4044a66638..7e375e835f 100644
--- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py
+++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py
@@ -442,4 +442,4 @@ class DashboardChart(Document):
try:
json.loads(self.custom_options)
except ValueError as error:
- frappe.throw(_("Invalid json added in the custom options: %s" % error))
\ No newline at end of file
+ frappe.throw(_("Invalid json added in the custom options: {0}").format(error))
From 9c412d60df01b5f0c555f102b950092a669ba14e Mon Sep 17 00:00:00 2001
From: prssanna
Date: Fri, 15 May 2020 00:40:01 +0530
Subject: [PATCH 171/274] fix: fix rebase
---
.../public/js/frappe/widgets/chart_widget.js | 69 ++++---------------
1 file changed, 15 insertions(+), 54 deletions(-)
diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js
index a0211284bf..e5378cf2ab 100644
--- a/frappe/public/js/frappe/widgets/chart_widget.js
+++ b/frappe/public/js/frappe/widgets/chart_widget.js
@@ -523,7 +523,6 @@ export default class ChartWidget extends Widget {
}
}
-
get_chart_args() {
let colors = this.get_chart_colors();
@@ -553,6 +552,21 @@ export default class ChartWidget extends Widget {
chart_args.data.end = new Date(`${heatmap_year+1}-01-01`);
}
+ let set_options = (options) => {
+ let custom_options = JSON.parse(options);
+ for (let key in custom_options) {
+ chart_args[key] = custom_options[key];
+ }
+ };
+
+ if (this.custom_options) {
+ set_options(this.custom_options);
+ }
+
+ if (this.chart_doc.custom_options) {
+ set_options(this.chart_doc.custom_options);
+ }
+
return chart_args;
}
@@ -593,59 +607,6 @@ export default class ChartWidget extends Widget {
}
}
- get_chart_args() {
- let colors = this.get_chart_colors();
-
- const chart_type_map = {
- Line: "line",
- Bar: "bar",
- Percentage: "percentage",
- Pie: "pie",
- Donut: "donut"
- };
-
- let chart_args = {
- data: this.data,
- type: chart_type_map[this.chart_doc.type],
- colors: colors,
- height: this.height,
- axisOptions: {
- xIsSeries: this.chart_doc.timeseries,
- shortenYAxisNumbers: 1
- }
- };
-
- let set_options = (options) => {
- let custom_options = JSON.parse(options);
- for (let key in custom_options) {
- chart_args[key] = custom_options[key];
- }
- };
-
- if (this.custom_options) {
- set_options(this.custom_options);
- }
-
- if (this.chart_doc.custom_options) {
- set_options(this.chart_doc.custom_options);
- }
-
- return chart_args;
- }
-
- get_chart_colors() {
- let colors = [];
- if (this.chart_doc.y_axis.length) {
- this.chart_doc.y_axis.map(field => {
- colors.push(field.color);
- });
- } else if (["Line", "Bar"].includes(this.chart_doc.type)) {
- colors = [this.chart_doc.color || "light-blue"];
- }
-
- return colors;
- }
-
update_last_synced() {
let last_synced_text = __("Last synced {0}", [
comment_when(this.chart_doc.last_synced_on)
From 76db5e11c8cb8ee5f12e71e46c29e6c78d5d71bd Mon Sep 17 00:00:00 2001
From: Nabin Hait
Date: Mon, 27 Apr 2020 16:51:31 +0530
Subject: [PATCH 172/274] feat: Section Break without border
---
frappe/core/doctype/docfield/docfield.json | 10 +++++++++-
.../custom/doctype/custom_field/custom_field.json | 10 +++++++++-
.../doctype/customize_form/customize_form.py | 3 ++-
.../customize_form_field/customize_form_field.json | 10 +++++++++-
frappe/database/mariadb/framework_mariadb.sql | 1 +
frappe/database/postgres/framework_postgres.sql | 1 +
frappe/public/js/frappe/form/layout.js | 14 ++++++++++++++
frappe/public/less/form.less | 11 ++++++++++-
8 files changed, 55 insertions(+), 5 deletions(-)
diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json
index 6d8ee41a5a..8e7516cd0a 100644
--- a/frappe/core/doctype/docfield/docfield.json
+++ b/frappe/core/doctype/docfield/docfield.json
@@ -43,6 +43,7 @@
"report_hide",
"remember_last_selected_value",
"ignore_xss_filter",
+ "hide_border",
"property_depends_on_section",
"mandatory_depends_on",
"column_break_38",
@@ -448,12 +449,19 @@
{
"fieldname": "column_break_38",
"fieldtype": "Column Break"
+ },
+ {
+ "default": "0",
+ "depends_on": "eval:doc.fieldtype=='Section Break'",
+ "fieldname": "hide_border",
+ "fieldtype": "Check",
+ "label": "Hide Border"
}
],
"idx": 1,
"istable": 1,
"links": [],
- "modified": "2020-04-19 21:54:13.783908",
+ "modified": "2020-04-27 11:38:21.223185",
"modified_by": "Administrator",
"module": "Core",
"name": "DocField",
diff --git a/frappe/custom/doctype/custom_field/custom_field.json b/frappe/custom/doctype/custom_field/custom_field.json
index 394f38b56c..122e6c7070 100644
--- a/frappe/custom/doctype/custom_field/custom_field.json
+++ b/frappe/custom/doctype/custom_field/custom_field.json
@@ -48,6 +48,7 @@
"allow_in_quick_entry",
"ignore_xss_filter",
"translatable",
+ "hide_border",
"description",
"permlevel",
"width",
@@ -378,12 +379,19 @@
"fieldname": "in_preview",
"fieldtype": "Check",
"label": "In Preview"
+ },
+ {
+ "default": "0",
+ "depends_on": "eval:doc.fieldtype=='Section Break'",
+ "fieldname": "hide_border",
+ "fieldtype": "Check",
+ "label": "Hide Border"
}
],
"icon": "fa fa-glass",
"idx": 1,
"links": [],
- "modified": "2020-04-10 11:57:10.392218",
+ "modified": "2020-04-27 11:40:48.325481",
"modified_by": "Administrator",
"module": "Custom",
"name": "Custom Field",
diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py
index ebf01d11b3..6a54d9c7e6 100644
--- a/frappe/custom/doctype/customize_form/customize_form.py
+++ b/frappe/custom/doctype/customize_form/customize_form.py
@@ -76,7 +76,8 @@ docfield_properties = {
'remember_last_selected_value': 'Check',
'allow_bulk_edit': 'Check',
'auto_repeat': 'Link',
- 'allow_in_quick_entry': 'Check'
+ 'allow_in_quick_entry': 'Check',
+ 'hide_border': 'Check'
}
allowed_fieldtype_change = (('Currency', 'Float', 'Percent'), ('Small Text', 'Data'),
diff --git a/frappe/custom/doctype/customize_form_field/customize_form_field.json b/frappe/custom/doctype/customize_form_field/customize_form_field.json
index d7887cf8bd..2c5fb874f7 100644
--- a/frappe/custom/doctype/customize_form_field/customize_form_field.json
+++ b/frappe/custom/doctype/customize_form_field/customize_form_field.json
@@ -39,6 +39,7 @@
"allow_on_submit",
"report_hide",
"remember_last_selected_value",
+ "hide_border",
"property_depends_on_section",
"mandatory_depends_on",
"column_break_33",
@@ -388,12 +389,19 @@
"fieldname": "in_preview",
"fieldtype": "Check",
"label": "In Preview"
+ },
+ {
+ "default": "0",
+ "depends_on": "eval:doc.fieldtype=='Section Break'",
+ "fieldname": "hide_border",
+ "fieldtype": "Check",
+ "label": "Hide Border"
}
],
"idx": 1,
"istable": 1,
"links": [],
- "modified": "2020-04-10 11:58:44.573537",
+ "modified": "2020-04-27 11:39:26.389300",
"modified_by": "Administrator",
"module": "Custom",
"name": "Customize Form Field",
diff --git a/frappe/database/mariadb/framework_mariadb.sql b/frappe/database/mariadb/framework_mariadb.sql
index 46940cc846..bd93069a3f 100644
--- a/frappe/database/mariadb/framework_mariadb.sql
+++ b/frappe/database/mariadb/framework_mariadb.sql
@@ -63,6 +63,7 @@ CREATE TABLE `tabDocField` (
`precision` varchar(255) DEFAULT NULL,
`length` int(11) NOT NULL DEFAULT 0,
`translatable` int(1) NOT NULL DEFAULT 0,
+ `hide_border` int(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`name`),
KEY `parent` (`parent`),
KEY `label` (`label`),
diff --git a/frappe/database/postgres/framework_postgres.sql b/frappe/database/postgres/framework_postgres.sql
index 26760dbcc9..76309e7347 100644
--- a/frappe/database/postgres/framework_postgres.sql
+++ b/frappe/database/postgres/framework_postgres.sql
@@ -63,6 +63,7 @@ CREATE TABLE "tabDocField" (
"precision" varchar(255) DEFAULT NULL,
"length" bigint NOT NULL DEFAULT 0,
"translatable" smallint NOT NULL DEFAULT 0,
+ "hide_border" smallint NOT NULL DEFAULT 0,
PRIMARY KEY ("name")
) ;
diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js
index 5aeb29b1ed..26131fc9c7 100644
--- a/frappe/public/js/frappe/form/layout.js
+++ b/frappe/public/js/frappe/form/layout.js
@@ -236,6 +236,7 @@ frappe.ui.form.Layout = Class.extend({
// collapse sections
if(this.frm) {
this.refresh_section_collapse();
+ this.refresh_section_border();
}
},
@@ -307,6 +308,16 @@ frappe.ui.form.Layout = Class.extend({
}
},
+ refresh_section_border: function() {
+ if(!this.doc) return;
+ this.sections.forEach(section => {
+ const df = section.df;
+ if (df && cint(df.hide_border)) {
+ section.hide_border(true);
+ }
+ })
+ },
+
attach_doc_and_docfields: function(refresh) {
var me = this;
for(var i=0, l=this.fields_list.length; i
Date: Mon, 11 May 2020 17:29:24 +0530
Subject: [PATCH 173/274] fix: linting issue
---
frappe/public/js/frappe/form/layout.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js
index 26131fc9c7..c8d5c9b422 100644
--- a/frappe/public/js/frappe/form/layout.js
+++ b/frappe/public/js/frappe/form/layout.js
@@ -309,13 +309,13 @@ frappe.ui.form.Layout = Class.extend({
},
refresh_section_border: function() {
- if(!this.doc) return;
+ if (!this.doc) return;
this.sections.forEach(section => {
const df = section.df;
if (df && cint(df.hide_border)) {
section.hide_border(true);
}
- })
+ });
},
attach_doc_and_docfields: function(refresh) {
From 30c22ba3e576770bea3e28287e912637d4720918 Mon Sep 17 00:00:00 2001
From: Nabin Hait
Date: Fri, 15 May 2020 10:11:42 +0530
Subject: [PATCH 174/274] fix: hide section border on make, instead of refresh
---
frappe/public/js/frappe/form/layout.js | 21 ++++++---------------
1 file changed, 6 insertions(+), 15 deletions(-)
diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js
index c8d5c9b422..d6106255a0 100644
--- a/frappe/public/js/frappe/form/layout.js
+++ b/frappe/public/js/frappe/form/layout.js
@@ -236,7 +236,6 @@ frappe.ui.form.Layout = Class.extend({
// collapse sections
if(this.frm) {
this.refresh_section_collapse();
- this.refresh_section_border();
}
},
@@ -308,16 +307,6 @@ frappe.ui.form.Layout = Class.extend({
}
},
- refresh_section_border: function() {
- if (!this.doc) return;
- this.sections.forEach(section => {
- const df = section.df;
- if (df && cint(df.hide_border)) {
- section.hide_border(true);
- }
- });
- },
-
attach_doc_and_docfields: function(refresh) {
var me = this;
for(var i=0, l=this.fields_list.length; i').appendTo(this.wrapper);
},
+
make_head: function() {
var me = this;
if(!this.df.collapsible) {
@@ -674,12 +666,11 @@ frappe.ui.form.Section = Class.extend({
}
});
},
- hide_border(hide) {
- this.body.parent().toggleClass("hide-border", hide);
- },
+
is_collapsed() {
return this.body.hasClass('hide');
},
+
has_missing_mandatory: function() {
var missing_mandatory = false;
for (var j=0, l=this.fields_list.length; j < l; j++) {
From 85d86fbedfd0707e9d9493470349e884b8fe74ac Mon Sep 17 00:00:00 2001
From: Gavin D'souza
Date: Fri, 15 May 2020 11:21:24 +0530
Subject: [PATCH 175/274] refactor: moved remote_migrations to
frappe.integrations.frappe_providers
fix: exit code fixes and minor bug fix
---
frappe/commands/site.py | 8 +++----
.../integrations/frappe_providers/__init__.py | 11 +++++++++
.../frappe_providers/frappecloud.py} | 23 ++++++++-----------
3 files changed, 24 insertions(+), 18 deletions(-)
create mode 100644 frappe/integrations/frappe_providers/__init__.py
rename frappe/{utils/remote_migrations.py => integrations/frappe_providers/frappecloud.py} (95%)
diff --git a/frappe/commands/site.py b/frappe/commands/site.py
index 10bf700340..1f22650930 100755
--- a/frappe/commands/site.py
+++ b/frappe/commands/site.py
@@ -257,12 +257,12 @@ def migrate(context, rebuild_website=False, skip_failing=False):
compileall.compile_dir('../apps', quiet=1, rx=re.compile('.*node_modules.*'))
@click.command('migrate-to')
-@click.argument('site_url')
+@click.argument('frappe_provider')
@pass_context
-def migrate_to(context, site_url):
- from frappe.utils.remote_migrations import migrate_to
+def migrate_to(context, frappe_provider):
+ from frappe.integrations.frappe_providers import migrate_to
for site in context.sites:
- migrate_to(site, site_url)
+ migrate_to(site, frappe_provider)
@click.command('run-patch')
@click.argument('module')
diff --git a/frappe/integrations/frappe_providers/__init__.py b/frappe/integrations/frappe_providers/__init__.py
new file mode 100644
index 0000000000..31a0cf1c04
--- /dev/null
+++ b/frappe/integrations/frappe_providers/__init__.py
@@ -0,0 +1,11 @@
+# imports - module imports
+from frappe.integrations.frappe_providers.frappecloud import frappecloud_migrator
+
+
+def migrate_to(local_site, frappe_provider):
+ if frappe_provider in ("frappe.cloud", "frappecloud.com"):
+ frappe_provider = "staging.frappe.cloud"
+ return frappecloud_migrator(local_site, frappe_provider)
+ else:
+ print("{} is not supported yet".format(frappe_provider))
+ sys.exit(1)
diff --git a/frappe/utils/remote_migrations.py b/frappe/integrations/frappe_providers/frappecloud.py
similarity index 95%
rename from frappe/utils/remote_migrations.py
rename to frappe/integrations/frappe_providers/frappecloud.py
index 90f8db0b74..1785823a2d 100644
--- a/frappe/utils/remote_migrations.py
+++ b/frappe/integrations/frappe_providers/frappecloud.py
@@ -13,7 +13,7 @@ import requests
import frappe
import frappe.utils.backups
from frappe.utils import get_installed_apps_info
-from frappe.utils.commands import render_table, padme
+from frappe.utils.commands import render_table, add_line_after
def get_new_site_options():
@@ -27,7 +27,7 @@ def get_new_site_options():
def is_valid_subdomain(subdomain):
- if len(subdomain) < 6:
+ if len(subdomain) < 5:
print("Subdomain too short. Use 5 or more characters")
return False
matched = re.match("^[a-z0-9][a-z0-9-]*[a-z0-9]$", subdomain)
@@ -60,7 +60,7 @@ def render_plan_table(plans_list):
render_table(plans_table)
-@padme
+@add_line_after
def choose_plan(plans_list):
print("{} plans available".format(len(plans_list)))
available_plans = [plan["name"] for plan in plans_list]
@@ -75,7 +75,7 @@ def choose_plan(plans_list):
print("Invalid Selection ❌")
-@padme
+@add_line_after
def check_app_compat(available_group):
is_compat = True
incompatible_apps, filtered_apps, branch_msgs = [], [], []
@@ -125,7 +125,7 @@ def render_group_table(app_groups):
render_table(app_groups_table)
-@padme
+@add_line_after
def filter_apps(app_groups):
render_group_table(app_groups)
@@ -145,7 +145,7 @@ def filter_apps(app_groups):
return selected_group["name"], filtered_apps
-@padme
+@add_line_after
def create_session():
# take user input from STDIN
username = click.prompt("Username").strip()
@@ -164,7 +164,7 @@ def create_session():
print("Authorization Failed with Error Code {}".format(login_sc.status_code))
-@padme
+@add_line_after
def get_subdomain(domain):
while True:
subdomain = click.prompt("Enter subdomain").strip()
@@ -173,7 +173,7 @@ def get_subdomain(domain):
return subdomain
-@padme
+@add_line_after
def upload_backup(local_site):
# take backup
files_session = {}
@@ -256,12 +256,7 @@ def frappecloud_migrator(local_site, remote_site):
print("Request failed with error code {}".format(site_creation_request.status_code))
reason = html2text(site_creation_request.text)
print(reason)
+ sys.exit(1)
-
-def migrate_to(local_site, remote_site):
- if remote_site in ("frappe.cloud", "frappecloud.com"):
- remote_site = "frappecloud.com"
- return frappecloud_migrator(local_site, remote_site)
else:
- print("{} is not supported yet".format(remote_site))
sys.exit(1)
From 15b96f8915f2d88bb2bfa200b63f7176c06f3cc9 Mon Sep 17 00:00:00 2001
From: Himanshu Warekar
Date: Fri, 15 May 2020 11:45:44 +0530
Subject: [PATCH 176/274] fix: sider fixes
---
.../doctype/package_publish_tool/package_publish_tool.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/frappe/custom/doctype/package_publish_tool/package_publish_tool.js b/frappe/custom/doctype/package_publish_tool/package_publish_tool.js
index 7822299f21..4c10b609a8 100644
--- a/frappe/custom/doctype/package_publish_tool/package_publish_tool.js
+++ b/frappe/custom/doctype/package_publish_tool/package_publish_tool.js
@@ -37,10 +37,10 @@ frappe.ui.form.on('Package Publish Tool', {
set_dirty_trigger: function(frm) {
$(frm.wrapper).on("dirty", function() {
frm.page.set_primary_action(__('Save'), () => frm.save());
- })
+ });
},
set_deploy_primary_action: function(frm) {
- if (frm.doc.package_details.length && frm.doc.instances.length){
+ if (frm.doc.package_details.length && frm.doc.instances.length) {
frm.page.set_primary_action(__("Deploy"), function () {
frappe.show_alert({
message: __("Deploying Package"),
@@ -49,7 +49,7 @@ frappe.ui.form.on('Package Publish Tool', {
frappe.call({
method: "frappe.custom.doctype.package_publish_tool.package_publish_tool.deploy_package",
- callback: function(r) {
+ callback: function() {
frappe.msgprint(__("Package has been published."));
}
});
From ed344ae8cf2d303a55c1cee07b30765babf1fdad Mon Sep 17 00:00:00 2001
From: Gavin D'souza
Date: Fri, 15 May 2020 11:23:42 +0530
Subject: [PATCH 177/274] chore: updated docstrings for command APIs
---
frappe/commands/site.py | 1 +
frappe/utils/commands.py | 7 +++++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/frappe/commands/site.py b/frappe/commands/site.py
index 1f22650930..d92c727dc7 100755
--- a/frappe/commands/site.py
+++ b/frappe/commands/site.py
@@ -260,6 +260,7 @@ def migrate(context, rebuild_website=False, skip_failing=False):
@click.argument('frappe_provider')
@pass_context
def migrate_to(context, frappe_provider):
+ "Migrates site to the specified provider"
from frappe.integrations.frappe_providers import migrate_to
for site in context.sites:
migrate_to(site, frappe_provider)
diff --git a/frappe/utils/commands.py b/frappe/utils/commands.py
index babefc56e2..99322b50ba 100644
--- a/frappe/utils/commands.py
+++ b/frappe/utils/commands.py
@@ -5,6 +5,7 @@ from terminaltables import AsciiTable
@functools.lru_cache(maxsize=1024)
def get_first_party_apps():
+ """Get list of all apps under orgs: frappe. erpnext from GitHub"""
apps = []
for org in ["frappe", "erpnext"]:
req = requests.get(f"https://api.github.com/users/{org}/repos", {"type": "sources", "per_page": 200})
@@ -17,15 +18,17 @@ def render_table(data):
print(AsciiTable(data).table)
-def padme(me):
+def add_line_after(function):
+ """Adds an extra line to STDOUT after the execution of a function this decorates"""
def empty_line(*args, **kwargs):
- result = me(*args, **kwargs)
+ result = function(*args, **kwargs)
print()
return result
return empty_line
def log(message, colour=''):
+ """Coloured log outputs to STDOUT"""
colours = {
"nc": '\033[0m',
"blue": '\033[94m',
From c6a66eb47b895521fa2a3660316fcaf46d149d0b Mon Sep 17 00:00:00 2001
From: prssanna
Date: Fri, 15 May 2020 13:31:13 +0530
Subject: [PATCH 178/274] fix: use different number system for india
---
.../js/frappe/widgets/number_card_widget.js | 3 +-
frappe/public/js/frappe/widgets/utils.js | 45 ++++++++++++++-----
2 files changed, 37 insertions(+), 11 deletions(-)
diff --git a/frappe/public/js/frappe/widgets/number_card_widget.js b/frappe/public/js/frappe/widgets/number_card_widget.js
index cda17e08bc..77cb8a59c2 100644
--- a/frappe/public/js/frappe/widgets/number_card_widget.js
+++ b/frappe/public/js/frappe/widgets/number_card_widget.js
@@ -119,7 +119,8 @@ export default class NumberCardWidget extends Widget {
get_formatted_number() {
const based_on_df =
frappe.meta.get_docfield(this.card_doc.document_type, this.card_doc.aggregate_function_based_on);
- const shortened_number = shorten_number(this.number);
+ const default_country = frappe.sys_defaults.country;
+ const shortened_number = shorten_number(this.number, default_country);
let number_parts = shortened_number.split(' ');
const symbol = number_parts[1] || '';
diff --git a/frappe/public/js/frappe/widgets/utils.js b/frappe/public/js/frappe/widgets/utils.js
index f336335d1c..ab807bb0b1 100644
--- a/frappe/public/js/frappe/widgets/utils.js
+++ b/frappe/public/js/frappe/widgets/utils.js
@@ -127,19 +127,44 @@ function go_to_list_with_filters(doctype, filters) {
});
}
-function shorten_number(number) {
+function shorten_number(number, country) {
+ country = country || '';
+ const number_system = get_number_system(country);
let x = Math.abs(Math.round(number));
+ for (const map of number_system) {
+ if (x >= map.divisor) {
+ return Math.round(number/map.divisor) + ' ' + map.symbol;
+ }
+ };
+ return number.toFixed();
+}
- switch (true) {
- case x >= 1.0e+12:
- return Math.round(number/1.0e+12) + " T";
- case x >= 1.0e+9:
- return Math.round(number/1.0e+9) + " B";
- case x >= 1.0e+6:
- return Math.round(number/1.0e+6) + " M";
- default:
- return number.toFixed();
+function get_number_system(country) {
+ let number_system_map = {
+ 'India':
+ [{
+ divisor: 1.0e+7,
+ symbol: 'Cr'
+ },
+ {
+ divisor: 1.0e+5,
+ symbol: 'Lakh'
+ }],
+ '':
+ [{
+ divisor: 1.0e+12,
+ symbol: 'T'
+ },
+ {
+ divisor: 1.0e+9,
+ symbol: 'B'
+ },
+ {
+ divisor: 1.0e+6,
+ symbol: 'M'
+ }]
}
+ return number_system_map[country];
}
export { generate_route, generate_grid, build_summary_item, go_to_list_with_filters, shorten_number };
\ No newline at end of file
From 2ebdb292f93823f242b40360bdeda8785de6020c Mon Sep 17 00:00:00 2001
From: prssanna
Date: Fri, 15 May 2020 13:35:21 +0530
Subject: [PATCH 179/274] style: fix semicolon
---
frappe/public/js/frappe/widgets/utils.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/frappe/public/js/frappe/widgets/utils.js b/frappe/public/js/frappe/widgets/utils.js
index ab807bb0b1..c92bdc1b5f 100644
--- a/frappe/public/js/frappe/widgets/utils.js
+++ b/frappe/public/js/frappe/widgets/utils.js
@@ -135,7 +135,7 @@ function shorten_number(number, country) {
if (x >= map.divisor) {
return Math.round(number/map.divisor) + ' ' + map.symbol;
}
- };
+ }
return number.toFixed();
}
@@ -163,7 +163,7 @@ function get_number_system(country) {
divisor: 1.0e+6,
symbol: 'M'
}]
- }
+ };
return number_system_map[country];
}
From 9d4a4ef6f4c1a92ec5f0918f4773cb605586cbc9 Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Fri, 15 May 2020 14:03:04 +0530
Subject: [PATCH 180/274] feat: collapse sections by default for page builder
dialog
---
frappe/public/js/frappe/utils/web_page_block.js | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/utils/web_page_block.js b/frappe/public/js/frappe/utils/web_page_block.js
index bcf821bcfa..acc7943671 100644
--- a/frappe/public/js/frappe/utils/web_page_block.js
+++ b/frappe/public/js/frappe/utils/web_page_block.js
@@ -4,7 +4,12 @@ frappe.ui.form.on('Web Page Block', {
frappe.model.with_doc('Web Template', row.web_template).then(doc => {
let d = new frappe.ui.Dialog({
title: __('Edit Values'),
- fields: doc.fields,
+ fields: doc.fields.map(df => {
+ if (df.fieldtype == "Section Break") {
+ df.collapsible = 1;
+ }
+ return df
+ }),
primary_action(values) {
frappe.model.set_value(
cdt,
From a7b431465d127360f995f45acd6bb605b58e111f Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Fri, 15 May 2020 14:03:37 +0530
Subject: [PATCH 181/274] feat: allow 9 cards in card grid
---
.../section_with_cards.html | 2 +-
.../section_with_cards.json | 26 ++++++++++++++++++-
2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/frappe/website/web_template/section_with_cards/section_with_cards.html b/frappe/website/web_template/section_with_cards/section_with_cards.html
index 1f0f71a15b..431a64a86d 100644
--- a/frappe/website/web_template/section_with_cards/section_with_cards.html
+++ b/frappe/website/web_template/section_with_cards/section_with_cards.html
@@ -29,7 +29,7 @@
{%- set card_size = card_size or 'Small' -%}
- {%- for index in ['1', '2', '3', '4', '5', '6', '7', '8'] -%}
+ {%- for index in ['1', '2', '3', '4', '5', '6', '7', '8', '9'] -%}
{%- set title = values['card_' + index + '_title'] -%}
{%- set content = values['card_' + index + '_content'] -%}
{%- set url = values['card_' + index + '_url'] -%}
diff --git a/frappe/website/web_template/section_with_cards/section_with_cards.json b/frappe/website/web_template/section_with_cards/section_with_cards.json
index 9ec430ae60..311cced829 100644
--- a/frappe/website/web_template/section_with_cards/section_with_cards.json
+++ b/frappe/website/web_template/section_with_cards/section_with_cards.json
@@ -213,10 +213,34 @@
"fieldtype": "Data",
"label": "URL",
"reqd": 0
+ },
+ {
+ "fieldname": "card_9",
+ "fieldtype": "Section Break",
+ "label": "Card 9",
+ "reqd": 0
+ },
+ {
+ "fieldname": "card_9_title",
+ "fieldtype": "Data",
+ "label": "Title",
+ "reqd": 0
+ },
+ {
+ "fieldname": "card_9_content",
+ "fieldtype": "Small Text",
+ "label": "Content",
+ "reqd": 0
+ },
+ {
+ "fieldname": "card_9_url",
+ "fieldtype": "Data",
+ "label": "URL",
+ "reqd": 0
}
],
"idx": 0,
- "modified": "2020-04-29 22:40:03.362229",
+ "modified": "2020-05-15 13:52:02.984001",
"modified_by": "Administrator",
"name": "Section with Cards",
"owner": "Administrator",
From 7721d540167d30f76308a2bc557afb29f021b33a Mon Sep 17 00:00:00 2001
From: Shivam Mishra
Date: Fri, 15 May 2020 14:15:59 +0530
Subject: [PATCH 182/274] feat: add hide login to website settings
---
frappe/templates/includes/navbar/navbar_login.html | 2 +-
.../doctype/website_settings/website_settings.json | 9 ++++++++-
.../website/doctype/website_settings/website_settings.py | 2 ++
3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/frappe/templates/includes/navbar/navbar_login.html b/frappe/templates/includes/navbar/navbar_login.html
index 2a58efe039..4e2c6dc93b 100644
--- a/frappe/templates/includes/navbar/navbar_login.html
+++ b/frappe/templates/includes/navbar/navbar_login.html
@@ -1,5 +1,5 @@
-{% if not only_static %}
+{% if not only_static and not hide_login %}
{% if frappe.session.user != 'Guest' %}