diff --git a/frappe/desk/doctype/kanban_board/kanban_board.py b/frappe/desk/doctype/kanban_board/kanban_board.py index 923ca8aa6b..f1ad41db6c 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/hooks.py b/frappe/hooks.py index 61fd389b20..b86dededa8 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.45' +staging_version = '11.0.3-beta.46' app_email = "info@frappe.io" diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index a83520251c..224b6bc299 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -573,6 +573,7 @@ class DatabaseQuery(object): ) match_conditions.append("({condition})".format(condition=condition)) + match_filters[df.get('options')] = docs if match_conditions: self.match_conditions.append(" and ".join(match_conditions)) diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py index 34f1c42382..6b4c1993cf 100644 --- a/frappe/model/delete_doc.py +++ b/frappe/model/delete_doc.py @@ -220,7 +220,7 @@ def check_if_doc_is_linked(doc, method="Delete"): def check_if_doc_is_dynamically_linked(doc, method="Delete"): '''Raise `frappe.LinkExistsError` if the document is dynamically linked''' for df in get_dynamic_link_map().get(doc.doctype, []): - if df.parent in ("Communication", "ToDo", "DocShare", "Email Unsubscribe", "Activity Log", 'File', 'Version'): + if df.parent in ("Communication", "ToDo", "DocShare", "Email Unsubscribe", "Activity Log", 'File', 'Version', 'View log'): # don't check for communication and todo! continue @@ -286,6 +286,10 @@ def delete_dynamic_links(doctype, name): communication_type = 'Comment' and reference_doctype=%s and reference_name=%s""", (doctype, name)) + # delete view logs + frappe.db.sql("""delete from `tabView log` + where reference_doctype=%s and reference_name=%s""", (doctype, name)) + # unlink communications frappe.db.sql("""update `tabCommunication` set reference_doctype=null, reference_name=null diff --git a/frappe/public/js/frappe/defaults.js b/frappe/public/js/frappe/defaults.js index a2df90e5b4..6115afb784 100644 --- a/frappe/public/js/frappe/defaults.js +++ b/frappe/public/js/frappe/defaults.js @@ -8,9 +8,11 @@ frappe.defaults = { if(!d && frappe.defaults.is_a_user_permission_key(key)) d = defaults[frappe.model.scrub(key)]; if($.isArray(d)) d = d[0]; - if(frappe.defaults.not_in_user_permission(key, d)) { + + if(!frappe.defaults.in_user_permission(key, d)) { return; } + return d; }, get_user_defaults: function(key) { @@ -29,7 +31,7 @@ frappe.defaults = { // filter out values which are not permitted to the user d.filter(item => { - if(!frappe.defaults.not_in_user_permission(key, item)) { + if(frappe.defaults.in_user_permission(key, item)) { return item; } }); @@ -73,7 +75,7 @@ frappe.defaults = { } } - if(frappe.defaults.not_in_user_permission(key, value)) { + if(!frappe.defaults.in_user_permission(key, value)) { return; } @@ -90,14 +92,22 @@ frappe.defaults = { return key.indexOf(":")===-1 && key !== frappe.model.scrub(key); }, - not_in_user_permission: function(key, value) { - let user_permission = this.get_user_permissions()[frappe.model.unscrub(key)] || []; + in_user_permission: function(key, value) { + let user_permission = this.get_user_permissions()[frappe.model.unscrub(key)]; - let doc_found = user_permission.some(perm => { - return perm.doc === value; - }); + if (user_permission && user_permission.length) { + + let doc_found = user_permission.some(perm => { + return perm.doc === value; + }); + return doc_found; + + } else { + // there is no user permission for this doctype + // so we can allow this doc i.e., value + return true; + } - return !doc_found; }, get_user_permissions: function() { diff --git a/frappe/public/js/frappe/form/footer/assign_to.js b/frappe/public/js/frappe/form/footer/assign_to.js index af23855110..b7056fd745 100644 --- a/frappe/public/js/frappe/form/footer/assign_to.js +++ b/frappe/public/js/frappe/form/footer/assign_to.js @@ -150,7 +150,7 @@ frappe.ui.form.AssignToDialog = Class.extend({ {value:'High', label:__('High')}], 'default':'Medium'}, ], - primary_action: function() { frappe.ui.add_assignment(opts, me) }, + primary_action: function() { frappe.ui.add_assignment(opts, this) }, primary_action_label: __("Add") }) $.extend(me, dialog); diff --git a/frappe/public/js/frappe/views/kanban/kanban_view.js b/frappe/public/js/frappe/views/kanban/kanban_view.js index ba8ccf8982..30680fedcb 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')} + +