From 0aaaca9b1a8b5ab5ac9d6b9ce43fa4b3176cd3ce Mon Sep 17 00:00:00 2001 From: pratu16x7 Date: Thu, 7 Sep 2017 16:02:25 +0530 Subject: [PATCH 1/9] [fix] ignore results with non-existent doctypes --- frappe/patches.txt | 1 + frappe/patches/v8_10/__init__.py | 0 .../delete_static_web_page_from_global_search.py | 5 +++++ frappe/utils/global_search.py | 11 ++++++++--- 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 frappe/patches/v8_10/__init__.py create mode 100644 frappe/patches/v8_10/delete_static_web_page_from_global_search.py diff --git a/frappe/patches.txt b/frappe/patches.txt index ce0a749126..28bc5cb574 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -192,3 +192,4 @@ frappe.patches.v8_5.delete_email_group_member_with_invalid_emails frappe.patches.v8_x.update_user_permission frappe.patches.v8_5.patch_event_colors frappe.patches.v8_7.update_email_queue_status +frappe.patches.v8_10.delete_static_web_page_from_global_search diff --git a/frappe/patches/v8_10/__init__.py b/frappe/patches/v8_10/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/patches/v8_10/delete_static_web_page_from_global_search.py b/frappe/patches/v8_10/delete_static_web_page_from_global_search.py new file mode 100644 index 0000000000..336562c157 --- /dev/null +++ b/frappe/patches/v8_10/delete_static_web_page_from_global_search.py @@ -0,0 +1,5 @@ +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.db.sql("""delete from `__global_search` where doctype='Static Web Page'"""); \ No newline at end of file diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index ea76247300..f2ba1069ce 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -307,9 +307,14 @@ def search(text, start=0, limit=20, doctype=""): limit {start}, {limit}'''.format(start=start, limit=limit), (doctype, text), as_dict=True) for r in results: - if frappe.get_meta(r.doctype).image_field: - doc = frappe.get_doc(r.doctype, r.name) - r.image = doc.get(doc.meta.image_field) + if not frappe.db.exists("Doctype", r.doctype): + continue + try: + if frappe.get_meta(r.doctype).image_field: + doc = frappe.get_doc(r.doctype, r.name) + r.image = doc.get(doc.meta.image_field) + except: + pass return results From 1a3d0bb4590ac1461a90d71d2963344e0d9aad23 Mon Sep 17 00:00:00 2001 From: pratu16x7 Date: Fri, 8 Sep 2017 06:39:18 +0530 Subject: [PATCH 2/9] [fix] clear messages on exception --- frappe/utils/global_search.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index f2ba1069ce..fa7c464831 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -307,13 +307,12 @@ def search(text, start=0, limit=20, doctype=""): limit {start}, {limit}'''.format(start=start, limit=limit), (doctype, text), as_dict=True) for r in results: - if not frappe.db.exists("Doctype", r.doctype): - continue try: if frappe.get_meta(r.doctype).image_field: doc = frappe.get_doc(r.doctype, r.name) r.image = doc.get(doc.meta.image_field) except: + frappe.clear_messages() pass return results From f66cfcece5fe4e68cc624fa04231cddf9791161c Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 8 Sep 2017 09:06:32 +0530 Subject: [PATCH 3/9] Update global_search.py --- frappe/utils/global_search.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index fa7c464831..35e9d40758 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -309,8 +309,7 @@ def search(text, start=0, limit=20, doctype=""): for r in results: try: if frappe.get_meta(r.doctype).image_field: - doc = frappe.get_doc(r.doctype, r.name) - r.image = doc.get(doc.meta.image_field) + r.image = frappe.db.get_value(r.doctype, r.name, frappe.get_meta(r.doctype).image_field) except: frappe.clear_messages() pass From 9cee53c33f12ea2856bc009b98b7a5e388fdcc24 Mon Sep 17 00:00:00 2001 From: pratu16x7 Date: Fri, 8 Sep 2017 16:03:51 +0530 Subject: [PATCH 4/9] [fix] specify exception --- frappe/utils/global_search.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index 35e9d40758..f9a07e3212 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -310,9 +310,8 @@ def search(text, start=0, limit=20, doctype=""): try: if frappe.get_meta(r.doctype).image_field: r.image = frappe.db.get_value(r.doctype, r.name, frappe.get_meta(r.doctype).image_field) - except: + except Exception: frappe.clear_messages() - pass return results From 90ebd643a7990eac92d3d571b86c9472aa41f642 Mon Sep 17 00:00:00 2001 From: mbauskar Date: Sat, 9 Sep 2017 22:43:48 +0530 Subject: [PATCH 5/9] [hotfix] minor fixes for text editor, report print and 2fa --- frappe/public/js/frappe/form/controls/text_editor.js | 3 ++- frappe/public/js/frappe/views/reports/print_grid.html | 2 +- frappe/tests/test_twofactor.py | 2 +- frappe/twofactor.py | 3 +++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/text_editor.js b/frappe/public/js/frappe/form/controls/text_editor.js index a249a9c0ea..1110fee7fc 100644 --- a/frappe/public/js/frappe/form/controls/text_editor.js +++ b/frappe/public/js/frappe/form/controls/text_editor.js @@ -46,7 +46,8 @@ frappe.ui.form.ControlTextEditor = frappe.ui.form.ControlCode.extend({ // this function is executed only once $(".note-editable[contenteditable='true']").one('focus', function() { var $this = $(this); - $this.html($this.html() + '
'); + if(!$this.html()) + $this.html($this.html() + '
'); }); }, onChange: function(value) { diff --git a/frappe/public/js/frappe/views/reports/print_grid.html b/frappe/public/js/frappe/views/reports/print_grid.html index daae4fd030..e30f01458d 100644 --- a/frappe/public/js/frappe/views/reports/print_grid.html +++ b/frappe/public/js/frappe/views/reports/print_grid.html @@ -24,7 +24,7 @@ {% for col in columns %} {% if col.name && col._id !== "_check" %} - {% var value = col.fieldname ? row[col.fieldname] : row[col.id]; %} + {% var value = col.fieldname ? row[col.fieldname] : row[col.field]; %} {{ col.formatter ? col.formatter(row._index, col._index, value, col, row, true) diff --git a/frappe/tests/test_twofactor.py b/frappe/tests/test_twofactor.py index e993b2d517..bb1417ddd9 100644 --- a/frappe/tests/test_twofactor.py +++ b/frappe/tests/test_twofactor.py @@ -51,6 +51,7 @@ class TestTwoFactor(unittest.TestCase): '''Should return true if enabled for user.''' toggle_2fa_all_role(state=True) self.assertTrue(two_factor_is_enabled_for_(self.user)) + self.assertFalse(two_factor_is_enabled_for_("Administrator")) toggle_2fa_all_role(state=False) self.assertFalse(two_factor_is_enabled_for_(self.user)) @@ -87,7 +88,6 @@ class TestTwoFactor(unittest.TestCase): _str = render_string_template(_str,args) self.assertEqual(_str,'Verification Code from Frappe Technologies') - def set_request(**kwargs): builder = EnvironBuilder(**kwargs) frappe.local.request = Request(builder.get_environ()) diff --git a/frappe/twofactor.py b/frappe/twofactor.py index 17eddf7bfb..0e564bca5a 100644 --- a/frappe/twofactor.py +++ b/frappe/twofactor.py @@ -74,6 +74,9 @@ def cache_2fa_data(user, token, otp_secret, tmp_id): def two_factor_is_enabled_for_(user): '''Check if 2factor is enabled for user.''' + if user == "Administrator": + return False + if isinstance(user, string_types): user = frappe.get_doc('User', user) From 18cd78e7d71f3f2df361451650615fe693217191 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 11 Sep 2017 16:16:27 +0530 Subject: [PATCH 6/9] Fixed encoding issue on exporting report in csv --- frappe/desk/reportview.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/desk/reportview.py b/frappe/desk/reportview.py index 1ae010fd8e..cacfa25e9a 100644 --- a/frappe/desk/reportview.py +++ b/frappe/desk/reportview.py @@ -152,8 +152,8 @@ def export_query(): writer = csv.writer(f) for r in data: # encode only unicode type strings and not int, floats etc. - writer.writerow(map(lambda v: isinstance(v, string_types) and - handle_html(frappe.as_unicode(v)) or v, r)) + writer.writerow([handle_html(frappe.as_unicode(v)).encode('utf-8') \ + if isinstance(v, string_types) else v for v in r]) f.seek(0) frappe.response['result'] = text_type(f.read(), 'utf-8') From e9eb5c4021f5fe9977f2299eead99167435f779c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 11 Sep 2017 19:22:58 +0530 Subject: [PATCH 7/9] Changed order to avoid deadlock --- frappe/model/delete_doc.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py index 1f0d894f97..f528a4103c 100644 --- a/frappe/model/delete_doc.py +++ b/frappe/model/delete_doc.py @@ -244,6 +244,14 @@ def delete_dynamic_links(doctype, name): frappe.db.sql('''delete from `tabEmail Unsubscribe` where reference_doctype=%s and reference_name=%s''', (doctype, name)) + # delete shares + delete_doc("DocShare", frappe.db.sql_list("""select name from `tabDocShare` + where share_doctype=%s and share_name=%s""", (doctype, name)), + ignore_on_trash=True, force=True) + + # delete versions + frappe.db.sql('delete from tabVersion where ref_doctype=%s and docname=%s', (doctype, name)) + # delete comments frappe.db.sql("""delete from `tabCommunication` where @@ -268,14 +276,6 @@ def delete_dynamic_links(doctype, name): set timeline_doctype=null, timeline_name=null where timeline_doctype=%s and timeline_name=%s""", (doctype, name)) - # delete shares - delete_doc("DocShare", frappe.db.sql_list("""select name from `tabDocShare` - where share_doctype=%s and share_name=%s""", (doctype, name)), - ignore_on_trash=True, force=True) - - # delete versions - frappe.db.sql('delete from tabVersion where ref_doctype=%s and docname=%s', (doctype, name)) - def insert_feed(doc): from frappe.utils import get_fullname From bd5d7717e7ce221b426c3f31e8b3dd23858a3e5d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 12 Sep 2017 15:46:41 +0530 Subject: [PATCH 8/9] Disable custom checkbox for doctype if not administrator or in developer mode (#4092) --- frappe/core/doctype/doctype/doctype.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.js b/frappe/core/doctype/doctype/doctype.js index c44fff15d5..0374026855 100644 --- a/frappe/core/doctype/doctype/doctype.js +++ b/frappe/core/doctype/doctype/doctype.js @@ -13,9 +13,12 @@ frappe.ui.form.on('DocType', { refresh: function(frm) { - if(frm.is_new() && (frappe.session.user !== "Administrator" || !frappe.boot.developer_mode)) { - frm.set_value("custom", 1); + if(frappe.session.user !== "Administrator" || !frappe.boot.developer_mode) { + if(frm.is_new()) { + frm.set_value("custom", 1); + } frm.toggle_enable("custom", 0); + frm.toggle_enable("beta", 0); } if(!frappe.boot.developer_mode && !frm.doc.custom) { From 6052800e15e146f4a8f30c0340831fcf6e47c39e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 12 Sep 2017 16:39:18 +0600 Subject: [PATCH 9/9] bumped to version 8.10.5 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 54cbe6bb31..5c28381025 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template -__version__ = '8.10.4' +__version__ = '8.10.5' __title__ = "Frappe Framework" local = Local()