From 3cf10db22cf6afcb83e71d7217fb943b47fabc57 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Mon, 19 Nov 2018 19:23:56 +0530 Subject: [PATCH 001/175] refactor primary key in series patch --- frappe/patches.txt | 2 +- .../v11_0/set_primary_key_in_series.py | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 frappe/patches/v11_0/set_primary_key_in_series.py diff --git a/frappe/patches.txt b/frappe/patches.txt index 1645d421fa..5a62f9af6e 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -230,4 +230,4 @@ frappe.patches.v10_0.modify_naming_series_table frappe.patches.v10_0.enhance_security frappe.patches.v11_0.multiple_references_in_events frappe.patches.v11_0.set_allow_self_approval_in_workflow -execute:frappe.db.sql('ALTER table `tabSeries` ADD PRIMARY KEY IF NOT EXISTS (name)') +frappe.patches.v11_0.set_primary_key_in_series diff --git a/frappe/patches/v11_0/set_primary_key_in_series.py b/frappe/patches/v11_0/set_primary_key_in_series.py new file mode 100644 index 0000000000..c3c3b9445e --- /dev/null +++ b/frappe/patches/v11_0/set_primary_key_in_series.py @@ -0,0 +1,27 @@ +import frappe + +def execute(): + keys_encountered = set() + #if current = 0, simply delete the key as it'll be recreated on first entry + frappe.db.sql('delete from `tabSeries` where current = 0') + duplicate_keys = frappe.db.sql(''' + SELECT distinct name, current + from + `tabSeries` + where + name in (Select name from `tabSeries` group by name having count(name) > 2) + ''', as_dict=True) + for row in duplicate_keys: + if row.name in keys_encountered: + frappe.throw(''' +Key {row.name} appears twice in `tabSeries` with different values. +Kindly remove the faulty one manually before continuing + '''.format(row=row)) + frappe.db.sql('delete from `tabSeries` where name = %(key)s', { + 'key': row.name + }) + if row.current: + frappe.db.sql('insert into `tabSeries`(`name`, `current`) values (%(name)s, %(current)s)', row) + keys_encountered.add(row.name) + frappe.db.commit() + frappe.db.sql('ALTER table `tabSeries` ADD PRIMARY KEY IF NOT EXISTS (name)') From b63edf8067c070f988f2ded4e33592d33bbbcab5 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Mon, 19 Nov 2018 19:30:09 +0530 Subject: [PATCH 002/175] Check duplicates > 1 instead of > 2 --- frappe/patches/v11_0/set_primary_key_in_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/patches/v11_0/set_primary_key_in_series.py b/frappe/patches/v11_0/set_primary_key_in_series.py index c3c3b9445e..83587018c1 100644 --- a/frappe/patches/v11_0/set_primary_key_in_series.py +++ b/frappe/patches/v11_0/set_primary_key_in_series.py @@ -9,7 +9,7 @@ def execute(): from `tabSeries` where - name in (Select name from `tabSeries` group by name having count(name) > 2) + name in (Select name from `tabSeries` group by name having count(name) > 1) ''', as_dict=True) for row in duplicate_keys: if row.name in keys_encountered: From 109a97218e3d62bcb0215f330b3e644f5a3dec2c Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Wed, 28 Nov 2018 09:05:02 +0530 Subject: [PATCH 003/175] simply keep current having max value --- frappe/patches/v11_0/set_primary_key_in_series.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/frappe/patches/v11_0/set_primary_key_in_series.py b/frappe/patches/v11_0/set_primary_key_in_series.py index c3c3b9445e..e5ed2204ba 100644 --- a/frappe/patches/v11_0/set_primary_key_in_series.py +++ b/frappe/patches/v11_0/set_primary_key_in_series.py @@ -1,27 +1,21 @@ import frappe def execute(): - keys_encountered = set() #if current = 0, simply delete the key as it'll be recreated on first entry frappe.db.sql('delete from `tabSeries` where current = 0') duplicate_keys = frappe.db.sql(''' - SELECT distinct name, current + SELECT name, max(current) as current from `tabSeries` - where - name in (Select name from `tabSeries` group by name having count(name) > 2) + group by + name + having count(name) > 1 ''', as_dict=True) for row in duplicate_keys: - if row.name in keys_encountered: - frappe.throw(''' -Key {row.name} appears twice in `tabSeries` with different values. -Kindly remove the faulty one manually before continuing - '''.format(row=row)) frappe.db.sql('delete from `tabSeries` where name = %(key)s', { 'key': row.name }) if row.current: frappe.db.sql('insert into `tabSeries`(`name`, `current`) values (%(name)s, %(current)s)', row) - keys_encountered.add(row.name) frappe.db.commit() frappe.db.sql('ALTER table `tabSeries` ADD PRIMARY KEY IF NOT EXISTS (name)') From 64ae24f0741111edb49a0a0327098c2b91e455ff Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 18 Dec 2018 13:17:04 +0530 Subject: [PATCH 004/175] fix(Kanban): Fix for New Kanban DDL issue --- .../desk/doctype/kanban_board/kanban_board.py | 12 +--- .../js/frappe/views/kanban/kanban_view.js | 55 +++++++++---------- 2 files changed, 28 insertions(+), 39 deletions(-) diff --git a/frappe/desk/doctype/kanban_board/kanban_board.py b/frappe/desk/doctype/kanban_board/kanban_board.py index a1df694f6e..b63d446d6d 100644 --- a/frappe/desk/doctype/kanban_board/kanban_board.py +++ b/frappe/desk/doctype/kanban_board/kanban_board.py @@ -8,7 +8,6 @@ import json from frappe import _ from frappe.model.document import Document from six import iteritems -from frappe.custom.doctype.custom_field.custom_field import create_custom_field class KanbanBoard(Document): @@ -130,17 +129,8 @@ def update_order(board_name, order): @frappe.whitelist() def quick_kanban_board(doctype, board_name, field_name, project=None): '''Create new KanbanBoard quickly with default options''' + doc = frappe.new_doc('Kanban Board') - - if field_name == 'kanban_column': - create_custom_field(doctype, { - 'label': 'Kanban Column', - 'fieldname': 'kanban_column', - 'fieldtype': 'Select', - 'hidden': 1, - 'owner': 'Administrator' - }) - meta = frappe.get_meta(doctype) options = '' diff --git a/frappe/public/js/frappe/views/kanban/kanban_view.js b/frappe/public/js/frappe/views/kanban/kanban_view.js index 74dc283326..0f85875233 100644 --- a/frappe/public/js/frappe/views/kanban/kanban_view.js +++ b/frappe/public/js/frappe/views/kanban/kanban_view.js @@ -225,21 +225,18 @@ frappe.views.KanbanView.setup_dropdown_in_sidebar = function(doctype, $dropdown) const fields = get_fields_for_dialog(); + let primary_action_label = fields.length > 1 ? __('Save') : ''; + let primary_action = fields.length > 1 ? + ({ board_name, field_name, project }) => { + make_kanban_board(board_name, field_name, project) + .then(() => dialog.hide(), (err) => frappe.msgprint(err)); + } : null; + dialog = new frappe.ui.Dialog({ title: __('New Kanban Board'), - fields: fields, - - primary_action_label: __('Save'), - primary_action(values) { - const custom_column = - values.custom_column !== undefined ? - values.custom_column : 1; - - let field_name = custom_column ? 'kanban_column' : values.field_name; - - make_kanban_board(values.board_name, field_name, values.project) - .then(() => dialog.hide(), (err) => frappe.msgprint(err)); - } + fields, + primary_action_label, + primary_action }); return dialog; } @@ -272,26 +269,28 @@ frappe.views.KanbanView.setup_dropdown_in_sidebar = function(doctype, $dropdown) }); if (select_fields.length > 0) { - fields = fields.concat([{ + fields.push({ fieldtype: 'Select', fieldname: 'field_name', label: __('Columns based on'), options: select_fields.map(df => ({label: df.label, value: df.fieldname})), default: select_fields[0], - depends_on: 'eval:doc.custom_column===0', - reqd: 1 - }, - - { - fieldtype: 'Check', - fieldname: 'custom_column', - label: __('Custom Column'), - default: 0, - onchange() { - const value = this.get_value(); - this.layout.set_df_property('field_name', 'reqd', !value); - } - }]); + reqd: 1, + }); + } else { + fields = [{ + fieldtype: 'HTML', + options: ` +
+

+ ${__('No fields found that can be used as a Kanban Column. Use the Customize Form to add a Custom Field of type "Select".')} +

+ + ${__('Customize Form')} + +
+ ` + }] } return fields; From ccea2e2b0076e085999cc7d902b5ba03787107cf Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sat, 22 Dec 2018 00:22:10 +0530 Subject: [PATCH 005/175] style: Add semicolon --- frappe/public/js/frappe/views/kanban/kanban_view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/views/kanban/kanban_view.js b/frappe/public/js/frappe/views/kanban/kanban_view.js index 0f85875233..edf3061b43 100644 --- a/frappe/public/js/frappe/views/kanban/kanban_view.js +++ b/frappe/public/js/frappe/views/kanban/kanban_view.js @@ -290,7 +290,7 @@ frappe.views.KanbanView.setup_dropdown_in_sidebar = function(doctype, $dropdown) ` - }] + }]; } return fields; From d483e87aa379da96ad3556fdad01f0d6d8c88159 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 26 Dec 2018 19:56:43 +0530 Subject: [PATCH 006/175] fix(permission): Update user_permission.py (#6684) --- frappe/core/doctype/user_permission/user_permission.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frappe/core/doctype/user_permission/user_permission.py b/frappe/core/doctype/user_permission/user_permission.py index 1f2ad4c0ef..0be62ffd01 100644 --- a/frappe/core/doctype/user_permission/user_permission.py +++ b/frappe/core/doctype/user_permission/user_permission.py @@ -93,7 +93,9 @@ def user_permission_exists(user, allow, for_value, applicable_for=None): def get_applicable_for_doctype_list(doctype, txt, searchfield, start, page_len, filters): linked_doctypes = get_linked_doctypes(doctype, True).keys() + linked_doctypes = list(linked_doctypes) linked_doctypes += [doctype] + if txt: linked_doctypes = [d for d in linked_doctypes if txt in d.lower()] @@ -107,4 +109,4 @@ def get_applicable_for_doctype_list(doctype, txt, searchfield, start, page_len, def get_permitted_documents(doctype): return [d.get('doc') for d in get_user_permissions().get(doctype, []) \ - if d.get('doc')] \ No newline at end of file + if d.get('doc')] From 8b201911b4cc9b2cbb74e291520067d14c5f364d Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 26 Dec 2018 19:57:18 +0530 Subject: [PATCH 007/175] fix(permission): Update db_query.py (#6683) --- frappe/model/db_query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index 6e4831a35f..6174d01939 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -715,7 +715,7 @@ def is_parent_only_filter(doctype, filters): def has_any_user_permission_for_doctype(doctype, user, applicable_for): user_permissions = frappe.permissions.get_user_permissions(user=user) - doctype_user_permissions = user_permissions.get(doctype) + doctype_user_permissions = user_permissions.get(doctype, []) for permission in doctype_user_permissions: if not permission.applicable_for or permission.applicable_for == applicable_for: From 7e9d29e244822e4a4789e85f01ab3caae7030b28 Mon Sep 17 00:00:00 2001 From: Frappe Bot Date: Wed, 26 Dec 2018 14:31:01 +0000 Subject: [PATCH 008/175] bumped to version 11.0.3-beta.43 --- frappe/hooks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index 6a09385d94..4f0c8d54c2 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -12,7 +12,7 @@ source_link = "https://github.com/frappe/frappe" app_license = "MIT" develop_version = '12.x.x-develop' -staging_version = '11.0.3-beta.42' +staging_version = '11.0.3-beta.43' app_email = "info@frappe.io" From 2a315b154e532f11cc7d5c30e7901a49b75af2fd Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 26 Dec 2018 21:16:41 +0530 Subject: [PATCH 009/175] fix(permission): KeyError --- frappe/permissions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/permissions.py b/frappe/permissions.py index b95d167e6e..bec30f87d2 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -27,7 +27,7 @@ def print_has_permission_check_logs(func): # print only if access denied if not result: msgprint(('
').join(frappe.flags['has_permission_check_logs'])) - del frappe.flags['has_permission_check_logs'] + frappe.flags.pop('has_permission_check_logs', None) return result return inner @@ -522,4 +522,4 @@ def get_allowed_docs_for_doctype(user_permissions, doctype): def push_perm_check_log(log): if frappe.flags.get('has_permission_check_logs') == None: return - frappe.flags.get('has_permission_check_logs').append(_(log)) \ No newline at end of file + frappe.flags.get('has_permission_check_logs').append(_(log)) From 37e6cd4bff4b52f2e0ee218e8f5f0a76ddae538e Mon Sep 17 00:00:00 2001 From: Saurabh Date: Wed, 26 Dec 2018 22:29:51 +0600 Subject: [PATCH 010/175] bumped to version 11.0.3-beta.44 --- frappe/hooks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index 4f0c8d54c2..939aaf5e08 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -12,7 +12,7 @@ source_link = "https://github.com/frappe/frappe" app_license = "MIT" develop_version = '12.x.x-develop' -staging_version = '11.0.3-beta.43' +staging_version = '11.0.3-beta.44' app_email = "info@frappe.io" From a74c91742ab36503d472c3879c985b8827d2a4ec Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 27 Dec 2018 12:55:52 +0530 Subject: [PATCH 011/175] fix(formatting): for email replies (#6676) * fix(fomratting): for email replies * fix(timeline): some more testing and fixes * fix(style): for blockquotes, also feedback --- .../public/js/frappe/form/footer/timeline.js | 3 +- .../public/js/frappe/views/communication.js | 33 ++++++++++++------- frappe/public/less/form.less | 5 ++- frappe/public/less/quill.less | 6 ++++ 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/frappe/public/js/frappe/form/footer/timeline.js b/frappe/public/js/frappe/form/footer/timeline.js index 0782f57b91..44771dd7c5 100644 --- a/frappe/public/js/frappe/form/footer/timeline.js +++ b/frappe/public/js/frappe/form/footer/timeline.js @@ -2,6 +2,7 @@ // MIT License. See license.txt frappe.provide('frappe.timeline'); +frappe.separator_element = '
---
'; frappe.ui.form.Timeline = class Timeline { constructor(opts) { @@ -344,7 +345,7 @@ frappe.ui.form.Timeline = class Timeline { }); } else { if(c.communication_type=="Communication" && c.communication_medium=="Email") { - c.content = c.content.split('')[0]; + c.content = c.content.split(frappe.separator_element)[0]; c.content = frappe.utils.strip_original_content(c.content); c.original_content = c.content; diff --git a/frappe/public/js/frappe/views/communication.js b/frappe/public/js/frappe/views/communication.js index 46f25bc23b..95fef7cf5a 100755 --- a/frappe/public/js/frappe/views/communication.js +++ b/frappe/public/js/frappe/views/communication.js @@ -11,6 +11,7 @@ frappe.views.CommunicationComposer = Class.extend({ }, make: function() { var me = this; + this.dialog = new frappe.ui.Dialog({ title: (this.title || this.subject || __("New Email")), no_submit_on_enter: true, @@ -499,7 +500,7 @@ frappe.views.CommunicationComposer = Class.extend({ if (this.dialog) { try { let message = this.dialog.get_value('content'); - message = message.split('')[0]; + message = message.split(frappe.separator_element)[0]; localStorage.setItem(this.frm.doctype + this.frm.docname, message); } catch (e) { // silently fail @@ -656,9 +657,9 @@ frappe.views.CommunicationComposer = Class.extend({ let last_email_content = last_email.original_comment || last_email.content; - last_email_content = last_email_content - .replace(/<meta[\s\S]*meta>/g, '') // remove tags - .replace(/<style[\s\S]*<\/style>/g, ''); // // remove