You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

159 line
4.7 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. """assign/unassign to ToDo"""
  5. import frappe
  6. from frappe import _
  7. from frappe.desk.form.load import get_docinfo
  8. class DuplicateToDoError(frappe.ValidationError): pass
  9. def get(args=None):
  10. """get assigned to"""
  11. if not args:
  12. args = frappe.local.form_dict
  13. get_docinfo(frappe.get_doc(args.get("doctype"), args.get("name")))
  14. return frappe.db.sql("""select owner, description from `tabToDo`
  15. where reference_type=%(doctype)s and reference_name=%(name)s and status="Open"
  16. order by modified desc limit 5""", args, as_dict=True)
  17. @frappe.whitelist()
  18. def add(args=None):
  19. """add in someone's to do list
  20. args = {
  21. "assign_to": ,
  22. "doctype": ,
  23. "name": ,
  24. "description":
  25. }
  26. """
  27. if not args:
  28. args = frappe.local.form_dict
  29. if frappe.db.sql("""select owner from `tabToDo`
  30. where reference_type=%(doctype)s and reference_name=%(name)s and status="Open"
  31. and owner=%(assign_to)s""", args):
  32. frappe.throw(_("Already in user's To Do list"), DuplicateToDoError)
  33. else:
  34. from frappe.utils import nowdate
  35. # if args.get("re_assign"):
  36. # remove_from_todo_if_already_assigned(args['doctype'], args['name'])
  37. d = frappe.get_doc({
  38. "doctype":"ToDo",
  39. "owner": args['assign_to'],
  40. "reference_type": args['doctype'],
  41. "reference_name": args['name'],
  42. "description": args.get('description'),
  43. "priority": args.get("priority", "Medium"),
  44. "status": "Open",
  45. "date": args.get('date', nowdate()),
  46. "assigned_by": args.get('assigned_by', frappe.session.user),
  47. }).insert(ignore_permissions=True)
  48. # set assigned_to if field exists
  49. if frappe.get_meta(args['doctype']).get_field("assigned_to"):
  50. frappe.db.set_value(args['doctype'], args['name'], "assigned_to", args['assign_to'])
  51. # notify
  52. notify_assignment(d.assigned_by, d.owner, d.reference_type, d.reference_name, action='ASSIGN',\
  53. description=args.get("description"), notify=args.get('notify'))
  54. return get(args)
  55. @frappe.whitelist()
  56. def add_multiple(args=None):
  57. import json
  58. if not args:
  59. args = frappe.local.form_dict
  60. docname_list = json.loads(args['name'])
  61. for docname in docname_list:
  62. args.update({"name": docname})
  63. add(args)
  64. def remove_from_todo_if_already_assigned(doctype, docname):
  65. owner = frappe.db.get_value("ToDo", {"reference_type": doctype, "reference_name": docname, "status":"Open"}, "owner")
  66. if owner:
  67. remove(doctype, docname, owner)
  68. @frappe.whitelist()
  69. def remove(doctype, name, assign_to):
  70. """remove from todo"""
  71. try:
  72. todo = frappe.db.get_value("ToDo", {"reference_type":doctype, "reference_name":name, "owner":assign_to, "status":"Open"})
  73. if todo:
  74. todo = frappe.get_doc("ToDo", todo)
  75. todo.status = "Closed"
  76. todo.save(ignore_permissions=True)
  77. notify_assignment(todo.assigned_by, todo.owner, todo.reference_type, todo.reference_name)
  78. except frappe.DoesNotExistError:
  79. pass
  80. # clear assigned_to if field exists
  81. if frappe.get_meta(doctype).get_field("assigned_to"):
  82. frappe.db.set_value(doctype, name, "assigned_to", None)
  83. return get({"doctype": doctype, "name": name})
  84. def clear(doctype, name):
  85. for assign_to in frappe.db.sql_list("""select owner from `tabToDo`
  86. where reference_type=%(doctype)s and reference_name=%(name)s""", locals()):
  87. remove(doctype, name, assign_to)
  88. def notify_assignment(assigned_by, owner, doc_type, doc_name, action='CLOSE',
  89. description=None, notify=0):
  90. """
  91. Notify assignee that there is a change in assignment
  92. """
  93. if not (assigned_by and owner and doc_type and doc_name): return
  94. # self assignment / closing - no message
  95. if assigned_by==owner:
  96. return
  97. from frappe.boot import get_fullnames
  98. user_info = get_fullnames()
  99. # Search for email address in description -- i.e. assignee
  100. from frappe.utils import get_link_to_form
  101. assignment = get_link_to_form(doc_type, doc_name, label="%s: %s" % (doc_type, doc_name))
  102. owner_name = user_info.get(owner, {}).get('fullname')
  103. user_name = user_info.get(frappe.session.get('user'), {}).get('fullname')
  104. if action=='CLOSE':
  105. if owner == frappe.session.get('user'):
  106. arg = {
  107. 'contact': assigned_by,
  108. 'txt': _("The task {0}, that you assigned to {1}, has been closed.").format(assignment,
  109. owner_name)
  110. }
  111. else:
  112. arg = {
  113. 'contact': assigned_by,
  114. 'txt': _("The task {0}, that you assigned to {1}, has been closed by {2}.").format(assignment,
  115. owner_name, user_name)
  116. }
  117. else:
  118. description_html = "<p>{0}</p>".format(description)
  119. arg = {
  120. 'contact': owner,
  121. 'txt': _("A new task, {0}, has been assigned to you by {1}. {2}").format(assignment,
  122. user_name, description_html),
  123. 'notify': notify
  124. }
  125. arg["parenttype"] = "Assignment"
  126. from frappe.desk.page.chat import chat
  127. chat.post(**arg)