From c0f674f5e52b62c924e28bb76320ca47e37e92e3 Mon Sep 17 00:00:00 2001 From: Achilles Rasquinha Date: Thu, 8 Mar 2018 11:49:31 +0530 Subject: [PATCH 1/4] cmp alternative --- frappe/contacts/doctype/contact/contact.py | 1 + frappe/core/page/desktop/desktop.py | 1 + frappe/website/utils.py | 1 + 3 files changed, 3 insertions(+) diff --git a/frappe/contacts/doctype/contact/contact.py b/frappe/contacts/doctype/contact/contact.py index 3e8bcf78a0..e168720553 100644 --- a/frappe/contacts/doctype/contact/contact.py +++ b/frappe/contacts/doctype/contact/contact.py @@ -8,6 +8,7 @@ from frappe import _ from frappe.model.document import Document from frappe.core.doctype.dynamic_link.dynamic_link import deduplicate_dynamic_links from six import iteritems +from past.builtins import cmp import functools diff --git a/frappe/core/page/desktop/desktop.py b/frappe/core/page/desktop/desktop.py index 2824fb7e9b..f426a67979 100644 --- a/frappe/core/page/desktop/desktop.py +++ b/frappe/core/page/desktop/desktop.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals import functools import frappe +from past.builtins import cmp @frappe.whitelist() def get_help_messages(): diff --git a/frappe/website/utils.py b/frappe/website/utils.py index b784a0ea3d..d330e97488 100644 --- a/frappe/website/utils.py +++ b/frappe/website/utils.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import functools import frappe, re, os from six import iteritems +from past.builtins import cmp def delete_page_cache(path): cache = frappe.cache() From 0c50800c408bef1cf4d65a247b04e45de60b5851 Mon Sep 17 00:00:00 2001 From: Mohd200 <32062135+Mohd200@users.noreply.github.com> Date: Thu, 8 Mar 2018 09:31:31 +0300 Subject: [PATCH 2/4] make password translatable (#5132) --- frappe/templates/emails/password_reset.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/templates/emails/password_reset.html b/frappe/templates/emails/password_reset.html index 5ddacb2652..d9e38e38f2 100644 --- a/frappe/templates/emails/password_reset.html +++ b/frappe/templates/emails/password_reset.html @@ -1,7 +1,7 @@

{{_("Dear")}} {{ first_name }}{% if last_name %} {{ last_name}}{% endif %},

{{_("Please click on the following link to set your new password")}}:

-

Reset your password

+

{{_("Reset your password")}}

{{_("Thank you")}},
{{ user_fullname }} -

\ No newline at end of file +

From f98d782055f44bd7d32311edbe41b4c73c2c39cd Mon Sep 17 00:00:00 2001 From: Revant Nandgaonkar Date: Thu, 8 Mar 2018 12:02:33 +0530 Subject: [PATCH 3/4] Oauth2 tests (#5128) * oauth2 test for openid profile * OAuth 2 Test : revoke token --- frappe/tests/ui/test_oauth20.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/frappe/tests/ui/test_oauth20.py b/frappe/tests/ui/test_oauth20.py index 1cc864416e..d21aba2efd 100644 --- a/frappe/tests/ui/test_oauth20.py +++ b/frappe/tests/ui/test_oauth20.py @@ -23,6 +23,9 @@ class TestOAuth20(unittest.TestCase): frappe_login_key.base_url = "http://localhost:8000" frappe_login_key.save() + def test_invalid_login(self): + self.assertFalse(check_valid_openid_response()) + def test_login_using_authorization_code(self): # Go to Authorize url @@ -75,6 +78,15 @@ class TestOAuth20(unittest.TestCase): self.assertTrue(bearer_token.get("refresh_token")) self.assertTrue(bearer_token.get("scope")) self.assertTrue(bearer_token.get("token_type") == "Bearer") + self.assertTrue(check_valid_openid_response(bearer_token.get("access_token"))) + + # Revoke Token + revoke_token_response = requests.post(frappe.get_site_config().host_name + "/api/method/frappe.integrations.oauth2.revoke_token", + data="token=" + bearer_token.get("access_token")) + self.assertTrue(revoke_token_response.status_code == 200) + + # Check revoked token + self.assertFalse(check_valid_openid_response(bearer_token.get("access_token"))) def test_login_using_implicit_token(self): @@ -118,6 +130,21 @@ class TestOAuth20(unittest.TestCase): self.assertTrue(response_url.get("expires_in")) self.assertTrue(response_url.get("scope")) self.assertTrue(response_url.get("token_type")) + self.assertTrue(check_valid_openid_response(response_url.get("access_token"))) def tearDown(self): self.driver.close() + +def check_valid_openid_response(access_token=None): + # Returns True for valid response + + # Use token in header + headers = {} + if access_token: + headers["Authorization"] = 'Bearer' + access_token + + # check openid for email test@example.com + openid_response = requests.get(frappe.get_site_config().host_name + + "/api/method/frappe.integrations.oauth2.openid_profile", headers=headers) + + return True if openid_response.status_code == 200 else False From 2db30659088b15bf4893639e0f51be2c93ecb3a9 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 8 Mar 2018 14:19:54 +0530 Subject: [PATCH 4/4] Listview fixes (#5136) - Remove freeze - Save user_settings only if changed --- frappe/public/js/frappe/list/base_list.js | 2 +- frappe/public/js/frappe/list/list_view.js | 28 +++++++++++++++---- .../public/js/frappe/model/user_settings.js | 19 +++++++++---- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/frappe/public/js/frappe/list/base_list.js b/frappe/public/js/frappe/list/base_list.js index 6fc487f03f..a924522052 100644 --- a/frappe/public/js/frappe/list/base_list.js +++ b/frappe/public/js/frappe/list/base_list.js @@ -335,11 +335,11 @@ frappe.views.BaseList = class BaseList { freeze_message: this.freeze_message || (__('Loading') + '...') }).then(r => { // render - this.freeze(false); this.prepare_data(r); this.toggle_result_area(); this.before_render(); this.render(); + this.freeze(false); }); } diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 704d134c0c..2e017e80da 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -61,7 +61,6 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { // build menu items this.menu_items = this.menu_items.concat(this.get_menu_items()); - this.freeze_on_refresh = true; this.actions_menu_items = this.get_actions_menu_items(); this.patch_refresh_and_load_lib(); @@ -150,6 +149,13 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { this.settings.onload && this.settings.onload(this); } + setup_freeze_area() { + this.$freeze = + $(`
${__('Loading')}...
`) + .hide(); + this.$result.append(this.$freeze); + } + setup_footnote_area() { const match_rules_list = frappe.perm.get_match_rules(this.doctype); @@ -227,6 +233,12 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { `; } + freeze(show) { + this.$result.find('.list-header-meta').html(__('Refreshing') + '...'); + this.$result.find('.checkbox-actions').toggle(show); + this.$result.find('.list-header-subject').toggle(!show); + } + get_args() { const args = super.get_args(); @@ -263,11 +275,15 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { render() { if (this.data.length > 0) { - const html = ` - ${this.get_header_html()} - ${this.data.map(doc => this.get_list_row_html(doc)).join('')} - `; - this.$result.html(html); + this.$result.find('.list-row-container').remove(); + if (this.$result.find('.list-row-head').length === 0) { + // append header once + this.$result.prepend(this.get_header_html()); + } + // append rows + this.$result.append( + this.data.map(doc => this.get_list_row_html(doc)).join('') + ); } this.render_count(); this.render_tags(); diff --git a/frappe/public/js/frappe/model/user_settings.js b/frappe/public/js/frappe/model/user_settings.js index 932b6a359c..30bd98008d 100644 --- a/frappe/public/js/frappe/model/user_settings.js +++ b/frappe/public/js/frappe/model/user_settings.js @@ -6,16 +6,23 @@ $.extend(frappe.model.user_settings, { .then(r => JSON.parse(r.message || '{}')); }, save: function(doctype, key, value) { - var user_settings = frappe.model.user_settings[doctype] || {}; + const old_user_settings = frappe.model.user_settings[doctype] || {}; + const new_user_settings = $.extend(true, {}, old_user_settings); // deep copy if ($.isPlainObject(value)) { - user_settings[key] = user_settings[key] || {}; - $.extend(user_settings[key], value); + new_user_settings[key] = new_user_settings[key] || {}; + $.extend(new_user_settings[key], value); } else { - user_settings[key] = value; + new_user_settings[key] = value; } - return this.update(doctype, user_settings); + const a = JSON.stringify(old_user_settings); + const b = JSON.stringify(new_user_settings); + if (a !== b) { + // update if changed + return this.update(doctype, new_user_settings); + } + return Promise.resolve(); }, remove: function(doctype, key) { var user_settings = frappe.model.user_settings[doctype] || {}; @@ -33,7 +40,7 @@ $.extend(frappe.model.user_settings, { callback: function(r) { frappe.model.user_settings[doctype] = r.message; } - }) + }); } });