From 558fec0d7cb12aef812419eada3c3e229e1f0641 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Fri, 10 Apr 2020 23:40:34 +0530 Subject: [PATCH 001/103] 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 607be5ad2a1d3b0afe5e2356b57283a8edd03528 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 14 Apr 2020 12:54:55 +0530 Subject: [PATCH 002/103] feat: add sidebar items to navbar in mobile --- .../includes/navbar/navbar_items.html | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/frappe/templates/includes/navbar/navbar_items.html b/frappe/templates/includes/navbar/navbar_items.html index 10d484df65..4e5ad0dd0a 100644 --- a/frappe/templates/includes/navbar/navbar_items.html +++ b/frappe/templates/includes/navbar/navbar_items.html @@ -64,6 +64,24 @@ {% if not only_static %} {% block navbar_right_extension %}{% endblock %} {% endif %} + + {% if show_sidebar %} +
+
+ {% for item in sidebar_items -%} + + {%- endfor %} +
+
+ {% endif %} + {% include "templates/includes/navbar/navbar_search.html" %} {% include "templates/includes/navbar/navbar_login.html" %} - + \ No newline at end of file From bc042b37b7d1e014012dfed9978cbc2a43e966c2 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 00:01:27 +0530 Subject: [PATCH 003/103] 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 004/103] 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 005/103] 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 006/103] 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 007/103] 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 008/103] 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 009/103] 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 010/103] 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 011/103] 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 012/103] 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 7e0e2da3bdac0cf839030e469063a6c2a4275ffb Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 16 Apr 2020 19:17:58 +0530 Subject: [PATCH 013/103] fix: render template if items exists --- frappe/templates/includes/navbar/navbar_items.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/templates/includes/navbar/navbar_items.html b/frappe/templates/includes/navbar/navbar_items.html index 4e5ad0dd0a..352fc23bbd 100644 --- a/frappe/templates/includes/navbar/navbar_items.html +++ b/frappe/templates/includes/navbar/navbar_items.html @@ -65,7 +65,7 @@ {% block navbar_right_extension %}{% endblock %} {% endif %} - {% if show_sidebar %} + {% if show_sidebar and sidebar_items %}

{% for item in sidebar_items -%} @@ -84,4 +84,4 @@ {% include "templates/includes/navbar/navbar_search.html" %} {% include "templates/includes/navbar/navbar_login.html" %} - \ No newline at end of file + 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 014/103] 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 015/103] 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 016/103] 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 017/103] 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 8f21ca4997ddb7323ce2f774662fff27897b1441 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sat, 18 Apr 2020 13:47:06 +0530 Subject: [PATCH 018/103] fix: Ability to resize expand/collapse code field --- frappe/public/js/frappe/form/controls/code.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/frappe/public/js/frappe/form/controls/code.js b/frappe/public/js/frappe/form/controls/code.js index 0648ad6e22..bdf36b706a 100644 --- a/frappe/public/js/frappe/form/controls/code.js +++ b/frappe/public/js/frappe/form/controls/code.js @@ -9,6 +9,12 @@ frappe.ui.form.ControlCode = frappe.ui.form.ControlText.extend({ this.ace_editor_target = $('
') .appendTo(this.input_area); + this.expanded = false; + this.$expand_button = $(``).click(() => { + this.expanded = !this.expanded; + this.refresh_height(); + }).insertAfter(this.ace_editor_target); + // styling this.ace_editor_target.addClass('border rounded'); this.ace_editor_target.css('height', 300); @@ -26,6 +32,11 @@ frappe.ui.form.ControlCode = frappe.ui.form.ControlText.extend({ }, 300)); }, + refresh_height() { + this.ace_editor_target.css('height', this.expanded ? 600 : 300); + this.editor.resize(); + }, + set_language() { const language_map = { 'Javascript': 'ace/mode/javascript', From e2eea4447b60a3358f305ea57d1de13128324f0e Mon Sep 17 00:00:00 2001 From: prssanna Date: Sat, 18 Apr 2020 21:20:45 +0530 Subject: [PATCH 019/103] fix(Reports): don't export hidden columns in reports --- frappe/desk/query_report.py | 1 + frappe/public/js/frappe/views/reports/query_report.js | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index aaf859e7fd..a08667161a 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -299,6 +299,7 @@ def export_query(): _("You can try changing the filters of your report.")) return + data.columns = [col for col in data.columns if not col.get('hidden')] columns = get_columns_dict(data.columns) from frappe.utils.xlsxutils import make_xlsx diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 08da956072..07616886f2 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -1084,7 +1084,11 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { ], ({ file_format, include_indentation }) => { this.make_access_log('Export', file_format); if (file_format === 'CSV') { - const column_row = this.columns.map(col => col.label); + const column_row = this.columns.map(col => { + if (!col.hidden) { + return col.label; + } + }); const data = this.get_data_for_csv(include_indentation); const out = [column_row].concat(data); From 8dafe6256cfdf56f595f68246417ea7fbb8abcc5 Mon Sep 17 00:00:00 2001 From: prssanna Date: Sat, 18 Apr 2020 21:32:16 +0530 Subject: [PATCH 020/103] fix: check if column is a dict --- frappe/desk/query_report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index a08667161a..f994dc0d30 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -299,7 +299,7 @@ def export_query(): _("You can try changing the filters of your report.")) return - data.columns = [col for col in data.columns if not col.get('hidden')] + data.columns = [col for col in data.columns if isinstance(col, dict) and not col.get('hidden')] columns = get_columns_dict(data.columns) from frappe.utils.xlsxutils import make_xlsx @@ -311,7 +311,7 @@ def export_query(): frappe.response['type'] = 'binary' -def build_xlsx_data(columns, data, visible_idx,include_indentation): +def build_xlsx_data(columns, data, visible_idx, include_indentation): result = [[]] # add column headings From 191165f704d7b682001617ee994befa66306b7c5 Mon Sep 17 00:00:00 2001 From: prssanna Date: Sun, 19 Apr 2020 00:34:21 +0530 Subject: [PATCH 021/103] fix: use .reduce to filter out hidden columns --- frappe/public/js/frappe/views/reports/query_report.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 07616886f2..be24273cb5 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -1084,11 +1084,12 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { ], ({ file_format, include_indentation }) => { this.make_access_log('Export', file_format); if (file_format === 'CSV') { - const column_row = this.columns.map(col => { + const column_row = this.columns.reduce((acc, col) => { if (!col.hidden) { - return col.label; + acc.push(col.label); } - }); + return acc; + }, []); const data = this.get_data_for_csv(include_indentation); const out = [column_row].concat(data); From c424c7e263bdf893a421560e7d1346e910cca165 Mon Sep 17 00:00:00 2001 From: prssanna Date: Fri, 10 Apr 2020 12:43:55 +0530 Subject: [PATCH 022/103] feat: Add show preview popup to Customize Form --- frappe/boot.py | 8 +++++++- frappe/custom/doctype/custom_field/custom_field.json | 9 ++++++++- frappe/custom/doctype/customize_form/customize_form.json | 9 ++++++++- frappe/custom/doctype/customize_form/customize_form.py | 2 ++ .../customize_form_field/customize_form_field.json | 9 ++++++++- 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/frappe/boot.py b/frappe/boot.py index e6d1199b19..8b9668430c 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -268,4 +268,10 @@ def get_success_action(): return frappe.get_all("Success Action", fields=["*"]) def get_link_preview_doctypes(): - return [d.name for d in frappe.db.get_all('DocType', {'show_preview_popup': 1})] \ No newline at end of file + link_preview_doctypes = [d.name for d in frappe.db.get_all('DocType', {'show_preview_popup': 1})] + customizations = frappe.get_all("Property Setter", + fields=['doc_type'], + filters={'property': 'show_preview_popup', 'value': "1" + }) + link_preview_doctypes += [custom.doc_type for custom in customizations] + return link_preview_doctypes diff --git a/frappe/custom/doctype/custom_field/custom_field.json b/frappe/custom/doctype/custom_field/custom_field.json index b274033f80..394f38b56c 100644 --- a/frappe/custom/doctype/custom_field/custom_field.json +++ b/frappe/custom/doctype/custom_field/custom_field.json @@ -41,6 +41,7 @@ "in_list_view", "in_standard_filter", "in_global_search", + "in_preview", "bold", "report_hide", "search_index", @@ -371,12 +372,18 @@ "fieldname": "allow_in_quick_entry", "fieldtype": "Check", "label": "Allow in Quick Entry" + }, + { + "default": "0", + "fieldname": "in_preview", + "fieldtype": "Check", + "label": "In Preview" } ], "icon": "fa fa-glass", "idx": 1, "links": [], - "modified": "2020-03-16 14:52:43.954709", + "modified": "2020-04-10 11:57:10.392218", "modified_by": "Administrator", "module": "Custom", "name": "Custom Field", diff --git a/frappe/custom/doctype/customize_form/customize_form.json b/frappe/custom/doctype/customize_form/customize_form.json index 51a5c0b85f..cd57aa23fe 100644 --- a/frappe/custom/doctype/customize_form/customize_form.json +++ b/frappe/custom/doctype/customize_form/customize_form.json @@ -20,6 +20,7 @@ "track_views", "allow_auto_repeat", "allow_import", + "show_preview_popup", "image_view", "column_break_5", "title_field", @@ -203,6 +204,12 @@ "depends_on": "doc_type", "fieldname": "section_break_23", "fieldtype": "Section Break" + }, + { + "default": "0", + "fieldname": "show_preview_popup", + "fieldtype": "Check", + "label": "Show Preview Popup" } ], "hide_toolbar": 1, @@ -210,7 +217,7 @@ "idx": 1, "issingle": 1, "links": [], - "modified": "2020-03-27 15:06:35.443861", + "modified": "2020-04-10 12:16:01.320411", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form", diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py index 7d081953dd..9efa555152 100644 --- a/frappe/custom/doctype/customize_form/customize_form.py +++ b/frappe/custom/doctype/customize_form/customize_form.py @@ -32,6 +32,7 @@ doctype_properties = { 'track_views': 'Check', 'allow_auto_repeat': 'Check', 'allow_import': 'Check', + 'show_preview_popup': 'Check', 'email_append_to': 'Check', 'subject_field': 'Data', 'sender_field': 'Data' @@ -53,6 +54,7 @@ docfield_properties = { 'in_list_view': 'Check', 'in_standard_filter': 'Check', 'in_global_search': 'Check', + 'in_preview': 'Check', 'bold': 'Check', 'hidden': 'Check', 'collapsible': 'Check', diff --git a/frappe/custom/doctype/customize_form_field/customize_form_field.json b/frappe/custom/doctype/customize_form_field/customize_form_field.json index 350d159541..d7887cf8bd 100644 --- a/frappe/custom/doctype/customize_form_field/customize_form_field.json +++ b/frappe/custom/doctype/customize_form_field/customize_form_field.json @@ -16,6 +16,7 @@ "in_list_view", "in_standard_filter", "in_global_search", + "in_preview", "bold", "allow_in_quick_entry", "translatable", @@ -381,12 +382,18 @@ "fieldtype": "Code", "label": "Read Only Depends On", "options": "JS" + }, + { + "default": "0", + "fieldname": "in_preview", + "fieldtype": "Check", + "label": "In Preview" } ], "idx": 1, "istable": 1, "links": [], - "modified": "2020-04-15 02:26:59.673750", + "modified": "2020-04-10 11:58:44.573537", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form Field", From 685df9b1f16e9a03a93df36fec978ba908fe2f4f Mon Sep 17 00:00:00 2001 From: prssanna Date: Sun, 19 Apr 2020 14:33:52 +0530 Subject: [PATCH 023/103] fix: remove doctype from link_preview_doctypes if custom value is 0 --- frappe/boot.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/frappe/boot.py b/frappe/boot.py index 8b9668430c..eed434f870 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -268,10 +268,18 @@ def get_success_action(): return frappe.get_all("Success Action", fields=["*"]) def get_link_preview_doctypes(): + from frappe.utils import cint + link_preview_doctypes = [d.name for d in frappe.db.get_all('DocType', {'show_preview_popup': 1})] customizations = frappe.get_all("Property Setter", - fields=['doc_type'], - filters={'property': 'show_preview_popup', 'value': "1" - }) - link_preview_doctypes += [custom.doc_type for custom in customizations] + fields=['doc_type', 'value'], + filters={'property': 'show_preview_popup'} + ) + + for custom in customizations: + if not cint(custom.value) and custom.doc_type in link_preview_doctypes: + link_preview_doctypes.remove(custom.doc_type) + else: + link_preview_doctypes.append(custom.doc_type) + return link_preview_doctypes From 25d92ac9b2af2ce0dce8be938fb132ec1ba47d7c Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sun, 19 Apr 2020 15:02:22 +0530 Subject: [PATCH 024/103] fix(Web View): renamed Web View Item to Web View Components, made Web Views embeddable, introduced full width, introduced Color --- frappe/public/scss/website.scss | 11 +++ frappe/templates/web.html | 10 ++- .../{web_view_item => color}/__init__.py | 0 frappe/website/doctype/color/color.js | 8 ++ frappe/website/doctype/color/color.json | 44 +++++++++++ .../web_view_item.py => color/color.py} | 2 +- frappe/website/doctype/color/test_color.py | 10 +++ frappe/website/doctype/web_page/web_page.json | 11 ++- frappe/website/doctype/web_page/web_page.py | 1 + .../web_view/templates/web_view_content.html | 22 ++++-- .../website/doctype/web_view/test_web_view.py | 26 ++++++- frappe/website/doctype/web_view/web_view.json | 61 ++++++++++++--- frappe/website/doctype/web_view/web_view.py | 77 ++++++++++++------- .../doctype/web_view_component/__init__.py | 0 .../web_view_component.json} | 39 ++++++++-- .../web_view_component/web_view_component.py | 10 +++ .../doctype/website_theme/website_theme.json | 61 ++++++++++----- .../website_theme/website_theme_template.scss | 6 +- .../website_theme/standard/standard.json | 42 +++++----- 19 files changed, 331 insertions(+), 110 deletions(-) rename frappe/website/doctype/{web_view_item => color}/__init__.py (100%) create mode 100644 frappe/website/doctype/color/color.js create mode 100644 frappe/website/doctype/color/color.json rename frappe/website/doctype/{web_view_item/web_view_item.py => color/color.py} (89%) create mode 100644 frappe/website/doctype/color/test_color.py create mode 100644 frappe/website/doctype/web_view_component/__init__.py rename frappe/website/doctype/{web_view_item/web_view_item.json => web_view_component/web_view_component.json} (70%) create mode 100644 frappe/website/doctype/web_view_component/web_view_component.py diff --git a/frappe/public/scss/website.scss b/frappe/public/scss/website.scss index 6f82e25ee0..546110bd5c 100644 --- a/frappe/public/scss/website.scss +++ b/frappe/public/scss/website.scss @@ -23,6 +23,17 @@ footer { flex-shrink: 0; } +// make navbar padding consistent with the page +.navbar { + padding-left: 0; + padding-right: 0; + + .container { + padding-left: 15px; + padding-right: 15px; + } +} + .navbar.bg-dark { .dropdown-menu { font-size: .75rem; diff --git a/frappe/templates/web.html b/frappe/templates/web.html index d2d38a6320..2fdfc9564a 100644 --- a/frappe/templates/web.html +++ b/frappe/templates/web.html @@ -13,7 +13,7 @@
{% block page_container %} -
+
{% endmacro %} -{% macro container_attributes() %} -id="page-{{ name or route | e }}" data-path="{{ pathname | e }}" {%- if page_or_generator=="Generator" %}source-type="Generator" data-doctype="{{ doctype }}"{% endif %} -{% endmacro %} +{% macro container_attributes() -%} +id="page-{{ name or route | e }}" data-path="{{ pathname | e }}" + {%- if page_or_generator=="Generator" %}source-type="Generator" data-doctype="{{ doctype }}"{%- endif %} + {%- if source_content_type %}source-content-type="{{ source_content_type }}"{%- endif %} +{%- endmacro %} {% if show_sidebar %}
diff --git a/frappe/website/doctype/web_view_item/__init__.py b/frappe/website/doctype/color/__init__.py similarity index 100% rename from frappe/website/doctype/web_view_item/__init__.py rename to frappe/website/doctype/color/__init__.py diff --git a/frappe/website/doctype/color/color.js b/frappe/website/doctype/color/color.js new file mode 100644 index 0000000000..78b3f773d1 --- /dev/null +++ b/frappe/website/doctype/color/color.js @@ -0,0 +1,8 @@ +// Copyright (c) 2020, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Color', { + // refresh: function(frm) { + + // } +}); diff --git a/frappe/website/doctype/color/color.json b/frappe/website/doctype/color/color.json new file mode 100644 index 0000000000..f42898da12 --- /dev/null +++ b/frappe/website/doctype/color/color.json @@ -0,0 +1,44 @@ +{ + "actions": [], + "autoname": "Prompt", + "creation": "2020-04-19 02:25:37.010180", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "color" + ], + "fields": [ + { + "fieldname": "color", + "fieldtype": "Color", + "in_list_view": 1, + "label": "Color", + "reqd": 1 + } + ], + "links": [], + "modified": "2020-04-19 02:25:47.417772", + "modified_by": "Administrator", + "module": "Website", + "name": "Color", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Website Manager", + "share": 1, + "write": 1 + } + ], + "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_item/web_view_item.py b/frappe/website/doctype/color/color.py similarity index 89% rename from frappe/website/doctype/web_view_item/web_view_item.py rename to frappe/website/doctype/color/color.py index cc440305c0..245b9e9165 100644 --- a/frappe/website/doctype/web_view_item/web_view_item.py +++ b/frappe/website/doctype/color/color.py @@ -6,5 +6,5 @@ from __future__ import unicode_literals # import frappe from frappe.model.document import Document -class WebViewItem(Document): +class Color(Document): pass diff --git a/frappe/website/doctype/color/test_color.py b/frappe/website/doctype/color/test_color.py new file mode 100644 index 0000000000..2f2be331ad --- /dev/null +++ b/frappe/website/doctype/color/test_color.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 TestColor(unittest.TestCase): + pass diff --git a/frappe/website/doctype/web_page/web_page.json b/frappe/website/doctype/web_page/web_page.json index 645d83e155..5f90f3adbf 100644 --- a/frappe/website/doctype/web_page/web_page.json +++ b/frappe/website/doctype/web_page/web_page.json @@ -1,4 +1,5 @@ { + "actions": [], "allow_guest_to_view": 1, "allow_import": 1, "creation": "2013-03-28 10:35:30", @@ -13,6 +14,7 @@ "slideshow", "cb1", "published", + "full_width", "show_title", "start_date", "end_date", @@ -242,14 +244,21 @@ "fieldname": "dynamic_template", "fieldtype": "Check", "label": "Dynamic Template" + }, + { + "default": "0", + "fieldname": "full_width", + "fieldtype": "Check", + "label": "Full Width" } ], "has_web_view": 1, "icon": "fa fa-file-alt", "idx": 1, "is_published_field": "published", + "links": [], "max_attachments": 20, - "modified": "2019-10-02 13:58:50.825481", + "modified": "2020-04-19 01:55:48.363008", "modified_by": "Administrator", "module": "Website", "name": "Web Page", diff --git a/frappe/website/doctype/web_page/web_page.py b/frappe/website/doctype/web_page/web_page.py index ffa836e3c5..98065e4cce 100644 --- a/frappe/website/doctype/web_page/web_page.py +++ b/frappe/website/doctype/web_page/web_page.py @@ -36,6 +36,7 @@ class WebPage(WebsiteGenerator): def get_context(self, context): context.main_section = get_html_content_based_on_type(self, 'main_section', self.content_type) + context.source_content_type = self.content_type self.render_dynamic(context) # if static page, get static content diff --git a/frappe/website/doctype/web_view/templates/web_view_content.html b/frappe/website/doctype/web_view/templates/web_view_content.html index f2e750a472..a1ac143639 100644 --- a/frappe/website/doctype/web_view/templates/web_view_content.html +++ b/frappe/website/doctype/web_view/templates/web_view_content.html @@ -9,7 +9,7 @@ {%- endif -%} {%- macro render_element(element) -%} - {%- if element.element_type=='Content' -%} + {%- if element.element_type in ('Content', 'Web View') -%}
{{ element.web_content_html }}
@@ -25,17 +25,16 @@ {%- endmacro -%} {%- macro element_style(element) -%} - {%- if element.element_style -%} - style = "{{ element.element_style }}" + {%- 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 -%} @@ -74,4 +73,11 @@ {%- endif -%}
-{%- endfor -%} \ No newline at end of file +{%- 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/test_web_view.py b/frappe/website/doctype/web_view/test_web_view.py index 67b353844d..3dc072a6dd 100644 --- a/frappe/website/doctype/web_view/test_web_view.py +++ b/frappe/website/doctype/web_view/test_web_view.py @@ -14,6 +14,7 @@ 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( @@ -22,12 +23,25 @@ class TestWebView(unittest.TestCase): 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, - items = [ + content_type = 'Components', + components = [ dict( element_type = 'Section', section_type = 'List' @@ -57,19 +71,27 @@ class TestWebView(unittest.TestCase): 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') - #print(html) 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): diff --git a/frappe/website/doctype/web_view/web_view.json b/frappe/website/doctype/web_view/web_view.json index 6d957fd0d9..c804d31de3 100644 --- a/frappe/website/doctype/web_view/web_view.json +++ b/frappe/website/doctype/web_view/web_view.json @@ -12,18 +12,17 @@ "field_order": [ "title", "route", + "column_break_4", + "full_width", "published", - "items", + "section_break_6", + "content_type", + "content_html", + "components", + "style_section", "css" ], "fields": [ - { - "fieldname": "items", - "fieldtype": "Table", - "label": "Items", - "options": "Web View Item", - "reqd": 1 - }, { "fieldname": "title", "fieldtype": "Data", @@ -36,8 +35,7 @@ "fieldname": "route", "fieldtype": "Data", "in_list_view": 1, - "label": "Route", - "reqd": 1 + "label": "Route" }, { "default": "0", @@ -49,12 +47,53 @@ "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" } ], "has_web_view": 1, "is_published_field": "published", "links": [], - "modified": "2020-04-15 23:58:12.208049", + "modified": "2020-04-19 05:05:43.620000", "modified_by": "Administrator", "module": "Website", "name": "Web View", diff --git a/frappe/website/doctype/web_view/web_view.py b/frappe/website/doctype/web_view/web_view.py index 6828057fe1..eeebb169dc 100644 --- a/frappe/website/doctype/web_view/web_view.py +++ b/frappe/website/doctype/web_view/web_view.py @@ -10,49 +10,70 @@ import frappe class WebView(WebsiteGenerator): def get_context(self, context): - # group items into sections - context.sections = [] - context.css_rules = [] - for item in self.items: - if not context.sections and item.element_type!='Section': - self.add_default_section(context) - - if item.element_type=='Section': - self.add_section(context, item) - else: - self.add_item(context, item) - - self.add_css_class(context, item) + # group components into sections + if self.content_type=='Components': + self.build_components(context) return context - def add_section(self, context, item): - item.elements = [] - context.sections.append(item) + 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 item.section_intro: - item.section_intro = markdown(item.section_intro) + if component.element_type=='Section': + self.add_section(context, component) + else: + self.add_component(context, component) - def add_item(self, context, item): - if item.hide: + 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 item.web_content_type == 'Markdown': - item.web_content_html = markdown(item.web_content_markdown) + if component.element_type == 'Web View' and component.web_view: + component.web_content_html = frappe.get_doc('Web View', component.web_view).render_content() - if item.title: - item.element_id = frappe.scrub(item.title) + elif component.web_content_type == 'Markdown': + component.web_content_html = markdown(component.web_content_markdown) - context.sections[-1].elements.append(item) + if component.title: + component.element_id = frappe.scrub(component.title) - def add_css_class(self, context, item): + context.sections[-1].elements.append(component) + + def add_css_class(self, context, component): # add css class definitions selected by the user - if item.element_class and not item.hide: - css, is_dynamic = frappe.db.get_value('CSS Class', item.element_class, ['css', 'is_dynamic']) + 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())) diff --git a/frappe/website/doctype/web_view_component/__init__.py b/frappe/website/doctype/web_view_component/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/website/doctype/web_view_item/web_view_item.json b/frappe/website/doctype/web_view_component/web_view_component.json similarity index 70% rename from frappe/website/doctype/web_view_item/web_view_item.json rename to frappe/website/doctype/web_view_component/web_view_component.json index 0d33cbb8ce..15dd761c81 100644 --- a/frappe/website/doctype/web_view_item/web_view_item.json +++ b/frappe/website/doctype/web_view_component/web_view_component.json @@ -8,11 +8,14 @@ "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", @@ -26,33 +29,35 @@ "fieldtype": "Select", "in_list_view": 1, "label": "Element Type", - "options": "Section\nContent\nParagraph\nWeb List\nWeb Form", + "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": "\nList\nTabbed\nGrid" + "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": "\nHTML\nMarkdown" + "options": "Markdown\nHTML" }, { - "depends_on": "eval:doc.web_content_type==='HTML'", + "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.web_content_type==='Markdown'", + "depends_on": "eval:doc.element_type === 'Content' && doc.web_content_type === 'Markdown'", "fieldname": "web_content_markdown", "fieldtype": "Markdown Editor", "label": "Web Content Markdown" @@ -104,14 +109,34 @@ "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-03-28 14:21:50.014823", + "modified": "2020-04-19 03:02:53.233036", "modified_by": "Administrator", "module": "Website", - "name": "Web View Item", + "name": "Web View Component", "owner": "Administrator", "permissions": [], "quick_entry": 1, diff --git a/frappe/website/doctype/web_view_component/web_view_component.py b/frappe/website/doctype/web_view_component/web_view_component.py new file mode 100644 index 0000000000..dcf1726c4a --- /dev/null +++ b/frappe/website/doctype/web_view_component/web_view_component.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 WebViewComponent(Document): + pass diff --git a/frappe/website/doctype/website_theme/website_theme.json b/frappe/website/doctype/website_theme/website_theme.json index f7c6a9a1f2..78a845fadc 100644 --- a/frappe/website/doctype/website_theme/website_theme.json +++ b/frappe/website/doctype/website_theme/website_theme.json @@ -14,8 +14,10 @@ "google_font", "font_size", "font_properties", - "use_full_width", - "column_break_7", + "button_rounded_corners", + "button_shadows", + "button_gradients", + "column_break_11", "primary_color", "text_color", "light_color", @@ -99,29 +101,29 @@ "fieldtype": "Data", "label": "Font Size" }, - { - "fieldname": "column_break_7", - "fieldtype": "Column Break" - }, { "fieldname": "primary_color", - "fieldtype": "Color", - "label": "Primary Color" + "fieldtype": "Link", + "label": "Primary Color", + "options": "Color" }, { "fieldname": "text_color", - "fieldtype": "Color", - "label": "Text Color" + "fieldtype": "Link", + "label": "Text Color", + "options": "Color" }, { "fieldname": "dark_color", - "fieldtype": "Color", - "label": "Dark Color" + "fieldtype": "Link", + "label": "Dark Color", + "options": "Color" }, { "fieldname": "background_color", - "fieldtype": "Color", - "label": "Background Color" + "fieldtype": "Link", + "label": "Background Color", + "options": "Color" }, { "fieldname": "stylesheet_section", @@ -135,8 +137,9 @@ }, { "fieldname": "light_color", - "fieldtype": "Color", - "label": "Light Color" + "fieldtype": "Link", + "label": "Light Color", + "options": "Color" }, { "default": "300,600", @@ -145,14 +148,30 @@ "label": "Font Properties" }, { - "description": "Content will not be inside a \"container\" class, you will have to add your own containers for different sections.", - "fieldname": "use_full_width", - "fieldtype": "Data", - "label": "Use Full Width" + "default": "1", + "fieldname": "button_rounded_corners", + "fieldtype": "Check", + "label": "Button Rounded Corners" + }, + { + "default": "0", + "fieldname": "button_shadows", + "fieldtype": "Check", + "label": "Button Shadows" + }, + { + "default": "0", + "fieldname": "button_gradients", + "fieldtype": "Check", + "label": "Button Gradients" + }, + { + "fieldname": "column_break_11", + "fieldtype": "Column Break" } ], "links": [], - "modified": "2020-03-19 09:46:48.750150", + "modified": "2020-04-19 05:18:49.820803", "modified_by": "Administrator", "module": "Website", "name": "Website Theme", diff --git a/frappe/website/doctype/website_theme/website_theme_template.scss b/frappe/website/doctype/website_theme/website_theme_template.scss index e1728eee36..7b0bc043d7 100644 --- a/frappe/website/doctype/website_theme/website_theme_template.scss +++ b/frappe/website/doctype/website_theme/website_theme_template.scss @@ -8,9 +8,9 @@ $font-family-sans-serif: "{{ google_font }}", -apple-system, BlinkMacSystemFont, {% if text_color %}$body-color: {{ text_color }};{% endif %} {% if background_color %}$body-bg: {{ background_color }};{% endif %} -$enable-shadows: {{ enable_shadows and "true" or "false" }}; -$enable-gradients: {{ enable_gradients and "true" or "false" }}; -$enable-rounded: {{ enable_rounded and "true" or "false" }}; +$enable-shadows: {{ button_shadows and "true" or "false" }}; +$enable-gradients: {{ button_gradients and "true" or "false" }}; +$enable-rounded: {{ button_rounded_corners and "true" or "false" }}; @import "frappe/public/scss/website"; diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index e610d82582..331f4ab7e5 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -1,26 +1,20 @@ { - "apply_style": 0, - "apply_text_styles": 0, - "creation": "2015-02-19 13:37:33.925909", - "css": ".navbar-header {\n display: none;\n}", - "custom": 0, - "docstatus": 0, - "doctype": "Website Theme", - "font_size": "14px", - "footer_color": "", - "footer_text_color": "", - "heading_style": "", - "heading_webfont": "", - "idx": 26, - "link_color": "", - "modified": "2016-12-29 05:40:17.289226", - "modified_by": "Administrator", - "module": "Website", - "name": "Standard", - "owner": "Administrator", - "text_color": "", - "text_webfont": "", - "theme": "Standard", - "top_bar_color": "", - "top_bar_text_color": "" + "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:00:20.668017", + "modified_by": "Administrator", + "module": "Website", + "name": "Standard", + "owner": "Administrator", + "primary_color": "#7575ff", + "theme": "Standard", + "theme_scss": "\n\n$primary: #7575ff;\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_55b00b4f.css" } \ No newline at end of file From 54e765cfc04b88a72cfac3c73aa1d27186bdafae Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sun, 19 Apr 2020 15:05:28 +0530 Subject: [PATCH 025/103] fix(minor): fix color in Website Theme --- .../doctype/website_theme/website_theme_template.scss | 8 ++++---- frappe/website/website_theme/standard/standard.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frappe/website/doctype/website_theme/website_theme_template.scss b/frappe/website/doctype/website_theme/website_theme_template.scss index 7b0bc043d7..caad55810a 100644 --- a/frappe/website/doctype/website_theme/website_theme_template.scss +++ b/frappe/website/doctype/website_theme/website_theme_template.scss @@ -3,10 +3,10 @@ $font-family-sans-serif: "{{ google_font }}", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; {% endif %} -{% if primary_color %}$primary: {{ primary_color }};{% endif %} -{% if dark_color %}$dark: {{ dark_color }};{% endif %} -{% if text_color %}$body-color: {{ text_color }};{% endif %} -{% if background_color %}$body-bg: {{ background_color }};{% endif %} +{% if primary_color %}$primary: {{ frappe.db.get_value('Color', primary_color, 'color') }};{% endif %} +{% if dark_color %}$dark: {{ frappe.db.get_value('Color', dark_color, 'color') }};{% endif %} +{% if text_color %}$body-color: {{ frappe.db.get_value('Color', text_color, 'color') }};{% endif %} +{% if background_color %}$body-bg: {{ frappe.db.get_value('Color', background_color, 'color') }};{% endif %} $enable-shadows: {{ button_shadows and "true" or "false" }}; $enable-gradients: {{ button_gradients and "true" or "false" }}; diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 331f4ab7e5..2393b684ca 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -8,13 +8,13 @@ "doctype": "Website Theme", "font_properties": "300,600", "idx": 27, - "modified": "2020-04-19 05:00:20.668017", + "modified": "2020-04-19 05:34:56.086984", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", - "primary_color": "#7575ff", + "primary_color": "Blue", "theme": "Standard", - "theme_scss": "\n\n$primary: #7575ff;\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_55b00b4f.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 9f26548b3101853884d9bb63690a6e90617ddaaa Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sun, 19 Apr 2020 18:01:06 +0530 Subject: [PATCH 026/103] fix(minor): update web page test and allow dashboards for custom doctype --- .../doctype/data_import/test_exporter_new.py | 2 +- frappe/desk/form/meta.py | 2 - frappe/model/meta.py | 18 +- frappe/website/doctype/blogger/blogger.json | 348 +++++------------- 4 files changed, 102 insertions(+), 268 deletions(-) diff --git a/frappe/core/doctype/data_import/test_exporter_new.py b/frappe/core/doctype/data_import/test_exporter_new.py index 7464d6edc5..06d7879a09 100644 --- a/frappe/core/doctype/data_import/test_exporter_new.py +++ b/frappe/core/doctype/data_import/test_exporter_new.py @@ -20,7 +20,7 @@ class TestExporter(unittest.TestCase): e = Exporter('Web Page', export_fields='All') csv_array = e.get_csv_array() header = csv_array[0] - self.assertEqual(len(header), 24) + self.assertEqual(len(header), 25) def test_exports_selected_fields(self): diff --git a/frappe/desk/form/meta.py b/frappe/desk/form/meta.py index 26fc6037fd..ba0e5c2216 100644 --- a/frappe/desk/form/meta.py +++ b/frappe/desk/form/meta.py @@ -196,8 +196,6 @@ class FormMeta(Meta): self.get("__messages").update(messages, as_value=True) def load_dashboard(self): - if self.custom: - return self.set('__dashboard', self.get_dashboard_data()) def load_kanban_meta(self): diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 9c71f8c0b1..2321e0c22a 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -425,17 +425,19 @@ class Meta(Document): implemented in other Frappe applications via hooks. ''' data = frappe._dict() - try: - module = load_doctype_module(self.name, suffix='_dashboard') - if hasattr(module, 'get_data'): - data = frappe._dict(module.get_data()) - except ImportError: - pass + if not self.custom: + try: + module = load_doctype_module(self.name, suffix='_dashboard') + if hasattr(module, 'get_data'): + data = frappe._dict(module.get_data()) + except ImportError: + pass self.add_doctype_links(data) - for hook in frappe.get_hooks("override_doctype_dashboards", {}).get(self.name, []): - data = frappe.get_attr(hook)(data=data) + if not self.custom: + for hook in frappe.get_hooks("override_doctype_dashboards", {}).get(self.name, []): + data = frappe.get_attr(hook)(data=data) return data diff --git a/frappe/website/doctype/blogger/blogger.json b/frappe/website/doctype/blogger/blogger.json index be4eb6399e..b8165a5908 100644 --- a/frappe/website/doctype/blogger/blogger.json +++ b/frappe/website/doctype/blogger/blogger.json @@ -1,274 +1,108 @@ { - "allow_copy": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "field:short_name", - "beta": 0, - "creation": "2013-03-25 16:00:51", - "custom": 0, - "description": "User ID of a Blogger", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Setup", - "editable_grid": 0, + "actions": [], + "allow_import": 1, + "autoname": "field:short_name", + "creation": "2013-03-25 16:00:51", + "description": "User ID of a Blogger", + "doctype": "DocType", + "document_type": "Setup", + "engine": "InnoDB", + "field_order": [ + "disabled", + "short_name", + "full_name", + "user", + "bio", + "avatar", + "posts" + ], "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "disabled", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Disabled", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "default": "0", + "fieldname": "disabled", + "fieldtype": "Check", + "label": "Disabled" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Will be used in url (usually first name).", - "fieldname": "short_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Short Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "description": "Will be used in url (usually first name).", + "fieldname": "short_name", + "fieldtype": "Data", + "label": "Short Name", + "reqd": 1, + "unique": 1 + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "full_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Full Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "fieldname": "full_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Full Name", + "reqd": 1 + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "user", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "User", - "length": 0, - "no_copy": 0, - "options": "User", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "fieldname": "user", + "fieldtype": "Link", + "label": "User", + "options": "User" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "bio", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Bio", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "fieldname": "bio", + "fieldtype": "Small Text", + "label": "Bio" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "avatar", - "fieldtype": "Attach", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Avatar", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, + "fieldname": "avatar", + "fieldtype": "Attach", + "label": "Avatar" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "posts", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Posts", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 + "fieldname": "posts", + "fieldtype": "Int", + "in_list_view": 1, + "label": "Posts", + "no_copy": 1, + "read_only": 1 } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-user", - "idx": 1, - "image_view": 0, - "in_create": 0, - - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 1, - "modified": "2018-10-10 14:40:40.407657", - "modified_by": "Administrator", - "module": "Website", - "name": "Blogger", - "owner": "Administrator", + ], + "icon": "fa fa-user", + "idx": 1, + "links": [ + { + "link_doctype": "Blog Post", + "link_fieldname": "blogger" + } + ], + "max_attachments": 1, + "modified": "2020-04-19 08:21:09.684300", + "modified_by": "Administrator", + "module": "Website", + "name": "Blogger", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 1, - "is_custom": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Website Manager", - "set_user_permissions": 1, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "import": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Website Manager", + "set_user_permissions": 1, + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "is_custom": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "Blogger", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "email": 1, + "print": 1, + "read": 1, + "role": "Blogger", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "title_field": "full_name", - "track_changes": 1, - "track_seen": 0 + ], + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "full_name", + "track_changes": 1 } \ No newline at end of file From e821d95a01139cc6ef5be844a3f1503340d30ef7 Mon Sep 17 00:00:00 2001 From: RJPvT <48353029+RJPvT@users.noreply.github.com> Date: Sun, 19 Apr 2020 15:51:47 +0200 Subject: [PATCH 027/103] fix: two_factor_is_enabled needs username --- frappe/twofactor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/twofactor.py b/frappe/twofactor.py index e60113215b..b44092d6a1 100644 --- a/frappe/twofactor.py +++ b/frappe/twofactor.py @@ -374,11 +374,11 @@ def delete_qrimage(user, check_expiry=False): def delete_all_barcodes_for_users(): '''Task to delete all barcodes for user.''' - if not two_factor_is_enabled(): - return users = frappe.get_all('User', {'enabled':1}) for user in users: + if not two_factor_is_enabled(user=user.name): + continue delete_qrimage(user.name, check_expiry=True) def should_remove_barcode_image(barcode): From be14e59d4aab9fdd4848f3dd123cdac2ccf43c01 Mon Sep 17 00:00:00 2001 From: RJPvT <48353029+RJPvT@users.noreply.github.com> Date: Sun, 19 Apr 2020 15:58:29 +0200 Subject: [PATCH 028/103] fix: no need for password check --- frappe/auth.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frappe/auth.py b/frappe/auth.py index dba8b05a62..1353acf10f 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -219,7 +219,10 @@ class LoginManager: user = frappe.db.get_value("User", filters={"username": user}, fieldname="name") or user self.check_if_enabled(user) - self.user = self.check_password(user, pwd) + if not frappe.form_dict.get('tmp_id'): + self.user = self.check_password(user, pwd) + else: + self.user = user def force_user_to_reset_password(self): if not self.user: From 2fd199650678213a43fb2751e084f75306dc0873 Mon Sep 17 00:00:00 2001 From: RJPvT <48353029+RJPvT@users.noreply.github.com> Date: Sun, 19 Apr 2020 16:02:19 +0200 Subject: [PATCH 029/103] fix: check if ldap user requires 2fa on login --- frappe/integrations/doctype/ldap_settings/ldap_settings.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frappe/integrations/doctype/ldap_settings/ldap_settings.py b/frappe/integrations/doctype/ldap_settings/ldap_settings.py index 558f7117c0..80dfef2693 100644 --- a/frappe/integrations/doctype/ldap_settings/ldap_settings.py +++ b/frappe/integrations/doctype/ldap_settings/ldap_settings.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe from frappe import _, safe_encode from frappe.model.document import Document - +from frappe.twofactor import (should_run_2fa, authenticate_for_2factor,confirm_otp_token) class LDAPSettings(Document): def validate(self): @@ -237,6 +237,10 @@ def login(): user = ldap.authenticate(frappe.as_unicode(args.usr), frappe.as_unicode(args.pwd)) frappe.local.login_manager.user = user.name + if should_run_2fa(user.name): + authenticate_for_2factor(user.name) + if not confirm_otp_token(frappe.local.login_manager): + return False frappe.local.login_manager.post_login() # because of a GET request! From 624470b088b5bd06e95f77757a2fdd5f53a7b605 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Sun, 19 Apr 2020 20:45:47 +0530 Subject: [PATCH 030/103] fix: allow modifying standard theme in migrate Signed-off-by: Chinmay D. Pai --- frappe/website/doctype/website_theme/website_theme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/website/doctype/website_theme/website_theme.py b/frappe/website/doctype/website_theme/website_theme.py index d0ce582482..a1b475450d 100644 --- a/frappe/website/doctype/website_theme/website_theme.py +++ b/frappe/website/doctype/website_theme/website_theme.py @@ -25,7 +25,7 @@ class WebsiteTheme(Document): def is_standard_and_not_valid_user(self): return (not self.custom and not frappe.local.conf.get('developer_mode') - and not (frappe.flags.in_import or frappe.flags.in_test)) + and not (frappe.flags.in_import or frappe.flags.in_test or frappe.flags.in_migrate)) def on_trash(self): if self.is_standard_and_not_valid_user(): From 3b5a1aaa3f505cf6ef87435bc21fce1e3a366a03 Mon Sep 17 00:00:00 2001 From: prssanna Date: Sun, 19 Apr 2020 21:56:31 +0530 Subject: [PATCH 031/103] fix: fix position of mandatory field in docfield --- frappe/core/doctype/docfield/docfield.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index 4614dd09c4..6d8ee41a5a 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -11,9 +11,9 @@ "label", "fieldtype", "fieldname", - "reqd", "precision", "length", + "reqd", "search_index", "in_list_view", "in_standard_filter", @@ -453,7 +453,7 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2020-04-15 02:26:03.310781", + "modified": "2020-04-19 21:54:13.783908", "modified_by": "Administrator", "module": "Core", "name": "DocField", From 982600fab04d05084071189adbc533c221d53ae5 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sun, 19 Apr 2020 22:02:03 +0530 Subject: [PATCH 032/103] fix(metatags): Better Meta Tags for Web Page and Web View --- frappe/website/context.py | 25 ++++++--------- frappe/website/doctype/web_page/web_page.json | 31 +++++++++++++++++-- frappe/website/doctype/web_page/web_page.py | 8 ++--- frappe/website/doctype/web_view/web_view.json | 28 +++++++++++++++-- frappe/website/doctype/web_view/web_view.py | 9 ++++++ 5 files changed, 76 insertions(+), 25 deletions(-) diff --git a/frappe/website/context.py b/frappe/website/context.py index dcef22af43..dc3af34de9 100644 --- a/frappe/website/context.py +++ b/frappe/website/context.py @@ -221,24 +221,24 @@ def add_metatags(context): tags = frappe._dict(context.get("metatags") or {}) if tags: - if not "twitter:card" in tags: - tags["twitter:card"] = "summary_large_image" - if not "og:type" in tags: tags["og:type"] = "article" - if tags.get("name"): - tags["og:title"] = tags["twitter:title"] = tags["name"] + name = tags.get('name') or tags.get('title') + if name: + tags["og:title"] = tags["twitter:title"] = name - if tags.get("title"): - tags["og:title"] = tags["twitter:title"] = tags["title"] - - if tags.get("description"): - tags["og:description"] = tags["twitter:description"] = tags["description"] + description = tags.get("description") or context.description + if description: + tags['description'] = tags["og:description"] = tags["twitter:description"] = description image = tags.get('image', context.image or None) if image: tags["og:image"] = tags["twitter:image:src"] = tags["image"] = frappe.utils.get_url(image) + tags['twitter:card'] = "summary_large_image" + + if context.author or tags.get('author'): + tags['author'] = context.author or tags.get('author') if context.path: tags['og:url'] = tags['url'] = frappe.utils.get_url(context.path) @@ -246,11 +246,6 @@ def add_metatags(context): if context.published_on: tags['datePublished'] = context.published_on - if context.author: - tags['author'] = context.author - - if context.description: - tags['description'] = context.description tags['language'] = frappe.local.lang or 'en' diff --git a/frappe/website/doctype/web_page/web_page.json b/frappe/website/doctype/web_page/web_page.json index 5f90f3adbf..9e348d2412 100644 --- a/frappe/website/doctype/web_page/web_page.json +++ b/frappe/website/doctype/web_page/web_page.json @@ -41,6 +41,10 @@ "sb2", "header", "breadcrumbs", + "metatags_section", + "meta_title", + "meta_description", + "meta_image", "set_meta_tags" ], "fields": [ @@ -219,7 +223,7 @@ "depends_on": "eval:!doc.__islocal", "fieldname": "sb2", "fieldtype": "Section Break", - "label": "Header, Breadcrumbs and Meta Tags" + "label": "Header and Breadcrumbs" }, { "description": "HTML for header section. Optional", @@ -237,7 +241,7 @@ { "fieldname": "set_meta_tags", "fieldtype": "Button", - "label": "Set Meta Tags" + "label": "Add Custom Tags" }, { "default": "0", @@ -250,6 +254,27 @@ "fieldname": "full_width", "fieldtype": "Check", "label": "Full Width" + }, + { + "collapsible": 1, + "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, @@ -258,7 +283,7 @@ "is_published_field": "published", "links": [], "max_attachments": 20, - "modified": "2020-04-19 01:55:48.363008", + "modified": "2020-04-19 12:26:21.546908", "modified_by": "Administrator", "module": "Website", "name": "Web Page", diff --git a/frappe/website/doctype/web_page/web_page.py b/frappe/website/doctype/web_page/web_page.py index 98065e4cce..da4bf31f46 100644 --- a/frappe/website/doctype/web_page/web_page.py +++ b/frappe/website/doctype/web_page/web_page.py @@ -128,13 +128,11 @@ class WebPage(WebsiteGenerator): def set_metatags(self, context): context.metatags = { - "name": context.title + "name": self.meta_title or self.title, + "description": self.meta_description, + "image": self.meta_image or find_first_image(context.main_section or "") } - image = find_first_image(context.main_section or "") - if image: - context.metatags["image"] = image - def validate_dates(self): if self.end_date: if self.start_date and get_datetime(self.end_date) < get_datetime(self.start_date): diff --git a/frappe/website/doctype/web_view/web_view.json b/frappe/website/doctype/web_view/web_view.json index c804d31de3..8c42f51421 100644 --- a/frappe/website/doctype/web_view/web_view.json +++ b/frappe/website/doctype/web_view/web_view.json @@ -20,7 +20,11 @@ "content_html", "components", "style_section", - "css" + "css", + "metatags_section", + "meta_title", + "meta_description", + "meta_image" ], "fields": [ { @@ -88,12 +92,32 @@ "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-19 05:05:43.620000", + "modified": "2020-04-19 12:25:48.014935", "modified_by": "Administrator", "module": "Website", "name": "Web View", diff --git a/frappe/website/doctype/web_view/web_view.py b/frappe/website/doctype/web_view/web_view.py index eeebb169dc..8b441579b6 100644 --- a/frappe/website/doctype/web_view/web_view.py +++ b/frappe/website/doctype/web_view/web_view.py @@ -14,6 +14,7 @@ class WebView(WebsiteGenerator): if self.content_type=='Components': self.build_components(context) + self.set_metatags(context) return context def build_components(self, context): @@ -93,3 +94,11 @@ class WebView(WebsiteGenerator): 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 + } + From 89e0a9804bd1ade5063aedbcee070e5bc3742cdf Mon Sep 17 00:00:00 2001 From: prssanna Date: Sun, 19 Apr 2020 22:13:10 +0530 Subject: [PATCH 033/103] fix: add missing fullstop in system update message --- frappe/utils/response.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/utils/response.py b/frappe/utils/response.py index 1dfbbe5516..fe7af072cf 100644 --- a/frappe/utils/response.py +++ b/frappe/utils/response.py @@ -218,6 +218,6 @@ def send_private_file(path): def handle_session_stopped(): frappe.respond_as_web_page(_("Updating"), - _("Your system is being updated. Please refresh again after a few moments"), + _("Your system is being updated. Please refresh again after a few moments."), http_status_code=503, indicator_color='orange', fullpage = True, primary_action=None) return frappe.website.render.render("message", http_status_code=503) From fb4338b78035d20e6520f425a1ac852b2d878cfe Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sun, 19 Apr 2020 22:18:24 +0530 Subject: [PATCH 034/103] fix(test): Exporter test, uses Web Page --- frappe/core/doctype/data_import/test_exporter_new.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/data_import/test_exporter_new.py b/frappe/core/doctype/data_import/test_exporter_new.py index 06d7879a09..eabf371b07 100644 --- a/frappe/core/doctype/data_import/test_exporter_new.py +++ b/frappe/core/doctype/data_import/test_exporter_new.py @@ -20,7 +20,7 @@ class TestExporter(unittest.TestCase): e = Exporter('Web Page', export_fields='All') csv_array = e.get_csv_array() header = csv_array[0] - self.assertEqual(len(header), 25) + self.assertEqual(len(header), 28) def test_exports_selected_fields(self): From 7b2f469bf01064a5af9b77811aa899cc42d1979f Mon Sep 17 00:00:00 2001 From: Mangesh-Khairnar Date: Sun, 19 Apr 2020 23:05:48 +0530 Subject: [PATCH 035/103] fix: remove nowrap from ellipsis class --- frappe/templates/styles/card_style.css | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/templates/styles/card_style.css b/frappe/templates/styles/card_style.css index 595d974011..cf90ff0bd5 100644 --- a/frappe/templates/styles/card_style.css +++ b/frappe/templates/styles/card_style.css @@ -31,7 +31,6 @@ } .ellipsis { - white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; From a4f309a40fa208e64eefa4b7592be4fd208484dd Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 20 Apr 2020 10:19:37 +0530 Subject: [PATCH 036/103] chore(formatting): some fixes for theme.scss --- .../website_theme/website_theme_template.scss | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/frappe/website/doctype/website_theme/website_theme_template.scss b/frappe/website/doctype/website_theme/website_theme_template.scss index caad55810a..1bb4685b98 100644 --- a/frappe/website/doctype/website_theme/website_theme_template.scss +++ b/frappe/website/doctype/website_theme/website_theme_template.scss @@ -1,12 +1,14 @@ {% if google_font %} @import url('https://fonts.googleapis.com/css?family={{ google_font.replace(' ', '+') }}:{{ font_properties }}&display=swap'); -$font-family-sans-serif: "{{ google_font }}", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; -{% endif %} -{% if primary_color %}$primary: {{ frappe.db.get_value('Color', primary_color, 'color') }};{% endif %} -{% if dark_color %}$dark: {{ frappe.db.get_value('Color', dark_color, 'color') }};{% endif %} -{% if text_color %}$body-color: {{ frappe.db.get_value('Color', text_color, 'color') }};{% endif %} -{% if background_color %}$body-bg: {{ frappe.db.get_value('Color', background_color, 'color') }};{% endif %} +$font-family-sans-serif: "{{ google_font }}", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + +{% endif -%} + +{% if primary_color %}$primary: {{ frappe.db.get_value('Color', primary_color, 'color') }};{% endif -%} +{% if dark_color %}$dark: {{ frappe.db.get_value('Color', dark_color, 'color') }};{% endif -%} +{% if text_color %}$body-color: {{ frappe.db.get_value('Color', text_color, 'color') }};{% endif -%} +{% if background_color %}$body-bg: {{ frappe.db.get_value('Color', background_color, 'color') }};{% endif -%} $enable-shadows: {{ button_shadows and "true" or "false" }}; $enable-gradients: {{ button_gradients and "true" or "false" }}; @@ -14,8 +16,8 @@ $enable-rounded: {{ button_rounded_corners and "true" or "false" }}; @import "frappe/public/scss/website"; +{% if font_size -%} body { - {% if font_size %} font-size: {{ font_size }}; - {% endif %} } +{%- endif %} From 16e96b14f863dc3db7b0b3100c72cb585f18a137 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Mon, 20 Apr 2020 12:43:01 +0530 Subject: [PATCH 037/103] 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 f1806aa8ef9976d4617571cf8c0c443c1ca71a62 Mon Sep 17 00:00:00 2001 From: prssanna Date: Mon, 20 Apr 2020 12:43:24 +0530 Subject: [PATCH 038/103] fix: form not being saved on setting empty value for some fieldtypes --- frappe/public/js/frappe/form/form.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index e714418375..82478db707 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -184,13 +184,7 @@ frappe.ui.form.Form = class FrappeForm { frappe.model.on(me.doctype, "*", function(fieldname, value, doc) { // set input if(doc.name===me.docname) { - if ((value==='' || value===null) && !doc[fieldname]) { - // both the incoming and outgoing values are falsy - // the texteditor, summernote, changes nulls to empty strings on render, - // so ignore those changes - } else { - me.dirty(); - } + me.dirty(); let field = me.fields_dict[fieldname]; field && field.refresh(fieldname); From 6f1caf101f4caed049e6efa200b086bfc0577f9b Mon Sep 17 00:00:00 2001 From: Aditya Hase Date: Mon, 20 Apr 2020 12:54:30 +0530 Subject: [PATCH 039/103] fix: Check if Event Consumer exists before checking for consumers the logic for event streaming has been hardcoded into `document.py` Scenario: a site (say, v12) backup needs to be restored on a v13 bench and then updated Solution: use `bench migrate`; works flawlessly. However, if this site has an app installed that isn't available on the v13 bench, then bench migrate fails. Also, `bench remove-from-installed-apps` fails, because of the absence of "Event Consumer" --- frappe/model/document.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frappe/model/document.py b/frappe/model/document.py index 03b21ea667..f2495e9e20 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -1318,6 +1318,9 @@ def make_event_update_log(doc, update_type): def check_doctype_has_consumers(doctype): """Check if doctype has event consumers for event streaming""" + if not frappe.db.exists("DocType", "Event Consumer"): + return False + event_consumers = frappe.get_all('Event Consumer') for event_consumer in event_consumers: consumer = frappe.get_doc('Event Consumer', event_consumer.name) From f6f55fa0ad682aee77a93c4af4b6e571244b6d8f Mon Sep 17 00:00:00 2001 From: Aditya Hase Date: Mon, 20 Apr 2020 13:32:18 +0530 Subject: [PATCH 040/103] fix(background jobs): Show method name on Background Jobs page. (#10014) After https://github.com/frappe/frappe/pull/8486 background jobs page doesn't provide any information. --- frappe/core/page/background_jobs/background_jobs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/core/page/background_jobs/background_jobs.py b/frappe/core/page/background_jobs/background_jobs.py index c8a2352968..4a94de4ace 100644 --- a/frappe/core/page/background_jobs/background_jobs.py +++ b/frappe/core/page/background_jobs/background_jobs.py @@ -28,6 +28,7 @@ def get_info(show_failed=False): if j.kwargs.get('site')==frappe.local.site: jobs.append({ 'job_name': j.kwargs.get('kwargs', {}).get('playbook_method') \ + or j.kwargs.get('kwargs', {}).get('job_type') \ or str(j.kwargs.get('job_name')), 'status': j.get_status(), 'queue': name, 'creation': format_datetime(convert_utc_to_user_timezone(j.created_at)), From ba03e6ee5d0d18f1e2f7b49081c06e97cf56b28d Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 20 Apr 2020 16:36:52 +0530 Subject: [PATCH 041/103] 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 042/103] 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 043/103] 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 83a2b354d96b6236e7693636566659e0a39baac0 Mon Sep 17 00:00:00 2001 From: prssanna Date: Mon, 20 Apr 2020 20:45:25 +0530 Subject: [PATCH 044/103] fix: MultiSelectList field being rendered multiple times in dialog --- frappe/public/js/frappe/form/controls/multiselect_list.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/public/js/frappe/form/controls/multiselect_list.js b/frappe/public/js/frappe/form/controls/multiselect_list.js index 3e8dc21dca..cd86bdd767 100644 --- a/frappe/public/js/frappe/form/controls/multiselect_list.js +++ b/frappe/public/js/frappe/form/controls/multiselect_list.js @@ -18,6 +18,7 @@ frappe.ui.form.ControlMultiSelectList = frappe.ui.form.ControlData.extend({ this.$list_wrapper = $(template); this.$input = $(''); this.input = this.$input.get(0); + this.has_input = true; this.$list_wrapper.prependTo(this.input_area); this.$filter_input = this.$list_wrapper.find('input'); this.$list_wrapper.on('click', '.dropdown-menu', e => { From 02d3654b452daae9da087cff3cca2a0e87d35bae Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 20 Apr 2020 23:23:22 +0530 Subject: [PATCH 045/103] fix: custom options not adding in the dashboard chart --- .../doctype/dashboard_chart/dashboard_chart.js | 4 ++++ .../doctype/dashboard_chart/dashboard_chart.json | 9 ++++++++- .../doctype/dashboard_chart/dashboard_chart.py | 14 ++++++++++++++ .../public/js/frappe/views/reports/query_report.js | 9 ++++++++- frappe/public/js/frappe/widgets/chart_widget.js | 8 ++++++++ 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js index a130c1d6cf..275028fc15 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js @@ -59,6 +59,10 @@ frappe.ui.form.on('Dashboard Chart', { if (frm.doc.report_name) { frm.trigger('set_chart_report_filters'); } + + if (!frappe.boot.developer_mode) { + frm.set_df_property("custom_options", "hidden", 1); + } }, source: function(frm) { diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.json b/frappe/desk/doctype/dashboard_chart/dashboard_chart.json index 676cdbe24a..6f037baec3 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.json +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.json @@ -33,6 +33,7 @@ "type", "column_break_2", "color", + "custom_options", "section_break_10", "last_synced_on" ], @@ -213,10 +214,16 @@ "label": "Y Axis", "mandatory_depends_on": "eval:doc.report_name && !doc.is_custom", "options": "Dashboard Chart Field" + }, + { + "description": "Ex: \"colors\": [\"#d1d8dd\", \"#ff5858\"]", + "fieldname": "custom_options", + "fieldtype": "Code", + "label": "Custom Options" } ], "links": [], - "modified": "2020-04-08 18:54:36.739183", + "modified": "2020-04-16 03:15:51.455196", "modified_by": "Administrator", "module": "Desk", "name": "Dashboard Chart", diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py index b2a6f0a0ff..36a75bd9d5 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.py +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.py @@ -97,6 +97,10 @@ def create_report_chart(args): _doc = frappe.new_doc('Dashboard Chart') _doc.update(args) + + if (args.get("custom_options")): + _doc.custom_options = json.dumps(args.get("custom_options")) + if frappe.db.exists('Dashboard Chart', args.chart_name): args.chart_name = append_number_if_name_exists('Dashboard Chart', args.chart_name) _doc.chart_name = args.chart_name @@ -108,6 +112,7 @@ def create_report_chart(args): @frappe.whitelist() def add_chart_to_dashboard(args): args = frappe.parse_json(args) + dashboard = frappe.get_doc('Dashboard', args.dashboard) dashboard_link = frappe.new_doc('Dashboard Chart Link') dashboard_link.chart = args.chart_name @@ -362,6 +367,8 @@ class DashboardChart(Document): self.check_required_field() self.check_document_type() + self.validate_custom_options() + def check_required_field(self): if not self.document_type: frappe.throw(_("Document type is required to create a dashboard chart")) @@ -378,3 +385,10 @@ class DashboardChart(Document): def check_document_type(self): if frappe.get_meta(self.document_type).issingle: frappe.throw("You cannot create a dashboard chart from single DocTypes") + + def validate_custom_options(self): + if self.custom_options: + try: + json.loads(self.custom_options) + except ValueError as error: + frappe.throw("Invalid json added in the custom options: %s" % error) \ No newline at end of file diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 08da956072..9c04f6e879 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -183,7 +183,6 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { } create_dashboard_chart(chart_args, dashboard_name, chart_name) { - let args = { 'dashboard': dashboard_name || null, 'chart_type': 'Report', @@ -191,8 +190,15 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { 'type': chart_args.chart_type || frappe.model.unscrub(chart_args.type), 'color': chart_args.color, 'filters_json': JSON.stringify(this.get_filter_values()), + 'custom_options': {} }; + for (let key in chart_args) { + if (key != "data") { + args['custom_options'][key] = chart_args[key]; + } + } + if (this.chart_fields) { let x_field_title = toTitle(chart_args.x_field); let y_field_title = toTitle(chart_args.y_fields[0]); @@ -218,6 +224,7 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { ); } + debugger frappe.xcall( 'frappe.desk.doctype.dashboard_chart.dashboard_chart.create_report_chart', {args: args} diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js index 9c03f08523..bf19d813d6 100644 --- a/frappe/public/js/frappe/widgets/chart_widget.js +++ b/frappe/public/js/frappe/widgets/chart_widget.js @@ -490,6 +490,14 @@ export default class ChartWidget extends Widget { shortenYAxisNumbers: 1 } }; + + if (this.chart_doc.custom_options) { + let custom_options = JSON.parse(this.chart_doc.custom_options); + for (let key in custom_options) { + chart_args[key] = custom_options[key]; + } + } + if (!this.dashboard_chart) { this.dashboard_chart = new frappe.Chart( this.chart_wrapper[0], From 0c1973538686eeb825fddb7a2f36b79a8de946c3 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 21 Apr 2020 09:13:27 +0530 Subject: [PATCH 046/103] fix(minor): standard Website Theme --- frappe/website/website_theme/standard/standard.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 2393b684ca..28667e124d 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -8,13 +8,12 @@ "doctype": "Website Theme", "font_properties": "300,600", "idx": 27, - "modified": "2020-04-19 05:34:56.086984", + "modified": "2020-04-20 23:42:31.649416", "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": "$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_88c91a7c.css" } \ No newline at end of file From 0fa8266d6d6c5808e3dbac5d11c0c7d10c735c93 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 21 Apr 2020 09:29:24 +0530 Subject: [PATCH 047/103] 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 c0f66f3dac78896f7728bb1f0f1bc6b893c3bbca Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 21 Apr 2020 11:41:55 +0530 Subject: [PATCH 048/103] fix(minor): Standard theme naming. It will be common across sites --- frappe/website/doctype/website_theme/website_theme.py | 7 +++++-- frappe/website/website_theme/standard/standard.json | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/frappe/website/doctype/website_theme/website_theme.py b/frappe/website/doctype/website_theme/website_theme.py index a1b475450d..9b1c9115d6 100644 --- a/frappe/website/doctype/website_theme/website_theme.py +++ b/frappe/website/doctype/website_theme/website_theme.py @@ -61,10 +61,13 @@ class WebsiteTheme(Document): from subprocess import Popen, PIPE folder_path = join_path(frappe.utils.get_bench_path(), 'sites', 'assets', 'css') - self.delete_old_theme_files(folder_path) + + if not self.custom: + self.delete_old_theme_files(folder_path) # add a random suffix - file_name = frappe.scrub(self.name) + '_' + frappe.generate_hash('Website Theme', 8) + '.css' + suffix = frappe.generate_hash('Website Theme', 8) if self.custom else 'style' + file_name = frappe.scrub(self.name) + '_' + suffix + '.css' output_path = join_path(folder_path, file_name) content = get_scss(self) diff --git a/frappe/website/website_theme/standard/standard.json b/frappe/website/website_theme/standard/standard.json index 28667e124d..a799f25425 100644 --- a/frappe/website/website_theme/standard/standard.json +++ b/frappe/website/website_theme/standard/standard.json @@ -7,13 +7,14 @@ "docstatus": 0, "doctype": "Website Theme", "font_properties": "300,600", + "font_size": "", "idx": 27, - "modified": "2020-04-20 23:42:31.649416", + "modified": "2020-04-21 02:10:31.761219", "modified_by": "Administrator", "module": "Website", "name": "Standard", "owner": "Administrator", "theme": "Standard", "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_88c91a7c.css" + "theme_url": "/assets/css/standard_style.css" } \ No newline at end of file From d265f00f9b28f6f8d0daaacc5a5895fe8e0d51f6 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 21 Apr 2020 12:38:04 +0530 Subject: [PATCH 049/103] 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 050/103] 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 051/103] 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 052/103] 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 053/103] 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 054/103] 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 055/103] 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 056/103] 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 057/103] 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 058/103] 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 059/103] 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 060/103] 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 061/103] 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 062/103] 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 063/103] 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 064/103] 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 065/103] 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 066/103] 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 a555f9ed52fce0becb2cad866be2dabbadee69cd Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 22 Apr 2020 13:34:21 +0530 Subject: [PATCH 067/103] feat: override barcode svg width to fit in html area --- frappe/public/js/frappe/form/controls/barcode.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/public/js/frappe/form/controls/barcode.js b/frappe/public/js/frappe/form/controls/barcode.js index 859cbbb22a..c2314d6664 100644 --- a/frappe/public/js/frappe/form/controls/barcode.js +++ b/frappe/public/js/frappe/form/controls/barcode.js @@ -48,6 +48,7 @@ frappe.ui.form.ControlBarcode = frappe.ui.form.ControlData.extend({ const svg = this.barcode_area.find('svg')[0]; JsBarcode(svg, value, this.get_options(value)); $(svg).attr('data-barcode-value', value); + $(svg).attr('width', '100%'); return this.barcode_area.html(); } }, From 96c5162c7eef08919a8d590e74dc0ce89329c6e0 Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Wed, 22 Apr 2020 14:18:38 +0530 Subject: [PATCH 068/103] 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 069/103] 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 070/103] 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 22f4a074cffa8c8f3f24004fee584977a02393f5 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 23 Apr 2020 14:41:50 +0530 Subject: [PATCH 071/103] chore: Update cypress - To leverage testing performance enhancements made in cypress v3.3.0 https://www.cypress.io/blog/2019/05/22/how-we-improved-network-speed-by-300-in-cypress-3-3-0/ --- package.json | 6 +- yarn.lock | 559 +++++++++++++++++---------------------------------- 2 files changed, 186 insertions(+), 379 deletions(-) diff --git a/package.json b/package.json index e6635fada1..2c06094737 100644 --- a/package.json +++ b/package.json @@ -41,17 +41,17 @@ "qz-tray": "^2.0.8", "redis": "^2.8.0", "showdown": "^1.9.1", + "snyk": "^1.297.4", "socket.io": "^2.3.0", "superagent": "^3.8.2", "touch": "^3.1.0", "vue": "^2.6.11", - "vue-router": "^2.0.0", - "snyk": "^1.297.4" + "vue-router": "^2.0.0" }, "devDependencies": { "babel-runtime": "^6.26.0", "chalk": "^2.3.2", - "cypress": "^3.1.1", + "cypress": "3", "cypress-file-upload": "^3.1.0", "less": "^3.11.1", "node-sass": "^4.13.1", diff --git a/yarn.lock b/yarn.lock index 1b3d0a2176..ed6b3f3a56 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,10 +35,10 @@ date-fns "^1.27.2" figures "^1.7.0" -"@cypress/xvfb@1.2.3": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.3.tgz#6319afdcdcff7d1505daeeaa84484d0596189860" - integrity sha512-yYrK+/bgL3hwoRHMZG4r5fyLniCy1pXex5fimtewAY6vE/jsVs8Q37UsEO03tFlcmiLnQ3rBNMaZBYTi/+C1cw== +"@cypress/xvfb@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== dependencies: debug "^3.1.0" lodash.once "^4.1.1" @@ -181,16 +181,6 @@ "@types/events" "*" "@types/node" "*" -"@types/blob-util@1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/blob-util/-/blob-util-1.3.3.tgz#adba644ae34f88e1dd9a5864c66ad651caaf628a" - integrity sha512-4ahcL/QDnpjWA2Qs16ZMQif7HjGP2cw3AGjHabybjw7Vm1EKu+cfQN1D78BaZbS1WJNa1opSMF5HNMztx7lR0w== - -"@types/bluebird@3.5.18": - version "3.5.18" - resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.18.tgz#6a60435d4663e290f3709898a4f75014f279c4d6" - integrity sha512-OTPWHmsyW18BhrnG5x8F7PzeZ2nFxmHGb42bZn79P9hl+GI5cMzyPgQTwNjbem0lJhoru/8vtjAFCUOu3+gE2w== - "@types/bunyan@*": version "1.8.6" resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.6.tgz#6527641cca30bedec5feb9ab527b7803b8000582" @@ -198,24 +188,6 @@ dependencies: "@types/node" "*" -"@types/chai-jquery@1.1.35": - version "1.1.35" - resolved "https://registry.yarnpkg.com/@types/chai-jquery/-/chai-jquery-1.1.35.tgz#9a8f0a39ec0851b2768a8f8c764158c2a2568d04" - integrity sha512-7aIt9QMRdxuagLLI48dPz96YJdhu64p6FCa6n4qkGN5DQLHnrIjZpD9bXCvV2G0NwgZ1FAmfP214dxc5zNCfgQ== - dependencies: - "@types/chai" "*" - "@types/jquery" "*" - -"@types/chai@*": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a" - integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA== - -"@types/chai@4.0.8": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.0.8.tgz#d27600e9ba2f371e08695d90a0fe0408d89c7be7" - integrity sha512-m812CONwdZn/dMzkIJEY0yAs4apyTkTORgfB2UsMOxgkUbC205AHnm4T8I0I5gPg9MHrFc1dJ35iS75c0CJkjg== - "@types/debug@^4.1.4": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" @@ -231,38 +203,11 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== -"@types/jquery@*": - version "3.3.29" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.29.tgz#680a2219ce3c9250483722fccf5570d1e2d08abd" - integrity sha512-FhJvBninYD36v3k6c+bVk1DSZwh7B5Dpb/Pyk3HKVsiohn0nhbefZZ+3JXbWQhFyt0MxSl2jRDdGQPHeOHFXrQ== - dependencies: - "@types/sizzle" "*" - -"@types/jquery@3.3.6": - version "3.3.6" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.6.tgz#5932ead926307ca21e5b36808257f7c926b06565" - integrity sha512-403D4wN95Mtzt2EoQHARf5oe/jEPhzBOBNrunk+ydQGW8WmkQ/E8rViRAEB1qEt/vssfGfNVD6ujP4FVeegrLg== - "@types/js-yaml@^3.12.1": version "3.12.2" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.2.tgz#a35a1809c33a68200fb6403d1ad708363c56470a" integrity sha512-0CFu/g4mDSNkodVwWijdlr8jH7RoplRWNgovjFLEZeT+QEbbZXjBmCe3HwaWheAlCbHwomTwzZoSedeOycABug== -"@types/lodash@4.14.87": - version "4.14.87" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.87.tgz#55f92183b048c2c64402afe472f8333f4e319a6b" - integrity sha512-AqRC+aEF4N0LuNHtcjKtvF9OTfqZI0iaBoe3dA6m/W+/YZJBZjBmW/QIZ8fBeXC6cnytSY9tBoFBqZ9uSCeVsw== - -"@types/minimatch@3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/mocha@2.2.44": - version "2.2.44" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.44.tgz#1d4a798e53f35212fd5ad4d04050620171cd5b5e" - integrity sha512-k2tWTQU8G4+iSMvqKi0Q9IIsWAp/n8xzdZS4Q4YVIltApoMA00wFBFdlJnmoaK1/z7B0Cy0yPe6GgXteSmdUNw== - "@types/node@*": version "13.7.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.4.tgz#76c3cb3a12909510f52e5dc04a6298cdf9504ffd" @@ -296,25 +241,7 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== -"@types/sinon-chai@3.2.2": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.2.tgz#5cfdbda70bae30f79a9423334af9e490e4cce793" - integrity sha512-5zSs2AslzyPZdOsbm2NRtuSNAI2aTWzNKOHa/GRecKo7a5efYD7qGcPxMZXQDayVXT2Vnd5waXxBvV31eCZqiA== - dependencies: - "@types/chai" "*" - "@types/sinon" "*" - -"@types/sinon@*": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.0.8.tgz#7bf01f2967d0d6d2cd84ce63e08696eb076e8dc0" - integrity sha512-v8HKmpYANbS3y0cWji16uk/CV9v2CqpI+wxeW7WVZPU2E8MAcvBYbCBpeukhaWPRHbTO3tu8m6vb2IXWCbEUOQ== - -"@types/sinon@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.0.0.tgz#84e707e157ec17d3e4c2a137f41fc3f416c0551e" - integrity sha512-kcYoPw0uKioFVC/oOqafk2yizSceIQXCYnkYts9vJIwQklFRsMubTObTDrjQamUyBRd47332s85074cd/hCwxg== - -"@types/sizzle@*": +"@types/sizzle@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== @@ -426,22 +353,12 @@ agent-base@~4.2.1: dependencies: jquery ">=2.0.0 <4.0.0" -ajv@^5.1.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - ajv@^6.5.5: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== dependencies: - fast-deep-equal "^2.0.1" + fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" @@ -510,6 +427,11 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +arch@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" + integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -607,12 +529,12 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== -async@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.4.0.tgz#4990200f18ea5b837c2cc4f8c031a6985c385611" - integrity sha1-SZAgDxjqW4N8LMT4wDGmmFw4VhE= +async@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== dependencies: - lodash "^4.14.0" + lodash "^4.17.10" async@^1.4.0: version "1.5.2" @@ -639,12 +561,12 @@ aws-sign2@~0.7.0: resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -aws4@^1.6.0, aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -babel-runtime@^6.18.0, babel-runtime@^6.26.0: +babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -936,10 +858,10 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -956,15 +878,6 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -975,7 +888,7 @@ check-more-types@2.24.0: resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= -ci-info@^1.0.0, ci-info@^1.5.0: +ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== @@ -1122,29 +1035,27 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" -commander@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== +commander@2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== commander@^2.19.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== -common-tags@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0" - integrity sha1-EYe+Tz1M8MBCfUP3Tu8fc1AWFMA= - dependencies: - babel-runtime "^6.18.0" +common-tags@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== component-bind@1.0.0: version "1.0.0" @@ -1166,11 +1077,12 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= +concat-stream@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: + buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" @@ -1232,9 +1144,9 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js@^2.4.0: - version "2.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-js@^3.2.0: version "3.6.4" @@ -1491,51 +1403,44 @@ cypress-file-upload@^3.1.0: resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-3.1.0.tgz#9da7ed60619631231bd2caaf9844874e7cec6f69" integrity sha512-zJh6Qwh+BZz6j3oCxMgRmfSsHJ+vSm2FrsZ1j/hG3s1O+6UPhOCDGeJucMUGBivWb1IsHrLKJP4LfgHSooPZHw== -cypress@^3.1.1: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.1.5.tgz#5227b2ce9306c47236d29e703bad9055d7218042" - integrity sha512-jzYGKJqU1CHoNocPndinf/vbG28SeU+hg+4qhousT/HDBMJxYgjecXOmSgBX/ga9/TakhqSrIrSP2r6gW/OLtg== +cypress@3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.8.3.tgz#e921f5482f1cbe5814891c878f26e704bbffd8f4" + integrity sha512-I9L/d+ilTPPA4vq3NC1OPKmw7jJIpMKNdyfR8t1EXYzYCjyqbc59migOm1YSse/VRbISLJ+QGb5k4Y3bz2lkYw== dependencies: "@cypress/listr-verbose-renderer" "0.4.1" - "@cypress/xvfb" "1.2.3" - "@types/blob-util" "1.3.3" - "@types/bluebird" "3.5.18" - "@types/chai" "4.0.8" - "@types/chai-jquery" "1.1.35" - "@types/jquery" "3.3.6" - "@types/lodash" "4.14.87" - "@types/minimatch" "3.0.3" - "@types/mocha" "2.2.44" - "@types/sinon" "7.0.0" - "@types/sinon-chai" "3.2.2" + "@cypress/xvfb" "1.2.4" + "@types/sizzle" "2.3.2" + arch "2.1.1" bluebird "3.5.0" cachedir "1.3.0" - chalk "2.4.1" + chalk "2.4.2" check-more-types "2.24.0" - commander "2.11.0" - common-tags "1.4.0" - debug "3.1.0" + commander "2.15.1" + common-tags "1.8.0" + debug "3.2.6" + eventemitter2 "4.1.2" execa "0.10.0" executable "4.1.1" - extract-zip "1.6.6" - fs-extra "4.0.1" - getos "3.1.0" - glob "7.1.2" - is-ci "1.0.10" + extract-zip "1.6.7" + fs-extra "5.0.0" + getos "3.1.1" + is-ci "1.2.1" is-installed-globally "0.1.0" lazy-ass "1.6.0" listr "0.12.0" - lodash "4.17.11" + lodash "4.17.15" log-symbols "2.2.0" minimist "1.2.0" - moment "2.22.2" + moment "2.24.0" ramda "0.24.1" - request "2.87.0" - request-progress "0.3.1" - supports-color "5.1.0" - tmp "0.0.31" + request "2.88.0" + request-progress "3.0.0" + supports-color "5.5.0" + tmp "0.1.0" + untildify "3.0.3" url "0.11.0" - yauzl "2.8.0" + yauzl "2.10.0" dashdash@^1.12.0: version "1.14.1" @@ -1578,6 +1483,13 @@ debug@3.1.0, debug@~3.1.0: dependencies: ms "2.0.0" +debug@3.2.6, debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + debug@4, debug@^4.1.1, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -1585,13 +1497,6 @@ debug@4, debug@^4.1.1, debug@~4.1.0: dependencies: ms "^2.1.1" -debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1949,6 +1854,11 @@ event-loop-spinner@^1.1.0: dependencies: tslib "^1.10.0" +eventemitter2@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-4.1.2.tgz#0e1a8477af821a6ef3995b311bf74c23a5247f15" + integrity sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU= + eventemitter3@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" @@ -2076,7 +1986,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@^3.0.1, extend@^3.0.2, extend@~3.0.1, extend@~3.0.2: +extend@^3.0.0, extend@^3.0.1, extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -2104,14 +2014,14 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@1.6.6: - version "1.6.6" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" - integrity sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw= +extract-zip@1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= dependencies: - concat-stream "1.6.0" + concat-stream "1.6.2" debug "2.6.9" - mkdirp "0.5.0" + mkdirp "0.5.1" yauzl "2.4.1" extsprintf@1.3.0: @@ -2124,25 +2034,25 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + fast-diff@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig== fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@~2.0.6: version "2.0.6" @@ -2161,6 +2071,13 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -2229,7 +2146,7 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@^2.3.1, form-data@~2.3.1, form-data@~2.3.2: +form-data@^2.3.1, form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== @@ -2284,13 +2201,13 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880" - integrity sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA= +fs-extra@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== dependencies: graceful-fs "^4.1.2" - jsonfile "^3.0.0" + jsonfile "^4.0.0" universalify "^0.1.0" fs.realpath@^1.0.0: @@ -2415,12 +2332,12 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -getos@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.0.tgz#db3aa4df15a3295557ce5e81aa9e3e5cdfaa6567" - integrity sha512-i9vrxtDu5DlLVFcrbqUqGWYlZN/zZ4pGMICCAcZoYsX3JA54nYp8r5EThw5K+m2q3wszkx4Th746JstspB0H4Q== +getos@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.1.tgz#967a813cceafee0156b0483f7cffa5b3eff029c5" + integrity sha512-oUP1rnEhAr97rkitiszGP9EgDVYnmchgFzfqRzSkgtfv7ai6tEi7Ko8GgjNXts7VLWEqrTWyhsOKLe5C5b/Zkg== dependencies: - async "2.4.0" + async "2.6.1" getpass@^0.1.1: version "0.1.7" @@ -2459,18 +2376,6 @@ gl-vec3@^1.0.3: resolved "https://registry.yarnpkg.com/gl-vec3/-/gl-vec3-1.1.3.tgz#a47c62f918774a06cbed1b65bcd0288ecbb03826" integrity sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw== -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -2536,16 +2441,11 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== -graceful-fs@^4.1.6: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== - graphlib@^2.1.1, graphlib@^2.1.5: version "2.1.8" resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" @@ -2558,14 +2458,6 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - har-validator@~5.1.0: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" @@ -2598,11 +2490,6 @@ has-flag@^1.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2949,14 +2836,7 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== -is-ci@1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" - integrity sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4= - dependencies: - ci-info "^1.0.0" - -is-ci@^1.0.10: +is-ci@1.2.1, is-ci@^1.0.10: version "1.2.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== @@ -3035,11 +2915,9 @@ is-extglob@^2.1.0: integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -3293,11 +3171,6 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -3318,10 +3191,10 @@ json5@^0.5.0: resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= -jsonfile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" - integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" @@ -3555,12 +3428,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.14, lodash@~4.17.10: +lodash@4.17.15, lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.14, lodash@~4.17.10: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -3749,11 +3617,6 @@ mime-db@1.43.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== -mime-db@~1.38.0: - version "1.38.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" - integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== - mime-types@^2.0.1: version "2.1.24" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" @@ -3761,14 +3624,7 @@ mime-types@^2.0.1: dependencies: mime-db "1.40.0" -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19: - version "2.1.22" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" - integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== - dependencies: - mime-db "~1.38.0" - -mime-types@~2.1.24: +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.26" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== @@ -3810,14 +3666,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" - integrity sha1-HXMHam35hs2TROFecfzAWkyavxI= - dependencies: - minimist "0.0.8" - -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -3831,12 +3680,7 @@ moment-timezone@^0.5.28: dependencies: moment ">= 2.9.0" -moment@2.22.2: - version "2.22.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" - integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= - -"moment@>= 2.9.0", moment@^2.20.1: +moment@2.24.0, "moment@>= 2.9.0", moment@^2.20.1: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== @@ -3846,11 +3690,16 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1, ms@^2.1.1: +ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -4044,11 +3893,6 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -4195,7 +4039,7 @@ os-name@^3.0.0: macos-release "^2.2.0" windows-release "^3.1.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -4839,9 +4683,9 @@ prettier@^1.13.0: integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g== process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== promise.series@^0.2.0: version "0.2.0" @@ -4898,9 +4742,9 @@ pseudomap@^1.0.2: integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: - version "1.1.31" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== pump@^3.0.0: version "3.0.0" @@ -4935,7 +4779,7 @@ qs@6.7.0, qs@^6.5.1: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@~6.5.1, qs@~6.5.2: +qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== @@ -5051,7 +4895,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@2, readable-stream@~2.3.6: +readable-stream@2, readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -5064,7 +4908,7 @@ readable-stream@2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.5: +readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -5220,40 +5064,14 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request-progress@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-0.3.1.tgz#0721c105d8a96ac6b2ce8b2c89ae2d5ecfcf6b3a" - integrity sha1-ByHBBdipasayzossia4tXs/Pazo= +request-progress@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= dependencies: - throttleit "~0.0.2" + throttleit "^1.0.0" -request@2.87.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@^2.44.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: +request@2.88.0, request@^2.44.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -5489,7 +5307,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -5644,7 +5462,12 @@ showdown@^1.9.1: dependencies: yargs "^14.2" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= @@ -6274,12 +6097,12 @@ superagent@^3.8.2: qs "^6.5.1" readable-stream "^2.3.5" -supports-color@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" - integrity sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ== +supports-color@5.5.0, supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - has-flag "^2.0.0" + has-flag "^3.0.0" supports-color@^2.0.0: version "2.0.0" @@ -6293,13 +6116,6 @@ supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^5.3.0, supports-color@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" @@ -6388,10 +6204,10 @@ then-fs@^2.0.0: dependencies: promise ">=3.2 <8" -throttleit@~0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" - integrity sha1-z+34jmDADdlpe2H90qg0OptoDq8= +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= through@^2.3.4, through@^2.3.6: version "2.3.8" @@ -6413,13 +6229,6 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tmp@0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - integrity sha1-jzirlDjhcxXl29izZX6L+yd65Kc= - dependencies: - os-tmpdir "~1.0.1" - tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -6481,13 +6290,6 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" -tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== - dependencies: - punycode "^1.4.1" - tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -6628,6 +6430,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +untildify@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" + integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== + unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" @@ -6683,7 +6490,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: +uuid@^3.0.1, uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -6969,6 +6776,14 @@ yargs@^7.0.0: y18n "^3.2.1" yargs-parser "^5.0.0" +yauzl@2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" @@ -6976,14 +6791,6 @@ yauzl@2.4.1: dependencies: fd-slicer "~1.0.1" -yauzl@2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2" - integrity sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.0.1" - yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" From 0296908f18d9b9eb2e6ce05f2b49eaac28e34267 Mon Sep 17 00:00:00 2001 From: Chinmay Pai Date: Thu, 23 Apr 2020 17:52:15 +0530 Subject: [PATCH 072/103] 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 073/103] 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 074/103] 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 075/103] 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 ce4560078a12e6548b2269d26b8d0be61da77f51 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 24 Apr 2020 12:58:22 +0530 Subject: [PATCH 076/103] fix: allow truncated image files Reason: "IOError: broken data stream when reading image file" Reference: https://github.com/python-pillow/Pillow/issues/1510 --- frappe/core/doctype/file/file.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index 8741101976..1312ae5c2b 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -28,7 +28,7 @@ from frappe import conf from frappe.utils.nestedset import NestedSet from frappe.model.document import Document from frappe.utils import strip -from PIL import Image, ImageOps +from PIL import Image, ImageFile, ImageOps from six import StringIO, string_types from six.moves.urllib.parse import unquote, quote from six import text_type, PY2 @@ -38,9 +38,11 @@ class MaxFileSizeReachedError(frappe.ValidationError): pass -class FolderNotEmpty(frappe.ValidationError): pass +class FolderNotEmpty(frappe.ValidationError): + pass exclude_from_linked_with = True +ImageFile.LOAD_TRUNCATED_IMAGES = True class File(Document): From 8144ae3bff74d403dc4b22ee05dfa3c591f2253d Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 24 Apr 2020 13:01:13 +0530 Subject: [PATCH 077/103] style: sort imports --- frappe/core/doctype/file/file.py | 38 +++++++++++++++----------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index 1312ae5c2b..252aeb0d10 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -1,43 +1,41 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # MIT License. See license.txt -from __future__ import unicode_literals -from frappe import _ """ record of files naming for same name files: file.gif, file-1.gif, file-2.gif etc """ -import frappe -import json -import os +from __future__ import unicode_literals + import base64 -import re import hashlib -import mimetypes +import imghdr import io +import json +import mimetypes +import os +import re import shutil +import zipfile + import requests import requests.exceptions -import imghdr - -from frappe.utils import get_hook_method, get_files_path, random_string, encode, cstr, call_hook_method, cint -from frappe import _ -from frappe import conf -from frappe.utils.nestedset import NestedSet -from frappe.model.document import Document -from frappe.utils import strip from PIL import Image, ImageFile, ImageOps -from six import StringIO, string_types -from six.moves.urllib.parse import unquote, quote -from six import text_type, PY2 -import zipfile +from six import PY2, StringIO, string_types, text_type +from six.moves.urllib.parse import quote, unquote + +import frappe +from frappe import _, conf +from frappe.model.document import Document +from frappe.utils import call_hook_method, cint, cstr, encode, get_files_path, get_hook_method, random_string, strip +from frappe.utils.nestedset import NestedSet + class MaxFileSizeReachedError(frappe.ValidationError): pass - class FolderNotEmpty(frappe.ValidationError): pass From a55589ec8dc05686e9f4f1965318fe2f325d7ccd Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 24 Apr 2020 13:06:02 +0530 Subject: [PATCH 078/103] chore: remove unused imports --- frappe/core/doctype/file/file.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index 252aeb0d10..70cdd6a000 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -30,7 +30,6 @@ import frappe from frappe import _, conf from frappe.model.document import Document from frappe.utils import call_hook_method, cint, cstr, encode, get_files_path, get_hook_method, random_string, strip -from frappe.utils.nestedset import NestedSet class MaxFileSizeReachedError(frappe.ValidationError): 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 079/103] 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 b9baa63cfda84d69cea978b71cffbaf48cb9d3cc Mon Sep 17 00:00:00 2001 From: prssanna Date: Fri, 24 Apr 2020 13:44:37 +0530 Subject: [PATCH 080/103] fix: fix file permissions Co-authored-by: Suraj Shetty --- 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 1dfd194b2e0b714639c27eb7aaf2065fd3a00b99 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 24 Apr 2020 14:09:41 +0530 Subject: [PATCH 081/103] fix: remove unused red indicator from the legend --- frappe/public/js/frappe/views/desktop/desktop.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/frappe/public/js/frappe/views/desktop/desktop.js b/frappe/public/js/frappe/views/desktop/desktop.js index 9f0df6e172..d71d390d20 100644 --- a/frappe/public/js/frappe/views/desktop/desktop.js +++ b/frappe/public/js/frappe/views/desktop/desktop.js @@ -344,10 +344,6 @@ class DesktopPage { { color: "orange", description: __("No Records Created") - }, - { - color: "red", - description: __("Has Open Entries") } ].map(item => { return `
From 99f818d9fe6a34f87063f1c6b9e2e2725b3cd9e2 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 20 Apr 2020 23:52:10 +0530 Subject: [PATCH 082/103] added donut option in the chart option type --- frappe/desk/doctype/dashboard_chart/dashboard_chart.json | 4 ++-- frappe/public/js/frappe/views/reports/query_report.js | 1 - frappe/public/js/frappe/widgets/chart_widget.js | 3 ++- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.json b/frappe/desk/doctype/dashboard_chart/dashboard_chart.json index 6f037baec3..cd32292783 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.json +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.json @@ -125,7 +125,7 @@ "fieldname": "type", "fieldtype": "Select", "label": "Type", - "options": "Line\nBar\nPercentage\nPie", + "options": "Line\nBar\nPercentage\nPie\nDonut", "reqd": 1 }, { @@ -223,7 +223,7 @@ } ], "links": [], - "modified": "2020-04-16 03:15:51.455196", + "modified": "2020-04-20 23:49:11.389909", "modified_by": "Administrator", "module": "Desk", "name": "Dashboard Chart", diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index 9c04f6e879..3a236b47f4 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -224,7 +224,6 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { ); } - debugger frappe.xcall( 'frappe.desk.doctype.dashboard_chart.dashboard_chart.create_report_chart', {args: args} diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js index bf19d813d6..313b0ea293 100644 --- a/frappe/public/js/frappe/widgets/chart_widget.js +++ b/frappe/public/js/frappe/widgets/chart_widget.js @@ -457,7 +457,8 @@ export default class ChartWidget extends Widget { Line: "line", Bar: "bar", Percentage: "percentage", - Pie: "pie" + Pie: "pie", + Donut: "donut" }; let colors = []; From 46d35308fe67e7954d2f8486a53255ca0b01a709 Mon Sep 17 00:00:00 2001 From: Rohan Verma Date: Fri, 24 Apr 2020 18:11:27 +0530 Subject: [PATCH 083/103] feat: add support for golang mode in ace-editor Closes #10088 10088 --- frappe/public/js/frappe/form/controls/code.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/controls/code.js b/frappe/public/js/frappe/form/controls/code.js index bdf36b706a..4f2c9bad27 100644 --- a/frappe/public/js/frappe/form/controls/code.js +++ b/frappe/public/js/frappe/form/controls/code.js @@ -45,7 +45,9 @@ frappe.ui.form.ControlCode = frappe.ui.form.ControlText.extend({ 'CSS': 'ace/mode/css', 'Markdown': 'ace/mode/markdown', 'SCSS': 'ace/mode/scss', - 'JSON': 'ace/mode/json' + 'JSON': 'ace/mode/json', + 'Golang': 'ace/mode/golang', + 'Go': 'ace/mode/golang' }; const language = this.df.options; From 8600e4e1507efe88399b3e036e739326103a2dee Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 22 Apr 2020 15:28:21 +0530 Subject: [PATCH 084/103] fix: added test case for default user permission --- .../user_permission/test_user_permission.py | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/frappe/core/doctype/user_permission/test_user_permission.py b/frappe/core/doctype/user_permission/test_user_permission.py index 870d3c7029..5ccc8752cf 100644 --- a/frappe/core/doctype/user_permission/test_user_permission.py +++ b/frappe/core/doctype/user_permission/test_user_permission.py @@ -9,7 +9,8 @@ import unittest class TestUserPermission(unittest.TestCase): def setUp(self): - frappe.db.sql("DELETE FROM `tabUser Permission` WHERE `user`='test_bulk_creation_update@example.com'") + frappe.db.sql("""DELETE FROM `tabUser Permission` + WHERE `user` in ('test_bulk_creation_update@example.com', 'test_user_perm1@example.com')""") def test_default_user_permission_validation(self): user = create_user('test_default_permission@example.com') @@ -20,6 +21,26 @@ class TestUserPermission(unittest.TestCase): param = get_params(user, 'User', perm_user.name, is_default=1) self.assertRaises(frappe.ValidationError, add_user_permissions, param) + def test_default_user_permission(self): + frappe.set_user('Administrator') + user = create_user('test_user_perm1@example.com', 'Website Manager') + for category in ['general', 'public']: + if not frappe.db.exists('Blog Category', category): + frappe.get_doc({'doctype': 'Blog Category', + 'category_name': category, 'title': category}).insert() + + param = get_params(user, 'Blog Category', 'general', is_default=1) + add_user_permissions(param) + + param = get_params(user, 'Blog Category', 'public') + add_user_permissions(param) + + frappe.set_user('test_user_perm1@example.com') + doc = frappe.new_doc("Blog Post") + + self.assertEquals(doc.blog_category, 'general') + frappe.set_user('Administrator') + def test_apply_to_all(self): ''' Create User permission for User having access to all applicable Doctypes''' user = create_user('test_bulk_creation_update@example.com') @@ -88,7 +109,7 @@ class TestUserPermission(unittest.TestCase): self.assertIsNone(removed_applicable_second) self.assertEquals(is_created, 1) -def create_user(email): +def create_user(email, role="System Manager"): ''' create user with role system manager ''' if frappe.db.exists('User', email): return frappe.get_doc('User', email) @@ -96,7 +117,7 @@ def create_user(email): user = frappe.new_doc('User') user.email = email user.first_name = email.split("@")[0] - user.add_roles("System Manager") + user.add_roles(role) return user def get_params(user, doctype, docname, is_default=0, applicable=None): From e0d9cf50df83a0fe265aedea7920ca0a29f673f8 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 24 Apr 2020 18:32:03 +0530 Subject: [PATCH 085/103] 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 @@