diff --git a/frappe/__init__.py b/frappe/__init__.py index 63dc00c6c8..bb1315091c 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() 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) { 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') 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 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/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 887494932e..4bef5aceb7 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) diff --git a/frappe/utils/global_search.py b/frappe/utils/global_search.py index ea76247300..f9a07e3212 100644 --- a/frappe/utils/global_search.py +++ b/frappe/utils/global_search.py @@ -307,9 +307,11 @@ 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) + 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 Exception: + frappe.clear_messages() return results