From 236fa87051a310ceae3020bd734eddd0772cb1a0 Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Wed, 23 Jan 2019 16:47:16 +0530 Subject: [PATCH 1/5] fix(comment): Encoding issue in jinja for mention in comment (#6813) --- frappe/core/doctype/communication/comment.py | 6 ++++-- frappe/templates/emails/mentioned_in_comment.html | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/frappe/core/doctype/communication/comment.py b/frappe/core/doctype/communication/comment.py index 0ceb93219c..fa3a7b2dcc 100644 --- a/frappe/core/doctype/communication/comment.py +++ b/frappe/core/doctype/communication/comment.py @@ -96,15 +96,17 @@ def notify_mentions(doc): recipients = [frappe.db.get_value("User", {"enabled": 1, "name": name, "user_type": "System User"}, "email") for name in mentions] + link = get_link_to_form(doc.reference_doctype, doc.reference_name, label=parent_doc_label) + frappe.sendmail( recipients=recipients, sender=frappe.session.user, subject=subject, template="mentioned_in_comment", args={ - "sender_fullname": sender_fullname, + "body_content": _("{0} mentioned you in a comment in {1}").format(sender_fullname, link), "comment": doc, - "link": get_link_to_form(doc.reference_doctype, doc.reference_name, label=parent_doc_label) + "link": link }, header=[_('New Mention'), 'orange'] ) diff --git a/frappe/templates/emails/mentioned_in_comment.html b/frappe/templates/emails/mentioned_in_comment.html index becf1dfd25..92bf15723a 100644 --- a/frappe/templates/emails/mentioned_in_comment.html +++ b/frappe/templates/emails/mentioned_in_comment.html @@ -1,5 +1,5 @@

- {{ _("{0} mentioned you in a comment in {1}").format(sender_fullname, link) }} + {{ body_content }}

From 94d048967414f66c0798e45b412cebb3082a4bc0 Mon Sep 17 00:00:00 2001 From: Zarrar Date: Fri, 25 Jan 2019 11:21:10 +0530 Subject: [PATCH 2/5] fix: Customize Form and Custom DocType related fixes (#6645) * display Customize option in menu bar only for standard DocType * disallow opening of custom doctype in Customize Form * make fields dependent on is_submittable property visible for child table * throw message that custom fields can only be added to standard doctype * set query similar to the one in Customize Form for DocType selection * only hide customize option [fix] * add core doctypes list in model and use it from there * avoid editing of core doctype from Customize Form or Custom Field * test case updated and additional test for core doctypes added * codacy fix --- .../doctype/custom_field/custom_field.js | 23 +++-- .../doctype/custom_field/custom_field.py | 9 ++ .../doctype/customize_form/customize_form.js | 14 ++-- .../doctype/customize_form/customize_form.py | 8 +- .../customize_form/test_customize_form.py | 83 ++++++++++--------- frappe/model/__init__.py | 3 + frappe/public/js/frappe/form/layout.js | 3 + frappe/public/js/frappe/list/list_view.js | 12 +-- frappe/public/js/frappe/model/model.js | 4 + 9 files changed, 103 insertions(+), 56 deletions(-) diff --git a/frappe/custom/doctype/custom_field/custom_field.js b/frappe/custom/doctype/custom_field/custom_field.js index c430d12752..c59fabeaa6 100644 --- a/frappe/custom/doctype/custom_field/custom_field.js +++ b/frappe/custom/doctype/custom_field/custom_field.js @@ -9,6 +9,9 @@ frappe.ui.form.on('Custom Field', { frm.set_query('dt', function(doc) { var filters = [ ['DocType', 'issingle', '=', 0], + ['DocType', 'custom', '=', 0], + ['DocType', 'name', 'not in', frappe.model.core_doctypes_list], + ['DocType', 'restrict_to_domain', 'in', frappe.boot.active_domains] ]; if(frappe.session.user!=="Administrator") { filters.push(['DocType', 'module', 'not in', ['Core', 'Custom']]) @@ -32,15 +35,21 @@ frappe.ui.form.on('Custom Field', { return frappe.call({ method: 'frappe.custom.doctype.custom_field.custom_field.get_fields_label', args: { doctype: frm.doc.dt, fieldname: frm.doc.fieldname }, - callback: function(r, rt) { - set_field_options('insert_after', r.message); - var fieldnames = $.map(r.message, function(v) { return v.value; }); + callback: function(r) { + if(r) { + if(r._server_messages && r._server_messages.length) { + frm.set_value("dt", ""); + } else { + set_field_options('insert_after', r.message); + var fieldnames = $.map(r.message, function(v) { return v.value; }); - if(insert_after==null || !in_list(fieldnames, insert_after)) { - insert_after = fieldnames[-1]; + if(insert_after==null || !in_list(fieldnames, insert_after)) { + insert_after = fieldnames[-1]; + } + + frm.set_value('insert_after', insert_after); + } } - - frm.set_value('insert_after', insert_after); } }); diff --git a/frappe/custom/doctype/custom_field/custom_field.py b/frappe/custom/doctype/custom_field/custom_field.py index dbab4eadcb..35ec34fc12 100644 --- a/frappe/custom/doctype/custom_field/custom_field.py +++ b/frappe/custom/doctype/custom_field/custom_field.py @@ -7,6 +7,7 @@ import json from frappe.utils import cstr from frappe import _ from frappe.model.document import Document +from frappe.model import core_doctypes_list class CustomField(Document): def autoname(self): @@ -82,6 +83,14 @@ class CustomField(Document): @frappe.whitelist() def get_fields_label(doctype=None): + meta = frappe.get_meta(doctype) + + if doctype in core_doctypes_list: + return frappe.msgprint(_("Custom Fields cannot be added to core DocTypes.")) + + if meta.custom: + return frappe.msgprint(_("Custom Fields can only be added to a standard DocType.")) + return [{"value": df.fieldname or "", "label": _(df.label or "")} for df in frappe.get_meta(doctype).get("fields")] diff --git a/frappe/custom/doctype/customize_form/customize_form.js b/frappe/custom/doctype/customize_form/customize_form.js index 227c6de1ee..125db507ea 100644 --- a/frappe/custom/doctype/customize_form/customize_form.js +++ b/frappe/custom/doctype/customize_form/customize_form.js @@ -13,9 +13,7 @@ frappe.ui.form.on("Customize Form", { filters: [ ['DocType', 'issingle', '=', 0], ['DocType', 'custom', '=', 0], - ['DocType', 'name', 'not in', 'DocType, DocField, DocPerm, User, Role, Has Role, \ - Page, Has Role, Module Def, Print Format, Report, Customize Form, \ - Customize Form Field, Property Setter, Custom Field, Custom Script'], + ['DocType', 'name', 'not in', frappe.model.core_doctypes_list], ['DocType', 'restrict_to_domain', 'in', frappe.boot.active_domains] ] }; @@ -39,8 +37,14 @@ frappe.ui.form.on("Customize Form", { doc: frm.doc, freeze: true, callback: function(r) { - frm.refresh(); - frm.trigger("setup_sortable"); + if(r) { + if(r._server_messages && r._server_messages.length) { + frm.set_value("doc_type", ""); + } else { + frm.refresh(); + frm.trigger("setup_sortable"); + } + } } }); } else { diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py index abcccd1070..1c05cc7253 100644 --- a/frappe/custom/doctype/customize_form/customize_form.py +++ b/frappe/custom/doctype/customize_form/customize_form.py @@ -11,7 +11,7 @@ import frappe.translate from frappe import _ from frappe.utils import cint from frappe.model.document import Document -from frappe.model import no_value_fields +from frappe.model import no_value_fields, core_doctypes_list from frappe.core.doctype.doctype.doctype import validate_fields_for_doctype doctype_properties = { @@ -82,6 +82,12 @@ class CustomizeForm(Document): meta = frappe.get_meta(self.doc_type) + if self.doc_type in core_doctypes_list: + return frappe.msgprint(_("Core DocTypes cannot be customized.")) + + if meta.custom: + return frappe.msgprint(_("Only standard DocTypes are allowed to be customized from Customize Form.")) + # doctype properties for property in doctype_properties: self.set(property, meta.get(property)) diff --git a/frappe/custom/doctype/customize_form/test_customize_form.py b/frappe/custom/doctype/customize_form/test_customize_form.py index 87f0a6324f..763b9cd5a0 100644 --- a/frappe/custom/doctype/customize_form/test_customize_form.py +++ b/frappe/custom/doctype/customize_form/test_customize_form.py @@ -9,28 +9,28 @@ from frappe.core.doctype.doctype.doctype import InvalidFieldNameError test_dependencies = ["Custom Field", "Property Setter"] class TestCustomizeForm(unittest.TestCase): def insert_custom_field(self): - frappe.delete_doc_if_exists("Custom Field", "User-test_custom_field") + frappe.delete_doc_if_exists("Custom Field", "Event-test_custom_field") frappe.get_doc({ "doctype": "Custom Field", - "dt": "User", + "dt": "Event", "label": "Test Custom Field", "description": "A Custom Field for Testing", "fieldtype": "Select", "in_list_view": 1, "options": "\nCustom 1\nCustom 2\nCustom 3", "default": "Custom 3", - "insert_after": frappe.get_meta('User').fields[-1].fieldname + "insert_after": frappe.get_meta('Event').fields[-1].fieldname }).insert() def setUp(self): self.insert_custom_field() frappe.db.commit() - frappe.clear_cache(doctype="User") + frappe.clear_cache(doctype="Event") def tearDown(self): - frappe.delete_doc("Custom Field", "User-test_custom_field") + frappe.delete_doc("Custom Field", "Event-test_custom_field") frappe.db.commit() - frappe.clear_cache(doctype="User") + frappe.clear_cache(doctype="Event") def get_customize_form(self, doctype=None): d = frappe.get_doc("Customize Form") @@ -46,66 +46,66 @@ class TestCustomizeForm(unittest.TestCase): d = self.get_customize_form("Event") self.assertEquals(d.doc_type, "Event") - self.assertEquals(len(d.get("fields")), 29) + self.assertEquals(len(d.get("fields")), 30) - d = self.get_customize_form("User") - self.assertEquals(d.doc_type, "User") + d = self.get_customize_form("Event") + self.assertEquals(d.doc_type, "Event") self.assertEquals(len(d.get("fields")), len(frappe.get_doc("DocType", d.doc_type).fields) + 1) self.assertEquals(d.get("fields")[-1].fieldname, "test_custom_field") - self.assertEquals(d.get("fields", {"fieldname": "location"})[0].in_list_view, 1) + self.assertEquals(d.get("fields", {"fieldname": "event_type"})[0].in_list_view, 1) return d def test_save_customization_property(self): - d = self.get_customize_form("User") + d = self.get_customize_form("Event") self.assertEquals(frappe.db.get_value("Property Setter", - {"doc_type": "User", "property": "allow_copy"}, "value"), None) + {"doc_type": "Event", "property": "allow_copy"}, "value"), None) d.allow_copy = 1 d.run_method("save_customization") self.assertEquals(frappe.db.get_value("Property Setter", - {"doc_type": "User", "property": "allow_copy"}, "value"), '1') + {"doc_type": "Event", "property": "allow_copy"}, "value"), '1') d.allow_copy = 0 d.run_method("save_customization") self.assertEquals(frappe.db.get_value("Property Setter", - {"doc_type": "User", "property": "allow_copy"}, "value"), None) + {"doc_type": "Event", "property": "allow_copy"}, "value"), None) def test_save_customization_field_property(self): - d = self.get_customize_form("User") + d = self.get_customize_form("Event") self.assertEquals(frappe.db.get_value("Property Setter", - {"doc_type": "User", "property": "reqd", "field_name": "location"}, "value"), None) + {"doc_type": "Event", "property": "reqd", "field_name": "repeat_this_event"}, "value"), None) - location_field = d.get("fields", {"fieldname": "location"})[0] - location_field.reqd = 1 + repeat_this_event_field = d.get("fields", {"fieldname": "repeat_this_event"})[0] + repeat_this_event_field.reqd = 1 d.run_method("save_customization") self.assertEquals(frappe.db.get_value("Property Setter", - {"doc_type": "User", "property": "reqd", "field_name": "location"}, "value"), '1') + {"doc_type": "Event", "property": "reqd", "field_name": "repeat_this_event"}, "value"), '1') - location_field = d.get("fields", {"fieldname": "location"})[0] - location_field.reqd = 0 + repeat_this_event_field = d.get("fields", {"fieldname": "repeat_this_event"})[0] + repeat_this_event_field.reqd = 0 d.run_method("save_customization") self.assertEquals(frappe.db.get_value("Property Setter", - {"doc_type": "User", "property": "reqd", "field_name": "location"}, "value"), None) + {"doc_type": "Event", "property": "reqd", "field_name": "repeat_this_event"}, "value"), None) def test_save_customization_custom_field_property(self): - d = self.get_customize_form("User") - self.assertEquals(frappe.db.get_value("Custom Field", "User-test_custom_field", "reqd"), 0) + d = self.get_customize_form("Event") + self.assertEquals(frappe.db.get_value("Custom Field", "Event-test_custom_field", "reqd"), 0) custom_field = d.get("fields", {"fieldname": "test_custom_field"})[0] custom_field.reqd = 1 d.run_method("save_customization") - self.assertEquals(frappe.db.get_value("Custom Field", "User-test_custom_field", "reqd"), 1) + self.assertEquals(frappe.db.get_value("Custom Field", "Event-test_custom_field", "reqd"), 1) custom_field = d.get("fields", {"is_custom_field": True})[0] custom_field.reqd = 0 d.run_method("save_customization") - self.assertEquals(frappe.db.get_value("Custom Field", "User-test_custom_field", "reqd"), 0) + self.assertEquals(frappe.db.get_value("Custom Field", "Event-test_custom_field", "reqd"), 0) def test_save_customization_new_field(self): - d = self.get_customize_form("User") + d = self.get_customize_form("Event") last_fieldname = d.fields[-1].fieldname d.append("fields", { "label": "Test Add Custom Field Via Customize Form", @@ -114,18 +114,18 @@ class TestCustomizeForm(unittest.TestCase): }) d.run_method("save_customization") self.assertEquals(frappe.db.get_value("Custom Field", - "User-test_add_custom_field_via_customize_form", "fieldtype"), "Data") + "Event-test_add_custom_field_via_customize_form", "fieldtype"), "Data") self.assertEquals(frappe.db.get_value("Custom Field", - "User-test_add_custom_field_via_customize_form", 'insert_after'), last_fieldname) + "Event-test_add_custom_field_via_customize_form", 'insert_after'), last_fieldname) - frappe.delete_doc("Custom Field", "User-test_add_custom_field_via_customize_form") + frappe.delete_doc("Custom Field", "Event-test_add_custom_field_via_customize_form") self.assertEquals(frappe.db.get_value("Custom Field", - "User-test_add_custom_field_via_customize_form"), None) + "Event-test_add_custom_field_via_customize_form"), None) def test_save_customization_remove_field(self): - d = self.get_customize_form("User") + d = self.get_customize_form("Event") custom_field = d.get("fields", {"fieldname": "test_custom_field"})[0] d.get("fields").remove(custom_field) d.run_method("save_customization") @@ -137,24 +137,24 @@ class TestCustomizeForm(unittest.TestCase): def test_reset_to_defaults(self): d = frappe.get_doc("Customize Form") - d.doc_type = "User" + d.doc_type = "Event" d.run_method('reset_to_defaults') - self.assertEquals(d.get("fields", {"fieldname": "location"})[0].in_list_view, 0) + self.assertEquals(d.get("fields", {"fieldname": "repeat_this_event"})[0].in_list_view, 0) frappe.local.test_objects["Property Setter"] = [] make_test_records_for_doctype("Property Setter") def test_set_allow_on_submit(self): - d = self.get_customize_form("User") - d.get("fields", {"fieldname": "first_name"})[0].allow_on_submit = 1 + d = self.get_customize_form("Event") + d.get("fields", {"fieldname": "subject"})[0].allow_on_submit = 1 d.get("fields", {"fieldname": "test_custom_field"})[0].allow_on_submit = 1 d.run_method("save_customization") - d = self.get_customize_form("User") + d = self.get_customize_form("Event") # don't allow for standard fields - self.assertEquals(d.get("fields", {"fieldname": "first_name"})[0].allow_on_submit or 0, 0) + self.assertEquals(d.get("fields", {"fieldname": "subject"})[0].allow_on_submit or 0, 0) # allow for custom field self.assertEquals(d.get("fields", {"fieldname": "test_custom_field"})[0].allow_on_submit, 1) @@ -184,3 +184,10 @@ class TestCustomizeForm(unittest.TestCase): df.default = None d.run_method("save_customization") + def test_core_doctype_customization(self): + d = self.get_customize_form('User') + e = self.get_customize_form('Custom Field') + + # core doctype is invalid, hence no attributes are set + self.assertEquals(d.get("fields"), []) + self.assertEquals(e.get("fields"), []) diff --git a/frappe/model/__init__.py b/frappe/model/__init__.py index 441a20733a..26e91e7117 100644 --- a/frappe/model/__init__.py +++ b/frappe/model/__init__.py @@ -13,6 +13,9 @@ display_fieldtypes = ('Section Break', 'Column Break', 'HTML', 'Button', 'Image' default_fields = ('doctype','name','owner','creation','modified','modified_by', 'parent','parentfield','parenttype','idx','docstatus') optional_fields = ("_user_tags", "_comments", "_assign", "_liked_by", "_seen") +core_doctypes_list = ('DocType', 'DocField', 'DocPerm', 'User', 'Role', 'Has Role', + 'Page', 'Module Def', 'Print Format', 'Report', 'Customize Form', + 'Customize Form Field', 'Property Setter', 'Custom Field', 'Custom Script') def copytables(srctype, src, srcfield, tartype, tar, tarfield, srcfields, tarfields=[]): if not tarfields: diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index 9b559a644b..0719f6c7fa 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -485,6 +485,9 @@ frappe.ui.form.Layout = Class.extend({ if(expression.substr(0,5)=='eval:') { try { out = eval(expression.substr(5)); + if(parent && parent.istable && expression.includes('is_submittable')) { + out = true; + } } catch(e) { frappe.throw(__('Invalid "depends_on" expression')); } diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 881c1b62ca..0bba54a5fa 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -619,11 +619,13 @@ frappe.views.ListView = frappe.ui.BaseList.extend({ doctype: me.doctype }); }, true); - this.page.add_menu_item(__('Customize'), function () { - frappe.set_route('Form', 'Customize Form', { - doc_type: me.doctype - }) - }, true); + if(this.meta && !this.meta.custom) { + this.page.add_menu_item(__('Customize'), function () { + frappe.set_route('Form', 'Customize Form', { + doc_type: me.doctype + }) + }, true); + } } this.make_bulk_assignment(); diff --git a/frappe/public/js/frappe/model/model.js b/frappe/public/js/frappe/model/model.js index a947483d25..74486a046a 100644 --- a/frappe/public/js/frappe/model/model.js +++ b/frappe/public/js/frappe/model/model.js @@ -13,6 +13,10 @@ $.extend(frappe.model, { '_user_tags', '_comments', '_assign', '_liked_by', 'docstatus', 'parent', 'parenttype', 'parentfield', 'idx'], + core_doctypes_list: ['DocType', 'DocField', 'DocPerm', 'User', 'Role', 'Has Role', + 'Page', 'Module Def', 'Print Format', 'Report', 'Customize Form', + 'Customize Form Field', 'Property Setter', 'Custom Field', 'Custom Script'], + std_fields: [ {fieldname:'name', fieldtype:'Link', label:__('ID')}, {fieldname:'owner', fieldtype:'Link', label:__('Created By'), options: 'User'}, From d3b4a165f2d49d82bc64df42e047d7526a4b99c0 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 28 Jan 2019 12:20:24 +0530 Subject: [PATCH 3/5] feat: [v10] Deprecate In App Help (#6834) * [feat] Removed help from global search * [feat] redirected search in help to docs website [] Url needs to be configurable from hooks * [Feat] Removed search functions for help * [fix] Help links not redirecting * [feat] Modified "Help" menu on desk toolbar * [feat] Removed docs search from desk toolbar * Removed Search from toolbar.js * Removed help from migrate * Deprecated help from command utils * Removed help setup from travis.yml * [fix] Fixed formatting issues * [fix] Deleted commented code from toolbar.js * [fix] Minor link fix * [fix] Removed accidentally added autodeploy --- .travis.yml | 2 - frappe/change_log/v8/v8_7_0.md | 2 +- frappe/commands/utils.py | 38 ++++-------------- frappe/migrate.py | 5 --- .../public/js/frappe/ui/toolbar/navbar.html | 8 +--- frappe/public/js/frappe/ui/toolbar/search.js | 25 +----------- .../js/frappe/ui/toolbar/search_utils.js | 40 ------------------- frappe/public/js/frappe/ui/toolbar/toolbar.js | 37 +---------------- 8 files changed, 14 insertions(+), 143 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7c16472271..803d414cd8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,8 +32,6 @@ before_script: - cd ~/frappe-bench - bench use test_site - bench reinstall --yes - - bench setup-help - - bench setup-global-help --mariadb_root_password travis - bench scheduler disable - sed -i 's/9000/9001/g' sites/common_site_config.json - bench start & diff --git a/frappe/change_log/v8/v8_7_0.md b/frappe/change_log/v8/v8_7_0.md index c7b0b4d577..8c982dcbcc 100644 --- a/frappe/change_log/v8/v8_7_0.md +++ b/frappe/change_log/v8/v8_7_0.md @@ -1,2 +1,2 @@ ### User Permissions -- User Permission is now a DocType, a new UX for the existing Role and User Permission managers to make it easy to enter permissions. For more details please check User Permissions \ No newline at end of file +- User Permission is now a DocType, a new UX for the existing Role and User Permission managers to make it easy to enter permissions. For more details please check User Permissions \ No newline at end of file diff --git a/frappe/commands/utils.py b/frappe/commands/utils.py index ff606d940d..774728ca6a 100644 --- a/frappe/commands/utils.py +++ b/frappe/commands/utils.py @@ -455,40 +455,16 @@ def get_version(): @click.command('setup-global-help') @click.option('--mariadb_root_password') def setup_global_help(mariadb_root_password=None): - '''setup help table in a separate database that will be + '''Deprecated: setup help table in a separate database that will be shared by the whole bench and set `global_help_setup` as 1 in common_site_config.json''' - - from frappe.installer import update_site_config - - frappe.local.flags = frappe._dict() - frappe.local.flags.in_setup_help = True - frappe.local.flags.in_install = True - frappe.local.lang = 'en' - frappe.local.conf = frappe.get_site_config(sites_path='.') - - update_site_config('global_help_setup', 1, - site_config_path=os.path.join('.', 'common_site_config.json')) - - if mariadb_root_password: - frappe.local.conf.root_password = mariadb_root_password - - from frappe.utils.help import sync - sync() + print_in_an_help_deprecation() @click.command('setup-help') @pass_context def setup_help(context): - '''Setup help table in the current site (called after migrate)''' - from frappe.utils.help import sync - - for site in context.sites: - try: - frappe.init(site) - frappe.connect() - sync() - finally: - frappe.destroy() + '''Deprecated: Setup help table in the current site (called after migrate)''' + print_in_an_help_deprecation() @click.command('rebuild-global-search') @pass_context @@ -509,6 +485,10 @@ def rebuild_global_search(context): frappe.destroy() +def print_in_an_help_deprecation(): + print("In app help has been deprectated.\nYou can access the documentation on erpnext.com/docs or frappe.io/docs") + return + commands = [ build, clear_cache, @@ -535,7 +515,5 @@ commands = [ watch, _bulk_rename, add_to_email_queue, - setup_global_help, - setup_help, rebuild_global_search ] diff --git a/frappe/migrate.py b/frappe/migrate.py index 8d9ed33b31..6726207add 100644 --- a/frappe/migrate.py +++ b/frappe/migrate.py @@ -14,7 +14,6 @@ from frappe.website import render, router from frappe.desk.doctype.desktop_icon.desktop_icon import sync_desktop_icons from frappe.core.doctype.language.language import sync_languages from frappe.modules.utils import sync_customizations -import frappe.utils.help def migrate(verbose=True, rebuild_website=False): '''Migrate all apps to the latest version, will: @@ -47,10 +46,6 @@ def migrate(verbose=True, rebuild_website=False): frappe.db.commit() - if not frappe.conf.get('global_help_setup'): - # sync help if not set as global - frappe.utils.help.sync() - clear_notifications() frappe.publish_realtime("version-update") diff --git a/frappe/public/js/frappe/ui/toolbar/navbar.html b/frappe/public/js/frappe/ui/toolbar/navbar.html index f702994dcb..cb38a95ea0 100644 --- a/frappe/public/js/frappe/ui/toolbar/navbar.html +++ b/frappe/public/js/frappe/ui/toolbar/navbar.html @@ -53,16 +53,12 @@ style="padding: 50% 7px; font-size: 17px; background-color: #fafbfc; font-weight: 100;">?