From 15eab8fb8000f814db4c2cd499cd667a55ef4c76 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 29 Apr 2020 12:28:08 +0530 Subject: [PATCH 001/319] perf: Cache get_tables values - To avoid redundant db calls --- frappe/database/database.py | 11 ++++++++++- frappe/database/schema.py | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index b083ff1014..cc76745c2e 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -769,7 +769,16 @@ class Database(object): return ("tab" + doctype) in self.get_tables() def get_tables(self): - return [d[0] for d in self.sql("select table_name from information_schema.tables where table_schema not in ('pg_catalog', 'information_schema')")] + tables = frappe.cache().get_value('db_tables') + if not tables: + table_rows = self.sql(""" + SELECT table_name + FROM information_schema.tables + WHERE table_schema NOT IN ('pg_catalog', 'information_schema') + """) + tables = set([d[0] for d in table_rows]) + frappe.cache().set_value('db_tables', tables) + return tables def a_row_exists(self, doctype): """Returns True if atleast one row exists.""" diff --git a/frappe/database/schema.py b/frappe/database/schema.py index 28e055f382..3d484a1f1b 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -31,6 +31,7 @@ class DBTable: def sync(self): if self.is_new(): + frappe.cache().delete_key('db_tables') self.create() else: frappe.cache().hdel('table_columns', self.table_name) From c06234802b3e2409d88fe188b9766bc1a1a54f27 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 29 Apr 2020 14:07:51 +0530 Subject: [PATCH 002/319] fix: Translatable string --- frappe/database/schema.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/frappe/database/schema.py b/frappe/database/schema.py index 3d484a1f1b..9c7008a8ed 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -144,10 +144,9 @@ class DBTable: if max_length and max_length[0][0] and max_length[0][0] > new_length: if col.fieldname in self.columns: self.columns[col.fieldname].length = current_length - - frappe.msgprint(_("""Reverting length to {0} for '{1}' in '{2}'; - Setting the length as {3} will cause truncation of data.""") - .format(current_length, col.fieldname, self.doctype, new_length)) + info_message = _("Reverting length to {0} for '{1}' in '{2}'. Setting the length as {3} will cause truncation of data.") \ + .format(current_length, col.fieldname, self.doctype, new_length) + frappe.msgprint(info_message) def is_new(self): return self.table_name not in frappe.db.get_tables() From 93d9fbb10b4a1ff372356a17f93e0e5720fe5342 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 29 Apr 2020 14:39:14 +0530 Subject: [PATCH 003/319] fix: Directly used set comprehension As indicated by deepsource --- frappe/database/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index cc76745c2e..103538944c 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -776,7 +776,7 @@ class Database(object): FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema') """) - tables = set([d[0] for d in table_rows]) + tables = set(d[0] for d in table_rows) frappe.cache().set_value('db_tables', tables) return tables From 04fb48165f7de69763b314080eb92406ecad1302 Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Tue, 28 Apr 2020 19:22:20 +0530 Subject: [PATCH 004/319] fix: do not check for frappe.conf.monitor while stopping monitor (cherry picked from commit a195421097b0ded8b531ce74ad9cf831f95780b1) --- frappe/monitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/monitor.py b/frappe/monitor.py index 7181bd92ad..cd365fd13f 100644 --- a/frappe/monitor.py +++ b/frappe/monitor.py @@ -23,7 +23,7 @@ def start(transaction_type="request", method=None, kwargs=None): def stop(response=None): - if frappe.conf.monitor and hasattr(frappe.local, "monitor"): + if hasattr(frappe.local, "monitor"): frappe.local.monitor.dump(response) From 9d7829761c1f0c595d4301263d56622dc9faf9e2 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 30 Apr 2020 14:16:29 +0530 Subject: [PATCH 005/319] fix: Clear db_tables cache whenever a table is created or dropped --- frappe/database/database.py | 7 +++++++ frappe/database/schema.py | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index 103538944c..b81a26bb81 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -124,6 +124,8 @@ class Database(object): # in transaction validations self.check_transaction_status(query) + self.clear_db_table_cache(query) + # autocommit if auto_commit: self.commit() @@ -277,6 +279,11 @@ class Database(object): ret.append(frappe._dict(zip(keys, values))) return ret + @staticmethod + def clear_db_table_cache(query): + if query and query.strip().split()[0].lower() in {'drop', 'create'}: + frappe.cache().delete_key('db_tables') + @staticmethod def needs_formatting(result, formatted): """Returns true if the first row in the result has a Date, Datetime, Long Int.""" diff --git a/frappe/database/schema.py b/frappe/database/schema.py index 9c7008a8ed..fc6215061a 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -31,7 +31,6 @@ class DBTable: def sync(self): if self.is_new(): - frappe.cache().delete_key('db_tables') self.create() else: frappe.cache().hdel('table_columns', self.table_name) From b7d077589299ae305a70471e9dccc29e7f8dec67 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 30 Apr 2020 14:36:42 +0530 Subject: [PATCH 006/319] fix: Add db_tables to global cache keys --- frappe/cache_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/cache_manager.py b/frappe/cache_manager.py index 78f452db21..2daed59074 100644 --- a/frappe/cache_manager.py +++ b/frappe/cache_manager.py @@ -16,7 +16,7 @@ global_cache_keys = ("app_hooks", "installed_apps", 'scheduler_events', 'time_zone', 'webhooks', 'active_domains', 'active_modules', 'assignment_rule', 'server_script_map', 'wkhtmltopdf_version', 'domain_restricted_doctypes', 'domain_restricted_pages', 'information_schema:counts', - 'sitemap_routes') + 'sitemap_routes', 'db_tables') user_cache_keys = ("bootinfo", "user_recent", "roles", "user_doc", "lang", "defaults", "user_permissions", "home_page", "linked_with", From 53f0387e217ffd57732b89a408802f1d946b5fe2 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Wed, 29 Apr 2020 16:43:01 +0530 Subject: [PATCH 007/319] refactor: Fix redundant cache value set --- frappe/database/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index b81a26bb81..90d07e457c 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -784,7 +784,7 @@ class Database(object): WHERE table_schema NOT IN ('pg_catalog', 'information_schema') """) tables = set(d[0] for d in table_rows) - frappe.cache().set_value('db_tables', tables) + frappe.cache().set_value('db_tables', tables) return tables def a_row_exists(self, doctype): From 056d3d382ce71ca1c5b376100342fe1d13afc3cc Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Wed, 29 Apr 2020 21:58:00 +0530 Subject: [PATCH 008/319] chore: fix deepsource issues * use set comprehension instead of generator * remove redundant else statement Signed-off-by: Chinmay D. Pai --- frappe/database/database.py | 2 +- frappe/database/schema.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index 90d07e457c..101b97c915 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -783,7 +783,7 @@ class Database(object): FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema') """) - tables = set(d[0] for d in table_rows) + tables = {d[0] for d in table_rows} frappe.cache().set_value('db_tables', tables) return tables diff --git a/frappe/database/schema.py b/frappe/database/schema.py index fc6215061a..52dc2ba917 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -137,8 +137,7 @@ class DBTable: if frappe.db.is_missing_column(e): # Unknown column 'column_name' in 'field list' continue - else: - raise + raise if max_length and max_length[0][0] and max_length[0][0] > new_length: if col.fieldname in self.columns: From f01f03ac771a6bbf67e19c4e253c81f8e370a03c Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 30 Apr 2020 14:32:00 +0530 Subject: [PATCH 009/319] fix: check for self linking and circular linking while getting submitted linked docs --- frappe/desk/form/linked_with.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/frappe/desk/form/linked_with.py b/frappe/desk/form/linked_with.py index 6c679bf312..5f5f6e4f82 100644 --- a/frappe/desk/form/linked_with.py +++ b/frappe/desk/form/linked_with.py @@ -13,7 +13,7 @@ from frappe.modules import load_doctype_module @frappe.whitelist() -def get_submitted_linked_docs(doctype, name, docs=None): +def get_submitted_linked_docs(doctype, name, docs=None, linked=None): """ Get all nested submitted linked doctype linkinfo @@ -31,12 +31,23 @@ def get_submitted_linked_docs(doctype, name, docs=None): if not docs: docs = [] + if not linked: + linked = {} + linkinfo = get_linked_doctypes(doctype) linked_docs = get_linked_docs(doctype, name, linkinfo) link_count = 0 for link_doctype, link_names in linked_docs.items(): + if link_doctype not in linked: + linked[link_doctype] = [] + for link in link_names: + if linked and name in linked[link_doctype]: + continue + + linked[link_doctype].append(link['name']) + docinfo = link.update({"doctype": link_doctype}) validated_doc = validate_linked_doc(docinfo) @@ -47,7 +58,7 @@ def get_submitted_linked_docs(doctype, name, docs=None): if link.name in [doc.get("name") for doc in docs]: continue - links = get_submitted_linked_docs(link_doctype, link.name, docs) + links = get_submitted_linked_docs(link_doctype, link.name, docs, linked) docs.append({ "doctype": link_doctype, "name": link.name, From f387f1b54f92340d3d3e4d65a578d1f35247dc6d Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 30 Apr 2020 15:16:53 +0530 Subject: [PATCH 010/319] fix: check for self linking --- frappe/desk/form/linked_with.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frappe/desk/form/linked_with.py b/frappe/desk/form/linked_with.py index 5f5f6e4f82..72917d0341 100644 --- a/frappe/desk/form/linked_with.py +++ b/frappe/desk/form/linked_with.py @@ -43,6 +43,9 @@ def get_submitted_linked_docs(doctype, name, docs=None, linked=None): linked[link_doctype] = [] for link in link_names: + if link['name'] == name: + continue + if linked and name in linked[link_doctype]: continue From aaeccae2b014c641f4892ba72e7fa30780dcd0ad Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 28 Apr 2020 14:07:29 +0530 Subject: [PATCH 011/319] fix: Add `__unsaved` flag for newly created doc (cherry picked from commit 689b68341e04cfadf067eeea6b9e04e23ec2f1c4) --- frappe/model/create_new.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py index 91fb079fca..2142d544fe 100644 --- a/frappe/model/create_new.py +++ b/frappe/model/create_new.py @@ -45,6 +45,7 @@ def make_new_doc(doctype): doc = doc.get_valid_dict(sanitize=False) doc["doctype"] = doctype doc["__islocal"] = 1 + doc["__unsaved"] = 1 return doc From cd344d888acbe49209f6a6d98a43e359b88c7ef8 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 28 Apr 2020 14:07:43 +0530 Subject: [PATCH 012/319] fix: Fix message for doc save without changes - To avoid confusion (cherry picked from commit 0c62b0629e6391801db4d3ae47a65622ac31d3f4) --- frappe/public/js/frappe/form/save.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/save.js b/frappe/public/js/frappe/form/save.js index 7efbbe2d3d..8f88ff8db0 100644 --- a/frappe/public/js/frappe/form/save.js +++ b/frappe/public/js/frappe/form/save.js @@ -36,7 +36,7 @@ frappe.ui.form.save = function (frm, action, callback, btn) { freeze_message: freeze_message }); } else { - frappe.show_alert({message: __("Document not updated"), indicator: "yellow"}); + frappe.show_alert({message: __("No changes in document"), indicator: "blue"}); $(btn).prop("disabled", false); } }; From 4c746b7b721fb4acb4defb0c67e30877f7526727 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Sat, 25 Apr 2020 11:56:55 +0530 Subject: [PATCH 013/319] fix: Clear `__unsaved` flag in insert method (#10094) (cherry picked from commit 1c3077b2599540cb698fd6914bce45aa24bfe898) --- frappe/model/document.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frappe/model/document.py b/frappe/model/document.py index f2495e9e20..3dbb1e232a 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -268,6 +268,10 @@ class Document(BaseDocument): if hasattr(self, "__islocal"): delattr(self, "__islocal") + # clear unsaved flag + if hasattr(self, "__unsaved"): + delattr(self, "__unsaved") + if not (frappe.flags.in_migrate or frappe.local.flags.in_install or frappe.flags.in_setup_wizard): follow_document(self.doctype, self.name, frappe.session.user) return self From bc8b5c01656bdbd742bbfa47556b2a2cb00f75f0 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Fri, 24 Apr 2020 11:25:36 +0530 Subject: [PATCH 014/319] fix: Clear `__unsaved` flag after document save (#10082) (cherry picked from commit d678fc62abf8c5b8495a1ac3e97655ef704b6022) --- frappe/model/document.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frappe/model/document.py b/frappe/model/document.py index f2495e9e20..5e01f5e65f 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -329,6 +329,10 @@ class Document(BaseDocument): self.update_children() self.run_post_save_methods() + # clear unsaved flag + if hasattr(self, "__unsaved"): + delattr(self, "__unsaved") + return self def copy_attachments_from_amended_from(self): From 67c9cda529a3d8872f918a450996c67408e338a9 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Thu, 23 Apr 2020 20:38:33 +0530 Subject: [PATCH 015/319] fix: Consider `__unsaved` flag while getting doc as_dict (#10067) Co-authored-by: Prssanna Desai Co-authored-by: Prssanna Desai (cherry picked from commit 9122866c625c40032fd22d04718bbba2db8cb208) --- frappe/model/base_document.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index b2b0f6380d..f5612c1ec0 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -289,7 +289,7 @@ class BaseDocument(object): if k in default_fields: del doc[k] - for key in ("_user_tags", "__islocal", "__onload", "_liked_by", "__run_link_triggers"): + for key in ("_user_tags", "__islocal", "__onload", "_liked_by", "__run_link_triggers", "__unsaved"): if self.get(key): doc[key] = self.get(key) From 9535268ab4618fcf632f61032834c89529c45e8c Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Sun, 26 Apr 2020 21:26:28 +0530 Subject: [PATCH 016/319] fix: initialise filters in Dashboard Chart (cherry picked from commit c4c71bc5391fc1294a8fb6c020f6464723278cb1) --- 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 b2a6f0a0ff..34994b8035 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py @@ -79,7 +79,7 @@ def get(chart_name = None, chart = None, no_cache = None, filters = None, from_d to_date = chart.to_date timegrain = time_interval or chart.time_interval - filters = frappe.parse_json(filters) or frappe.parse_json(chart.filters_json) + filters = frappe.parse_json(filters) or frappe.parse_json(chart.filters_json) or [] # don't include cancelled documents filters.append([chart.document_type, 'docstatus', '<', 2, False]) From 5ffb18c725d61bd0c2318cd4c818013af6e9d6e7 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Sun, 26 Apr 2020 22:40:57 +0530 Subject: [PATCH 017/319] fix: Labels in Users Desk Page (cherry picked from commit 273df7d51cbf473c3cac857788b1fc4d6521348e) --- frappe/core/desk_page/users/users.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/core/desk_page/users/users.json b/frappe/core/desk_page/users/users.json index 30455b86e6..f1f43a4ef0 100644 --- a/frappe/core/desk_page/users/users.json +++ b/frappe/core/desk_page/users/users.json @@ -27,7 +27,7 @@ "idx": 0, "is_standard": 1, "label": "Users", - "modified": "2020-04-01 11:24:40.767676", + "modified": "2020-04-26 22:36:14.311554", "modified_by": "Administrator", "module": "Core", "name": "Users", @@ -46,12 +46,12 @@ "type": "DocType" }, { - "label": "permission-manager", + "label": "Permission Manager", "link_to": "permission-manager", "type": "Page" }, { - "label": "user-profile", + "label": "User Profile", "link_to": "user-profile", "type": "Page" } From e44188e1d2e3be6061aab065aa2fb3549a11fb4f Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Sun, 26 Apr 2020 20:32:51 +0530 Subject: [PATCH 018/319] fix: Only make form-area scrollable - Exclude grid-form-footer from scrolling area (cherry picked from commit 84a3d9271e1dca021e43738d680f3d74a1635126) --- frappe/public/less/form_grid.less | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frappe/public/less/form_grid.less b/frappe/public/less/form_grid.less index ed457a9ce8..88c5cf7bbc 100644 --- a/frappe/public/less/form_grid.less +++ b/frappe/public/less/form_grid.less @@ -263,8 +263,10 @@ } .grid-form-body { - max-height: 75vh; - overflow-y: auto; + .form-area { + max-height: 70vh; + overflow-y: auto; + } } .grid-header-toolbar { From 6685f65bccdcd756a44218385da35bbc6f5b2e22 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Sun, 26 Apr 2020 20:36:01 +0530 Subject: [PATCH 019/319] fix(style): Make grid form look visually centered & fix scrolling - Scroll -15px to make grid form look visually centered - Do not scroll if grid is displayed in modal (cherry picked from commit 3292cfb82d7a186bf28fbe1c56b45550724ad8c9) --- frappe/public/js/frappe/dom.js | 4 ++++ frappe/public/js/frappe/form/grid_row.js | 16 ++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/frappe/public/js/frappe/dom.js b/frappe/public/js/frappe/dom.js index 819ecb526e..7b59f9da08 100644 --- a/frappe/public/js/frappe/dom.js +++ b/frappe/public/js/frappe/dom.js @@ -85,6 +85,10 @@ frappe.dom = { ); }, + is_element_in_modal(element) { + return Boolean($(element).parents('.modal').length); + }, + set_style: function(txt, id) { if(!txt) return; diff --git a/frappe/public/js/frappe/form/grid_row.js b/frappe/public/js/frappe/form/grid_row.js index 31d62dc445..5ed31e6e49 100644 --- a/frappe/public/js/frappe/form/grid_row.js +++ b/frappe/public/js/frappe/form/grid_row.js @@ -527,7 +527,7 @@ export default class GridRow { return this; } show_form() { - if(!this.grid_form) { + if (!this.grid_form) { this.grid_form = new GridRowForm({ row: this }); @@ -536,13 +536,15 @@ export default class GridRow { this.row.toggle(false); // this.form_panel.toggle(true); frappe.dom.freeze("", "dark"); - if(cur_frm) cur_frm.cur_grid = this; + if (cur_frm) cur_frm.cur_grid = this; this.wrapper.addClass("grid-row-open"); - if(!frappe.dom.is_element_in_viewport(this.wrapper)) { - frappe.utils.scroll_to(this.wrapper, true, 15); + if (!frappe.dom.is_element_in_viewport(this.wrapper) + && !frappe.dom.is_element_in_modal(this.wrapper)) { + // -15 offset to make form look visually centered + frappe.utils.scroll_to(this.wrapper, true, -15); } - if(this.frm) { + if (this.frm) { this.frm.script_manager.trigger(this.doc.parentfield + "_on_form_rendered"); this.frm.script_manager.trigger("form_render", this.doc.doctype, this.doc.name); } @@ -550,7 +552,9 @@ export default class GridRow { hide_form() { frappe.dom.unfreeze(); this.row.toggle(true); - frappe.utils.scroll_to(this.row, true, 15); + if (!frappe.dom.is_element_in_modal(this.row)) { + frappe.utils.scroll_to(this.row, true, 15); + } this.refresh(); if(cur_frm) cur_frm.cur_grid = null; this.wrapper.removeClass("grid-row-open"); From c085af1b5d323b6f00481f7a6ca7e27fc461df2a Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Sun, 26 Apr 2020 17:18:11 +0530 Subject: [PATCH 020/319] Revert "fix: Set fields in grid form as read only for non-editable grids" (cherry picked from commit 75031287652d9d76914ef5c199345d8a9e2f8d1e) --- frappe/public/js/frappe/form/grid_row.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/frappe/public/js/frappe/form/grid_row.js b/frappe/public/js/frappe/form/grid_row.js index 31d62dc445..8738efc1ee 100644 --- a/frappe/public/js/frappe/form/grid_row.js +++ b/frappe/public/js/frappe/form/grid_row.js @@ -22,9 +22,6 @@ export default class GridRow { if(me.grid.allow_on_grid_editing() && me.grid.is_editable()) { // pass } else { - if (!me.grid.is_editable()) { - me.docfields.map(df => df.read_only = 1); - } me.toggle_view(); return false; } From e2c8a23fa99685527096a3c64c43f21faab4762c Mon Sep 17 00:00:00 2001 From: prssanna Date: Fri, 24 Apr 2020 13:44:37 +0530 Subject: [PATCH 021/319] fix: fix file permissions Co-authored-by: Suraj Shetty (cherry picked from commit b9baa63cfda84d69cea978b71cffbaf48cb9d3cc) --- frappe/core/doctype/file/file.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index 8741101976..2ff3a72b38 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -714,7 +714,10 @@ def has_permission(doc, ptype=None, user=None): has_access = False user = user or frappe.session.user - if not doc.is_private or doc.owner == user or user == 'Administrator': + if ptype == 'create': + has_access = frappe.has_permission('File', 'create', user=user) + + if not doc.is_private or doc.owner in [user, 'Guest'] or user == 'Administrator': has_access = True if doc.attached_to_doctype and doc.attached_to_name: From 057e5b345b87e4e2d3452f5209b6d960153d311f Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 30 Apr 2020 21:48:44 +0530 Subject: [PATCH 022/319] chore: Add change log --- frappe/change_log/v13/v13_0_0_beta_1.md | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 frappe/change_log/v13/v13_0_0_beta_1.md diff --git a/frappe/change_log/v13/v13_0_0_beta_1.md b/frappe/change_log/v13/v13_0_0_beta_1.md new file mode 100644 index 0000000000..6a31d143c5 --- /dev/null +++ b/frappe/change_log/v13/v13_0_0_beta_1.md @@ -0,0 +1,28 @@ +# Version 13.0.0 Beta 1 Release Notes + +## Major Features + +- New Desk (#9617) +- Child table pagination (#8786) +- Offsite backup (#8241) +- Events Streaming (#8567) +- Mandatory Depends On & Read Only Depends On for Document Fields (#8820) + +### Dashboard Enhancements + +- Onboarding Wizard with configurable slides (#8880) +- Save Dashboard Chart config per user (#9830) +- Dashboard permissions (#9789) +- Create Dashboard Charts from Reports (#9518) +- Web Page tracking (#9959) + +### Other Minor Features + +- Ability to cancel all linked document with a single click (#8905) +- Custom JS & CSS support in Web Form (#9121) (#9610) +- System Setting to remove seconds from datetime field (#8531) +- Added empty list graphics for list view (#8863) +- Validation for Data options and Data values (#9784) +- Introduced tnum font feature for reports (#9430) +- Allow list structure to be changed for the web view (#9431) +- Added Google API Indexing (#9411) From f4a6c34a2b8dd1ac086ae93a27b85452f95de6e4 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 30 Apr 2020 22:35:06 +0530 Subject: [PATCH 023/319] chore: Add PR Links --- frappe/change_log/v13/v13_0_0_beta_1.md | 39 +++++++++++++------------ 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/frappe/change_log/v13/v13_0_0_beta_1.md b/frappe/change_log/v13/v13_0_0_beta_1.md index 6a31d143c5..144b3e34ae 100644 --- a/frappe/change_log/v13/v13_0_0_beta_1.md +++ b/frappe/change_log/v13/v13_0_0_beta_1.md @@ -2,27 +2,28 @@ ## Major Features -- New Desk (#9617) -- Child table pagination (#8786) -- Offsite backup (#8241) -- Events Streaming (#8567) -- Mandatory Depends On & Read Only Depends On for Document Fields (#8820) +- New Desk ([#9617](https://github.com/frappe/frappe/pull/9617)) +- Child table pagination ([#8786](https://github.com/frappe/frappe/pull/8786)) +- Events Streaming ([#8567](https://github.com/frappe/frappe/pull/8567)) + ### Dashboard Enhancements -- Onboarding Wizard with configurable slides (#8880) -- Save Dashboard Chart config per user (#9830) -- Dashboard permissions (#9789) -- Create Dashboard Charts from Reports (#9518) -- Web Page tracking (#9959) +- Onboarding Wizard with configurable slides ([#8880](https://github.com/frappe/frappe/pull/8880)) +- Save Dashboard Chart config per user ([#9830](https://github.com/frappe/frappe/pull/9830)) +- Dashboard permissions ([#9789](https://github.com/frappe/frappe/pull/9789)) +- Create Dashboard Charts from Reports ([#9518](https://github.com/frappe/frappe/pull/9518)) +- Web Page tracking ([#9959](https://github.com/frappe/frappe/pull/9959)) -### Other Minor Features +### Other Features -- Ability to cancel all linked document with a single click (#8905) -- Custom JS & CSS support in Web Form (#9121) (#9610) -- System Setting to remove seconds from datetime field (#8531) -- Added empty list graphics for list view (#8863) -- Validation for Data options and Data values (#9784) -- Introduced tnum font feature for reports (#9430) -- Allow list structure to be changed for the web view (#9431) -- Added Google API Indexing (#9411) +- Ability to cancel all linked document with a single click ([#8905](https://github.com/frappe/frappe/pull/8905)) +- Custom JS & CSS support in Web Form ([#9121](https://github.com/frappe/frappe/pull/9121)) ([#9610](https://github.com/frappe/frappe/pull/9610)) +- System Setting to remove seconds from datetime field ([#8531](https://github.com/frappe/frappe/pull/8531)) +- Added empty list graphics for list view ([#8863](https://github.com/frappe/frappe/pull/8863)) +- Validation for Data options and Data values ([#9784](https://github.com/frappe/frappe/pull/9784)) +- Introduced tnum font feature for reports ([#9430](https://github.com/frappe/frappe/pull/9430)) +- Allow list structure to be changed for the web view ([#9431](https://github.com/frappe/frappe/pull/9431)) +- Offsite backup ([#8241](https://github.com/frappe/frappe/pull/8241)) +- Mandatory Depends On & Read Only Depends On for Document Fields ([#8820](https://github.com/frappe/frappe/pull/8820)) +- Added Google API Indexing ([#9411](https://github.com/frappe/frappe/pull/9411)) From 5275db5269157a8b993038c2d577a072ceab733c Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 30 Apr 2020 22:37:57 +0530 Subject: [PATCH 024/319] chore: Fix structure issue --- frappe/change_log/v13/v13_0_0_beta_1.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frappe/change_log/v13/v13_0_0_beta_1.md b/frappe/change_log/v13/v13_0_0_beta_1.md index 144b3e34ae..6bdbd5d69b 100644 --- a/frappe/change_log/v13/v13_0_0_beta_1.md +++ b/frappe/change_log/v13/v13_0_0_beta_1.md @@ -5,18 +5,17 @@ - New Desk ([#9617](https://github.com/frappe/frappe/pull/9617)) - Child table pagination ([#8786](https://github.com/frappe/frappe/pull/8786)) - Events Streaming ([#8567](https://github.com/frappe/frappe/pull/8567)) - +- Onboarding Wizard with configurable slides ([#8880](https://github.com/frappe/frappe/pull/8880)) ### Dashboard Enhancements -- Onboarding Wizard with configurable slides ([#8880](https://github.com/frappe/frappe/pull/8880)) - Save Dashboard Chart config per user ([#9830](https://github.com/frappe/frappe/pull/9830)) - Dashboard permissions ([#9789](https://github.com/frappe/frappe/pull/9789)) - Create Dashboard Charts from Reports ([#9518](https://github.com/frappe/frappe/pull/9518)) -- Web Page tracking ([#9959](https://github.com/frappe/frappe/pull/9959)) ### Other Features +- Web Page tracking ([#9959](https://github.com/frappe/frappe/pull/9959)) - Ability to cancel all linked document with a single click ([#8905](https://github.com/frappe/frappe/pull/8905)) - Custom JS & CSS support in Web Form ([#9121](https://github.com/frappe/frappe/pull/9121)) ([#9610](https://github.com/frappe/frappe/pull/9610)) - System Setting to remove seconds from datetime field ([#8531](https://github.com/frappe/frappe/pull/8531)) From 6ee02b161864115c6ebcddb3dd5d772f0d4a96d1 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 1 May 2020 19:09:24 +0530 Subject: [PATCH 025/319] feat: disable onboarding pop-up --- frappe/public/js/frappe/desk.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/frappe/public/js/frappe/desk.js b/frappe/public/js/frappe/desk.js index b5046d4b12..71898e3d1b 100644 --- a/frappe/public/js/frappe/desk.js +++ b/frappe/public/js/frappe/desk.js @@ -96,10 +96,6 @@ frappe.Application = Class.extend({ this.show_notes(); - if (frappe.boot.is_first_startup) { - this.setup_onboarding_wizard(); - } - if (frappe.ui.startup_setup_dialog && !frappe.boot.setup_complete) { frappe.ui.startup_setup_dialog.pre_show(); frappe.ui.startup_setup_dialog.show(); From bd43fe887772949c4200ee8fd1534eb74f445f0e Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 1 May 2020 19:10:04 +0530 Subject: [PATCH 026/319] chore: update change log --- frappe/change_log/v13/v13_0_0_beta_1.md | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/change_log/v13/v13_0_0_beta_1.md b/frappe/change_log/v13/v13_0_0_beta_1.md index 6bdbd5d69b..87b4d265d9 100644 --- a/frappe/change_log/v13/v13_0_0_beta_1.md +++ b/frappe/change_log/v13/v13_0_0_beta_1.md @@ -5,7 +5,6 @@ - New Desk ([#9617](https://github.com/frappe/frappe/pull/9617)) - Child table pagination ([#8786](https://github.com/frappe/frappe/pull/8786)) - Events Streaming ([#8567](https://github.com/frappe/frappe/pull/8567)) -- Onboarding Wizard with configurable slides ([#8880](https://github.com/frappe/frappe/pull/8880)) ### Dashboard Enhancements From 7a72707d16fb8155bc755800a7fd1dfb1430f935 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 29 Apr 2020 18:59:33 +0530 Subject: [PATCH 027/319] refactor: Remove Webview feature --- frappe/website/doctype/css_class/__init__.py | 0 frappe/website/doctype/css_class/css_class.js | 8 - .../website/doctype/css_class/css_class.json | 60 ------- frappe/website/doctype/css_class/css_class.py | 10 -- .../doctype/css_class/test_css_class.py | 10 -- frappe/website/doctype/web_view/__init__.py | 0 .../doctype/web_view/templates/web_view.html | 7 - .../web_view/templates/web_view_content.html | 83 ---------- .../web_view/templates/web_view_row.html | 4 - .../website/doctype/web_view/test_web_view.py | 115 ------------- frappe/website/doctype/web_view/web_view.js | 8 - frappe/website/doctype/web_view/web_view.json | 154 ------------------ frappe/website/doctype/web_view/web_view.py | 104 ------------ .../doctype/web_view_component/__init__.py | 0 .../web_view_component.json | 146 ----------------- .../web_view_component/web_view_component.py | 10 -- 16 files changed, 719 deletions(-) delete mode 100644 frappe/website/doctype/css_class/__init__.py delete mode 100644 frappe/website/doctype/css_class/css_class.js delete mode 100644 frappe/website/doctype/css_class/css_class.json delete mode 100644 frappe/website/doctype/css_class/css_class.py delete mode 100644 frappe/website/doctype/css_class/test_css_class.py delete mode 100644 frappe/website/doctype/web_view/__init__.py delete mode 100644 frappe/website/doctype/web_view/templates/web_view.html delete mode 100644 frappe/website/doctype/web_view/templates/web_view_content.html delete mode 100644 frappe/website/doctype/web_view/templates/web_view_row.html delete mode 100644 frappe/website/doctype/web_view/test_web_view.py delete mode 100644 frappe/website/doctype/web_view/web_view.js delete mode 100644 frappe/website/doctype/web_view/web_view.json delete mode 100644 frappe/website/doctype/web_view/web_view.py delete mode 100644 frappe/website/doctype/web_view_component/__init__.py delete mode 100644 frappe/website/doctype/web_view_component/web_view_component.json delete mode 100644 frappe/website/doctype/web_view_component/web_view_component.py diff --git a/frappe/website/doctype/css_class/__init__.py b/frappe/website/doctype/css_class/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/website/doctype/css_class/css_class.js b/frappe/website/doctype/css_class/css_class.js deleted file mode 100644 index 4544e249bf..0000000000 --- a/frappe/website/doctype/css_class/css_class.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2020, Frappe Technologies and contributors -// For license information, please see license.txt - -frappe.ui.form.on('CSS Class', { - // refresh: function(frm) { - - // } -}); diff --git a/frappe/website/doctype/css_class/css_class.json b/frappe/website/doctype/css_class/css_class.json deleted file mode 100644 index 2a7e1e010e..0000000000 --- a/frappe/website/doctype/css_class/css_class.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "actions": [], - "allow_import": 1, - "allow_rename": 1, - "autoname": "Prompt", - "creation": "2020-03-17 15:03:31.431344", - "doctype": "DocType", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "is_global", - "is_dynamic", - "css" - ], - "fields": [ - { - "default": "0", - "fieldname": "is_global", - "fieldtype": "Check", - "label": "Is Global?" - }, - { - "fieldname": "css", - "fieldtype": "Code", - "in_list_view": 1, - "label": "CSS", - "reqd": 1 - }, - { - "default": "0", - "description": "Website Theme elements are accessible as Jinja variables. Example: \"{{ primary_color }}\"", - "fieldname": "is_dynamic", - "fieldtype": "Check", - "label": "Is Dynamic?" - } - ], - "links": [], - "modified": "2020-03-17 17:01:14.874631", - "modified_by": "Administrator", - "module": "Website", - "name": "CSS Class", - "owner": "Administrator", - "permissions": [ - { - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "Website Manager", - "share": 1, - "write": 1 - } - ], - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1 -} \ No newline at end of file diff --git a/frappe/website/doctype/css_class/css_class.py b/frappe/website/doctype/css_class/css_class.py deleted file mode 100644 index cb9e7483d4..0000000000 --- a/frappe/website/doctype/css_class/css_class.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2020, Frappe Technologies and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -# import frappe -from frappe.model.document import Document - -class CSSClass(Document): - pass diff --git a/frappe/website/doctype/css_class/test_css_class.py b/frappe/website/doctype/css_class/test_css_class.py deleted file mode 100644 index 551b44e3f2..0000000000 --- a/frappe/website/doctype/css_class/test_css_class.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2020, Frappe Technologies and Contributors -# See license.txt -from __future__ import unicode_literals - -# import frappe -import unittest - -class TestCSSClass(unittest.TestCase): - pass diff --git a/frappe/website/doctype/web_view/__init__.py b/frappe/website/doctype/web_view/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/website/doctype/web_view/templates/web_view.html b/frappe/website/doctype/web_view/templates/web_view.html deleted file mode 100644 index bf993c05fb..0000000000 --- a/frappe/website/doctype/web_view/templates/web_view.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "templates/web.html" %} - -{% block page_content %} - {% include "frappe/website/doctype/web_view/templates/web_view_content.html" %} -{% endblock %} - - \ No newline at end of file diff --git a/frappe/website/doctype/web_view/templates/web_view_content.html b/frappe/website/doctype/web_view/templates/web_view_content.html deleted file mode 100644 index a1ac143639..0000000000 --- a/frappe/website/doctype/web_view/templates/web_view_content.html +++ /dev/null @@ -1,83 +0,0 @@ -{%- if css_rules or css -%} - - -{%- endif -%} - -{%- macro render_element(element) -%} - {%- if element.element_type in ('Content', 'Web View') -%} -
- {{ element.web_content_html }} -
- {%- elif element.element_type=='Image' -%} - - {%- endif -%} -{%- endmacro -%} - -{%- macro element_class(element) -%} - {{ element.element_class or "" }} -{%- endmacro -%} - -{%- macro element_style(element) -%} - {%- if element.element_style or element.background_color -%} - style = "{{ element.element_style or '' }} {%if element.background_color %}background-color: {{ element.background_color }};{% endif %}" - {%- endif -%} -{%- endmacro -%} - -{%- macro render_sections(sections) -%} -{%- for section in sections -%} -
-
- {%- if section.section_intro -%} -
{{ section.section_intro }}
- {%- endif -%} - - {%- if section.section_type == 'List' -%} - {%- for element in section.elements -%} - {{ render_element(element) }} - {%- endfor -%} - - {%- elif section.section_type == 'Grid' -%} -
- {%- for element in section.elements -%} -
- {{ render_element(element) }} -
- {%- endfor -%} -
- - {%- elif section.section_type == 'Tabbed' -%} - -
- {%- for element in section.elements -%} -
- {{ render_element(element) }} -
- {%- endfor -%} -
- - {%- endif -%} -
-
-{%- endfor -%} -{%- endmacro -%} - -{% if content_type == 'HTML' -%} -{{ content_html }} -{%- else -%} -{{ render_sections(sections) }} -{%- endif -%} \ No newline at end of file diff --git a/frappe/website/doctype/web_view/templates/web_view_row.html b/frappe/website/doctype/web_view/templates/web_view_row.html deleted file mode 100644 index 2b999819cb..0000000000 --- a/frappe/website/doctype/web_view/templates/web_view_row.html +++ /dev/null @@ -1,4 +0,0 @@ - - \ No newline at end of file diff --git a/frappe/website/doctype/web_view/test_web_view.py b/frappe/website/doctype/web_view/test_web_view.py deleted file mode 100644 index 3dc072a6dd..0000000000 --- a/frappe/website/doctype/web_view/test_web_view.py +++ /dev/null @@ -1,115 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2020, Frappe Technologies and Contributors -# See license.txt -from __future__ import unicode_literals - -import frappe -import unittest - -from frappe.website.doctype.web_page.test_web_page import get_page_content - -test_dependencies = ['Web Page'] # for test - -class TestWebView(unittest.TestCase): - @classmethod - def setUpClass(cls): - frappe.delete_doc_if_exists('Web View', 'test-web-view') - frappe.delete_doc_if_exists('Web View', 'html-web-view') - frappe.delete_doc_if_exists('CSS Class', 'test-css-class') - - frappe.get_doc(dict( - doctype = 'CSS Class', - name = 'test-css-class', - css = '.test-class { color: red; }' - )).insert() - - # simple html webview - frappe.get_doc(dict( - doctype = 'Web View', - title = 'HTML Web View', - route = 'html-web-view', - published = 1, - content_type = 'HTML', - content_html = '

Hello HTML

' - )).insert() - - # simple web view with components - - frappe.get_doc(dict( - doctype = 'Web View', - title = 'Test Web View', - route = 'test-web-view', - published = 1, - content_type = 'Components', - components = [ - dict( - element_type = 'Section', - section_type = 'List' - ), - dict( - element_type = 'Content', - web_content_type = 'Markdown', - web_content_markdown = '## Heading\n\nBody' - ), - dict( - element_type = 'Content', - web_content_type = 'HTML', - web_content_html = '
Here is some HTML
' - ), - dict( - element_type = 'Section', - section_type = 'Grid' - ), - dict( - element_type = 'Content', - element_class = 'test-css-class', - web_content_type = 'Markdown', - web_content_markdown = 'Column 1' - ), - dict( - element_type = 'Content', - web_content_type = 'Markdown', - web_content_markdown = 'Column 2' - ), - dict( - element_type = 'Web View', - web_view = 'html-web-view', - ), - ] - )).insert() - - def test_web_view(self): - html = get_page_content('test-web-view') - self.assert_web_view_in_html(html) - - def test_html_web_view(self): - html = get_page_content('html-web-view') - self.assertTrue('Hello HTML' in html) - - def assert_web_view_in_html(self, html): - self.assertTrue('

Heading

' in html) - self.assertTrue('
Here is some HTML
' in html) - self.assertTrue('Column 1' in html) - self.assertTrue('Column 2' in html) - self.assertTrue('Hello HTML' in html) - self.assertTrue('.test-class { color: red; }' in html) - - def test_web_view_in_footer(self): - website_settings = frappe.get_single("Website Settings") - website_settings.footer_type = 'Web View' - website_settings.footer_web_view = 'test-web-view' - website_settings.save() - - html = get_page_content('test-web-page-1') - - website_settings.footer_type = 'Standard' - website_settings.footer_web_view = '' - website_settings.save() - - # web view should still come as footer - self.assert_web_view_in_html(html) - - html_without_footer = get_page_content('test-web-page-1') - - # no more footer - self.assertFalse('Column 1' in html_without_footer) diff --git a/frappe/website/doctype/web_view/web_view.js b/frappe/website/doctype/web_view/web_view.js deleted file mode 100644 index 449c0949b6..0000000000 --- a/frappe/website/doctype/web_view/web_view.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2020, Frappe Technologies and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Web View', { - // refresh: function(frm) { - - // } -}); diff --git a/frappe/website/doctype/web_view/web_view.json b/frappe/website/doctype/web_view/web_view.json deleted file mode 100644 index d4ccbad0e4..0000000000 --- a/frappe/website/doctype/web_view/web_view.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "actions": [], - "allow_guest_to_view": 1, - "allow_import": 1, - "allow_rename": 1, - "beta": 1, - "creation": "2020-03-16 15:28:03.828741", - "doctype": "DocType", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "title", - "route", - "column_break_4", - "full_width", - "published", - "section_break_6", - "content_type", - "content_html", - "components", - "style_section", - "css", - "metatags_section", - "meta_title", - "meta_description", - "meta_image" - ], - "fields": [ - { - "fieldname": "title", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Title", - "reqd": 1, - "unique": 1 - }, - { - "fieldname": "route", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Route" - }, - { - "default": "0", - "fieldname": "published", - "fieldtype": "Check", - "label": "Published" - }, - { - "fieldname": "css", - "fieldtype": "Code", - "label": "CSS" - }, - { - "fieldname": "column_break_4", - "fieldtype": "Column Break" - }, - { - "default": "0", - "fieldname": "full_width", - "fieldtype": "Check", - "label": "Full Width" - }, - { - "fieldname": "section_break_6", - "fieldtype": "Section Break", - "label": "Content" - }, - { - "default": "Components", - "fieldname": "content_type", - "fieldtype": "Select", - "label": "Content Type", - "options": "Components\nHTML", - "reqd": 1 - }, - { - "depends_on": "eval:doc.content_type==='Components'", - "fieldname": "components", - "fieldtype": "Table", - "label": "Components", - "options": "Web View Component" - }, - { - "depends_on": "eval:doc.content_type===\"HTML\"", - "fieldname": "content_html", - "fieldtype": "HTML Editor", - "label": "Content HTML" - }, - { - "fieldname": "style_section", - "fieldtype": "Section Break", - "label": "Style" - }, - { - "fieldname": "metatags_section", - "fieldtype": "Section Break", - "label": "Meta Tags" - }, - { - "fieldname": "meta_title", - "fieldtype": "Data", - "label": "Title" - }, - { - "fieldname": "meta_description", - "fieldtype": "Small Text", - "label": "Description" - }, - { - "fieldname": "meta_image", - "fieldtype": "Attach Image", - "label": "Image" - } - ], - "has_web_view": 1, - "is_published_field": "published", - "links": [], - "modified": "2020-04-22 00:54:23.413077", - "modified_by": "Administrator", - "module": "Website", - "name": "Web View", - "owner": "Administrator", - "permissions": [ - { - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "share": 1, - "write": 1 - }, - { - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "Website Manager", - "share": 1, - "write": 1 - } - ], - "route": "route", - "sort_field": "creation", - "sort_order": "DESC", - "track_changes": 1 -} \ No newline at end of file diff --git a/frappe/website/doctype/web_view/web_view.py b/frappe/website/doctype/web_view/web_view.py deleted file mode 100644 index 8b441579b6..0000000000 --- a/frappe/website/doctype/web_view/web_view.py +++ /dev/null @@ -1,104 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2020, Frappe Technologies and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -# import frappe -from frappe.website.website_generator import WebsiteGenerator -from frappe.utils import markdown -import frappe - -class WebView(WebsiteGenerator): - def get_context(self, context): - # group components into sections - if self.content_type=='Components': - self.build_components(context) - - self.set_metatags(context) - return context - - def build_components(self, context): - context.sections = [] - context.css_rules = [] - for component in self.components: - if not context.sections and component.element_type!='Section': - self.add_default_section(context) - - if component.element_type=='Section': - self.add_section(context, component) - else: - self.add_component(context, component) - - self.add_css_class(context, component) - self.add_color(component) - self.add_missing_semi(component) - - return context - - def add_section(self, context, component): - component.elements = [] - context.sections.append(component) - - if component.section_intro: - component.section_intro = markdown(component.section_intro) - - def add_component(self, context, component): - if component.hide: - return - - if component.element_type == 'Web View' and component.web_view: - component.web_content_html = frappe.get_doc('Web View', component.web_view).render_content() - - elif component.web_content_type == 'Markdown': - component.web_content_html = markdown(component.web_content_markdown) - - if component.title: - component.element_id = frappe.scrub(component.title) - - context.sections[-1].elements.append(component) - - def add_css_class(self, context, component): - # add css class definitions selected by the user - if component.element_class and not component.hide: - css, is_dynamic = frappe.db.get_value('CSS Class', component.element_class, ['css', 'is_dynamic']) - if is_dynamic: - css = frappe.render_template(css, self.get_theme()) - context.css_rules.append(css) - - def add_color(self, component): - # convert to css color - if component.background_color and not component.hide: - component.background_color = frappe.db.get_value('Color', - component.background_color, 'color', cache=True) - - def add_missing_semi(self, component): - if component.element_style and not component.element_style.strip().endswith(';'): - component.element_style = component.element_style.strip() + ';' - - def render_content(self): - # webview can be rendered as an object (see footer) - return frappe.render_template("frappe/website/doctype/web_view/templates/web_view_content.html", self.get_context(self.as_dict())) - - def get_theme(self): - # get theme properties - if not hasattr(self, '_theme'): - default_theme = frappe.db.get_value("Website Settings", "Website Settings", "website_theme") - self._theme = frappe.get_value('Website Theme', default_theme, '*') - return self._theme - - def add_default_section(self, context): - # add a default section if not added - context.sections.append(frappe._dict( - element_type='Section', - section_type='List', - title='Default Section', - elements=[] - )) - - def set_metatags(self, context): - context.metatags = { - "name": self.meta_title or context.title, - "description": self.meta_description, - "image": self.meta_image - } - diff --git a/frappe/website/doctype/web_view_component/__init__.py b/frappe/website/doctype/web_view_component/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/website/doctype/web_view_component/web_view_component.json b/frappe/website/doctype/web_view_component/web_view_component.json deleted file mode 100644 index 15dd761c81..0000000000 --- a/frappe/website/doctype/web_view_component/web_view_component.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "actions": [], - "creation": "2020-03-16 15:25:17.530296", - "doctype": "DocType", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "element_type", - "title", - "hide", - "contain_section_width", - "column_break_3", - "columns", - "background_color", - "element_class", - "element_style", - "section_break_5", - "web_view", - "section_type", - "web_content_type", - "web_content_html", - "web_content_markdown", - "image_url", - "section_intro" - ], - "fields": [ - { - "fieldname": "element_type", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Element Type", - "options": "Section\nContent\nImage\nWeb View", - "reqd": 1 - }, - { - "default": "List", - "depends_on": "eval:doc.element_type==='Section'", - "fieldname": "section_type", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Section Type", - "options": "List\nTabbed\nGrid" - }, - { - "default": "Markdown", - "depends_on": "eval:doc.element_type==='Content'", - "fieldname": "web_content_type", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Web Content Type", - "options": "Markdown\nHTML" - }, - { - "depends_on": "eval:doc.element_type === 'Content' && doc.web_content_type === 'HTML'", - "fieldname": "web_content_html", - "fieldtype": "HTML Editor", - "label": "Web Content HTML" - }, - { - "depends_on": "eval:doc.element_type === 'Content' && doc.web_content_type === 'Markdown'", - "fieldname": "web_content_markdown", - "fieldtype": "Markdown Editor", - "label": "Web Content Markdown" - }, - { - "fieldname": "title", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Title" - }, - { - "fieldname": "columns", - "fieldtype": "Int", - "label": "Columns" - }, - { - "fieldname": "element_class", - "fieldtype": "Link", - "label": "Element Class", - "options": "CSS Class" - }, - { - "fieldname": "section_break_5", - "fieldtype": "Section Break" - }, - { - "fieldname": "column_break_3", - "fieldtype": "Column Break" - }, - { - "depends_on": "eval:doc.element_type==='Image'", - "fieldname": "image_url", - "fieldtype": "Small Text", - "label": "Image URL" - }, - { - "depends_on": "eval:doc.element_type==='Section'", - "fieldname": "section_intro", - "fieldtype": "Markdown Editor", - "label": "Section Intro" - }, - { - "default": "0", - "fieldname": "hide", - "fieldtype": "Check", - "label": "Hide" - }, - { - "fieldname": "element_style", - "fieldtype": "Small Text", - "label": "Element Style" - }, - { - "default": "0", - "depends_on": "eval:doc.element_type==='Section'", - "fieldname": "contain_section_width", - "fieldtype": "Check", - "label": "Contain Section Width" - }, - { - "fieldname": "background_color", - "fieldtype": "Link", - "label": "Background Color", - "options": "Color" - }, - { - "depends_on": "eval:doc.element_type==='Web View'", - "fieldname": "web_view", - "fieldtype": "Link", - "label": "Web View", - "options": "Web View" - } - ], - "istable": 1, - "links": [], - "modified": "2020-04-19 03:02:53.233036", - "modified_by": "Administrator", - "module": "Website", - "name": "Web View Component", - "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/website/doctype/web_view_component/web_view_component.py b/frappe/website/doctype/web_view_component/web_view_component.py deleted file mode 100644 index dcf1726c4a..0000000000 --- a/frappe/website/doctype/web_view_component/web_view_component.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2020, Frappe Technologies and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -# import frappe -from frappe.model.document import Document - -class WebViewComponent(Document): - pass From 993c5cbf9f107a74d871bd1f06d1d73adae9221d Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 29 Apr 2020 20:05:54 +0530 Subject: [PATCH 028/319] fix: Patch to remove webview --- frappe/patches/v13_0/remove_web_view.py | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 frappe/patches/v13_0/remove_web_view.py diff --git a/frappe/patches/v13_0/remove_web_view.py b/frappe/patches/v13_0/remove_web_view.py new file mode 100644 index 0000000000..7c9109fd03 --- /dev/null +++ b/frappe/patches/v13_0/remove_web_view.py @@ -0,0 +1,6 @@ +import frappe + +def execute(): + frappe.delete_doc_if_exists("DocType", "Web View") + frappe.delete_doc_if_exists("DocType", "Web View Component") + frappe.delete_doc_if_exists("DocType", "CSS Class") \ No newline at end of file From 3c049185db65ba36d0c7d272b13a1bb1ecb15555 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 30 Apr 2020 09:15:14 +0530 Subject: [PATCH 029/319] refactor: Remove webview related code --- .../doctype/website_settings/website_settings.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/frappe/website/doctype/website_settings/website_settings.py b/frappe/website/doctype/website_settings/website_settings.py index ead48425ed..ff94bd15a3 100644 --- a/frappe/website/doctype/website_settings/website_settings.py +++ b/frappe/website/doctype/website_settings/website_settings.py @@ -149,7 +149,6 @@ def get_website_settings(): context[key] = context[key][-1] add_website_theme(context) - add_webviews(context, settings) if not context.get("favicon"): context["favicon"] = "/assets/frappe/images/favicon.png" @@ -159,17 +158,6 @@ def get_website_settings(): return context -def add_webviews(context, settings): - # render footer as webview, not standard view - # see base.html for how this is handled - if settings.footer_type=='Web View' and settings.footer_web_view: - context.footer_content = frappe.get_doc('Web View', - settings.footer_web_view).render_content() - - if settings.top_bar_type=='Web View' and settings.top_bar_web_view: - context.navbar_content = frappe.get_doc('Web View', - settings.top_bar_web_view).render_content() - def get_items(parentfield): all_top_items = frappe.db.sql("""\ select * from `tabTop Bar Item` From 76e421dc3c0a9393239ca23aba481500a80cef17 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 30 Apr 2020 18:18:29 +0530 Subject: [PATCH 030/319] refactor: Remove unused fields in website settings --- .../website_settings/website_settings.json | 36 +------------------ 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/frappe/website/doctype/website_settings/website_settings.json b/frappe/website/doctype/website_settings/website_settings.json index 708d2a0473..b2d765b81f 100644 --- a/frappe/website/doctype/website_settings/website_settings.json +++ b/frappe/website/doctype/website_settings/website_settings.json @@ -19,15 +19,11 @@ "set_banner_from_image", "favicon", "top_bar", - "top_bar_type", - "top_bar_web_view", "navbar_search", "top_bar_items", "banner", "banner_html", "footer", - "footer_type", - "footer_web_view", "copyright", "address", "footer_items", @@ -135,13 +131,11 @@ }, { "default": "0", - "depends_on": "eval:doc.top_bar_type==='Standard'", "fieldname": "navbar_search", "fieldtype": "Check", "label": "Include Search in Top Bar" }, { - "depends_on": "eval:doc.top_bar_type==='Standard'", "fieldname": "top_bar_items", "fieldtype": "Table", "label": "Top Bar Items", @@ -336,34 +330,6 @@ "fieldname": "enable_view_tracking", "fieldtype": "Check", "label": "Enable In App Website Tracking" - }, - { - "default": "Standard", - "fieldname": "footer_type", - "fieldtype": "Select", - "label": "Footer Type", - "options": "Standard\nWeb View" - }, - { - "depends_on": "eval:doc.footer_type==='Web View'", - "fieldname": "footer_web_view", - "fieldtype": "Link", - "label": "Footer Web View", - "options": "Web View" - }, - { - "default": "Standard", - "fieldname": "top_bar_type", - "fieldtype": "Select", - "label": "Top Bar Type", - "options": "Standard\nWeb View" - }, - { - "depends_on": "eval:doc.top_bar_type==='Web View'", - "fieldname": "top_bar_web_view", - "fieldtype": "Link", - "label": "Top Bar Web View", - "options": "Web View" } ], "icon": "fa fa-cog", @@ -371,7 +337,7 @@ "issingle": 1, "links": [], "max_attachments": 10, - "modified": "2020-04-21 12:37:44.070662", + "modified": "2020-04-30 12:37:44.070662", "modified_by": "Administrator", "module": "Website", "name": "Website Settings", From 473ccc4be60f1120b3e6addf2f2a0a4a2c0a2ff6 Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Fri, 1 May 2020 20:48:03 +0530 Subject: [PATCH 031/319] fix: update init.py --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 912d0b0e42..6b05344b48 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -23,7 +23,7 @@ if PY2: reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '12.0.0-dev' +__version__ = '13.0.0-dev' __title__ = "Frappe Framework" local = Local() From 5bc388e8c2dad38892f666f15c9af508e796ec04 Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Fri, 1 May 2020 20:49:50 +0530 Subject: [PATCH 032/319] fix: update init.py --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 6b05344b48..260874adde 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -23,7 +23,7 @@ if PY2: reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '13.0.0-dev' +__version__ = '13.0.0' __title__ = "Frappe Framework" local = Local() From 24b5d0212d713bb7f238bd550be3e7171015c5b9 Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Fri, 1 May 2020 21:10:36 +0550 Subject: [PATCH 033/319] bumped to version 13.0.1-beta.1 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 260874adde..1de03f0632 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -23,7 +23,7 @@ if PY2: reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '13.0.0' +__version__ = '13.0.1-beta.1' __title__ = "Frappe Framework" local = Local() From b8d618260f8ef893081dd47e0d8580f84ef18b0f Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Fri, 1 May 2020 21:02:26 +0530 Subject: [PATCH 034/319] fix: correct version --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 1de03f0632..ebb5e2a4b8 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -23,7 +23,7 @@ if PY2: reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '13.0.1-beta.1' +__version__ = '13.0.0-beta.1' __title__ = "Frappe Framework" local = Local() From af9250e8932442e5c83f276f4f6600d210eb6396 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Sat, 2 May 2020 22:30:44 +0530 Subject: [PATCH 035/319] chore: Rename change log --- frappe/change_log/v13/{v13_0_0_beta_1.md => v13_0_0-beta_1.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frappe/change_log/v13/{v13_0_0_beta_1.md => v13_0_0-beta_1.md} (100%) diff --git a/frappe/change_log/v13/v13_0_0_beta_1.md b/frappe/change_log/v13/v13_0_0-beta_1.md similarity index 100% rename from frappe/change_log/v13/v13_0_0_beta_1.md rename to frappe/change_log/v13/v13_0_0-beta_1.md From 08612837efa2e63a05a37fd4c50faa38197c8c34 Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Thu, 21 May 2020 15:29:14 +0530 Subject: [PATCH 036/319] chore: pin redis version to 3.5.1 (#10440) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 431f216afa..4ef3e5abf1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -49,7 +49,7 @@ python-dateutil==2.8.1 pytz==2019.3 PyYAML==5.3.1 rauth==0.7.3 -redis>=3.0 +redis==3.5.1 requests-oauthlib==1.3.0 requests==2.23.0 RestrictedPython==5.0 From a0a722fd6e391a9734125bec17ab7b37ba33cdab Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 22 May 2020 09:47:53 +0530 Subject: [PATCH 037/319] fix: use get-all instead of get-list (bp #10444) (#10445) --- frappe/boot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/boot.py b/frappe/boot.py index 0eb6265942..e615cc49fa 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -106,7 +106,7 @@ def load_desktop_data(bootinfo): from frappe.desk.desktop import get_desk_sidebar_items bootinfo.allowed_modules = get_modules_from_all_apps_for_user() bootinfo.allowed_workspaces = get_desk_sidebar_items(True) - bootinfo.dashboards = frappe.get_list("Dashboard") + bootinfo.dashboards = frappe.get_all("Dashboard") def get_allowed_pages(cache=False): return get_user_pages_or_reports('Page', cache=cache) From 22b59eefa826353d928327ec87abedac38b5ee30 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 22 May 2020 10:02:55 +0530 Subject: [PATCH 038/319] fix(background-jobs): Include traceback in error logs (bp #10432) (#10443) --- frappe/utils/background_jobs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/utils/background_jobs.py b/frappe/utils/background_jobs.py index 4b37e850f0..2701ca9bc6 100755 --- a/frappe/utils/background_jobs.py +++ b/frappe/utils/background_jobs.py @@ -116,12 +116,12 @@ def execute_job(site, method, event, job_name, kwargs, user=None, is_async=True, is_async=is_async, retry=retry+1) else: - frappe.log_error(method_name) + frappe.log_error(title=method_name) raise except: frappe.db.rollback() - frappe.log_error(method_name) + frappe.log_error(title=method_name) frappe.db.commit() print(frappe.get_traceback()) raise From 115c5377b2e9744abd1d39f01d4d1bec8d2cb6c5 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 25 May 2020 11:16:29 +0530 Subject: [PATCH 039/319] fix: chart auto color (bp #10461) (#10465) --- frappe/public/js/frappe/widgets/chart_widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js index e5378cf2ab..35e5fc223e 100644 --- a/frappe/public/js/frappe/widgets/chart_widget.js +++ b/frappe/public/js/frappe/widgets/chart_widget.js @@ -577,7 +577,7 @@ export default class ChartWidget extends Widget { colors.push(field.color); }); } else if (["Line", "Bar"].includes(this.chart_doc.type)) { - colors = [this.chart_doc.color || "light-blue"]; + colors = [this.chart_doc.color || []]; } else if (this.chart_doc.type == "Heatmap") { colors = []; } From 90687a5d4e84ab6aa178da24d2c4a16f333d4c99 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 25 May 2020 12:28:53 +0530 Subject: [PATCH 040/319] fix: fixed the reports print format (bp #10304) (#10471) --- frappe/templates/styles/standard.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frappe/templates/styles/standard.css b/frappe/templates/styles/standard.css index f5eeb1c7fb..b87aa46d23 100644 --- a/frappe/templates/styles/standard.css +++ b/frappe/templates/styles/standard.css @@ -145,6 +145,11 @@ table.no-border, table.no-border td { margin: 3px 0px 3px; } +.print-format table td pre { + white-space: normal; + word-break: normal; +} + table td div { {% if not print_settings.allow_page_break_inside_tables %} /* needed to avoid partial cutting of text between page break in wkhtmltopdf */ From de06c43982007c33afc718f475b64b8120153b69 Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 20 May 2020 14:46:42 +0530 Subject: [PATCH 041/319] fix: get_data takes input value (cherry picked from commit 952c3840149e42b9df68d93548fbe5e3b98ecc32) --- frappe/public/js/frappe/form/controls/multiselect_pills.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/controls/multiselect_pills.js b/frappe/public/js/frappe/form/controls/multiselect_pills.js index 8796c95eaa..6190204357 100644 --- a/frappe/public/js/frappe/form/controls/multiselect_pills.js +++ b/frappe/public/js/frappe/form/controls/multiselect_pills.js @@ -129,7 +129,8 @@ frappe.ui.form.ControlMultiSelectPills = frappe.ui.form.ControlAutocomplete.exte get_data() { let data; if(this.df.get_data) { - data = this.df.get_data(); + let txt = this.$input.val(); + data = this.df.get_data(txt); if (data && data.then) { data.then((r) => { this.set_data(r); From 49392beaa6fe7f39e7af1fb9545d3cdb43a9c438 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Sat, 2 May 2020 22:30:44 +0530 Subject: [PATCH 042/319] chore: Rename change log --- frappe/change_log/v13/{v13_0_0_beta_1.md => v13_0_0-beta_1.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frappe/change_log/v13/{v13_0_0_beta_1.md => v13_0_0-beta_1.md} (100%) diff --git a/frappe/change_log/v13/v13_0_0_beta_1.md b/frappe/change_log/v13/v13_0_0-beta_1.md similarity index 100% rename from frappe/change_log/v13/v13_0_0_beta_1.md rename to frappe/change_log/v13/v13_0_0-beta_1.md From bfc1319d9330402043b6d17227bdbf05b477dd95 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 25 May 2020 21:49:30 +0530 Subject: [PATCH 043/319] fix: call onload if defined in report script (bp #10467) (#10481) --- frappe/desk/doctype/dashboard_chart/dashboard_chart.js | 2 ++ frappe/public/js/frappe/widgets/chart_widget.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js index e2be095fce..9053a9ab7f 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js @@ -353,6 +353,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}); + frappe.query_reports[frm.doc.report_name].onload + && frappe.query_reports[frm.doc.report_name].onload(frappe.query_report); 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 35e5fc223e..d32ca6f4d8 100644 --- a/frappe/public/js/frappe/widgets/chart_widget.js +++ b/frappe/public/js/frappe/widgets/chart_widget.js @@ -412,6 +412,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}); + frappe.query_reports[this.chart_doc.report_name].onload + && frappe.query_reports[this.chart_doc.report_name].onload(frappe.query_report); dialog.set_values(this.filters); } From 40fde8561f900c60dff205caa749fb2245c28039 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 25 May 2020 21:50:01 +0530 Subject: [PATCH 044/319] fix(timeline): Escape timeline content properly (bp #10472) (#10480) --- .../public/js/frappe/form/footer/timeline.js | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/frappe/public/js/frappe/form/footer/timeline.js b/frappe/public/js/frappe/form/footer/timeline.js index beec168dfd..bb44408c2a 100644 --- a/frappe/public/js/frappe/form/footer/timeline.js +++ b/frappe/public/js/frappe/form/footer/timeline.js @@ -589,7 +589,6 @@ frappe.ui.form.Timeline = class Timeline { out.push(me.get_version_comment(version, message)); } } else { - p = p.map(frappe.utils.escape_html); const df = frappe.meta.get_docfield(me.frm.doctype, p[0], me.frm.docname); if (df && !df.hidden) { const field_display_status = frappe.perm.get_field_display_status(df, null, @@ -597,8 +596,8 @@ frappe.ui.form.Timeline = class Timeline { if (field_display_status === 'Read' || field_display_status === 'Write') { parts.push(__('{0} from {1} to {2}', [ __(df.label), - (frappe.ellipsis(frappe.utils.html2text(p[1]), 40) || '""').bold(), - (frappe.ellipsis(frappe.utils.html2text(p[2]), 40) || '""').bold() + me.format_content_for_timeline(p[1]), + me.format_content_for_timeline(p[2]) ])); } } @@ -608,9 +607,9 @@ frappe.ui.form.Timeline = class Timeline { if (parts.length) { let message; if (updater_reference_link) { - message = __("changed value of {0} {1}", [parts.join(', ').bold(), updater_reference_link]); + message = __("changed value of {0} {1}", [parts.join(', '), updater_reference_link]); } else { - message = __("changed value of {0}", [parts.join(', ').bold()]); + message = __("changed value of {0}", [parts.join(', ')]); } out.push(me.get_version_comment(version, message)); } @@ -618,23 +617,23 @@ frappe.ui.form.Timeline = class Timeline { // value changed in table field if (data.row_changed && data.row_changed.length) { - var parts = [], count = 0; + let parts = []; data.row_changed.every(function(row) { row[3].every(function(p) { var df = me.frm.fields_dict[row[0]] && frappe.meta.get_docfield(me.frm.fields_dict[row[0]].grid.doctype, p[0], me.frm.docname); - if(df && !df.hidden) { + if (df && !df.hidden) { var field_display_status = frappe.perm.get_field_display_status(df, null, me.frm.perm); - if(field_display_status === 'Read' || field_display_status === 'Write') { + if (field_display_status === 'Read' || field_display_status === 'Write') { parts.push(__('{0} from {1} to {2} in row #{3}', [ frappe.meta.get_label(me.frm.fields_dict[row[0]].grid.doctype, p[0]), - (frappe.ellipsis(p[1], 40) || '""').bold(), - (frappe.ellipsis(p[2], 40) || '""').bold(), + me.format_content_for_timeline(p[1]), + me.format_content_for_timeline(p[2]), row[1] ])); } @@ -657,20 +656,22 @@ frappe.ui.form.Timeline = class Timeline { // rows added / removed // __('added'), __('removed') # for translation, don't remove ['added', 'removed'].forEach(function(key) { - if(data[key] && data[key].length) { - parts = (data[key] || []).map(function(p) { + if (data[key] && data[key].length) { + let parts = (data[key] || []).map(function(p) { var df = frappe.meta.get_docfield(me.frm.doctype, p[0], me.frm.docname); - if(df && !df.hidden) { + if (df && !df.hidden) { var field_display_status = frappe.perm.get_field_display_status(df, null, me.frm.perm); - if(field_display_status === 'Read' || field_display_status === 'Write') { + if (field_display_status === 'Read' || field_display_status === 'Write') { return frappe.meta.get_label(me.frm.doctype, p[0]) } } }); - parts = parts.filter(function(p) { return p; }); - if(parts.length) { + parts = parts.filter(function(p) { + return p; + }); + if (parts.length) { out.push(me.get_version_comment(version, __("{0} rows for {1}", [__(key), parts.join(', ')]))); } @@ -717,6 +718,17 @@ frappe.ui.form.Timeline = class Timeline { } + format_content_for_timeline(content) { + // text to HTML + // limits content to 40 characters + // escapes HTML + // and makes it bold + content = frappe.utils.html2text(content); + content = frappe.ellipsis(content, 40) || '""'; + content = frappe.utils.escape_html(content); + return content.bold(); + } + delete_comment(name) { var me = this; From 5be32206c5ba1cda9ebf5ca3679cccc3a8b452d8 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 25 May 2020 22:58:07 +0530 Subject: [PATCH 045/319] fix: Empty sidebar filter list html not updated (bp #10478) (#10482) --- frappe/public/js/frappe/list/list_sidebar_group_by.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/list/list_sidebar_group_by.js b/frappe/public/js/frappe/list/list_sidebar_group_by.js index 3d64c42f6a..d9324297a7 100644 --- a/frappe/public/js/frappe/list/list_sidebar_group_by.js +++ b/frappe/public/js/frappe/list/list_sidebar_group_by.js @@ -103,7 +103,11 @@ frappe.views.ListGroupBy = class ListGroupBy { this.render_dropdown_items(field_count_list, fieldtype, dropdown); frappe.utils.setup_search(dropdown, '.group-by-item', '.group-by-value', 'data-name'); } else { - dropdown.find('.group-by-loading').html(`${__("No filters found")}`); + dropdown.html( + `
+ ${__("No filters found")} +
` + ); } }); }); From e3e7d678447ac1c337b298376d557f09df859395 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 26 May 2020 19:35:21 +0530 Subject: [PATCH 046/319] fix: find element by fieldname --- frappe/public/js/frappe/form/form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index bad7c877fc..da52a0bcb8 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -1586,7 +1586,7 @@ frappe.ui.form.Form = class FrappeForm { let steps = frappe.tour[this.doctype].map(step => { let field = this.get_docfield(step.fieldname); return { - element: `.frappe-control[title='${step.fieldname}']`, + element: `.frappe-control[data-fieldname='${step.fieldname}']`, popover: { title: step.title || field.label, description: step.description From ea21cf8812e143460b08b57b9e547a7e158aa818 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 27 May 2020 21:13:01 +0530 Subject: [PATCH 047/319] fix: trigger after submit route hook after on_submit --- frappe/public/js/frappe/form/form.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index bad7c877fc..aa0fc6e2ac 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -650,13 +650,14 @@ frappe.ui.form.Form = class FrappeForm { frappe.utils.play_sound("submit"); 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); - } + .then(() => resolve(me)) + .then(() => { + 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); }); From f1657d6573d8836ea01b1dd34d03da70f2a7e8d8 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 28 May 2020 00:10:32 +0530 Subject: [PATCH 048/319] chore: Add Release Notes for V13.0.0-beta.2 --- frappe/change_log/v13/v13_0_0-beta_2.md | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 frappe/change_log/v13/v13_0_0-beta_2.md diff --git a/frappe/change_log/v13/v13_0_0-beta_2.md b/frappe/change_log/v13/v13_0_0-beta_2.md new file mode 100644 index 0000000000..746fee26dc --- /dev/null +++ b/frappe/change_log/v13/v13_0_0-beta_2.md @@ -0,0 +1,27 @@ +# Version 13.0.0 Beta 2 Release Notes + +## Features + +- Export and Import Customizations in Packages ([#9692](https://github.com/frappe/frappe/pull/9692)) +- Dashboard view for each DocTypes ([#10000](https://github.com/frappe/frappe/pull/10000)) +- Introduced HeatMap chart type option for Dashboard Charts ([#10193](https://github.com/frappe/frappe/pull/10193)) +- Translation Tool ([#9636](https://github.com/frappe/frappe/pull/9636)) + +## Enhancements + +- Configure dependency mapping and default values for Event Streaming sync ([#9742](https://github.com/frappe/frappe/pull/9742)) +- Config for Section Break without border ([#10116](https://github.com/frappe/frappe/pull/10116)) +- Onboarding Enhancements ([#10356](https://github.com/frappe/frappe/pull/10356)) ([#10364](https://github.com/frappe/frappe/pull/10364)) +- Introduced Page Builder option in Web Page ([#10035](https://github.com/frappe/frappe/pull/10035)) ([#10154](https://github.com/frappe/frappe/pull/10154)) +- Module-wise onboarding via new desk ([#10194](https://github.com/frappe/frappe/pull/10194)) +- 2FA for LDAP users ([#10001](https://github.com/frappe/frappe/pull/10001)) +- Assign to multiple people at once ([#9957](https://github.com/frappe/frappe/pull/9957)) +- Desk page enhancements ([#10359](https://github.com/frappe/frappe/pull/10359)) ([#10384](https://github.com/frappe/frappe/pull/10384)) ([#10338](https://github.com/frappe/frappe/pull/10338)) +- Search in column picker and filter dialog ([#10111](https://github.com/frappe/frappe/pull/10111)) + +## Performance Improvements + +- Application ([#10229](https://github.com/frappe/frappe/pull/10229)) ([#10147](https://github.com/frappe/frappe/pull/10147)) +- Recorder ([#10272](https://github.com/frappe/frappe/pull/10272)) +- Desk ([#9930](https://github.com/frappe/frappe/pull/9930)) +- Scheduler Job ([#9928](https://github.com/frappe/frappe/pull/9928)) From cbba2f5fa778b79fe3cb588362a078bfa8b0b059 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 28 May 2020 09:53:52 +0530 Subject: [PATCH 049/319] fix(dropbox): dropbox timeout for large files (bp #10501) (#10513) (cherry picked from commit bba7336b6ce55a23edca7fc9805100902500afd3) Co-authored-by: karthikeyan5 --- .../integrations/doctype/dropbox_settings/dropbox_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py index 2a036f4838..4b595b1abf 100644 --- a/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py +++ b/frappe/integrations/doctype/dropbox_settings/dropbox_settings.py @@ -90,7 +90,7 @@ def backup_to_dropbox(upload_db_backup=True): dropbox_settings['access_token'] = access_token['oauth2_token'] set_dropbox_access_token(access_token['oauth2_token']) - dropbox_client = dropbox.Dropbox(dropbox_settings['access_token']) + dropbox_client = dropbox.Dropbox(dropbox_settings['access_token'], timeout=None) if upload_db_backup: if frappe.flags.create_new_backup: From 2ceb8e62e4aed17973aec82e703131efd96ab884 Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 27 May 2020 17:06:56 +0530 Subject: [PATCH 050/319] fix: fetch date filters with default values set dynamically --- .../dashboard_chart/dashboard_chart.js | 23 +++++++++- .../public/js/frappe/widgets/chart_widget.js | 42 ++++++++++++++++--- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js index 9053a9ab7f..8ce22d6d27 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js @@ -251,6 +251,7 @@ frappe.ui.form.on('Dashboard Chart', { render_filters_table: function(frm) { frm.set_df_property("filters_section", "hidden", 0); let is_document_type = frm.doc.chart_type!== 'Report' && frm.doc.chart_type!=='Custom'; + let is_dynamic_filter = f => ['Date', 'DateRange'].includes(f.fieldtype) && f.default; let wrapper = $(frm.get_field('filters_json').wrapper).empty(); let table = $(` @@ -268,6 +269,18 @@ frappe.ui.form.on('Dashboard Chart', { let filters = JSON.parse(frm.doc.filters_json || '[]'); var filters_set = false; + // Set dynamic filters for reports + if (frm.doc.chart_type == 'Report') { + let set_filters = false; + frm.chart_filters.forEach(f => { + if (is_dynamic_filter(f)) { + filters[f.fieldname] = f.default; + set_filters = true; + } + }); + set_filters && frm.set_value('filters_json', JSON.stringify(filters)); + } + let fields; if (is_document_type) { fields = [ @@ -291,7 +304,15 @@ frappe.ui.form.on('Dashboard Chart', { }); } } else if (frm.chart_filters.length) { - fields = frm.chart_filters.filter(f => f.fieldname); + fields = frm.chart_filters.filter(f => { + // Set dynamic filters as read only + if (is_dynamic_filter(f)) { + f.read_only = 1; + } + if (f.fieldname) { + return true; + } + }); fields.map( f => { if (filters[f.fieldname]) { let condition = '='; diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js index d32ca6f4d8..77ea2847d7 100644 --- a/frappe/public/js/frappe/widgets/chart_widget.js +++ b/frappe/public/js/frappe/widgets/chart_widget.js @@ -97,7 +97,6 @@ export default class ChartWidget extends Widget { this.chart_settings = {}; } this.setup_container(); - this.prepare_chart_object(); if (!this.in_customize_mode) { this.action_area.empty(); this.prepare_chart_actions(); @@ -110,7 +109,10 @@ export default class ChartWidget extends Widget { this.render_time_series_filters(); } } - this.fetch_and_update_chart(); + frappe.run_serially([ + () => this.prepare_chart_object(), + () => this.fetch_and_update_chart(), + ]); }); } @@ -625,13 +627,41 @@ export default class ChartWidget extends Widget { } prepare_chart_object() { - let saved_filters = this.chart_settings.filters || null; - this.filters = - saved_filters || this.filters || JSON.parse(this.chart_doc.filters_json || "[]"); - if (this.chart_doc.type == 'Heatmap' && !this.chart_doc.heatmap_year) { this.chart_doc.heatmap_year = frappe.dashboard_utils.get_year(frappe.datetime.now_date()); } + + return this.set_chart_filters(); + } + + set_chart_filters() { + let user_saved_filters = this.chart_settings.filters || null; + let chart_saved_filters = JSON.parse(this.chart_doc.filters_json || "null"); + + if (this.chart_doc.chart_type == 'Report') { + return frappe.dashboard_utils + .get_filters_for_chart_type(this.chart_doc).then(filters => { + chart_saved_filters = this.update_default_date_filters(filters, chart_saved_filters); + this.filters = + user_saved_filters || this.filters || chart_saved_filters; + }); + } else { + this.filters = + user_saved_filters || this.filters || chart_saved_filters; + return Promise.resolve(); + } + } + + update_default_date_filters(report_filters, chart_filters) { + report_filters.map(f => { + if (['Date', 'DateRange'].includes(f.fieldtype) && f.default) { + if (chart_filters[f.fieldname]) { + chart_filters[f.fieldname] = f.default; + } + } + }); + + return chart_filters; } get_settings() { From 6434bcfded9e7338dfb4a3819870e119c3b9eed4 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 28 May 2020 12:36:34 +0530 Subject: [PATCH 051/319] fix: also set required filters --- frappe/public/js/frappe/widgets/chart_widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js index 77ea2847d7..8a0eca9eaf 100644 --- a/frappe/public/js/frappe/widgets/chart_widget.js +++ b/frappe/public/js/frappe/widgets/chart_widget.js @@ -655,7 +655,7 @@ export default class ChartWidget extends Widget { update_default_date_filters(report_filters, chart_filters) { report_filters.map(f => { if (['Date', 'DateRange'].includes(f.fieldtype) && f.default) { - if (chart_filters[f.fieldname]) { + if (f.reqd || chart_filters[f.fieldname]) { chart_filters[f.fieldname] = f.default; } } From 8119bd85c7a44366d643e91026f93a943f52c6fd Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 28 May 2020 12:37:02 +0530 Subject: [PATCH 052/319] fix: don't show dynamic filters in dialog --- .../desk/doctype/dashboard_chart/dashboard_chart.js | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js index 8ce22d6d27..59a88d65fb 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js @@ -304,15 +304,8 @@ frappe.ui.form.on('Dashboard Chart', { }); } } else if (frm.chart_filters.length) { - fields = frm.chart_filters.filter(f => { - // Set dynamic filters as read only - if (is_dynamic_filter(f)) { - f.read_only = 1; - } - if (f.fieldname) { - return true; - } - }); + fields = frm.chart_filters.filter(f => f.fieldname); + fields.map( f => { if (filters[f.fieldname]) { let condition = '='; @@ -339,7 +332,7 @@ frappe.ui.form.on('Dashboard Chart', { let dialog = new frappe.ui.Dialog({ title: __('Set Filters'), - fields: fields, + fields: fields.filter(f => !is_dynamic_filter(f)), primary_action: function() { let values = this.get_values(); if (values) { From e38225346d01f10a929e33ca6e531fc6b740485d Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Thu, 28 May 2020 14:09:19 +0530 Subject: [PATCH 053/319] chore: use correct version for beta release --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 598bbf3bf8..9db9bb0c93 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -23,7 +23,7 @@ if PY2: reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '13.0.1-beta.1' +__version__ = '13.0.0-beta.1' __title__ = "Frappe Framework" local = Local() From d67656bdf6a20d0238b776173440b4c46af95fdf Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 May 2020 08:43:29 +0000 Subject: [PATCH 054/319] feat: patch to delete onboarding slide doctype (#10520) --- frappe/patches.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frappe/patches.txt b/frappe/patches.txt index 8ab9418e6c..09995e6e72 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -281,3 +281,6 @@ frappe.patches.v13_0.remove_web_view frappe.patches.v13_0.remove_tailwind_from_page_builder frappe.patches.v13_0.rename_onboarding frappe.patches.v13_0.email_unsubscribe +execute:frappe.delete_doc("DocType", "Onboarding Slide") +execute:frappe.delete_doc("DocType", "Onboarding Slide Field") +execute:frappe.delete_doc("DocType", "Onboarding Slide Help Link") \ No newline at end of file From e222961b3385cb3d44f84d38b2b325c75b869bcc Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 28 May 2020 09:44:39 +0000 Subject: [PATCH 055/319] refactor: handle exception in syncing dashboard (#10522) --- frappe/utils/dashboard.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frappe/utils/dashboard.py b/frappe/utils/dashboard.py index f06f9272b8..c1884d62fb 100644 --- a/frappe/utils/dashboard.py +++ b/frappe/utils/dashboard.py @@ -89,10 +89,14 @@ def sync_dashboards(app=None): config = get_config(app_name, module_name) if config: frappe.flags.in_import = True - make_records(config.charts, "Dashboard Chart") - make_records(config.number_cards, "Number Card") - make_records(config.dashboards, "Dashboard") - frappe.flags.in_import = False + try: + make_records(config.charts, "Dashboard Chart") + make_records(config.number_cards, "Number Card") + make_records(config.dashboards, "Dashboard") + except Exception as e: + frappe.log_error(e, _("Dashboard Import Error")) + finally: + frappe.flags.in_import = False def make_records(config, doctype): if not config: From 50dbe17e812ec5567394d7f6e70fae6bb67d80b3 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 28 May 2020 18:49:20 +0530 Subject: [PATCH 056/319] fix: check chart type before setting report object --- .../desk/doctype/dashboard_chart/dashboard_chart.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js index 59a88d65fb..a10d3d96f2 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js @@ -365,10 +365,15 @@ 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}); - frappe.query_reports[frm.doc.report_name].onload - && frappe.query_reports[frm.doc.report_name].onload(frappe.query_report); + + if (frm.doc.chart_type == 'Report') { + //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}); + frappe.query_reports[frm.doc.report_name] + && frappe.query_reports[frm.doc.report_name].onload + && frappe.query_reports[frm.doc.report_name].onload(frappe.query_report); + } + dialog.set_values(filters); }); }, From 2b3197b922372bb09c23e24ee082c2a7c44f5422 Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Thu, 28 May 2020 20:38:43 +0550 Subject: [PATCH 057/319] bumped to version 13.0.0-beta.2 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 9db9bb0c93..7aa6eb3351 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -23,7 +23,7 @@ if PY2: reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '13.0.0-beta.1' +__version__ = '13.0.0-beta.2' __title__ = "Frappe Framework" local = Local() From fce5f477d1f08aa44feceb810b57225499ae3f54 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 3 Jun 2020 13:47:28 +0530 Subject: [PATCH 058/319] feat: added decorator to catch does not exist error (cherry picked from commit d9279e75d7910e13a8c274e55eb5d00fae4f4092) --- frappe/desk/desktop.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py index 6ca101c3a8..4e5692c16e 100644 --- a/frappe/desk/desktop.py +++ b/frappe/desk/desktop.py @@ -8,12 +8,26 @@ from json import loads, dumps from frappe import _, DoesNotExistError, ValidationError, _dict from frappe.boot import get_allowed_pages, get_allowed_reports from six import string_types +from functools import wraps from frappe.cache_manager import ( build_domain_restriced_doctype_cache, build_domain_restriced_page_cache, build_table_count_cache ) +def handle_not_exist(fn): + @wraps(fn) + def wrapper(*args, **kwargs): + try: + return fn(*args, **kwargs) + except DoesNotExistError: + if frappe.message_log: + frappe.message_log.pop() + return [] + + return wrapper + + class Workspace: def __init__(self, page_name): self.page_name = page_name @@ -157,7 +171,7 @@ class Workspace: 'user_can_dismiss': self.onboarding_doc.user_can_dismiss, 'items': self.get_onboarding_steps() } - + @handle_not_exist def get_cards(self): cards = self.doc.cards if not self.doc.hide_custom: @@ -227,6 +241,7 @@ class Workspace: return new_data + @handle_not_exist def get_charts(self): all_charts = [] if frappe.has_permission("Dashboard Chart", throw=False): @@ -242,6 +257,7 @@ class Workspace: return all_charts + @handle_not_exist def get_shortcuts(self): def _in_active_domains(item): @@ -272,6 +288,7 @@ class Workspace: return items + @handle_not_exist def get_onboarding_steps(self): steps = [] for doc in self.onboarding_doc.get_steps(): From 502a385d2941cd56f55018389bdd0fd3f4be6098 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 3 Jun 2020 13:47:54 +0530 Subject: [PATCH 059/319] refactor: remove workspace build from try block (cherry picked from commit 5f2bef2fc7cdd4dc7f3614cbcecfff3a4c29f5f3) --- frappe/desk/desktop.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py index 4e5692c16e..aca1abb3c8 100644 --- a/frappe/desk/desktop.py +++ b/frappe/desk/desktop.py @@ -313,21 +313,15 @@ def get_desktop_page(page): Returns: dict: dictionary of cards, charts and shortcuts to be displayed on website """ - try: - wspace = Workspace(page) - wspace.build_workspace() - return { - 'charts': wspace.charts, - 'shortcuts': wspace.shortcuts, - 'cards': wspace.cards, - 'onboarding': wspace.onboarding, - 'allow_customization': not wspace.doc.disable_user_customization - } - - except DoesNotExistError: - if frappe.message_log: - frappe.message_log.pop() - return None + wspace = Workspace(page) + wspace.build_workspace() + return { + 'charts': wspace.charts, + 'shortcuts': wspace.shortcuts, + 'cards': wspace.cards, + 'onboarding': wspace.onboarding, + 'allow_customization': not wspace.doc.disable_user_customization + } @frappe.whitelist() def get_desk_sidebar_items(flatten=False): From 587b69f68b61333595849bb58c901ba919fa00e9 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 4 Jun 2020 10:41:58 +0530 Subject: [PATCH 060/319] fix: don't cache zero count --- frappe/desk/desktop.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py index aca1abb3c8..956308568b 100644 --- a/frappe/desk/desktop.py +++ b/frappe/desk/desktop.py @@ -183,8 +183,8 @@ class Workspace: def _doctype_contains_a_record(name): exists = self.table_counts.get(name, None) - if exists is None: - if not frappe.db.get_value('DocType', name, 'issingle', cache=True): + if not exists: + if not frappe.db.get_value('DocType', name, 'issingle'): exists = frappe.db.count(name) else: exists = True From de4c46c73922c91851f260d9275ddcd81239e6d3 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Fri, 5 Jun 2020 20:51:12 +0530 Subject: [PATCH 061/319] fix: DO NOT ever delete site folder this is very stupid, never delete folders that you do not know the importance of all the site data is stored in the sites folder, and may it even be new-site, the data should not be deleted at any cost please never add anything to the code that "deletes folders" on failure. this is highly risky, and it should never be a practice to delete anything without user confirmation. Signed-off-by: Chinmay D. Pai --- frappe/commands/site.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/frappe/commands/site.py b/frappe/commands/site.py index 82ed72dd5c..effa212bca 100755 --- a/frappe/commands/site.py +++ b/frappe/commands/site.py @@ -79,7 +79,6 @@ def _new_site(db_name, site, mariadb_root_username=None, mariadb_root_password=N make_site_dirs() installing = touch_file(get_site_path('locks', 'installing.lock')) - atexit.register(_new_site_cleanup, site, mariadb_root_username, mariadb_root_password) install_db(root_login=mariadb_root_username, root_password=mariadb_root_password, db_name=db_name, admin_password=admin_password, verbose=verbose, source_sql=source_sql, force=force, reinstall=reinstall, @@ -96,15 +95,6 @@ def _new_site(db_name, site, mariadb_root_username=None, mariadb_root_password=N scheduler_status = "disabled" if frappe.utils.scheduler.is_scheduler_disabled() else "enabled" print("*** Scheduler is", scheduler_status, "***") -def _new_site_cleanup(site, mariadb_root_username, mariadb_root_password): - installing = get_site_path('locks', 'installing.lock') - - if installing and os.path.exists(installing): - if mariadb_root_password: - _drop_site(site, mariadb_root_username, mariadb_root_password, force=True, no_backup=True) - shutil.rmtree(site) - - frappe.destroy() @click.command('restore') @click.argument('sql-file-path') From 7ca2ef45231a3e37593088e1e6aeb70ba06b13ce Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 8 Jun 2020 15:37:25 +0530 Subject: [PATCH 062/319] refactor: remove grid and use default typography --- .../js/frappe/widgets/onboarding_widget.js | 6 ---- frappe/public/less/desktop.less | 29 ------------------- 2 files changed, 35 deletions(-) diff --git a/frappe/public/js/frappe/widgets/onboarding_widget.js b/frappe/public/js/frappe/widgets/onboarding_widget.js index 821824a2d2..68a7857418 100644 --- a/frappe/public/js/frappe/widgets/onboarding_widget.js +++ b/frappe/public/js/frappe/widgets/onboarding_widget.js @@ -7,12 +7,6 @@ export default class OnboardingWidget extends Widget { } make_body() { - this.body.addClass("grid"); - if (this.steps.length < 5) { - this.body.addClass(`grid-rows-${this.steps.length}`); - } else if (this.steps.length >= 5) { - this.body.addClass("grid-rows-5"); - } this.steps.forEach((step) => { this.add_step(step); }); diff --git a/frappe/public/less/desktop.less b/frappe/public/less/desktop.less index 0b17d75861..c592253d07 100644 --- a/frappe/public/less/desktop.less +++ b/frappe/public/less/desktop.less @@ -369,12 +369,7 @@ .widget-head { display: flex; - .widget-title { - font-size: 20px; - } - .widget-subtitle { - font-size: 16px; margin-top: 5px; color: @text-muted; } @@ -388,33 +383,9 @@ .widget-body { margin-top: 20px; - padding-right: 200px; - - &.grid { - display: grid; - grid-template-columns: 1fr 1fr; - grid-auto-flow: column; - - &.grid-rows-2 { - grid-template-rows: repeat(3, 1fr); - } - - &.grid-rows-3 { - grid-template-rows: repeat(3, 1fr); - } - - &.grid-rows-4 { - grid-template-rows: repeat(4, 1fr); - } - - &.grid-rows-5 { - grid-template-rows: repeat(5, 1fr); - } - } .onboarding-step { margin-bottom: 8px; - font-size: 16px; letter-spacing: 0.015em; i { From 95d42b230f1f084bed084595a9272dde06b6c2fc Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 17 Jun 2020 08:21:03 +0000 Subject: [PATCH 063/319] fix: minor styling fixes for onboarding subtitle (#10717) --- frappe/public/less/desktop.less | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/public/less/desktop.less b/frappe/public/less/desktop.less index c592253d07..98ae9c4927 100644 --- a/frappe/public/less/desktop.less +++ b/frappe/public/less/desktop.less @@ -371,6 +371,8 @@ .widget-subtitle { margin-top: 5px; + font-size: 14px; + font-weight: 400; color: @text-muted; } From 43190c9ef7c3bcad9b2b362357e64f560f2797ba Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 26 Jun 2020 11:35:38 +0530 Subject: [PATCH 064/319] fix(text-editor): List UI (bp #10598) (#10823) Co-authored-by: Suraj Shetty --- frappe/public/css/desk-rtl.css | 5 + frappe/public/js/frappe/form/controls/code.js | 2 +- .../js/frappe/form/controls/text_editor.js | 94 +---- frappe/public/less/print.less | 16 +- frappe/public/less/quill.less | 162 ++++----- .../print_formats/standard_macros.html | 2 +- frappe/utils/html_utils.py | 5 +- package.json | 3 +- yarn.lock | 333 ++++++++++++++++-- 9 files changed, 401 insertions(+), 221 deletions(-) diff --git a/frappe/public/css/desk-rtl.css b/frappe/public/css/desk-rtl.css index 31321be17d..a38f6864ff 100644 --- a/frappe/public/css/desk-rtl.css +++ b/frappe/public/css/desk-rtl.css @@ -110,4 +110,9 @@ ul.tree-children { } .section-header { direction: ltr; +} + +.ql-editor { + direction: rtl; + text-align: right; } \ No newline at end of file diff --git a/frappe/public/js/frappe/form/controls/code.js b/frappe/public/js/frappe/form/controls/code.js index 60825c82ad..726a83db72 100644 --- a/frappe/public/js/frappe/form/controls/code.js +++ b/frappe/public/js/frappe/form/controls/code.js @@ -39,7 +39,7 @@ frappe.ui.form.ControlCode = frappe.ui.form.ControlText.extend({ toggle_label() { const button_label = this.expanded ? __('Collapse') : __('Expand'); - this.$expand_button.text(button_label); + this.$expand_button && this.$expand_button.text(button_label); }, set_language() { diff --git a/frappe/public/js/frappe/form/controls/text_editor.js b/frappe/public/js/frappe/form/controls/text_editor.js index 5e73889490..3c0f7d5110 100644 --- a/frappe/public/js/frappe/form/controls/text_editor.js +++ b/frappe/public/js/frappe/form/controls/text_editor.js @@ -1,10 +1,5 @@ import Quill from 'quill'; -// replace

tag with

-const Block = Quill.import('blots/block'); -Block.tagName = 'DIV'; -Quill.register(Block, true); - const CodeBlockContainer = Quill.import('formats/code-block-container'); CodeBlockContainer.tagName = 'PRE'; Quill.register(CodeBlockContainer, true); @@ -17,7 +12,8 @@ Table.create = (value) => { node.classList.add('table'); node.classList.add('table-bordered'); return node; -} +}; + Quill.register(Table, true); // link without href @@ -28,7 +24,7 @@ class MyLink extends Link { let node = super.create(value); value = this.sanitize(value); node.setAttribute('href', value); - if(value.startsWith('/') || value.indexOf(window.location.host)) { + if (value.startsWith('/') || value.indexOf(window.location.host)) { // no href if internal link node.removeAttribute('target'); } @@ -73,7 +69,7 @@ Quill.register(CustomColor, true); frappe.ui.form.ControlTextEditor = frappe.ui.form.ControlCode.extend({ make_wrapper() { this._super(); - this.$wrapper.find(".like-disabled-input").addClass('text-editor-print'); + this.$wrapper.find(".like-disabled-input").addClass('ql-editor'); }, make_input() { @@ -203,91 +199,9 @@ frappe.ui.form.ControlTextEditor = frappe.ui.form.ControlCode.extend({ get_input_value() { let value = this.quill ? this.quill.root.innerHTML : ''; - // quill keeps ol as a common container for both type of lists - // and uses css for appearances, this is not semantic - // so we convert ol to ul if it is unordered - const $value = $(`
${value}
`); - $value.find('ol li[data-list=bullet]:first-child').each((i, li) => { - let $li = $(li); - let $parent = $li.parent(); - let $children = $parent.children(); - let $ul = $('