From fca6181d6771235d883bd1c4cc0ce57c3c32065c Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Wed, 15 Apr 2020 21:32:22 +0530 Subject: [PATCH 1/8] feat: multiple assignments --- frappe/desk/form/assign_to.py | 77 +++---- .../js/frappe/form/sidebar/assign_to.js | 202 +++++++++++------- 2 files changed, 164 insertions(+), 115 deletions(-) diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index 76c7caa63d..a0f2f99910 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -11,6 +11,7 @@ from frappe.desk.doctype.notification_log.notification_log import enqueue_create get_title, get_title_html import frappe.utils import frappe.share +import json class DuplicateToDoError(frappe.ValidationError): pass @@ -19,7 +20,7 @@ def get(args=None): if not args: args = frappe.local.form_dict - return frappe.get_all('ToDo', fields = ['owner', 'description'], filters = dict( + return frappe.get_all('ToDo', fields = ['owner', 'name'], filters = dict( reference_type = args.get('doctype'), reference_name = args.get('name'), status = ('!=', 'Cancelled') @@ -40,49 +41,53 @@ def add(args=None): if not args: args = frappe.local.form_dict - if frappe.db.sql("""SELECT `owner` - FROM `tabToDo` - WHERE `reference_type`=%(doctype)s - AND `reference_name`=%(name)s - AND `status`='Open' - AND `owner`=%(assign_to)s""", args): - frappe.throw(_("Already in user's To Do list"), DuplicateToDoError) - else: - from frappe.utils import nowdate - - if not args.get('description'): - args['description'] = _('Assignment for {0} {1}').format(args['doctype'], args['name']) - - d = frappe.get_doc({ - "doctype":"ToDo", - "owner": args['assign_to'], + for assign_to in json.loads(args.get("assign_to")): + filters = { "reference_type": args['doctype'], "reference_name": args['name'], - "description": args.get('description'), - "priority": args.get("priority", "Medium"), "status": "Open", - "date": args.get('date', nowdate()), - "assigned_by": args.get('assigned_by', frappe.session.user), - 'assignment_rule': args.get('assignment_rule') - }).insert(ignore_permissions=True) + "owner": assign_to + } - # set assigned_to if field exists - if frappe.get_meta(args['doctype']).get_field("assigned_to"): - frappe.db.set_value(args['doctype'], args['name'], "assigned_to", args['assign_to']) + if frappe.get_all("ToDo", filters=filters): + if not args.get("bulk_assign"): + frappe.throw(_("Already in user's ToDo list"), DuplicateToDoError) + else: + from frappe.utils import nowdate - doc = frappe.get_doc(args['doctype'], args['name']) + if not args.get('description'): + args['description'] = _('Assignment for {0} {1}').format(args['doctype'], args['name']) - # if assignee does not have permissions, share - if not frappe.has_permission(doc=doc, user=args['assign_to']): - frappe.share.add(doc.doctype, doc.name, args['assign_to']) - frappe.msgprint(_('Shared with user {0} with read access').format(args['assign_to']), alert=True) + d = frappe.get_doc({ + "doctype":"ToDo", + "owner": assign_to, + "reference_type": args['doctype'], + "reference_name": args['name'], + "description": args.get('description'), + "priority": args.get("priority", "Medium"), + "status": "Open", + "date": args.get('date', nowdate()), + "assigned_by": args.get('assigned_by', frappe.session.user), + 'assignment_rule': args.get('assignment_rule') + }).insert(ignore_permissions=True) - # make this document followed by assigned user - follow_document(args['doctype'], args['name'], args['assign_to']) + # set assigned_to if field exists + if frappe.get_meta(args['doctype']).get_field("assigned_to"): + frappe.db.set_value(args['doctype'], args['name'], "assigned_to", assign_to) - # notify - notify_assignment(d.assigned_by, d.owner, d.reference_type, d.reference_name, action='ASSIGN',\ - description=args.get("description")) + doc = frappe.get_doc(args['doctype'], args['name']) + + # if assignee does not have permissions, share + if not frappe.has_permission(doc=doc, user=assign_to): + frappe.share.add(doc.doctype, doc.name, assign_to) + frappe.msgprint(_('Shared with user {0} with read access').format(assign_to, alert=True)) + + # make this document followed by assigned user + follow_document(args['doctype'], args['name'], assign_to) + + # notify + notify_assignment(d.assigned_by, d.owner, d.reference_type, d.reference_name, action='ASSIGN',\ + description=args.get("description")) return get(args) diff --git a/frappe/public/js/frappe/form/sidebar/assign_to.js b/frappe/public/js/frappe/form/sidebar/assign_to.js index 61d1789518..b78540f6a7 100644 --- a/frappe/public/js/frappe/form/sidebar/assign_to.js +++ b/frappe/public/js/frappe/form/sidebar/assign_to.js @@ -87,23 +87,17 @@ frappe.ui.form.AssignTo = Class.extend({ if(!me.assign_to) { me.assign_to = new frappe.ui.form.AssignToDialog({ - obj: me, - method: 'frappe.desk.form.assign_to.add', + method: "frappe.desk.form.assign_to.add", doctype: me.frm.doctype, docname: me.frm.docname, - callback: function(r) { + frm: me.frm, + callback: function (r) { me.render(r.message); } }); } me.assign_to.dialog.clear(); - - if(me.frm.meta.title_field) { - me.assign_to.dialog.set_value("description", me.frm.doc[me.frm.meta.title_field]) - } - me.assign_to.dialog.show(); - me.assign_to = null; }, remove: function(owner) { var me = this; @@ -130,81 +124,131 @@ frappe.ui.form.AssignTo = Class.extend({ frappe.ui.form.AssignToDialog = Class.extend({ init: function(opts){ - var me = this - var dialog = new frappe.ui.Dialog({ - title: __('Add to To Do'), - fields: [ - { fieldtype: 'Link', fieldname: 'assign_to', options: 'User', label: __("Assign To"), reqd: true, filters: { 'user_type': 'System User' }}, - { fieldtype: 'Check', fieldname: 'myself', label: __("Assign to me"), "default": 0 }, - { fieldtype: 'Small Text', fieldname: 'description', label: __("Comment") }, - { fieldtype: 'Section Break' }, - { fieldtype: 'Column Break' }, - { fieldtype: 'Date', fieldname: 'date', label: __("Complete By") }, - { fieldtype: 'Column Break' }, - { fieldtype: 'Select', fieldname: 'priority', label: __("Priority"), - options: [ - { value: 'Low', label: __('Low') }, - { value: 'Medium', label: __('Medium') }, - { value: 'High', label: __('High') } - ], - // Pick up priority from the source document, if it exists and is available in ToDo - 'default': ["Low", "Medium", "High"].includes(opts.obj.frm && opts.obj.frm.doc.priority - ? opts.obj.frm.doc.priority : 'Medium') - }, - ], - primary_action: function() { frappe.ui.add_assignment(opts, this) }, - primary_action_label: __("Add") - }) - $.extend(me, dialog); + $.extend(this, opts) - me.dialog = dialog; - - me.dialog.fields_dict.assign_to.get_query = "frappe.core.doctype.user.user.user_query"; - - var myself = me.dialog.get_input("myself").on("click", function() { - me.toggle_myself(this); - }); - me.toggle_myself(myself); - }, - toggle_myself: function(myself) { - var me = this; - if($(myself).prop("checked")) { - me.dialog.set_value("assign_to", frappe.session.user); - me.dialog.get_field("notify").$wrapper.toggle(false); - me.dialog.get_field("assign_to").$wrapper.toggle(false); - } else { - me.dialog.set_value("assign_to", ""); - me.dialog.get_field("assign_to").$wrapper.toggle(true); - } + this.make(); + this.set_description_from_doc(); }, + make: function() { + let me = this -}); + me.dialog = new frappe.ui.Dialog({ + title: __('Add to ToDo'), + fields: me.get_fields(), + primary_action_label: __("Add"), + primary_action: function() { + let args = me.dialog.get_values(); -frappe.ui.add_assignment = function(opts, dialog) { - var assign_to = dialog.fields_dict.assign_to.get_value(); - var args = dialog.get_values(); - if(args && assign_to) { - dialog.set_message('Assigning...'); - return frappe.call({ - method: opts.method, - args: $.extend(args, { - doctype: opts.doctype, - name: opts.docname, - assign_to: assign_to, - bulk_assign: opts.bulk_assign || false, - re_assign: opts.re_assign || false - }), - btn: dialog.get_primary_btn(), - callback: function(r) { - if(!r.exc) { - if(opts.callback){ - opts.callback(r); - } - dialog && dialog.hide(); - } else { - dialog.clear_message(); + if (args && args.assign_to) { + me.dialog.set_message("Assigning..."); + + frappe.call({ + method: me.method, + args: $.extend(args, { + doctype: me.doctype, + name: me.docname, + assign_to: args.assign_to, + bulk_assign: me.bulk_assign || false, + re_assign: me.re_assign || false + }), + btn: me.dialog.get_primary_btn(), + callback: function(r) { + if (!r.exc) { + if (me.callback) { + me.callback(r); + } + me.dialog && me.dialog.hide(); + } else { + me.dialog.clear_message(); + } + }, + }); } }, }); + }, + assign_to_me: function() { + let me = this; + let assign_to = []; + + if(me.dialog.get_value("assign_to_me")) { + assign_to.push(frappe.session.user); + } + + me.dialog.set_value("assign_to", assign_to); + }, + set_description_from_doc: function() { + let me = this; + + if (me.frm && me.frm.meta.title_field) { + me.dialog.set_value("description", me.frm.doc[me.frm.meta.title_field]); + } + }, + set_assign_to_field_description: function() { + let me = this; + + let assignees = me.dialog.get_value("assign_to"); + let field = me.dialog.get_field("assign_to"); + let description = ""; + + if (assignees.length > 0) { + description = "Assign To: " + assignees.join(", "); + } + + field.set_description(description); + }, + get_fields: function() { + let me = this; + + return [ + { + fieldtype: 'MultiSelectList', + fieldname: 'assign_to', + label: __("Assign To"), + reqd: true, + get_data: function(txt) { + return frappe.db.get_link_options("User", txt, {user_type: "System User", enabled: 1}); + }, + onchange: () => me.set_assign_to_field_description() + }, + { + label: __("Assign to me"), + fieldtype: 'Check', + fieldname: 'assign_to_me', + default: 0, + onchange: () => me.assign_to_me() + }, + { + label: __("Comment"), + fieldtype: 'Small Text', + fieldname: 'description' + }, + { + fieldtype: 'Section Break' + }, + { + fieldtype: 'Column Break' + }, + { + label: __("Complete By"), + fieldtype: 'Date', + fieldname: 'date' + }, + { + fieldtype: 'Column Break' + }, + { + label: __("Priority"), + fieldtype: 'Select', + fieldname: 'priority', + options: [ + { value: 'Low', label: __('Low') }, + { value: 'Medium', label: __('Medium') }, + { value: 'High', label: __('High') } + ], + // Pick up priority from the source document, if it exists and is available in ToDo + default: ["Low", "Medium", "High"].includes(me.frm && me.frm.doc.priority ? me.frm.doc.priority : 'Medium') + } + ] } -} +}); From 6b9de21d539d4a64fe82473be994af9bc814eb61 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Wed, 15 Apr 2020 22:20:23 +0530 Subject: [PATCH 2/8] fix: minor bug fixes for notifying assignees --- frappe/desk/form/assign_to.py | 4 ++-- frappe/public/js/frappe/form/sidebar/assign_to.js | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index a0f2f99910..8a8219eb22 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -85,8 +85,8 @@ def add(args=None): # make this document followed by assigned user follow_document(args['doctype'], args['name'], assign_to) - # notify - notify_assignment(d.assigned_by, d.owner, d.reference_type, d.reference_name, action='ASSIGN',\ + # notify + notify_assignment(d.assigned_by, d.owner, d.reference_type, d.reference_name, action='ASSIGN',\ description=args.get("description")) return get(args) diff --git a/frappe/public/js/frappe/form/sidebar/assign_to.js b/frappe/public/js/frappe/form/sidebar/assign_to.js index b78540f6a7..03fba17ec7 100644 --- a/frappe/public/js/frappe/form/sidebar/assign_to.js +++ b/frappe/public/js/frappe/form/sidebar/assign_to.js @@ -124,7 +124,7 @@ frappe.ui.form.AssignTo = Class.extend({ frappe.ui.form.AssignToDialog = Class.extend({ init: function(opts){ - $.extend(this, opts) + $.extend(this, opts); this.make(); this.set_description_from_doc(); @@ -148,7 +148,7 @@ frappe.ui.form.AssignToDialog = Class.extend({ doctype: me.doctype, name: me.docname, assign_to: args.assign_to, - bulk_assign: me.bulk_assign || false, + bulk_assign: me.bulk_assign || false, re_assign: me.re_assign || false }), btn: me.dialog.get_primary_btn(), @@ -171,7 +171,7 @@ frappe.ui.form.AssignToDialog = Class.extend({ let me = this; let assign_to = []; - if(me.dialog.get_value("assign_to_me")) { + if (me.dialog.get_value("assign_to_me")) { assign_to.push(frappe.session.user); } @@ -249,6 +249,6 @@ frappe.ui.form.AssignToDialog = Class.extend({ // Pick up priority from the source document, if it exists and is available in ToDo default: ["Low", "Medium", "High"].includes(me.frm && me.frm.doc.priority ? me.frm.doc.priority : 'Medium') } - ] + ]; } }); From 7886365c090ad1b645b63c0987af83e13366b1e9 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Wed, 15 Apr 2020 22:48:58 +0530 Subject: [PATCH 3/8] chore: code cleanup --- frappe/desk/form/assign_to.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index 8a8219eb22..be83dc957e 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -20,11 +20,11 @@ def get(args=None): if not args: args = frappe.local.form_dict - return frappe.get_all('ToDo', fields = ['owner', 'name'], filters = dict( + return frappe.get_all('ToDo', fields=['owner', 'name'], filters=dict( reference_type = args.get('doctype'), reference_name = args.get('name'), status = ('!=', 'Cancelled') - ), limit = 5) + ), limit=5) @frappe.whitelist() def add(args=None): @@ -59,7 +59,7 @@ def add(args=None): args['description'] = _('Assignment for {0} {1}').format(args['doctype'], args['name']) d = frappe.get_doc({ - "doctype":"ToDo", + "doctype": "ToDo", "owner": assign_to, "reference_type": args['doctype'], "reference_name": args['name'], @@ -86,15 +86,13 @@ def add(args=None): follow_document(args['doctype'], args['name'], assign_to) # notify - notify_assignment(d.assigned_by, d.owner, d.reference_type, d.reference_name, action='ASSIGN',\ + notify_assignment(d.assigned_by, d.owner, d.reference_type, d.reference_name, action='ASSIGN', description=args.get("description")) return get(args) @frappe.whitelist() def add_multiple(args=None): - import json - if not args: args = frappe.local.form_dict From 7dac9e2a0342809453bdb44d0588606715b5154b Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Thu, 16 Apr 2020 21:55:52 +0530 Subject: [PATCH 4/8] fix: change to multiselect pills --- .../js/frappe/form/sidebar/assign_to.js | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/frappe/public/js/frappe/form/sidebar/assign_to.js b/frappe/public/js/frappe/form/sidebar/assign_to.js index 03fba17ec7..84fde564c0 100644 --- a/frappe/public/js/frappe/form/sidebar/assign_to.js +++ b/frappe/public/js/frappe/form/sidebar/assign_to.js @@ -184,32 +184,18 @@ frappe.ui.form.AssignToDialog = Class.extend({ me.dialog.set_value("description", me.frm.doc[me.frm.meta.title_field]); } }, - set_assign_to_field_description: function() { - let me = this; - - let assignees = me.dialog.get_value("assign_to"); - let field = me.dialog.get_field("assign_to"); - let description = ""; - - if (assignees.length > 0) { - description = "Assign To: " + assignees.join(", "); - } - - field.set_description(description); - }, get_fields: function() { let me = this; return [ { - fieldtype: 'MultiSelectList', + fieldtype: 'MultiSelectPills', fieldname: 'assign_to', label: __("Assign To"), reqd: true, get_data: function(txt) { return frappe.db.get_link_options("User", txt, {user_type: "System User", enabled: 1}); - }, - onchange: () => me.set_assign_to_field_description() + } }, { label: __("Assign to me"), @@ -242,9 +228,18 @@ frappe.ui.form.AssignToDialog = Class.extend({ fieldtype: 'Select', fieldname: 'priority', options: [ - { value: 'Low', label: __('Low') }, - { value: 'Medium', label: __('Medium') }, - { value: 'High', label: __('High') } + { + value: 'Low', + label: __('Low') + }, + { + value: 'Medium', + label: __('Medium') + }, + { + value: 'High', + label: __('High') + } ], // Pick up priority from the source document, if it exists and is available in ToDo default: ["Low", "Medium", "High"].includes(me.frm && me.frm.doc.priority ? me.frm.doc.priority : 'Medium') From 606c57be5d849335513025d6ef12e1ab50613c1b Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Tue, 5 May 2020 17:35:26 +0530 Subject: [PATCH 5/8] fix: error message --- frappe/desk/form/assign_to.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index be83dc957e..6178690b1f 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -41,6 +41,9 @@ def add(args=None): if not args: args = frappe.local.form_dict + users_with_duplicate_todo = [] + shared_with_users = [] + for assign_to in json.loads(args.get("assign_to")): filters = { "reference_type": args['doctype'], @@ -50,8 +53,7 @@ def add(args=None): } if frappe.get_all("ToDo", filters=filters): - if not args.get("bulk_assign"): - frappe.throw(_("Already in user's ToDo list"), DuplicateToDoError) + users_with_duplicate_todo.append(assign_to) else: from frappe.utils import nowdate @@ -80,7 +82,7 @@ def add(args=None): # if assignee does not have permissions, share if not frappe.has_permission(doc=doc, user=assign_to): frappe.share.add(doc.doctype, doc.name, assign_to) - frappe.msgprint(_('Shared with user {0} with read access').format(assign_to, alert=True)) + shared_with_users.append(assign_to) # make this document followed by assigned user follow_document(args['doctype'], args['name'], assign_to) @@ -89,6 +91,14 @@ def add(args=None): notify_assignment(d.assigned_by, d.owner, d.reference_type, d.reference_name, action='ASSIGN', description=args.get("description")) + if shared_with_users: + user_list = format_message_for_assign_to(shared_with_users) + frappe.msgprint(_("Shared with the following Users with Read access:{0}").format(user_list, alert=True)) + + if users_with_duplicate_todo: + user_list = format_message_for_assign_to(users_with_duplicate_todo) + frappe.msgprint(_("Already in the following Users ToDo list:{0}").format(user_list, alert=True)) + return get(args) @frappe.whitelist() @@ -186,3 +196,5 @@ def notify_assignment(assigned_by, owner, doc_type, doc_name, action='CLOSE', enqueue_create_notification(owner, notification_doc) +def format_message_for_assign_to(users): + return "

" + "
".join(users) \ No newline at end of file From 04a59352f7ccaf66758632e15415395844246280 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Wed, 6 May 2020 17:40:50 +0530 Subject: [PATCH 6/8] fix: test cases --- frappe/desk/form/assign_to.py | 2 +- frappe/public/js/frappe/form/sidebar/assign_to.js | 2 +- frappe/tests/test_assign.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index 6178690b1f..6c8cd5dfbd 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -44,7 +44,7 @@ def add(args=None): users_with_duplicate_todo = [] shared_with_users = [] - for assign_to in json.loads(args.get("assign_to")): + for assign_to in frappe.parse_json(args.get("assign_to")): filters = { "reference_type": args['doctype'], "reference_name": args['name'], diff --git a/frappe/public/js/frappe/form/sidebar/assign_to.js b/frappe/public/js/frappe/form/sidebar/assign_to.js index 84fde564c0..95ceb246e6 100644 --- a/frappe/public/js/frappe/form/sidebar/assign_to.js +++ b/frappe/public/js/frappe/form/sidebar/assign_to.js @@ -130,7 +130,7 @@ frappe.ui.form.AssignToDialog = Class.extend({ this.set_description_from_doc(); }, make: function() { - let me = this + let me = this; me.dialog = new frappe.ui.Dialog({ title: __('Add to ToDo'), diff --git a/frappe/tests/test_assign.py b/frappe/tests/test_assign.py index f32e3c9272..439e1546c0 100644 --- a/frappe/tests/test_assign.py +++ b/frappe/tests/test_assign.py @@ -60,7 +60,7 @@ class TestAssign(unittest.TestCase): def assign(doc, user): return frappe.desk.form.assign_to.add({ - "assign_to": user, + "assign_to": [user], "doctype": doc.doctype, "name": doc.name, "description": 'test', From 59d1c29c986031b374ad02b65805f534ff046c47 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Mon, 18 May 2020 12:54:26 +0530 Subject: [PATCH 7/8] fix: test cases --- frappe/automation/doctype/assignment_rule/assignment_rule.py | 2 +- frappe/desk/doctype/event/test_event.py | 2 +- frappe/desk/doctype/notification_log/test_notification_log.py | 2 +- frappe/desk/form/assign_to.py | 2 +- frappe/social/doctype/energy_point_log/test_energy_point_log.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frappe/automation/doctype/assignment_rule/assignment_rule.py b/frappe/automation/doctype/assignment_rule/assignment_rule.py index 0a5d85636f..bf45347c4f 100644 --- a/frappe/automation/doctype/assignment_rule/assignment_rule.py +++ b/frappe/automation/doctype/assignment_rule/assignment_rule.py @@ -44,7 +44,7 @@ class AssignmentRule(Document): user = self.get_user() assign_to.add(dict( - assign_to = user, + assign_to = [user], doctype = doc.get('doctype'), name = doc.get('name'), description = frappe.render_template(self.description, doc), diff --git a/frappe/desk/doctype/event/test_event.py b/frappe/desk/doctype/event/test_event.py index 6d1e865a45..3bb0518964 100644 --- a/frappe/desk/doctype/event/test_event.py +++ b/frappe/desk/doctype/event/test_event.py @@ -71,7 +71,7 @@ class TestEvent(unittest.TestCase): ev = frappe.get_doc(self.test_records[0]).insert() add({ - "assign_to": "test@example.com", + "assign_to": ["test@example.com"], "doctype": "Event", "name": ev.name, "description": "Test Assignment" diff --git a/frappe/desk/doctype/notification_log/test_notification_log.py b/frappe/desk/doctype/notification_log/test_notification_log.py index fe7d56c081..e59aee30c9 100644 --- a/frappe/desk/doctype/notification_log/test_notification_log.py +++ b/frappe/desk/doctype/notification_log/test_notification_log.py @@ -13,7 +13,7 @@ class TestNotificationLog(unittest.TestCase): user = get_user() assign_task({ - "assign_to": user, + "assign_to": [user], "doctype": 'ToDo', "name": todo.name, "description": todo.description diff --git a/frappe/desk/form/assign_to.py b/frappe/desk/form/assign_to.py index 6c8cd5dfbd..a916cbca82 100644 --- a/frappe/desk/form/assign_to.py +++ b/frappe/desk/form/assign_to.py @@ -30,7 +30,7 @@ def get(args=None): def add(args=None): """add in someone's to do list args = { - "assign_to": , + "assign_to": [], "doctype": , "name": , "description": , diff --git a/frappe/social/doctype/energy_point_log/test_energy_point_log.py b/frappe/social/doctype/energy_point_log/test_energy_point_log.py index 9e4d0e6425..1ecaba9cd5 100644 --- a/frappe/social/doctype/energy_point_log/test_energy_point_log.py +++ b/frappe/social/doctype/energy_point_log/test_energy_point_log.py @@ -306,7 +306,7 @@ def get_points(user, point_type='energy_points'): def assign_users_to_todo(todo_name, users): for user in users: assign_to({ - 'assign_to': user, + 'assign_to': [user], 'doctype': 'ToDo', 'name': todo_name }) \ No newline at end of file From 365b770e5e073f4b06f3a923fdcedcea967ec3d8 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Mon, 18 May 2020 14:49:06 +0530 Subject: [PATCH 8/8] fix: test cases --- frappe/desk/doctype/event/test_event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/desk/doctype/event/test_event.py b/frappe/desk/doctype/event/test_event.py index 3bb0518964..dcfb38bd08 100644 --- a/frappe/desk/doctype/event/test_event.py +++ b/frappe/desk/doctype/event/test_event.py @@ -83,7 +83,7 @@ class TestEvent(unittest.TestCase): # add another one add({ - "assign_to": self.test_user, + "assign_to": [self.test_user], "doctype": "Event", "name": ev.name, "description": "Test Assignment"