From 558fec0d7cb12aef812419eada3c3e229e1f0641 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Fri, 10 Apr 2020 23:40:34 +0530 Subject: [PATCH 01/48] fix: move Video DocType from Education Module to Core --- frappe/core/doctype/video/__init__.py | 0 frappe/core/doctype/video/test_video.js | 23 +++++ frappe/core/doctype/video/test_video.py | 10 +++ frappe/core/doctype/video/video.js | 8 ++ frappe/core/doctype/video/video.json | 114 ++++++++++++++++++++++++ frappe/core/doctype/video/video.py | 10 +++ 6 files changed, 165 insertions(+) create mode 100644 frappe/core/doctype/video/__init__.py create mode 100644 frappe/core/doctype/video/test_video.js create mode 100644 frappe/core/doctype/video/test_video.py create mode 100644 frappe/core/doctype/video/video.js create mode 100644 frappe/core/doctype/video/video.json create mode 100644 frappe/core/doctype/video/video.py diff --git a/frappe/core/doctype/video/__init__.py b/frappe/core/doctype/video/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/core/doctype/video/test_video.js b/frappe/core/doctype/video/test_video.js new file mode 100644 index 0000000000..a82a221319 --- /dev/null +++ b/frappe/core/doctype/video/test_video.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Video", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Video + () => frappe.tests.make('Video', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/frappe/core/doctype/video/test_video.py b/frappe/core/doctype/video/test_video.py new file mode 100644 index 0000000000..0bed1e98d6 --- /dev/null +++ b/frappe/core/doctype/video/test_video.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestVideo(unittest.TestCase): + pass diff --git a/frappe/core/doctype/video/video.js b/frappe/core/doctype/video/video.js new file mode 100644 index 0000000000..36ea240a36 --- /dev/null +++ b/frappe/core/doctype/video/video.js @@ -0,0 +1,8 @@ +// Copyright (c) 2020, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Video', { + // refresh: function(frm) { + + // } +}); diff --git a/frappe/core/doctype/video/video.json b/frappe/core/doctype/video/video.json new file mode 100644 index 0000000000..875926088b --- /dev/null +++ b/frappe/core/doctype/video/video.json @@ -0,0 +1,114 @@ +{ + "actions": [], + "allow_import": 1, + "allow_rename": 1, + "autoname": "field:title", + "creation": "2018-10-17 05:47:13.087395", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "title", + "provider", + "url", + "column_break_4", + "publish_date", + "duration", + "section_break_7", + "description" + ], + "fields": [ + { + "fieldname": "title", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Title", + "reqd": 1, + "unique": 1 + }, + { + "fieldname": "provider", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Provider", + "options": "YouTube\nVimeo", + "reqd": 1 + }, + { + "fieldname": "url", + "fieldtype": "Data", + "in_list_view": 1, + "label": "URL", + "reqd": 1 + }, + { + "fieldname": "column_break_4", + "fieldtype": "Column Break" + }, + { + "fieldname": "publish_date", + "fieldtype": "Date", + "label": "Publish Date" + }, + { + "fieldname": "duration", + "fieldtype": "Data", + "label": "Duration" + }, + { + "fieldname": "section_break_7", + "fieldtype": "Section Break" + }, + { + "fieldname": "description", + "fieldtype": "Text Editor", + "in_list_view": 1, + "label": "Description", + "reqd": 1 + } + ], + "links": [], + "modified": "2020-04-10 23:04:41.124053", + "modified_by": "Administrator", + "module": "Core", + "name": "Video", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Academics User", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Instructor", + "share": 1, + "write": 1 + }, + { + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "LMS User", + "share": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/core/doctype/video/video.py b/frappe/core/doctype/video/video.py new file mode 100644 index 0000000000..fdbd3a1abe --- /dev/null +++ b/frappe/core/doctype/video/video.py @@ -0,0 +1,10 @@ +# -*- 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 Video(Document): + pass From bc042b37b7d1e014012dfed9978cbc2a43e966c2 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:01:27 +0530 Subject: [PATCH 02/48] feat: added Page View doctype --- frappe/website/doctype/page_view/__init__.py | 0 frappe/website/doctype/page_view/page_view.js | 8 ++ .../website/doctype/page_view/page_view.json | 75 +++++++++++++++++++ frappe/website/doctype/page_view/page_view.py | 34 +++++++++ .../doctype/page_view/test_page_view.py | 10 +++ .../website_settings/test_website_settings.py | 10 +++ 6 files changed, 137 insertions(+) create mode 100644 frappe/website/doctype/page_view/__init__.py create mode 100644 frappe/website/doctype/page_view/page_view.js create mode 100644 frappe/website/doctype/page_view/page_view.json create mode 100644 frappe/website/doctype/page_view/page_view.py create mode 100644 frappe/website/doctype/page_view/test_page_view.py create mode 100644 frappe/website/doctype/website_settings/test_website_settings.py diff --git a/frappe/website/doctype/page_view/__init__.py b/frappe/website/doctype/page_view/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/website/doctype/page_view/page_view.js b/frappe/website/doctype/page_view/page_view.js new file mode 100644 index 0000000000..3d6bf92429 --- /dev/null +++ b/frappe/website/doctype/page_view/page_view.js @@ -0,0 +1,8 @@ +// Copyright (c) 2020, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Page View', { + // refresh: function(frm) { + + // } +}); diff --git a/frappe/website/doctype/page_view/page_view.json b/frappe/website/doctype/page_view/page_view.json new file mode 100644 index 0000000000..a79472154f --- /dev/null +++ b/frappe/website/doctype/page_view/page_view.json @@ -0,0 +1,75 @@ +{ + "actions": [], + "creation": "2020-04-15 22:54:46.009703", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "path", + "referrer", + "browser", + "browser_version", + "date" + ], + "fields": [ + { + "fieldname": "path", + "fieldtype": "Data", + "label": "Path", + "set_only_once": 1 + }, + { + "fieldname": "referrer", + "fieldtype": "Data", + "label": "Referrer", + "search_index": 1, + "set_only_once": 1 + }, + { + "fieldname": "browser", + "fieldtype": "Data", + "label": "Browser", + "search_index": 1, + "set_only_once": 1 + }, + { + "fieldname": "browser_version", + "fieldtype": "Data", + "label": "Browser Version", + "set_only_once": 1 + }, + { + "fieldname": "date", + "fieldtype": "Datetime", + "label": "Date", + "set_only_once": 1 + } + ], + "in_create": 1, + "links": [], + "modified": "2020-04-15 23:31:27.517793", + "modified_by": "Administrator", + "module": "Website", + "name": "Page 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 + } + ], + "quick_entry": 1, + "read_only": 1, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "path", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/website/doctype/page_view/page_view.py b/frappe/website/doctype/page_view/page_view.py new file mode 100644 index 0000000000..9c41e1c4aa --- /dev/null +++ b/frappe/website/doctype/page_view/page_view.py @@ -0,0 +1,34 @@ +# -*- 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 PageView(Document): + pass + + +@frappe.whitelist(allow_guest=True) +def make_view_log(path, referrer=None, browser=None, version=None): + if path.startswith('/'): + path = path[1:] + + if is_tracking_enabled(): + view = frappe.new_doc("Page View") + view.path = path + view.referrer = referrer + view.browser = browser + view.browser_version = version + view.date = frappe.utils.now_datetime() + view.insert(ignore_permissions=True) + + return + +@frappe.whitelist() +def get_page_view_count(path): + return frappe.db.count("Page View", filters={'path': path}) + +def is_tracking_enabled(): + return frappe.db.get_value("Website Settings", "Website Settings", "enable_view_tracking") \ No newline at end of file diff --git a/frappe/website/doctype/page_view/test_page_view.py b/frappe/website/doctype/page_view/test_page_view.py new file mode 100644 index 0000000000..2ac98f2be2 --- /dev/null +++ b/frappe/website/doctype/page_view/test_page_view.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestPageView(unittest.TestCase): + pass diff --git a/frappe/website/doctype/website_settings/test_website_settings.py b/frappe/website/doctype/website_settings/test_website_settings.py new file mode 100644 index 0000000000..9eca957713 --- /dev/null +++ b/frappe/website/doctype/website_settings/test_website_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestWebsiteSettings(unittest.TestCase): + pass From 3d454607495fd7997a5b3b909745c0ef0d0ab4f4 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:01:38 +0530 Subject: [PATCH 03/48] feat: added tracking script to website --- frappe/www/website_script.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/frappe/www/website_script.js b/frappe/www/website_script.js index fd361f8986..9f0dd329c6 100644 --- a/frappe/www/website_script.js +++ b/frappe/www/website_script.js @@ -12,3 +12,17 @@ ga('create', '{{ google_analytics_id }}', 'auto'); ga('send', 'pageview'); // End Google Analytics {%- endif %} + +{% if enable_view_tracking %} + if (navigator.doNotTrack != 1) { + frappe.ready(() => { + let browser = frappe.utils.get_browser(); + frappe.call("frappe.website.doctype.page_view.page_view.make_view_log", { + path: location.pathname, + referrer: document.referrer, + browser: browser.name, + version: browser.version + }) + }) + } +{% endif %} From 9ad1cf94f2a6db4ad88f68493b52030323c9e823 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:01:55 +0530 Subject: [PATCH 04/48] feat: add tracking enabled info to boot --- frappe/boot.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/boot.py b/frappe/boot.py index e6d1199b19..e11dd87990 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -17,6 +17,7 @@ from frappe.utils.change_log import get_versions from frappe.translate import get_lang_dict from frappe.email.inbox import get_email_accounts from frappe.social.doctype.energy_point_settings.energy_point_settings import is_energy_point_enabled +from frappe.website.doctype.page_view.page_view import is_tracking_enabled from frappe.social.doctype.energy_point_log.energy_point_log import get_energy_points from frappe.social.doctype.post.post import frequently_visited_links @@ -79,6 +80,7 @@ def get_bootinfo(): bootinfo.success_action = get_success_action() bootinfo.update(get_email_accounts(user=frappe.session.user)) bootinfo.energy_points_enabled = is_energy_point_enabled() + bootinfo.website_tracking_enabled = is_tracking_enabled() bootinfo.points = get_energy_points(frappe.session.user) bootinfo.frequently_visited_links = frequently_visited_links() bootinfo.link_preview_doctypes = get_link_preview_doctypes() From 6233e94dab4de5bf73f161aa7565f758662e2100 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:02:27 +0530 Subject: [PATCH 05/48] feat: added utility to get browser details --- frappe/public/js/frappe/utils/utils.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index a2b03f180e..a81d6deece 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -743,7 +743,25 @@ Object.assign(frappe.utils, { }); return $el; - } + }, + + get_browser() { + var ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; + if(/trident/i.test(M[1])){ + tem=/\brv[ :]+(\d+)/g.exec(ua) || []; + return {name:'IE',version:(tem[1]||'')}; + } + if(M[1]==='Chrome'){ + tem=ua.match(/\bOPR|Edge\/(\d+)/) + if(tem!=null) {return {name:'Opera', version:tem[1]};} + } + M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?']; + if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);} + return { + name: M[0], + version: M[1] + }; + } }); // Array de duplicate From 815f05a0eb4939b73f531da9b939991916139d15 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:02:52 +0530 Subject: [PATCH 06/48] feat: added enable tracking flag to default website context --- .../doctype/website_settings/website_settings.json | 11 +++++++++-- .../doctype/website_settings/website_settings.py | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/frappe/website/doctype/website_settings/website_settings.json b/frappe/website/doctype/website_settings/website_settings.json index 39ffa2329f..f247082046 100644 --- a/frappe/website/doctype/website_settings/website_settings.json +++ b/frappe/website/doctype/website_settings/website_settings.json @@ -29,6 +29,7 @@ "footer_items", "hide_footer_signup", "integrations", + "enable_view_tracking", "enable_google_indexing", "authorize_api_indexing_access", "indexing_refresh_token", @@ -186,7 +187,7 @@ "collapsible": 1, "fieldname": "integrations", "fieldtype": "Section Break", - "label": "Google Integrations" + "label": "Integrations" }, { "description": "Add Google Analytics ID: eg. UA-89XXX57-1. Please search help on Google Analytics for more information.", @@ -319,6 +320,12 @@ "fieldname": "authorize_api_indexing_access", "fieldtype": "Button", "label": "Authorize API Indexing Access" + }, + { + "default": "0", + "fieldname": "enable_view_tracking", + "fieldtype": "Check", + "label": "Enable In App Website Tracking" } ], "icon": "fa fa-cog", @@ -326,7 +333,7 @@ "issingle": 1, "links": [], "max_attachments": 10, - "modified": "2020-02-21 16:46:59.947403", + "modified": "2020-04-15 22:59:26.256662", "modified_by": "Administrator", "module": "Website", "name": "Website Settings", diff --git a/frappe/website/doctype/website_settings/website_settings.py b/frappe/website/doctype/website_settings/website_settings.py index 4356b1aa82..ff94bd15a3 100644 --- a/frappe/website/doctype/website_settings/website_settings.py +++ b/frappe/website/doctype/website_settings/website_settings.py @@ -118,7 +118,7 @@ def get_website_settings(): for k in ["banner_html", "brand_html", "copyright", "twitter_share_via", "facebook_share", "google_plus_one", "twitter_share", "linked_in_share", "disable_signup", "hide_footer_signup", "head_html", "title_prefix", - "navbar_search"]: + "navbar_search", "enable_view_tracking"]: if hasattr(settings, k): context[k] = settings.get(k) From 7a9a16b6afec7d34435004275f4b6a168c56f856 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:03:17 +0530 Subject: [PATCH 07/48] feat: add page view count to form --- frappe/public/js/frappe/form/sidebar/form_sidebar.js | 9 +++++++++ frappe/public/js/frappe/form/templates/form_sidebar.html | 1 + frappe/public/js/frappe/utils/common.js | 6 ++++++ frappe/public/less/sidebar.less | 3 ++- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 02caf25557..677d53bb64 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -81,6 +81,15 @@ frappe.ui.form.Sidebar = Class.extend({ } this.frm.viewers.refresh(); this.frm.tags && this.frm.tags.refresh(this.frm.get_docinfo().tags); + + if (this.frm.doc.route && frappe.boot.website_tracking_enabled) { + let route = this.frm.doc.route; + frappe.utils.get_page_view_count(route).then(res => { + this.sidebar.find(".pageview-count").html(__("{0} Page Views", + ["" + res.message + ""])); + }) + } + this.sidebar.find(".modified-by").html(__("{0} edited this {1}", ["" + frappe.user.full_name(this.frm.doc.modified_by) + "", "
" + comment_when(this.frm.doc.modified)])); diff --git a/frappe/public/js/frappe/form/templates/form_sidebar.html b/frappe/public/js/frappe/form/templates/form_sidebar.html index b611557c43..30b2205bae 100644 --- a/frappe/public/js/frappe/form/templates/form_sidebar.html +++ b/frappe/public/js/frappe/form/templates/form_sidebar.html @@ -105,6 +105,7 @@ diff --git a/frappe/public/js/frappe/utils/common.js b/frappe/public/js/frappe/utils/common.js index e919012664..5d20b04616 100644 --- a/frappe/public/js/frappe/utils/common.js +++ b/frappe/public/js/frappe/utils/common.js @@ -352,3 +352,9 @@ frappe.utils.new_auto_repeat_prompt = function(frm) { __('Save') ); } + +frappe.utils.get_page_view_count = function(route) { + return frappe.call("frappe.website.doctype.page_view.page_view.get_page_view_count", { + path: route + }) +} diff --git a/frappe/public/less/sidebar.less b/frappe/public/less/sidebar.less index ac5a5c33d5..28dae1a948 100644 --- a/frappe/public/less/sidebar.less +++ b/frappe/public/less/sidebar.less @@ -273,7 +273,8 @@ body[data-route^="Module"] .main-menu { } .layout-side-section .form-sidebar { - .modified-by { + .modified-by, + .pageview-count { margin-bottom: 15px; } } From 985392d07f8880f5277c3830462a58416271a3ee Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 11:29:15 +0530 Subject: [PATCH 08/48] fix: linting fixes --- .../js/frappe/form/sidebar/form_sidebar.js | 2 +- frappe/public/js/frappe/utils/common.js | 4 +- frappe/public/js/frappe/utils/utils.js | 37 ++++++++++++------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 677d53bb64..9910227590 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -87,7 +87,7 @@ frappe.ui.form.Sidebar = Class.extend({ frappe.utils.get_page_view_count(route).then(res => { this.sidebar.find(".pageview-count").html(__("{0} Page Views", ["" + res.message + ""])); - }) + }); } this.sidebar.find(".modified-by").html(__("{0} edited this {1}", diff --git a/frappe/public/js/frappe/utils/common.js b/frappe/public/js/frappe/utils/common.js index 5d20b04616..7ffec5e541 100644 --- a/frappe/public/js/frappe/utils/common.js +++ b/frappe/public/js/frappe/utils/common.js @@ -356,5 +356,5 @@ frappe.utils.new_auto_repeat_prompt = function(frm) { frappe.utils.get_page_view_count = function(route) { return frappe.call("frappe.website.doctype.page_view.page_view.get_page_view_count", { path: route - }) -} + }); +}; diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index b07e71bc91..315637092d 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -748,22 +748,33 @@ Object.assign(frappe.utils, { }, get_browser() { - var ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; - if(/trident/i.test(M[1])){ - tem=/\brv[ :]+(\d+)/g.exec(ua) || []; - return {name:'IE',version:(tem[1]||'')}; + var ua = navigator.userAgent, + tem, + M = + ua.match( + /(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i + ) || []; + if (/trident/i.test(M[1])) { + tem = /\brv[ :]+(\d+)/g.exec(ua) || []; + return { name: "IE", version: tem[1] || "" }; + } + if (M[1] === "Chrome") { + tem = ua.match(/\bOPR|Edge\/(\d+)/); + if (tem != null) { + return { name: "Opera", version: tem[1] }; } - if(M[1]==='Chrome'){ - tem=ua.match(/\bOPR|Edge\/(\d+)/) - if(tem!=null) {return {name:'Opera', version:tem[1]};} - } - M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?']; - if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);} + } + M = M[2] + ? [M[1], M[2]] + : [navigator.appName, navigator.appVersion, "-?"]; + if ((tem = ua.match(/version\/(\d+)/i)) != null) { + M.splice(1, 1, tem[1]); + } return { - name: M[0], - version: M[1] + name: M[0], + version: M[1], }; - } + }, }); // Array de duplicate From 82cedb86171d83485629490b94b1aa2c7c488160 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Thu, 16 Apr 2020 16:37:35 +0530 Subject: [PATCH 09/48] fix: Attribute errors and better msgprint --- .../doctype/email_domain/email_domain.py | 32 ++++++------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/frappe/email/doctype/email_domain/email_domain.py b/frappe/email/doctype/email_domain/email_domain.py index b6585d966b..08583dc228 100644 --- a/frappe/email/doctype/email_domain/email_domain.py +++ b/frappe/email/doctype/email_domain/email_domain.py @@ -39,7 +39,7 @@ class EmailDomain(Document): except Exception: frappe.throw(_("Incoming email account not correct")) - return None + finally: try: if self.use_imap: @@ -48,9 +48,10 @@ class EmailDomain(Document): test.quit() except Exception: pass + try: - if self.use_ssl_for_outgoing: - if not self.smtp_port: + if self.get('use_ssl_for_outgoing'): + if not self.get('smtp_port'): self.smtp_port = 465 sess = smtplib.SMTP_SSL((self.smtp_server or "").encode('utf-8'), @@ -62,28 +63,15 @@ class EmailDomain(Document): sess.quit() except Exception: frappe.throw(_("Outgoing email account not correct")) - return None - return def on_update(self): """update all email accounts using this domain""" - for email_account in frappe.get_all("Email Account", - filters={"domain": self.name}): - + for email_account in frappe.get_all("Email Account", filters={"domain": self.name}): try: - email_account = frappe.get_doc("Email Account", - email_account.name) - email_account.set("email_server",self.email_server) - email_account.set("use_imap",self.use_imap) - email_account.set("use_ssl",self.use_ssl) - email_account.set("use_tls",self.use_tls) - email_account.set("attachment_limit",self.attachment_limit) - email_account.set("smtp_server",self.smtp_server) - email_account.set("smtp_port",self.smtp_port) - email_account.set("use_ssl_for_outgoing", self.use_ssl_for_outgoing) - email_account.set("append_emails_to_sent_folder", self.append_emails_to_sent_folder) + email_account = frappe.get_doc("Email Account", email_account.name) + for attr in ["email_server", "use_imap", "use_ssl", "use_tls", "attachment_limit", "smtp_server", "smtp_port", "use_ssl_for_outgoing", "append_emails_to_sent_folder"]: + email_account.set(attr, self.get(attr, default=0)) email_account.save() + except Exception as e: - frappe.msgprint(email_account.name) - frappe.throw(e) - return None + frappe.msgprint(_("Error has occurred in {0}").format(email_account.name), raise_exception=e.__class__) From 33c6089049938695d1604584eb0de5af0f86a17d Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 15:35:46 +0530 Subject: [PATCH 10/48] feat: rename doctype to Web Page View --- frappe/boot.py | 2 +- frappe/public/js/frappe/utils/common.js | 2 +- .../doctype/{page_view => web_page_view}/__init__.py | 0 .../test_web_page_view.py} | 2 +- .../page_view.js => web_page_view/web_page_view.js} | 2 +- .../page_view.json => web_page_view/web_page_view.json} | 2 +- .../page_view.py => web_page_view/web_page_view.py} | 6 +++--- frappe/website/website_theme/standard/standard.json | 4 ++-- frappe/www/website_script.js | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) rename frappe/website/doctype/{page_view => web_page_view}/__init__.py (100%) rename frappe/website/doctype/{page_view/test_page_view.py => web_page_view/test_web_page_view.py} (81%) rename frappe/website/doctype/{page_view/page_view.js => web_page_view/web_page_view.js} (80%) rename frappe/website/doctype/{page_view/page_view.json => web_page_view/web_page_view.json} (98%) rename frappe/website/doctype/{page_view/page_view.py => web_page_view/web_page_view.py} (85%) diff --git a/frappe/boot.py b/frappe/boot.py index e11dd87990..dc7ea8b3da 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -17,7 +17,7 @@ from frappe.utils.change_log import get_versions from frappe.translate import get_lang_dict from frappe.email.inbox import get_email_accounts from frappe.social.doctype.energy_point_settings.energy_point_settings import is_energy_point_enabled -from frappe.website.doctype.page_view.page_view import is_tracking_enabled +from frappe.website.doctype.web_page_view.web_page_view import is_tracking_enabled from frappe.social.doctype.energy_point_log.energy_point_log import get_energy_points from frappe.social.doctype.post.post import frequently_visited_links diff --git a/frappe/public/js/frappe/utils/common.js b/frappe/public/js/frappe/utils/common.js index 7ffec5e541..6ad15e44bf 100644 --- a/frappe/public/js/frappe/utils/common.js +++ b/frappe/public/js/frappe/utils/common.js @@ -354,7 +354,7 @@ frappe.utils.new_auto_repeat_prompt = function(frm) { } frappe.utils.get_page_view_count = function(route) { - return frappe.call("frappe.website.doctype.page_view.page_view.get_page_view_count", { + return frappe.call("frappe.website.doctype.web_page_view.web_page_view.get_page_view_count", { path: route }); }; diff --git a/frappe/website/doctype/page_view/__init__.py b/frappe/website/doctype/web_page_view/__init__.py similarity index 100% rename from frappe/website/doctype/page_view/__init__.py rename to frappe/website/doctype/web_page_view/__init__.py diff --git a/frappe/website/doctype/page_view/test_page_view.py b/frappe/website/doctype/web_page_view/test_web_page_view.py similarity index 81% rename from frappe/website/doctype/page_view/test_page_view.py rename to frappe/website/doctype/web_page_view/test_web_page_view.py index 2ac98f2be2..d51727ec68 100644 --- a/frappe/website/doctype/page_view/test_page_view.py +++ b/frappe/website/doctype/web_page_view/test_web_page_view.py @@ -6,5 +6,5 @@ from __future__ import unicode_literals # import frappe import unittest -class TestPageView(unittest.TestCase): +class TestWebPageView(unittest.TestCase): pass diff --git a/frappe/website/doctype/page_view/page_view.js b/frappe/website/doctype/web_page_view/web_page_view.js similarity index 80% rename from frappe/website/doctype/page_view/page_view.js rename to frappe/website/doctype/web_page_view/web_page_view.js index 3d6bf92429..77a047e408 100644 --- a/frappe/website/doctype/page_view/page_view.js +++ b/frappe/website/doctype/web_page_view/web_page_view.js @@ -1,7 +1,7 @@ // Copyright (c) 2020, Frappe Technologies and contributors // For license information, please see license.txt -frappe.ui.form.on('Page View', { +frappe.ui.form.on('Web Page View', { // refresh: function(frm) { // } diff --git a/frappe/website/doctype/page_view/page_view.json b/frappe/website/doctype/web_page_view/web_page_view.json similarity index 98% rename from frappe/website/doctype/page_view/page_view.json rename to frappe/website/doctype/web_page_view/web_page_view.json index a79472154f..7a1a210d62 100644 --- a/frappe/website/doctype/page_view/page_view.json +++ b/frappe/website/doctype/web_page_view/web_page_view.json @@ -50,7 +50,7 @@ "modified": "2020-04-15 23:31:27.517793", "modified_by": "Administrator", "module": "Website", - "name": "Page View", + "name": "Web Page View", "owner": "Administrator", "permissions": [ { diff --git a/frappe/website/doctype/page_view/page_view.py b/frappe/website/doctype/web_page_view/web_page_view.py similarity index 85% rename from frappe/website/doctype/page_view/page_view.py rename to frappe/website/doctype/web_page_view/web_page_view.py index 9c41e1c4aa..d09ee8ecb3 100644 --- a/frappe/website/doctype/page_view/page_view.py +++ b/frappe/website/doctype/web_page_view/web_page_view.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document -class PageView(Document): +class WebPageView(Document): pass @@ -16,7 +16,7 @@ def make_view_log(path, referrer=None, browser=None, version=None): path = path[1:] if is_tracking_enabled(): - view = frappe.new_doc("Page View") + view = frappe.new_doc("Web Page View") view.path = path view.referrer = referrer view.browser = browser @@ -28,7 +28,7 @@ def make_view_log(path, referrer=None, browser=None, version=None): @frappe.whitelist() def get_page_view_count(path): - return frappe.db.count("Page View", filters={'path': path}) + return frappe.db.count("Web Page View", filters={'path': path}) def is_tracking_enabled(): return frappe.db.get_value("Website Settings", "Website Settings", "enable_view_tracking") \ No newline at end of file diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index a719031c40..138168a648 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -5,12 +5,12 @@ "doctype": "Website Theme", "font_properties": "300,600", "idx": 26, - "modified": "2020-04-16 11:23:03.707474", + "modified": "2020-04-16 18:23:34.573404", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", "theme": "Standard", "theme_scss": "\n\n\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: false;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", - "theme_url": "/assets/css/standard_25d87270.css" + "theme_url": "/assets/css/standard_a9402c50.css" } \ No newline at end of file diff --git a/frappe/www/website_script.js b/frappe/www/website_script.js index 9f0dd329c6..38f11a18a7 100644 --- a/frappe/www/website_script.js +++ b/frappe/www/website_script.js @@ -17,7 +17,7 @@ ga('send', 'pageview'); if (navigator.doNotTrack != 1) { frappe.ready(() => { let browser = frappe.utils.get_browser(); - frappe.call("frappe.website.doctype.page_view.page_view.make_view_log", { + frappe.call("frappe.website.doctype.web_page_view.web_page_view.make_view_log", { path: location.pathname, referrer: document.referrer, browser: browser.name, From 0bc153704ccd6ae69f11bd67748391fe6aeb2a99 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 18:30:20 +0530 Subject: [PATCH 11/48] style: linting & formatting fixes --- .../js/frappe/form/sidebar/form_sidebar.js | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 9910227590..3da6bedb8c 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -69,7 +69,7 @@ frappe.ui.form.Sidebar = Class.extend({ }, refresh: function() { - if(this.frm.doc.__islocal) { + if (this.frm.doc.__islocal) { this.sidebar.toggle(false); } else { this.sidebar.toggle(true); @@ -84,18 +84,31 @@ frappe.ui.form.Sidebar = Class.extend({ if (this.frm.doc.route && frappe.boot.website_tracking_enabled) { let route = this.frm.doc.route; - frappe.utils.get_page_view_count(route).then(res => { - this.sidebar.find(".pageview-count").html(__("{0} Page Views", - ["" + res.message + ""])); + frappe.utils.get_page_view_count(route).then((res) => { + this.sidebar + .find(".pageview-count") + .html( + __("{0} Page Views", [String(res.message).bold()]) + ); }); } - this.sidebar.find(".modified-by").html(__("{0} edited this {1}", - ["" + frappe.user.full_name(this.frm.doc.modified_by) + "", - "
" + comment_when(this.frm.doc.modified)])); - this.sidebar.find(".created-by").html(__("{0} created this {1}", - ["" + frappe.user.full_name(this.frm.doc.owner) + "", - "
" + comment_when(this.frm.doc.creation)])); + this.sidebar + .find(".modified-by") + .html( + __("{0} edited this {1}", [ + frappe.user.full_name(this.frm.doc.modified_by).bold(), + "
" + comment_when(this.frm.doc.modified), + ]) + ); + this.sidebar + .find(".created-by") + .html( + __("{0} created this {1}", [ + frappe.user.full_name(this.frm.doc.owner).bold(), + "
" + comment_when(this.frm.doc.creation), + ]) + ); this.refresh_like(); frappe.ui.form.set_user_image(this.frm); From 3db595f06d61a6e4e7e206c8725e4beb8c823c25 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Fri, 17 Apr 2020 12:15:49 +0530 Subject: [PATCH 12/48] Delete test_video.js --- frappe/core/doctype/video/test_video.js | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 frappe/core/doctype/video/test_video.js diff --git a/frappe/core/doctype/video/test_video.js b/frappe/core/doctype/video/test_video.js deleted file mode 100644 index a82a221319..0000000000 --- a/frappe/core/doctype/video/test_video.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Video", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Video - () => frappe.tests.make('Video', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); From 7e0e6630bd66b1b29db886e597a82475ba581a16 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 17 Apr 2020 13:00:48 +0530 Subject: [PATCH 13/48] feat: add user timezone and unique visit check --- .../website/doctype/web_page_view/web_page_view.py | 14 ++++++++++++-- frappe/www/website_script.js | 6 ++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/frappe/website/doctype/web_page_view/web_page_view.py b/frappe/website/doctype/web_page_view/web_page_view.py index d09ee8ecb3..ba2d707e44 100644 --- a/frappe/website/doctype/web_page_view/web_page_view.py +++ b/frappe/website/doctype/web_page_view/web_page_view.py @@ -11,7 +11,15 @@ class WebPageView(Document): @frappe.whitelist(allow_guest=True) -def make_view_log(path, referrer=None, browser=None, version=None): +def make_view_log(path, referrer=None, browser=None, version=None, url=None, user_tz=None): + from pprint import pprint + request_dict = frappe.request.__dict__ + user_agent = request_dict.get('environ', {}).get('HTTP_USER_AGENT') + + is_unique = True + if referrer.startswith(url): + is_unique = False + if path.startswith('/'): path = path[1:] @@ -21,7 +29,9 @@ def make_view_log(path, referrer=None, browser=None, version=None): view.referrer = referrer view.browser = browser view.browser_version = version - view.date = frappe.utils.now_datetime() + view.time_zone = user_tz + view.user_agent = user_agent + view.is_unique = is_unique view.insert(ignore_permissions=True) return diff --git a/frappe/www/website_script.js b/frappe/www/website_script.js index 38f11a18a7..7fdc2e94d6 100644 --- a/frappe/www/website_script.js +++ b/frappe/www/website_script.js @@ -21,8 +21,10 @@ ga('send', 'pageview'); path: location.pathname, referrer: document.referrer, browser: browser.name, - version: browser.version + version: browser.version, + url: location.origin, + user_tz: Intl.DateTimeFormat().resolvedOptions().timeZone }) }) } -{% endif %} +{% endif %} \ No newline at end of file From 938684759ba4925cd7a32f4bf7a850e80dd7f4a6 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Fri, 17 Apr 2020 13:35:17 +0530 Subject: [PATCH 14/48] fix: update Roles in Video DocType --- frappe/core/doctype/video/video.json | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/frappe/core/doctype/video/video.json b/frappe/core/doctype/video/video.json index 875926088b..b0a154f5d4 100644 --- a/frappe/core/doctype/video/video.json +++ b/frappe/core/doctype/video/video.json @@ -68,7 +68,7 @@ } ], "links": [], - "modified": "2020-04-10 23:04:41.124053", + "modified": "2020-04-17 13:34:06.461574", "modified_by": "Administrator", "module": "Core", "name": "Video", @@ -82,30 +82,9 @@ "print": 1, "read": 1, "report": 1, - "role": "Academics User", + "role": "All", "share": 1, "write": 1 - }, - { - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "Instructor", - "share": 1, - "write": 1 - }, - { - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "LMS User", - "share": 1 } ], "sort_field": "modified", From 00cb903462fc53c3eb415ed83e7d0902eea24056 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 17 Apr 2020 15:47:56 +0530 Subject: [PATCH 15/48] feat: remove unused import --- frappe/website/doctype/web_page_view/web_page_view.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/website/doctype/web_page_view/web_page_view.py b/frappe/website/doctype/web_page_view/web_page_view.py index ba2d707e44..08625f9d6f 100644 --- a/frappe/website/doctype/web_page_view/web_page_view.py +++ b/frappe/website/doctype/web_page_view/web_page_view.py @@ -12,7 +12,6 @@ class WebPageView(Document): @frappe.whitelist(allow_guest=True) def make_view_log(path, referrer=None, browser=None, version=None, url=None, user_tz=None): - from pprint import pprint request_dict = frappe.request.__dict__ user_agent = request_dict.get('environ', {}).get('HTTP_USER_AGENT') From 16e96b14f863dc3db7b0b3100c72cb585f18a137 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Mon, 20 Apr 2020 12:43:01 +0530 Subject: [PATCH 16/48] fix: message on reset password --- frappe/www/update-password.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frappe/www/update-password.html b/frappe/www/update-password.html index f0ee0688d4..34e5ea137d 100644 --- a/frappe/www/update-password.html +++ b/frappe/www/update-password.html @@ -57,11 +57,11 @@ frappe.ready(function() { } if(!args.old_password && !args.key) { - frappe.msgprint("{{ _("Old Password Required.") }}"); + frappe.msgprint("{{ _('Old Password Required.') }}"); return; } if(!args.new_password) { - frappe.msgprint("{{ _("New Password Required.") }}"); + frappe.msgprint("{{ _('New Password Required.') }}"); return; } frappe.call({ @@ -79,11 +79,11 @@ frappe.ready(function() { strength_indicator.addClass('hidden'); strength_message.addClass('hidden'); $('.page-card-head .indicator') - .removeClass().addClass('indicator green') - .html("{{ _('Password Updated') }}"); + .removeClass().addClass('indicator blue') + .html("{{ _('Status Updated') }}"); if(r.message) { frappe.msgprint({ - message: "{{ _("Password Updated") }}", + message: `{{ _('${r.message}') }}`, // password is updated successfully // clear any server message clear: true From ba03e6ee5d0d18f1e2f7b49081c06e97cf56b28d Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 20 Apr 2020 16:36:52 +0530 Subject: [PATCH 17/48] fix: conflict --- frappe/website/website_theme/standard/standard.json | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 138168a648..2393b684ca 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -1,16 +1,20 @@ { + "button_gradients": 0, + "button_rounded_corners": 1, + "button_shadows": 0, "creation": "2015-02-19 13:37:33.925909", "custom": 0, "docstatus": 0, "doctype": "Website Theme", "font_properties": "300,600", - "idx": 26, - "modified": "2020-04-16 18:23:34.573404", + "idx": 27, + "modified": "2020-04-19 05:34:56.086984", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", + "primary_color": "Blue", "theme": "Standard", - "theme_scss": "\n\n\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: false;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", - "theme_url": "/assets/css/standard_a9402c50.css" + "theme_scss": "\n\n$primary: #5e3aa8;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", + "theme_url": "/assets/css/standard_999ef15b.css" } \ No newline at end of file From 1a8e8437a2ce6fc6a04b75e4dbfa51d3aca19e06 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Mon, 20 Apr 2020 20:04:08 +0530 Subject: [PATCH 18/48] fix: Breadcrumb and Desk Page for Video DocType --- frappe/automation/desk_page/tools/tools.json | 4 ++-- frappe/public/js/frappe/views/breadcrumbs.js | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/automation/desk_page/tools/tools.json b/frappe/automation/desk_page/tools/tools.json index 235498724d..2164a4ce38 100644 --- a/frappe/automation/desk_page/tools/tools.json +++ b/frappe/automation/desk_page/tools/tools.json @@ -3,7 +3,7 @@ { "hidden": 0, "label": "Tools", - "links": "[\n {\n \"description\": \"Documents assigned to you and by you.\",\n \"label\": \"To Do\",\n \"name\": \"ToDo\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Event and other calendars.\",\n \"label\": \"Calendar\",\n \"link\": \"List/Event/Calendar\",\n \"name\": \"Event\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Private and public Notes.\",\n \"label\": \"Note\",\n \"name\": \"Note\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Files\",\n \"name\": \"File\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Activity log of all users.\",\n \"label\": \"Activity\",\n \"name\": \"activity\",\n \"type\": \"page\"\n }\n]" + "links": "[\n {\n \"description\": \"Documents assigned to you and by you.\",\n \"label\": \"To Do\",\n \"name\": \"ToDo\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Event and other calendars.\",\n \"label\": \"Calendar\",\n \"link\": \"List/Event/Calendar\",\n \"name\": \"Event\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Private and public Notes.\",\n \"label\": \"Note\",\n \"name\": \"Note\",\n \"onboard\": 1,\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Files\",\n \"name\": \"File\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Video\",\n \"name\": \"Video\",\n \"type\": \"doctype\"\n },\n {\n \"description\": \"Activity log of all users.\",\n \"label\": \"Activity\",\n \"name\": \"activity\",\n \"type\": \"page\"\n }\n]" }, { "hidden": 0, @@ -32,7 +32,7 @@ "idx": 0, "is_standard": 1, "label": "Tools", - "modified": "2020-04-01 11:24:40.804346", + "modified": "2020-04-20 18:21:14.152537", "modified_by": "Administrator", "module": "Automation", "name": "Tools", diff --git a/frappe/public/js/frappe/views/breadcrumbs.js b/frappe/public/js/frappe/views/breadcrumbs.js index 2aef1a8218..1c1049391f 100644 --- a/frappe/public/js/frappe/views/breadcrumbs.js +++ b/frappe/public/js/frappe/views/breadcrumbs.js @@ -6,9 +6,10 @@ frappe.breadcrumbs = { preferred: { "File": "", + "Video": "", "Dashboard": "Customization", "Dashboard Chart": "Customization", - "Dashboard Chart Source": "Customization", + "Dashboard Chart Source": "Customization" }, module_map: { From 90dd7294969c4ce8db16b52f3056e93911dc8e71 Mon Sep 17 00:00:00 2001 From: marination Date: Mon, 20 Apr 2020 20:31:27 +0530 Subject: [PATCH 19/48] fix: Migrate fails on `move_email_and_phone_to_child_table` patch --- .../patches/v12_0/move_email_and_phone_to_child_table.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frappe/patches/v12_0/move_email_and_phone_to_child_table.py b/frappe/patches/v12_0/move_email_and_phone_to_child_table.py index 4388d3c849..12680609d5 100644 --- a/frappe/patches/v12_0/move_email_and_phone_to_child_table.py +++ b/frappe/patches/v12_0/move_email_and_phone_to_child_table.py @@ -1,6 +1,10 @@ import frappe def execute(): + frappe.reload_doc("contacts", "doctype", "contact_email") + frappe.reload_doc("contacts", "doctype", "contact_phone") + frappe.reload_doc("contacts", "doctype", "contact") + contact_details = frappe.db.sql(""" SELECT `name`, `email_id`, `phone`, `mobile_no`, `modified_by`, `creation`, `modified` @@ -10,10 +14,6 @@ def execute(): and `tabContact Email`.email_id=`tabContact`.email_id) """, as_dict=True) - frappe.reload_doc("contacts", "doctype", "contact_email") - frappe.reload_doc("contacts", "doctype", "contact_phone") - frappe.reload_doc("contacts", "doctype", "contact") - email_values = [] phone_values = [] for count, contact_detail in enumerate(contact_details): From 0fa8266d6d6c5808e3dbac5d11c0c7d10c735c93 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 21 Apr 2020 09:29:24 +0530 Subject: [PATCH 20/48] fix: Translate only if column label exists --- frappe/desk/query_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index f994dc0d30..164f6389eb 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -242,7 +242,7 @@ def get_prepared_report_result(report, filters, dn="", user=None): columns = json.loads(doc.columns) if doc.columns else data[0] for column in columns: - if isinstance(column, dict): + if isinstance(column, dict) and column.get("label"): column["label"] = _(column["label"]) latest_report_data = { From d265f00f9b28f6f8d0daaacc5a5895fe8e0d51f6 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 21 Apr 2020 12:38:04 +0530 Subject: [PATCH 21/48] fix: update timestamp --- .../doctype/website_settings/website_settings.json | 2 +- frappe/website/website_theme/standard/standard.json | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/frappe/website/doctype/website_settings/website_settings.json b/frappe/website/doctype/website_settings/website_settings.json index 635f0d3f22..708d2a0473 100644 --- a/frappe/website/doctype/website_settings/website_settings.json +++ b/frappe/website/doctype/website_settings/website_settings.json @@ -371,7 +371,7 @@ "issingle": 1, "links": [], "max_attachments": 10, - "modified": "2020-04-21 16:46:59.947403", + "modified": "2020-04-21 12:37:44.070662", "modified_by": "Administrator", "module": "Website", "name": "Website Settings", diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 2393b684ca..099d57da01 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -1,20 +1,17 @@ { - "button_gradients": 0, - "button_rounded_corners": 1, - "button_shadows": 0, "creation": "2015-02-19 13:37:33.925909", "custom": 0, "docstatus": 0, "doctype": "Website Theme", "font_properties": "300,600", "idx": 27, - "modified": "2020-04-19 05:34:56.086984", + "modified": "2020-04-21 12:36:34.307990", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", "primary_color": "Blue", "theme": "Standard", - "theme_scss": "\n\n$primary: #5e3aa8;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", - "theme_url": "/assets/css/standard_999ef15b.css" + "theme_scss": "\n\n$primary: Blue;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: false;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", + "theme_url": "/assets/css/standard_44af43a7.css" } \ No newline at end of file From ceabdf7403645873b24e25986e1ecec11e060833 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 21 Apr 2020 12:43:26 +0530 Subject: [PATCH 22/48] feat: better handling of website tracking flag --- frappe/public/js/frappe/form/sidebar/form_sidebar.js | 2 +- frappe/website/doctype/website_settings/website_settings.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index 3da6bedb8c..a145e47149 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -82,7 +82,7 @@ frappe.ui.form.Sidebar = Class.extend({ this.frm.viewers.refresh(); this.frm.tags && this.frm.tags.refresh(this.frm.get_docinfo().tags); - if (this.frm.doc.route && frappe.boot.website_tracking_enabled) { + if (this.frm.doc.route && cint(frappe.boot.website_tracking_enabled)) { let route = this.frm.doc.route; frappe.utils.get_page_view_count(route).then((res) => { this.sidebar diff --git a/frappe/website/doctype/website_settings/website_settings.js b/frappe/website/doctype/website_settings/website_settings.js index 38e1ff993a..be294258f4 100644 --- a/frappe/website/doctype/website_settings/website_settings.js +++ b/frappe/website/doctype/website_settings/website_settings.js @@ -56,6 +56,10 @@ frappe.ui.form.on('Website Settings', { }); }, + enable_view_tracking: function(frm) { + frappe.boot.website_tracking_enabled = frm.doc.enable_view_tracking; + }, + set_parent_options: function(frm, doctype, name) { var item = frappe.get_doc(doctype, name); if(item.parentfield === "top_bar_items") { From 7d6adb94309caf806c1b47f29bbc34ea1c32c201 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 21 Apr 2020 13:25:24 +0530 Subject: [PATCH 23/48] feat: allow minimizing new email dialog --- frappe/public/js/frappe/views/communication.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/views/communication.js b/frappe/public/js/frappe/views/communication.js index 17b32b3a52..ba290417f5 100755 --- a/frappe/public/js/frappe/views/communication.js +++ b/frappe/public/js/frappe/views/communication.js @@ -20,7 +20,8 @@ frappe.views.CommunicationComposer = Class.extend({ primary_action: function() { me.delete_saved_draft(); me.send_action(); - } + }, + minimizable: true }); ['recipients', 'cc', 'bcc'].forEach(field => { From 2fccdd5bd20cd4cd5c6852d7bb7bd607e0ec76b4 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 21 Apr 2020 13:34:00 +0530 Subject: [PATCH 24/48] fix: resolve conflicts in standard.json --- frappe/website/website_theme/standard/standard.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 099d57da01..a799f25425 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -1,17 +1,20 @@ { + "button_gradients": 0, + "button_rounded_corners": 1, + "button_shadows": 0, "creation": "2015-02-19 13:37:33.925909", "custom": 0, "docstatus": 0, "doctype": "Website Theme", "font_properties": "300,600", + "font_size": "", "idx": 27, - "modified": "2020-04-21 12:36:34.307990", + "modified": "2020-04-21 02:10:31.761219", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", - "primary_color": "Blue", "theme": "Standard", - "theme_scss": "\n\n$primary: Blue;\n\n\n\n\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: false;\n\n@import \"frappe/public/scss/website\";\n\nbody {\n \n}", - "theme_url": "/assets/css/standard_44af43a7.css" + "theme_scss": "$enable-shadows: false;\n$enable-gradients: false;\n$enable-rounded: true;\n\n@import \"frappe/public/scss/website\";\n\n", + "theme_url": "/assets/css/standard_style.css" } \ No newline at end of file From 1dfa8ccbc4e44fb45ee7b49c75ecf6278d796f58 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Tue, 21 Apr 2020 15:49:55 +0530 Subject: [PATCH 25/48] feat: add name validation to data fieldtype Signed-off-by: Chinmay D. Pai --- .eslintrc | 1 + frappe/exceptions.py | 3 ++- frappe/model/__init__.py | 2 +- frappe/model/base_document.py | 3 +++ frappe/public/js/frappe/form/controls/data.js | 3 +++ frappe/public/js/frappe/utils/datatype.js | 6 +++++- frappe/public/js/frappe/utils/utils.js | 3 +++ frappe/utils/__init__.py | 18 +++++++++++++++++- 8 files changed, 35 insertions(+), 4 deletions(-) diff --git a/.eslintrc b/.eslintrc index eef33ec8a0..69c731b079 100644 --- a/.eslintrc +++ b/.eslintrc @@ -78,6 +78,7 @@ "has_common": true, "has_words": true, "validate_email": true, + "validate_name": true, "validate_phone": true, "get_number_format": true, "format_number": true, diff --git a/frappe/exceptions.py b/frappe/exceptions.py index ef75a36e03..9a1c1fb0b0 100644 --- a/frappe/exceptions.py +++ b/frappe/exceptions.py @@ -78,6 +78,7 @@ class TimestampMismatchError(ValidationError): pass class EmptyTableError(ValidationError): pass class LinkExistsError(ValidationError): pass class InvalidEmailAddressError(ValidationError): pass +class InvalidNameError(ValidationError): pass class InvalidPhoneNumberError(ValidationError): pass class TemplateNotFoundError(ValidationError): pass class UniqueValidationError(ValidationError): pass @@ -95,4 +96,4 @@ class DataTooLongException(ValidationError): pass # OAuth exceptions class InvalidAuthorizationHeader(CSRFTokenError): pass class InvalidAuthorizationPrefix(CSRFTokenError): pass -class InvalidAuthorizationToken(CSRFTokenError): pass \ No newline at end of file +class InvalidAuthorizationToken(CSRFTokenError): pass diff --git a/frappe/model/__init__.py b/frappe/model/__init__.py index 7af987f4bc..93ef78df7b 100644 --- a/frappe/model/__init__.py +++ b/frappe/model/__init__.py @@ -48,7 +48,7 @@ table_fields = ('Table', 'Table MultiSelect') core_doctypes_list = ('DocType', 'DocField', 'DocPerm', 'DocType Action', 'DocType Link', 'User', 'Role', 'Has Role', 'Page', 'Module Def', 'Print Format', 'Report', 'Customize Form', 'Customize Form Field', 'Property Setter', 'Custom Field', 'Custom Script') -data_field_options = ('Email', 'Phone') +data_field_options = ('Email', 'Name', 'Phone') def copytables(srctype, src, srcfield, tartype, tar, tarfield, srcfields, tarfields=[]): if not tarfields: diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 9ab1ef7799..5d1d693f8e 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -571,6 +571,9 @@ class BaseDocument(object): for email_address in frappe.utils.split_emails(data): frappe.utils.validate_email_address(email_address, throw=True) + if data_field_options == "Name": + frappe.utils.validate_name(data, throw=True) + if data_field_options == "Phone": frappe.utils.validate_phone_number(data, throw=True) diff --git a/frappe/public/js/frappe/form/controls/data.js b/frappe/public/js/frappe/form/controls/data.js index a7f0050d65..c943ec89bb 100644 --- a/frappe/public/js/frappe/form/controls/data.js +++ b/frappe/public/js/frappe/form/controls/data.js @@ -96,6 +96,9 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ if(this.df.options == 'Phone') { this.df.invalid = !validate_phone(v); return v; + } else if (this.df.options == 'Name') { + this.df.invalid = !validate_name(v); + return v; } else if(this.df.options == 'Email') { var email_list = frappe.utils.split_emails(v); if (!email_list) { diff --git a/frappe/public/js/frappe/utils/datatype.js b/frappe/public/js/frappe/utils/datatype.js index 16f87b872f..1b9206f434 100644 --- a/frappe/public/js/frappe/utils/datatype.js +++ b/frappe/public/js/frappe/utils/datatype.js @@ -48,6 +48,10 @@ window.validate_phone = function(txt) { return frappe.utils.validate_type(txt, "phone"); }; +window.validate_name = function(txt) { + return frappe.utils.validate_type(txt, "name"); +}; + window.nth = function(number) { number = cint(number); var s = 'th'; @@ -73,4 +77,4 @@ window.has_common = function(list1, list2) { if(in_list(list2, list1[i]))return true; } return false; -}; \ No newline at end of file +}; diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 315637092d..f07d47326e 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -237,6 +237,9 @@ Object.assign(frappe.utils, { case "phone": regExp = /^([0-9\ \+\_\-\,\.\*\#\(\)]){1,20}$/; break; + case "name": + regExp = /^[\w][\w\'\-]*([ \w][\w\'\-]+)*$/; + break; case "number": regExp = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/; break; diff --git a/frappe/utils/__init__.py b/frappe/utils/__init__.py index 649d3bf72c..34432839bb 100644 --- a/frappe/utils/__init__.py +++ b/frappe/utils/__init__.py @@ -81,13 +81,29 @@ def validate_phone_number(phone_number, throw=False): return False phone_number = phone_number.strip() - match = re.match("([0-9\ \+\_\-\,\.\*\#\(\)]){1,20}$", phone_number) + match = re.match(r"([0-9\ \+\_\-\,\.\*\#\(\)]){1,20}$", phone_number) if not match and throw: frappe.throw(frappe._("{0} is not a valid Phone Number").format(phone_number), frappe.InvalidPhoneNumberError) return bool(match) +def validate_name(name, throw=False): + """Returns True if the name is valid + valid names may have unicode and ascii characters, dash, quotes, numbers + anything else is considered invalid + """ + if not name: + return False + + name = name.strip() + match = re.match(r"^[\w][\w\'\-]*([ \w][\w\'\-]+)*$", name) + + if not match and throw: + frappe.throw(frappe._("{0} is not a valid Name").format(name), frappe.InvalidNameError) + + return bool(match) + def validate_email_address(email_str, throw=False): """Validates the email string""" email = email_str = (email_str or "").strip() From 6f63b03aeb43220d51a28cf529d3d614b1695781 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Tue, 21 Apr 2020 16:09:09 +0530 Subject: [PATCH 26/48] chore: fix sider issues Signed-off-by: Chinmay D. Pai --- frappe/public/js/frappe/utils/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index f07d47326e..1afdbfd81c 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -238,7 +238,7 @@ Object.assign(frappe.utils, { regExp = /^([0-9\ \+\_\-\,\.\*\#\(\)]){1,20}$/; break; case "name": - regExp = /^[\w][\w\'\-]*([ \w][\w\'\-]+)*$/; + regExp = /^[\w][\w'-]*([ \w][\w'-]+)*$/; break; case "number": regExp = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/; From 108fa0f42e8f1539c39455c6ca9f2ddc9ee68111 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Tue, 21 Apr 2020 17:22:44 +0530 Subject: [PATCH 27/48] fix: sanitize all html input use beautifulsoup to parse if string contains html and then sanitize the input html Signed-off-by: Chinmay D. Pai --- frappe/model/base_document.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 9ab1ef7799..ca6261076e 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -11,11 +11,12 @@ from frappe.model import default_fields, table_fields from frappe.model.naming import set_new_name from frappe.model.utils.link_count import notify_link_count from frappe.modules import load_doctype_module -from frappe.model import display_fieldtypes, data_fieldtypes +from frappe.model import display_fieldtypes from frappe.utils.password import get_decrypted_password, set_encrypted_password -from frappe.utils import (cint, flt, now, cstr, strip_html, getdate, get_datetime, to_timedelta, +from frappe.utils import (cint, flt, now, cstr, strip_html, sanitize_html, sanitize_email, cast_fieldtype) from frappe.utils.html_utils import unescape_html +from bs4 import BeautifulSoup max_positive_value = { 'smallint': 2 ** 15, @@ -678,7 +679,7 @@ class BaseDocument(object): # doesn't look like html so no need continue - elif "" in value and not ("" in value and not bool(BeautifulSoup(value, "html.parser").find()): # should be handled separately via the markdown converter function continue From 3a48fd858f06e00f74e16309fe3bc3c912f03b98 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 21 Apr 2020 23:06:14 +0530 Subject: [PATCH 28/48] fix: Use currentTarget to find right parent --- .../print_format_builder/print_format_builder.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/frappe/printing/page/print_format_builder/print_format_builder.js b/frappe/printing/page/print_format_builder/print_format_builder.js index d0a3379609..4e049d120a 100644 --- a/frappe/printing/page/print_format_builder/print_format_builder.js +++ b/frappe/printing/page/print_format_builder/print_format_builder.js @@ -441,18 +441,16 @@ frappe.PrintFormatBuilder = Class.extend({ }); }, setup_field_settings: function() { - - this.page.main.find(".field-settings").on("click", () => { - var field = $(this).parent(); - + this.page.main.find(".field-settings").on("click", e => { + const field = $(e.currentTarget).parent(); // new dialog var d = new frappe.ui.Dialog({ title: "Set Properties", fields: [ { - label:__("Label"), - fieldname:"label", - fieldtype:"Data" + label: __("Label"), + fieldname: "label", + fieldtype: "Data" }, { label: __("Align Value"), @@ -485,7 +483,7 @@ frappe.PrintFormatBuilder = Class.extend({ }); // set current value - if(field.attr('data-align')) { + if (field.attr('data-align')) { d.set_value('align', field.attr('data-align')); } else { d.set_value('align', 'left'); From c2f566163e17392693593e82b8e1e6237c59cc4d Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Wed, 22 Apr 2020 01:56:58 +0530 Subject: [PATCH 29/48] feat: source maps for css/scss/less files! --- rollup/config.js | 5 +++- rollup/less-loader.js | 54 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 rollup/less-loader.js diff --git a/rollup/config.js b/rollup/config.js index 93bb226927..5f0b2bc60a 100644 --- a/rollup/config.js +++ b/rollup/config.js @@ -11,6 +11,7 @@ const buble = require('rollup-plugin-buble'); const { terser } = require('rollup-plugin-terser'); const vue = require('rollup-plugin-vue'); const frappe_html = require('./frappe-html-plugin'); +const less_loader = require('./less-loader'); const production = process.env.FRAPPE_ENV === 'production'; @@ -116,6 +117,7 @@ function get_rollup_options_for_css(output_file, input_files) { // less -> css postcss({ extract: output_path, + loaders: [less_loader], use: [ ['less', { // import other less/css files starting from these folders @@ -130,7 +132,8 @@ function get_rollup_options_for_css(output_file, input_files) { path.resolve(bench_path, '**/*.scss'), path.resolve(bench_path, '**/*.css') ], - minimize: minimize_css + minimize: minimize_css, + sourceMap: output_file.startsWith('css/') && !production }) ]; diff --git a/rollup/less-loader.js b/rollup/less-loader.js new file mode 100644 index 0000000000..7463565d76 --- /dev/null +++ b/rollup/less-loader.js @@ -0,0 +1,54 @@ +const pify = require('pify'); +const importCwd = require('import-cwd'); +const path = require('path'); + +const getFileName = filepath => path.basename(filepath); + +function loadModule(moduleId) { + // Trying to load module normally (relative to plugin directory) + try { + return require(moduleId) + } catch (_) { + // Ignore error + } + + // Then, trying to load it relative to CWD + return importCwd.silent(moduleId) +} + +module.exports = { + name: 'less', + test: /\.less$/, + async process({ + code + }) { + const less = loadModule('less') + if (!less) { + throw new Error('You need to install "less" packages in order to process Less files') + } + + let { + css, + map, + imports + } = await pify(less.render.bind(less))(code, { + ...this.options, + sourceMap: this.sourceMap && { outputSourceFiles: true }, + filename: this.id + }) + + for (const dep of imports) { + this.dependencies.add(dep) + } + + if (map) { + map = JSON.parse(map) + map.sources = map.sources.map(source => getFileName(source)) + } + + return { + code: css, + map + } + } +} \ No newline at end of file From 04e6e8125ea7f3e094cb1fbe5253b97046abab9f Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 22 Apr 2020 10:29:06 +0530 Subject: [PATCH 30/48] fix(minor): editable title for Web View --- frappe/website/doctype/web_view/web_view.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/website/doctype/web_view/web_view.json b/frappe/website/doctype/web_view/web_view.json index 8c42f51421..d4ccbad0e4 100644 --- a/frappe/website/doctype/web_view/web_view.json +++ b/frappe/website/doctype/web_view/web_view.json @@ -3,7 +3,6 @@ "allow_guest_to_view": 1, "allow_import": 1, "allow_rename": 1, - "autoname": "field:title", "beta": 1, "creation": "2020-03-16 15:28:03.828741", "doctype": "DocType", @@ -117,7 +116,7 @@ "has_web_view": 1, "is_published_field": "published", "links": [], - "modified": "2020-04-19 12:25:48.014935", + "modified": "2020-04-22 00:54:23.413077", "modified_by": "Administrator", "module": "Website", "name": "Web View", From 18cd93eb7f60e0a5124833e279e05e66e81ee43a Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Wed, 22 Apr 2020 11:29:38 +0530 Subject: [PATCH 31/48] missing semicolons --- rollup/less-loader.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/rollup/less-loader.js b/rollup/less-loader.js index 7463565d76..5c4c89f87b 100644 --- a/rollup/less-loader.js +++ b/rollup/less-loader.js @@ -7,13 +7,13 @@ const getFileName = filepath => path.basename(filepath); function loadModule(moduleId) { // Trying to load module normally (relative to plugin directory) try { - return require(moduleId) + return require(moduleId); } catch (_) { // Ignore error } // Then, trying to load it relative to CWD - return importCwd.silent(moduleId) + return importCwd.silent(moduleId); } module.exports = { @@ -22,9 +22,9 @@ module.exports = { async process({ code }) { - const less = loadModule('less') + const less = loadModule('less'); if (!less) { - throw new Error('You need to install "less" packages in order to process Less files') + throw new Error('You need to install "less" packages in order to process Less files'); } let { @@ -35,20 +35,20 @@ module.exports = { ...this.options, sourceMap: this.sourceMap && { outputSourceFiles: true }, filename: this.id - }) + }); for (const dep of imports) { - this.dependencies.add(dep) + this.dependencies.add(dep); } if (map) { - map = JSON.parse(map) - map.sources = map.sources.map(source => getFileName(source)) + map = JSON.parse(map); + map.sources = map.sources.map(source => getFileName(source)); } return { code: css, map - } + }; } -} \ No newline at end of file +}; \ No newline at end of file From db120f47937bc08b9c2e22cfe2e756888dfed190 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 22 Apr 2020 11:39:19 +0530 Subject: [PATCH 32/48] fix: add modules.less --- frappe/public/build.json | 1 + frappe/public/less/module.less | 147 +++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 frappe/public/less/module.less diff --git a/frappe/public/build.json b/frappe/public/build.json index 75a89e5010..7f55924a6b 100755 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -90,6 +90,7 @@ "public/css/font-awesome.css", "public/css/octicons/octicons.css", "public/less/desk.less", + "public/less/module.less", "public/less/flex.less", "public/less/indicator.less", "public/less/avatar.less", diff --git a/frappe/public/less/module.less b/frappe/public/less/module.less new file mode 100644 index 0000000000..f924778864 --- /dev/null +++ b/frappe/public/less/module.less @@ -0,0 +1,147 @@ +@import "variables.less"; + +.module-head { + padding: 15px 30px; + border-bottom: 1px solid @light-border-color; +} + +.module-head h1 { + padding: 0px; + margin: 0px; +} + +.module-body { + padding: 0px 15px; + + .section-head { + margin-bottom: 15px; + margin-top: 0px; + } +} + +.module-section { + border-bottom: 1px solid @light-border-color; + + .module-section-link { + line-height: 1.5em; + // font-size: 14px; + } +} + +.module-section-column { + padding: 30px; +} + +@media(min-width: @screen-xs) { + .module-section:nth-child(even) { + background-color: @light-bg; + } + + .module-section:last-child { + border-bottom: none; + } +} + +@media(max-width: @screen-sm) { + .module-body { + margin-top: 15px; + border-top: 1px solid @border-color; + } +} + +@media(max-width: @screen-xs) { + .module-body { + margin-top: 0; + border-top: 1px solid transparent; + } +} + +@media(max-width: @screen-xs) { + .module-section { + border: none; + } + + .module-section-column { + border-bottom: 1px solid @light-border-color; + } + + .module-section-column:nth-child(even) { + background-color: @light-bg; + } + + .module-section:last-child .module-section-column:last-child { + border-bottom: none; + } +} + + +.module-item { + margin: 0px; + padding: 7px; + font-weight: 400; + border-bottom: 1px solid @border-color; + cursor: pointer; + transition: 0.2s; + -webkit-transition: 0.2s; +} + +.module-item h4 { + display: inline-block; +} + +.module-item .module-item-description { + margin-top: -5px; +} + +.module-item .badge { + margin-top: -2px; + margin-left: 3px; +} + +.module-item:hover, .module-item:focus { + background-color: @panel-bg; +} + +.module-item:last-child { + border: none; +} + +.module-link.active .icon-chevron-right { + margin-top: 4px; + display: block !important; +} + +.module-item-progress { + margin-bottom: 10px; + height: 17px; +} + +.module-item-progress-total { + height: 7px; + background-color: #999999; + width: 0px; +} + +.module-item-progress-open { + height: 7px; + background-color: red; + width: 0px; +} + +@media(max-width: @screen-xs) { + + body[data-route^="Module"] { + .page-title { + width: 100%; + } + + + .page-actions { + display: none !important; + } + + .layout-main-section { + border-bottom: 0px; + } + } +} From 27b5819e3466ad254edb7262800a8589efb9d231 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Wed, 22 Apr 2020 11:55:46 +0530 Subject: [PATCH 33/48] fix: skip validation if oldfieldtype is not set to data Signed-off-by: Chinmay D. Pai --- frappe/model/base_document.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index ca6261076e..36f6970995 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -565,10 +565,14 @@ class BaseDocument(object): for data_field in self.meta.get_data_fields(): data = self.get(data_field.fieldname) data_field_options = data_field.get("options") + old_fieldtype = data_field.get("oldfieldtype") + + if old_fieldtype and old_fieldtype != "Data": + continue if data_field_options == "Email": if (self.owner in STANDARD_USERS) and (data in STANDARD_USERS): - return + continue for email_address in frappe.utils.split_emails(data): frappe.utils.validate_email_address(email_address, throw=True) From 774f990260bf79ba97fe44b40f4d78f4f32aa1de Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 22 Apr 2020 12:03:35 +0530 Subject: [PATCH 34/48] fix: fix case of timestamps --- frappe/public/js/frappe/utils/pretty_date.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frappe/public/js/frappe/utils/pretty_date.js b/frappe/public/js/frappe/utils/pretty_date.js index 060ae73a98..ef235ed3b1 100644 --- a/frappe/public/js/frappe/utils/pretty_date.js +++ b/frappe/public/js/frappe/utils/pretty_date.js @@ -13,7 +13,7 @@ function prettyDate(date, mini) { // Return short format of time difference if (day_diff == 0) { if (diff < 60) { - return __("Now"); + return __("now"); } else if (diff < 3600) { return __("{0} m", [Math.floor(diff / 60)]); } else if (diff < 86400) { @@ -21,20 +21,20 @@ function prettyDate(date, mini) { } } else { if (day_diff < 7) { - return __("{0} D", [day_diff]); + return __("{0} d", [day_diff]); } else if (day_diff < 31) { - return __("{0} W", [Math.ceil(day_diff / 7)]); + return __("{0} w", [Math.ceil(day_diff / 7)]); } else if (day_diff < 365) { return __("{0} M", [Math.ceil(day_diff / 30)]); } else { - return __("{0} Y", [Math.ceil(day_diff / 365)]); + return __("{0} y", [Math.ceil(day_diff / 365)]); } } } else { // Return long format of time difference if (day_diff == 0) { if (diff < 60) { - return __("Just now"); + return __("just now"); } else if (diff < 120) { return __("1 minute ago"); } else if (diff < 3600) { @@ -46,7 +46,7 @@ function prettyDate(date, mini) { } } else { if (day_diff == 1) { - return __("Yesterday"); + return __("yesterday"); } else if (day_diff < 7) { return __("{0} days ago", [day_diff]); } else if (day_diff < 14) { From be6c58d6062af58b83093bba54edf4f884846705 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 22 Apr 2020 12:10:18 +0530 Subject: [PATCH 35/48] fix: permissions for Video DocType --- frappe/core/doctype/video/video.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/frappe/core/doctype/video/video.json b/frappe/core/doctype/video/video.json index b0a154f5d4..26a407c05c 100644 --- a/frappe/core/doctype/video/video.json +++ b/frappe/core/doctype/video/video.json @@ -68,7 +68,7 @@ } ], "links": [], - "modified": "2020-04-17 13:34:06.461574", + "modified": "2020-04-22 12:09:49.057403", "modified_by": "Administrator", "module": "Core", "name": "Video", @@ -79,12 +79,25 @@ "delete": 1, "email": 1, "export": 1, + "if_owner": 1, "print": 1, "read": 1, "report": 1, "role": "All", "share": 1, "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 } ], "sort_field": "modified", From 919562e60e8e63cebdaca3e8ea951a83029a2f4f Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Wed, 22 Apr 2020 12:22:46 +0530 Subject: [PATCH 36/48] fix: skip data validation on creation if oldfieldtype is set Signed-off-by: Chinmay D. Pai --- frappe/core/doctype/doctype/doctype.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index f7c9cbe28a..7306f90108 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -893,7 +893,7 @@ def validate_fields(meta): field.fetch_from = field.fetch_from.strip('\n').strip() def validate_data_field_type(docfield): - if docfield.fieldtype == "Data": + if docfield.fieldtype == "Data" and not (docfield.oldfieldtype and docfield.oldfieldtype != "Data"): if docfield.options and (docfield.options not in data_field_options): df_str = frappe.bold(_(docfield.label)) text_str = _("{0} is an invalid Data field.").format(df_str) + "
" * 2 + _("Only Options allowed for Data field are:") + "
" From a3059b10d1518f2e858ec1b82047ef2895aed463 Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 22 Apr 2020 12:32:44 +0530 Subject: [PATCH 37/48] fix: move expand button after description and change label according to state --- frappe/public/js/frappe/form/controls/code.js | 11 ++++++++--- frappe/public/less/form.less | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/code.js b/frappe/public/js/frappe/form/controls/code.js index bdf36b706a..446b9b5fd8 100644 --- a/frappe/public/js/frappe/form/controls/code.js +++ b/frappe/public/js/frappe/form/controls/code.js @@ -10,11 +10,11 @@ frappe.ui.form.ControlCode = frappe.ui.form.ControlText.extend({ .appendTo(this.input_area); this.expanded = false; - this.$expand_button = $(``).click(() => { + this.$expand_button = $(``).click(() => { this.expanded = !this.expanded; this.refresh_height(); - }).insertAfter(this.ace_editor_target); - + this.toggle_label(); + }).appendTo(this.$input_wrapper); // styling this.ace_editor_target.addClass('border rounded'); this.ace_editor_target.css('height', 300); @@ -37,6 +37,11 @@ frappe.ui.form.ControlCode = frappe.ui.form.ControlText.extend({ this.editor.resize(); }, + toggle_label() { + const button_label = this.expanded? __('Collapse'): __('Expand'); + this.$expand_button.text(button_label); + }, + set_language() { const language_map = { 'Javascript': 'ace/mode/javascript', diff --git a/frappe/public/less/form.less b/frappe/public/less/form.less index b72d249aab..8e43b05122 100644 --- a/frappe/public/less/form.less +++ b/frappe/public/less/form.less @@ -770,6 +770,7 @@ h6.uppercase, .h6.uppercase { .help-box { margin-top: 3px; + margin-bottom: 6px; } pre { From 02b3ccc935530295916521eb370102586ca24a00 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 21 Apr 2020 14:16:23 +0530 Subject: [PATCH 38/48] fix: ignore user permissions not working from the JS side --- frappe/model/create_new.py | 8 +++----- frappe/public/js/frappe/model/create_new.js | 10 ++-------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py index f697d8051a..91fb079fca 100644 --- a/frappe/model/create_new.py +++ b/frappe/model/create_new.py @@ -74,11 +74,9 @@ def set_user_and_static_default_values(doc): def get_user_default_value(df, defaults, doctype_user_permissions, allowed_records, default_doc): # don't set defaults for "User" link field using User Permissions! if df.fieldtype == "Link" and df.options != "User": - # 1 - look in user permissions only for document_type==Setup - # We don't want to include permissions of transactions to be used for defaults. - if (frappe.get_meta(df.options).document_type=="Setup" - and not df.ignore_user_permissions and default_doc): - return default_doc + # If user permission has Is Default enabled or single-user permission has found against respective doctype. + if (not df.ignore_user_permissions and default_doc): + return default_doc # 2 - Look in user defaults user_default = defaults.get(df.fieldname) diff --git a/frappe/public/js/frappe/model/create_new.js b/frappe/public/js/frappe/model/create_new.js index 1a118be5db..7be7fc5baa 100644 --- a/frappe/public/js/frappe/model/create_new.js +++ b/frappe/public/js/frappe/model/create_new.js @@ -137,10 +137,8 @@ $.extend(frappe.model, { // don't set defaults for "User" link field using User Permissions! if (df.fieldtype==="Link" && df.options!=="User") { - // 1 - look in user permissions for document_type=="Setup". - // We don't want to include permissions of transactions to be used for defaults. - if (df.linked_document_type==="Setup" - && has_user_permissions && default_doc) { + // If user permission has Is Default enabled or single-user permission has found against respective doctype. + if (has_user_permissions && default_doc) { return default_doc; } @@ -161,10 +159,6 @@ $.extend(frappe.model, { user_default = frappe.boot.user.last_selected_values[df.options]; } - if (!user_default && default_doc) { - user_default = default_doc; - } - var is_allowed_user_default = user_default && (!has_user_permissions || allowed_records.includes(user_default)); From 96c5162c7eef08919a8d590e74dc0ce89329c6e0 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Wed, 22 Apr 2020 14:18:38 +0530 Subject: [PATCH 39/48] fix: compare and sort release list to get latest release Signed-off-by: Chinmay D. Pai --- frappe/utils/change_log.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/frappe/utils/change_log.py b/frappe/utils/change_log.py index c94a247796..776fb825c2 100644 --- a/frappe/utils/change_log.py +++ b/frappe/utils/change_log.py @@ -174,9 +174,12 @@ def parse_latest_non_beta_release(response): Returns json : json object pertaining to the latest non-beta release """ - for release in response: - if release['prerelease'] == True: continue - return release + version_list = [release.get('tag_name').strip('v') for release in response if not release.get('prerelease')] + + if version_list: + return sorted(version_list, key=Version, reverse=True)[0] + + return None def check_release_on_github(app): # Check if repo remote is on github @@ -199,12 +202,11 @@ def check_release_on_github(app): org_name = remote_url.split('/')[3] r = requests.get('https://api.github.com/repos/{}/{}/releases'.format(org_name, app)) - if r.status_code == 200 and r.json(): + if r.ok: lastest_non_beta_release = parse_latest_non_beta_release(r.json()) - return Version(lastest_non_beta_release['tag_name'].strip('v')), org_name - else: - # In case of an improper response or if there are no releases - return None + return Version(lastest_non_beta_release), org_name + # In case of an improper response or if there are no releases + return None def add_message_to_redis(update_json): # "update-message" will store the update message string From 1bd5c916cecb1ad83386a24f5ce2c9d44fd08ff2 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Wed, 22 Apr 2020 16:23:02 +0530 Subject: [PATCH 40/48] chore: separate frappe log by site Signed-off-by: Chinmay D. Pai --- frappe/utils/logger.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/utils/logger.py b/frappe/utils/logger.py index d40e2565cb..5a77434cde 100755 --- a/frappe/utils/logger.py +++ b/frappe/utils/logger.py @@ -5,7 +5,7 @@ from logging.handlers import RotatingFileHandler from six import text_type default_log_level = logging.DEBUG -LOG_FILENAME = '../logs/frappe.log' +LOG_FILENAME = '../logs/{}-frappe.log'.format(frappe.local.site) def get_logger(module, with_more_info=True): if module in frappe.loggers: @@ -57,4 +57,3 @@ def set_log_level(level): '''Use this method to set log level to something other than the default DEBUG''' frappe.log_level = getattr(logging, (level or '').upper(), None) or default_log_level frappe.loggers = {} - From 8c63e4de2e26d0426e3c7241505512ffa8f4cca8 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Thu, 23 Apr 2020 01:49:43 +0530 Subject: [PATCH 41/48] fix(minor): Value Error during importing or exporting document files in migrate --- frappe/core/doctype/doctype/doctype.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index f7c9cbe28a..89b2a1a47e 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -477,7 +477,8 @@ class DocType(Document): field_dict = list(filter(lambda d: d['fieldname'] == fieldname, docdict['fields'])) if field_dict: new_field_dicts.append(field_dict[0]) - remaining_field_names.remove(fieldname) + if fieldname in remaining_field_names: + remaining_field_names.remove(fieldname) for fieldname in remaining_field_names: field_dict = list(filter(lambda d: d['fieldname'] == fieldname, docdict['fields'])) @@ -498,7 +499,8 @@ class DocType(Document): field_dict = list(filter(lambda d: d['fieldname'] == fieldname, docdict.get('fields', []))) if field_dict: new_field_dicts.append(field_dict[0]) - remaining_field_names.remove(fieldname) + if fieldname in remaining_field_names: + remaining_field_names.remove(fieldname) for fieldname in remaining_field_names: field_dict = list(filter(lambda d: d['fieldname'] == fieldname, docdict.get('fields', []))) From 0296908f18d9b9eb2e6ce05f2b49eaac28e34267 Mon Sep 17 00:00:00 2001 From: Chinmay Pai Date: Thu, 23 Apr 2020 17:52:15 +0530 Subject: [PATCH 42/48] fix: only allow ldap reset password for system manager (#10076) * fix: only allow ldap reset password for system manager Signed-off-by: Chinmay D. Pai * chore: only check for system manager Signed-off-by: Chinmay D. Pai * fix: Syntax error Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> --- frappe/core/doctype/user/user.js | 82 ++++++++++++++++---------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/frappe/core/doctype/user/user.js b/frappe/core/doctype/user/user.js index b17548d994..b8e16bfe25 100644 --- a/frappe/core/doctype/user/user.js +++ b/frappe/core/doctype/user/user.js @@ -97,47 +97,49 @@ frappe.ui.form.on('User', { }); }, __("Password")); - frappe.db.get_single_value("LDAP Settings", "enabled").then((value) => { - if (value === 1 && frm.doc.name != "Administrator") { - frm.add_custom_button(__("Reset LDAP Password"), function() { - const d = new frappe.ui.Dialog({ - title: __("Reset LDAP Password"), - fields: [ - { - label: __("New Password"), - fieldtype: "Password", - fieldname: "new_password", - reqd: 1 - }, - { - label: __("Confirm New Password"), - fieldtype: "Password", - fieldname: "confirm_password", - reqd: 1 - }, - { - label: __("Logout All Sessions"), - fieldtype: "Check", - fieldname: "logout_sessions" + if (frappe.user.has_role("System Manager")) { + frappe.db.get_single_value("LDAP Settings", "enabled").then((value) => { + if (value === 1 && frm.doc.name != "Administrator") { + frm.add_custom_button(__("Reset LDAP Password"), function() { + const d = new frappe.ui.Dialog({ + title: __("Reset LDAP Password"), + fields: [ + { + label: __("New Password"), + fieldtype: "Password", + fieldname: "new_password", + reqd: 1 + }, + { + label: __("Confirm New Password"), + fieldtype: "Password", + fieldname: "confirm_password", + reqd: 1 + }, + { + label: __("Logout All Sessions"), + fieldtype: "Check", + fieldname: "logout_sessions" + } + ], + primary_action: (values) => { + d.hide(); + if (values.new_password !== values.confirm_password) { + frappe.throw(__("Passwords do not match!")); + } + frappe.call( + "frappe.integrations.doctype.ldap_settings.ldap_settings.reset_password", { + user: frm.doc.email, + password: values.new_password, + logout: values.logout_sessions + }); } - ], - primary_action: (values) => { - d.hide(); - if (values.new_password !== values.confirm_password) { - frappe.throw(__("Passwords do not match!")); - } - frappe.call( - "frappe.integrations.doctype.ldap_settings.ldap_settings.reset_password", { - user: frm.doc.email, - password: values.new_password, - logout: values.logout_sessions - }); - } - }); - d.show(); - }, __("Password")); - } - }); + }); + d.show(); + }, __("Password")); + } + }); + } frm.add_custom_button(__("Reset OTP Secret"), function() { frappe.call({ From 9122866c625c40032fd22d04718bbba2db8cb208 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 43/48] fix: Consider `__unsaved` flag while getting doc as_dict (#10067) Co-authored-by: Prssanna Desai Co-authored-by: Prssanna Desai --- 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 c3519b5a124d88d72f81b369d779015f2a311494 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Fri, 24 Apr 2020 10:31:08 +0530 Subject: [PATCH 44/48] fix: Do not check for module for custom doctypes (#10081) --- frappe/desk/notifications.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/desk/notifications.py b/frappe/desk/notifications.py index 3a8815ca71..109dd25f4f 100644 --- a/frappe/desk/notifications.py +++ b/frappe/desk/notifications.py @@ -268,8 +268,9 @@ def get_open_count(doctype, name, items=[]): "count": out, } - module = frappe.get_meta_module(doctype) - if hasattr(module, "get_timeline_data"): - out["timeline_data"] = module.get_timeline_data(doctype, name) + if not meta.custom: + module = frappe.get_meta_module(doctype) + if hasattr(module, "get_timeline_data"): + out["timeline_data"] = module.get_timeline_data(doctype, name) return out From d678fc62abf8c5b8495a1ac3e97655ef704b6022 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 45/48] fix: Clear `__unsaved` flag after document save (#10082) --- 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 a3b9761f76b7e816e20051268cdff0a563e0706f Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Fri, 24 Apr 2020 13:43:35 +0530 Subject: [PATCH 46/48] style: Fix formatting --- frappe/public/js/frappe/form/controls/code.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/controls/code.js b/frappe/public/js/frappe/form/controls/code.js index 446b9b5fd8..6b40201001 100644 --- a/frappe/public/js/frappe/form/controls/code.js +++ b/frappe/public/js/frappe/form/controls/code.js @@ -38,7 +38,7 @@ frappe.ui.form.ControlCode = frappe.ui.form.ControlText.extend({ }, toggle_label() { - const button_label = this.expanded? __('Collapse'): __('Expand'); + const button_label = this.expanded ? __('Collapse') : __('Expand'); this.$expand_button.text(button_label); }, From e0d9cf50df83a0fe265aedea7920ca0a29f673f8 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 24 Apr 2020 18:32:03 +0530 Subject: [PATCH 47/48] fix: update password API mapping for /update-password --- frappe/www/update-password.html | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/frappe/www/update-password.html b/frappe/www/update-password.html index 34e5ea137d..d12be86d12 100644 --- a/frappe/www/update-password.html +++ b/frappe/www/update-password.html @@ -9,7 +9,7 @@ {{ _("Reset Password") if frappe.db.get_default('company') else _("Set Password")}}
-
+ @@ -32,8 +32,8 @@