171 lines
4.7 KiB
Python
171 lines
4.7 KiB
Python
import frappe
|
|
import json
|
|
|
|
def get_email_accounts(user=None):
|
|
if not user:
|
|
user = frappe.session.user
|
|
|
|
email_accounts = []
|
|
|
|
accounts = frappe.get_all("User Email", filters={ "parent": user },
|
|
fields=["email_account", "email_id", "enable_outgoing"],
|
|
distinct=True, order_by="idx")
|
|
|
|
if not accounts:
|
|
return {
|
|
"email_accounts": [],
|
|
"all_accounts": ""
|
|
}
|
|
|
|
all_accounts = ",".join([ account.get("email_account") for account in accounts ])
|
|
if len(accounts) > 1:
|
|
email_accounts.append({
|
|
"email_account": all_accounts,
|
|
"email_id": "All Accounts"
|
|
})
|
|
email_accounts.extend(accounts)
|
|
|
|
email_accounts.extend([
|
|
{
|
|
"email_account": "Sent",
|
|
"email_id": "Sent Mail"
|
|
},
|
|
{
|
|
"email_account": "Spam",
|
|
"email_id": "Spam"
|
|
},
|
|
{
|
|
"email_account": "Trash",
|
|
"email_id": "Trash"
|
|
}
|
|
])
|
|
|
|
return {
|
|
"email_accounts": email_accounts,
|
|
"all_accounts": all_accounts
|
|
}
|
|
|
|
@frappe.whitelist()
|
|
def create_email_flag_queue(names, action, flag="(\\Seen)"):
|
|
""" create email flag queue to mark email either as read or unread """
|
|
class Found(Exception):
|
|
pass
|
|
|
|
if not all([names, action, flag]):
|
|
return
|
|
|
|
for name in json.loads(names or []):
|
|
uid, seen_status, email_account = frappe.db.get_value("Communication", name,
|
|
["ifnull(uid, -1)", "ifnull(seen, 0)", "email_account"])
|
|
|
|
if not uid or uid == -1:
|
|
continue
|
|
|
|
seen = 1 if action == "Read" else 0
|
|
# check if states are correct
|
|
if (action =='Read' and seen_status == 0) or (action =='Unread' and seen_status == 1):
|
|
try:
|
|
queue = frappe.db.sql("""select name, action, flag from `tabEmail Flag Queue`
|
|
where communication = %(name)s""", {"name":name}, as_dict=True)
|
|
for q in queue:
|
|
# is same email with same flag
|
|
if q.flag == flag:
|
|
# to prevent flag local and server states being out of sync
|
|
if q.action != action:
|
|
frappe.delete_doc("Email Flag Queue", q.name)
|
|
raise Found
|
|
|
|
flag_queue = frappe.get_doc({
|
|
"uid": uid,
|
|
"flag": flag,
|
|
"action": action,
|
|
"communication": name,
|
|
"doctype": "Email Flag Queue",
|
|
"email_account": email_account
|
|
})
|
|
flag_queue.save(ignore_permissions=True);
|
|
frappe.db.set_value("Communication", name, "seen", seen,
|
|
update_modified=False)
|
|
except Found:
|
|
pass
|
|
|
|
@frappe.whitelist()
|
|
def mark_as_trash(communication):
|
|
"""set email status to trash"""
|
|
frappe.db.set_value("Communication", communication, "email_status", "Trash")
|
|
|
|
@frappe.whitelist()
|
|
def mark_as_spam(communication, sender):
|
|
""" set email status to spam """
|
|
email_rule = frappe.db.get_value("Email Rule", { "email_id": sender })
|
|
if not email_rule:
|
|
frappe.get_doc({
|
|
"doctype": "Email Rule",
|
|
"email_id": sender,
|
|
"is_spam": 1
|
|
}).insert(ignore_permissions=True)
|
|
frappe.db.set_value("Communication", communication, "email_status", "Spam")
|
|
|
|
def link_communication_to_document(doc, reference_doctype, reference_name, ignore_communication_links):
|
|
if not ignore_communication_links:
|
|
doc.reference_doctype = reference_doctype
|
|
doc.reference_name = reference_name
|
|
doc.status = "Linked"
|
|
doc.save(ignore_permissions=True)
|
|
|
|
@frappe.whitelist()
|
|
def make_issue_from_communication(communication, ignore_communication_links=False):
|
|
""" raise a issue from email """
|
|
|
|
doc = frappe.get_doc("Communication", communication)
|
|
issue = frappe.get_doc({
|
|
"doctype": "Issue",
|
|
"subject": doc.subject,
|
|
"raised_by": doc.sender
|
|
}).insert(ignore_permissions=True)
|
|
|
|
link_communication_to_document(doc, "Issue", issue.name, ignore_communication_links)
|
|
|
|
return issue.name
|
|
|
|
@frappe.whitelist()
|
|
def make_lead_from_communication(communication, ignore_communication_links=False):
|
|
""" raise a issue from email """
|
|
|
|
doc = frappe.get_doc("Communication", communication)
|
|
frappe.errprint(doc.sender_full_name)
|
|
lead_name = frappe.db.get_value("Lead", {"email_id": doc.sender})
|
|
if not lead_name:
|
|
lead = frappe.get_doc({
|
|
"doctype": "Lead",
|
|
"lead_name": doc.sender_full_name,
|
|
"email_id": doc.sender
|
|
})
|
|
lead.flags.ignore_mandatory = True
|
|
lead.flags.ignore_permissions = True
|
|
lead.insert()
|
|
|
|
lead_name = lead.name
|
|
|
|
link_communication_to_document(doc, "Lead", lead_name, ignore_communication_links)
|
|
return lead_name
|
|
|
|
@frappe.whitelist()
|
|
def make_opportunity_from_communication(communication, ignore_communication_links=False):
|
|
doc = frappe.get_doc("Communication", communication)
|
|
|
|
lead = doc.reference_name if doc.reference_doctype == "Lead" else None
|
|
if not lead:
|
|
lead = make_lead_from_communication(communication, ignore_communication_links=True)
|
|
|
|
enquiry_from = "Lead"
|
|
|
|
opportunity = frappe.get_doc({
|
|
"doctype": "Opportunity",
|
|
"enquiry_from": enquiry_from,
|
|
"lead": lead
|
|
}).insert(ignore_permissions=True)
|
|
|
|
link_communication_to_document(doc, "Opportunity", opportunity.name, ignore_communication_links)
|
|
|
|
return opportunity.name
|