[mailbox] removed separate email settings for jobs, sales, support

This commit is contained in:
Rushabh Mehta 2014-09-15 16:59:38 +05:30
parent 7fb79f6062
commit 5cdc8e560c
32 changed files with 106 additions and 651 deletions

View File

@ -155,7 +155,7 @@ def get_data():
},
{
"type": "doctype",
"name": "Jobs Email Settings",
"name": "Email Account",
"description": _("Setup incoming server for jobs email id. (e.g. jobs@example.com)")
},
]

View File

@ -158,7 +158,7 @@ def get_data():
},
{
"type": "doctype",
"name": "Sales Email Settings",
"name": "Email Account",
"description": _("Setup incoming server for sales email id. (e.g. sales@example.com)")
},
{

View File

@ -73,21 +73,6 @@ def get_data():
"name": "Email Digest",
"description": _("Create and manage daily, weekly and monthly email digests.")
},
{
"type": "doctype",
"name": "Support Email Settings",
"description": _("Setup incoming server for support email id. (e.g. support@example.com)")
},
{
"type": "doctype",
"name": "Sales Email Settings",
"description": _("Setup incoming server for sales email id. (e.g. sales@example.com)")
},
{
"type": "doctype",
"name": "Jobs Email Settings",
"description": _("Setup incoming server for jobs email id. (e.g. jobs@example.com)")
},
{
"type": "doctype",
"name": "SMS Settings",

View File

@ -49,7 +49,7 @@ def get_data():
"items": [
{
"type": "doctype",
"name": "Support Email Settings",
"name": "Email Account",
"description": _("Setup incoming server for support email id. (e.g. support@example.com)")
},
]

View File

@ -33,13 +33,6 @@ class SellingController(StockController):
self.validate_max_discount()
check_active_sales_items(self)
def get_sender(self, comm):
sender = None
if cint(frappe.db.get_value('Sales Email Settings', None, 'extract_emails')):
sender = frappe.db.get_value('Sales Email Settings', None, 'email_id')
return sender or comm.sender or frappe.session.user
def set_missing_values(self, for_validate=False):
super(SellingController, self).set_missing_values(for_validate)

View File

@ -8,28 +8,16 @@ from frappe import msgprint, _, throw
from frappe.model.document import Document
status_map = {
"Contact": [
["Replied", "communication_sent"],
["Open", "communication_received"]
],
"Job Applicant": [
["Replied", "communication_sent"],
["Open", "communication_received"]
],
"Lead": [
["Replied", "communication_sent"],
["Converted", "has_customer"],
["Opportunity", "has_opportunity"],
["Open", "communication_received"],
],
"Opportunity": [
["Draft", None],
["Submitted", "eval:self.docstatus==1"],
["Lost", "eval:self.status=='Lost'"],
["Quotation", "has_quotation"],
["Replied", "communication_sent"],
["Cancelled", "eval:self.docstatus==2"],
["Open", "communication_received"],
],
"Quotation": [
["Draft", None],
@ -46,10 +34,6 @@ status_map = {
["Stopped", "eval:self.status=='Stopped'"],
["Cancelled", "eval:self.docstatus==2"],
],
"Support Ticket": [
["Replied", "communication_sent"],
["Open", "communication_received"]
],
}
class StatusUpdater(Document):
@ -90,25 +74,6 @@ class StatusUpdater(Document):
if update:
frappe.db.set_value(self.doctype, self.name, "status", self.status)
def on_communication(self):
if not self.get("communications"): return
self.communication_set = True
self.get("communications").sort(key=lambda d: d.creation)
self.set_status(update=True)
del self.communication_set
def communication_received(self):
if getattr(self, "communication_set", False):
last_comm = self.get("communications")
if last_comm:
return last_comm[-1].sent_or_received == "Received"
def communication_sent(self):
if getattr(self, "communication_set", False):
last_comm = self.get("communications")
if last_comm:
return last_comm[-1].sent_or_received == "Sent"
def validate_qty(self):
"""
Validates qty at row level

View File

@ -38,11 +38,6 @@ doc_events = {
}
scheduler_events = {
"all": [
"erpnext.support.doctype.support_ticket.get_support_mails.get_support_mails",
"erpnext.hr.doctype.job_applicant.get_job_applications.get_job_applications",
"erpnext.selling.doctype.lead.get_leads.get_leads"
],
"daily": [
"erpnext.controllers.recurring_document.create_recurring_documents",
"erpnext.stock.utils.reorder_item",
@ -57,3 +52,6 @@ scheduler_events = {
]
}
default_mail_footer = """<div style="padding: 7px; text-align: right; color: #888"><small>
<a style="color: #888" href="https://erpnext.com">Sent via ERPNext</a></div>"""

View File

@ -1,47 +0,0 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import frappe
from frappe.utils import cstr, cint
from frappe.email.receive import POP3Server
from frappe.core.doctype.communication.communication import _make
class JobsMailbox(POP3Server):
def setup(self, args=None):
self.settings = args or frappe.get_doc("Jobs Email Settings", "Jobs Email Settings")
def process_message(self, mail):
if mail.from_email == self.settings.email_id:
return
name = frappe.db.get_value("Job Applicant", {"email_id": mail.from_email},
"name")
if name:
applicant = frappe.get_doc("Job Applicant", name)
if applicant.status!="Rejected":
applicant.status = "Open"
applicant.ignore_permissions = True
applicant.save()
else:
name = (mail.from_real_name and (mail.from_real_name + " - ") or "") \
+ mail.from_email
applicant = frappe.get_doc({
"creation": mail.date,
"doctype":"Job Applicant",
"applicant_name": name,
"email_id": mail.from_email,
"status": "Open"
})
applicant.ignore_permissions = True
applicant.ignore_mandatory = True
applicant.insert()
mail.save_attachments_in_doc(applicant)
_make(content=mail.content, sender=mail.from_email, subject=mail.subject or "No Subject",
doctype="Job Applicant", name=applicant.name, sent_or_received="Received")
def get_job_applications():
if cint(frappe.db.get_value('Jobs Email Settings', None, 'extract_emails')):
JobsMailbox()

View File

@ -5,13 +5,9 @@
from __future__ import unicode_literals
import frappe
from erpnext.utilities.transaction_base import TransactionBase
from frappe.model.document import Document
from frappe.utils import extract_email_id
class JobApplicant(TransactionBase):
def get_sender(self, comm):
return frappe.db.get_value('Jobs Email Settings',None,'email_id') or comm.sender or frappe.session.user
class JobApplicant(Document):
def validate(self):
self.set_status()

View File

@ -10,9 +10,9 @@ def execute():
"Comment", "Communication", "Company", "Contact Us Settings",
"Country", "Currency", "Currency Exchange", "Deduction Type", "Department",
"Designation", "Earning Type", "Event", "Feed", "File Data", "Fiscal Year",
"HR Settings", "Industry Type", "Jobs Email Settings", "Leave Type", "Letter Head",
"HR Settings", "Industry Type", "Leave Type", "Letter Head",
"Mode of Payment", "Module Def", "Naming Series", "POS Setting", "Print Heading",
"Report", "Role", "Sales Email Settings", "Selling Settings", "Stock Settings", "Supplier Type", "UOM"):
"Report", "Role", "Selling Settings", "Stock Settings", "Supplier Type", "UOM"):
try:
frappe.reset_perms(doctype)
except:

View File

@ -5,6 +5,16 @@ from __future__ import unicode_literals
import frappe
def execute():
print "WARNING!!!! Email Settings not migrated. Please setup your email again."
# this will happen if you are migrating very old accounts
# comment out this line below and remember to create new Email Accounts
# for incoming and outgoing mails
raise Exception
return
frappe.reload_doc("core", "doctype", "outgoing_email_settings")
frappe.reload_doc("support", "doctype", "support_email_settings")
@ -12,7 +22,6 @@ def execute():
map_outgoing_email_settings(email_settings)
map_support_email_settings(email_settings)
frappe.delete_doc("DocType", "Email Settings")
def map_outgoing_email_settings(email_settings):
outgoing_email_settings = frappe.get_doc("Outgoing Email Settings")

View File

@ -6,6 +6,7 @@ import frappe
from erpnext.setup.install import default_mail_footer
def execute():
return
mail_footer = frappe.db.get_default('mail_footer') or ''
mail_footer += default_mail_footer
frappe.db.set_value("Outgoing Email Settings", "Outgoing Email Settings", "footer", mail_footer)

View File

@ -0,0 +1,73 @@
import frappe
def execute():
frappe.reload_doc("email", "doctype", "email_account")
# outgoing
outgoing = frappe.get_doc("Outgoing Email Settings")
account = frappe.new_doc("Email Account")
mapping = {
"email_id": "mail_login",
"password": "mail_password",
"footer": "footer",
"smtp_server": "mail_server",
"smtp_port": "mail_port",
"use_tls": "use_ssl"
}
for target_fieldname, source_fieldname in mapping.iteritems():
account.set(target_fieldname, outgoing.get(source_fieldname))
account.enable_outgoing = 1
account.enable_incoming = 0
account.is_global = 1
account.insert()
# support
support = frappe.get_doc("Support Email Settings")
account = frappe.new_doc("Email Account")
mapping = {
"enable_incoming": "sync_support_mails",
"email_id": "mail_login",
"password": "mail_password",
"pop3_server": "mail_server",
"use_ssl": "use_ssl",
"signature": "support_signature",
"enable_auto_reply": "send_autoreply",
"auto_reply_message": "support_autoreply"
}
for target_fieldname, source_fieldname in mapping.iteritems():
account.set(target_fieldname, support.get(source_fieldname))
account.enable_outgoing = 0
account.is_global = 1
account.insert()
# sales, jobs
for doctype in ("Sales Email Settings", "Jobs Email Settings"):
source = frappe.get_doc(doctype)
account = frappe.new_doc("Email Account")
mapping = {
"enable_incoming": "extract_emails",
"email_id": "username",
"password": "password",
"pop3_server": "host",
"use_ssl": "use_ssl",
}
for target_fieldname, source_fieldname in mapping.iteritems():
account.set(target_fieldname, source.get(source_fieldname))
account.enable_outgoing = 0
account.is_global = 1
account.append_to = "Lead" if doctype=="Sales Email Settings" else "Job Applicant"
account.insert()
for doctype in ("Outgoing Email Settings", "Support Email Settings",
"Sales Email Settings", "Jobs Email Settings"):
frappe.delete_doc("DocType", doctype)

View File

@ -1,53 +0,0 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import frappe
from frappe.utils import cstr, cint
from frappe.email.receive import POP3Server
from frappe.core.doctype.communication.communication import _make
def add_sales_communication(subject, content, sender, real_name, mail=None,
status="Open", date=None):
lead_name = frappe.db.get_value("Lead", {"email_id": sender})
contact_name = frappe.db.get_value("Contact", {"email_id": sender})
if not (lead_name or contact_name):
# none, create a new Lead
lead = frappe.get_doc({
"doctype":"Lead",
"lead_name": real_name or sender,
"email_id": sender,
"status": status,
"source": "Email"
})
lead.ignore_permissions = True
lead.ignore_mandatory = True
lead.insert()
lead_name = lead.name
parent_doctype = "Contact" if contact_name else "Lead"
parent_name = contact_name or lead_name
message = _make(content=content, sender=sender, subject=subject,
doctype = parent_doctype, name = parent_name, date=date, sent_or_received="Received")
if mail:
# save attachments to parent if from mail
doc = frappe.get_doc(parent_doctype, parent_name)
mail.save_attachments_in_doc(doc)
class SalesMailbox(POP3Server):
def setup(self, args=None):
self.settings = args or frappe.get_doc("Sales Email Settings", "Sales Email Settings")
def process_message(self, mail):
if mail.from_email == self.settings.email_id:
return
add_sales_communication(mail.subject, mail.content, mail.from_email,
mail.from_real_name, mail=mail, date=mail.date)
def get_leads():
if cint(frappe.db.get_value('Sales Email Settings', None, 'extract_emails')):
SalesMailbox()

View File

@ -1 +0,0 @@
Settings to extract job applications via email (POP).

View File

@ -1,15 +0,0 @@
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
// For license information, please see license.txt
cur_frm.cscript = {
refresh: function(doc) {
cur_frm.set_intro("");
if(doc.extract_emails) {
cur_frm.set_intro(__("Active: Will extract emails from ") + doc.email_id);
} else {
cur_frm.set_intro(__("Not Active"));
}
}
}

View File

@ -1,73 +0,0 @@
{
"creation": "2013-01-15 16:50:01.000000",
"description": "Email settings for jobs email id \"jobs@example.com\"",
"docstatus": 0,
"doctype": "DocType",
"fields": [
{
"description": "Settings to extract Job Applicants from a mailbox e.g. \"jobs@example.com\"",
"fieldname": "pop3_mail_settings",
"fieldtype": "Section Break",
"label": "POP3 Mail Settings",
"permlevel": 0
},
{
"description": "Check to activate",
"fieldname": "extract_emails",
"fieldtype": "Check",
"label": "Extract Emails",
"permlevel": 0
},
{
"description": "Email Id where a job applicant will email e.g. \"jobs@example.com\"",
"fieldname": "email_id",
"fieldtype": "Data",
"label": "Email Id",
"permlevel": 0
},
{
"description": "POP3 server e.g. (pop.gmail.com)",
"fieldname": "host",
"fieldtype": "Data",
"label": "Host",
"permlevel": 0
},
{
"fieldname": "use_ssl",
"fieldtype": "Check",
"label": "Use SSL",
"permlevel": 0
},
{
"fieldname": "username",
"fieldtype": "Data",
"label": "Username",
"permlevel": 0
},
{
"fieldname": "password",
"fieldtype": "Password",
"label": "Password",
"permlevel": 0
}
],
"icon": "icon-cog",
"idx": 1,
"issingle": 1,
"modified": "2013-12-20 19:23:16.000000",
"modified_by": "Administrator",
"module": "Setup",
"name": "Jobs Email Settings",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"email": 1,
"permlevel": 0,
"print": 1,
"read": 1,
"role": "System Manager",
"write": 1
}
]
}

View File

@ -1,19 +0,0 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.utils import cint
from frappe.model.document import Document
class JobsEmailSettings(Document):
def validate(self):
if cint(self.extract_emails) and not (self.email_id and self.host and \
self.username and self.password):
frappe.throw(_("""Host, Email and Password required if emails are to be pulled"""))

View File

@ -1 +0,0 @@
Settings for creating new Communication, Leads from sales inbox like "sales@example.com" via POP3.

View File

@ -1,15 +0,0 @@
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
// For license information, please see license.txt
cur_frm.cscript = {
refresh: function(doc) {
cur_frm.set_intro("");
if(doc.extract_emails) {
cur_frm.set_intro(__("Active: Will extract emails from ") + doc.email_id);
} else {
cur_frm.set_intro(__("Not Active"));
}
}
}

View File

@ -1,73 +0,0 @@
{
"creation": "2013-01-16 10:25:26.000000",
"description": "Email settings to extract Leads from sales email id e.g. \"sales@example.com\"",
"docstatus": 0,
"doctype": "DocType",
"fields": [
{
"description": "Email settings to extract Leads from sales email id e.g. \"sales@example.com\"",
"fieldname": "pop3_mail_settings",
"fieldtype": "Section Break",
"label": "POP3 Mail Settings",
"permlevel": 0
},
{
"description": "Check to activate",
"fieldname": "extract_emails",
"fieldtype": "Check",
"label": "Extract Emails",
"permlevel": 0
},
{
"description": "Email Id where a job applicant will email e.g. \"jobs@example.com\"",
"fieldname": "email_id",
"fieldtype": "Data",
"label": "Email Id",
"permlevel": 0
},
{
"description": "POP3 server e.g. (pop.gmail.com)",
"fieldname": "host",
"fieldtype": "Data",
"label": "Host",
"permlevel": 0
},
{
"fieldname": "use_ssl",
"fieldtype": "Check",
"label": "Use SSL",
"permlevel": 0
},
{
"fieldname": "username",
"fieldtype": "Data",
"label": "Username",
"permlevel": 0
},
{
"fieldname": "password",
"fieldtype": "Password",
"label": "Password",
"permlevel": 0
}
],
"icon": "icon-cog",
"idx": 1,
"issingle": 1,
"modified": "2013-12-20 19:21:38.000000",
"modified_by": "Administrator",
"module": "Setup",
"name": "Sales Email Settings",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"email": 1,
"permlevel": 0,
"print": 1,
"read": 1,
"role": "System Manager",
"write": 1
}
]
}

View File

@ -1,20 +0,0 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.utils import cint
from frappe.model.document import Document
class SalesEmailSettings(Document):
def validate(self):
if cint(self.extract_emails) and not (self.email_id and self.host and \
self.username and self.password):
frappe.msgprint(_("""Host, Email and Password required if emails are to be pulled"""),
raise_exception=True)

View File

@ -52,6 +52,3 @@ def set_single_defaults():
pass
frappe.db.set_default("date_format", "dd-mm-yyyy")
frappe.db.set_value("Outgoing Email Settings", "Outgoing Email Settings", "footer",
default_mail_footer)

View File

@ -192,9 +192,6 @@ class SerialNo(StockController):
self.set_sales_details(last_sle.get("delivery_sle"))
self.set_maintenance_status()
def on_communication(self):
return
def process_serial_no(sle):
item_det = get_item_details(sle.item_code)
validate_serial_no(sle, item_det)

View File

@ -1,92 +0,0 @@
{
"allow_copy": 1,
"creation": "2014-03-03 19:48:46.000000",
"description": "Email Settings for Outgoing and Incoming Emails.",
"docstatus": 0,
"doctype": "DocType",
"fields": [
{
"description": "Check this to pull emails from your mailbox",
"fieldname": "sync_support_mails",
"fieldtype": "Check",
"label": "Sync Support Mails",
"permlevel": 0
},
{
"description": "Your support email id - must be a valid email - this is where your emails will come!",
"fieldname": "support_email",
"fieldtype": "Data",
"label": "Support Email",
"permlevel": 0
},
{
"description": "POP3 mail server (e.g. pop.gmail.com)",
"fieldname": "mail_server",
"fieldtype": "Data",
"label": "POP3 Mail Server",
"permlevel": 0
},
{
"fieldname": "use_ssl",
"fieldtype": "Check",
"label": "Use SSL",
"permlevel": 0
},
{
"fieldname": "mail_login",
"fieldtype": "Data",
"label": "User Name",
"permlevel": 0
},
{
"fieldname": "mail_password",
"fieldtype": "Password",
"label": "Support Password",
"permlevel": 0
},
{
"fieldname": "cb1",
"fieldtype": "Column Break",
"permlevel": 0
},
{
"description": "Signature to be appended at the end of every email",
"fieldname": "support_signature",
"fieldtype": "Text",
"label": "Signature",
"permlevel": 0
},
{
"default": "1",
"fieldname": "send_autoreply",
"fieldtype": "Check",
"label": "Send Autoreply",
"permlevel": 0
},
{
"description": "Autoreply when a new mail is received",
"fieldname": "support_autoreply",
"fieldtype": "Text",
"label": "Custom Autoreply Message",
"permlevel": 0
}
],
"icon": "icon-cog",
"idx": 1,
"in_create": 1,
"issingle": 1,
"modified": "2014-03-03 20:20:34.000000",
"modified_by": "Administrator",
"module": "Support",
"name": "Support Email Settings",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"permlevel": 0,
"read": 1,
"role": "System Manager",
"write": 1
}
]
}

View File

@ -1,45 +0,0 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.utils import cint
from frappe.model.document import Document
from frappe.email.receive import POP3Server
import _socket, poplib
class SupportEmailSettings(Document):
def validate(self):
"""
Checks support ticket email settings
"""
if cint(self.sync_support_mails) and self.mail_server and not frappe.local.flags.in_patch:
inc_email = frappe._dict(self.as_dict())
# inc_email.encode()
inc_email.host = self.mail_server
inc_email.use_ssl = self.use_ssl
try:
err_msg = _('User Name or Support Password missing. Please enter and try again.')
if not (self.mail_login and self.mail_password):
raise AttributeError, err_msg
inc_email.username = self.mail_login
inc_email.password = self.mail_password
except AttributeError, e:
frappe.msgprint(err_msg)
raise
pop_mb = POP3Server(inc_email)
try:
pop_mb.connect()
except _socket.error, e:
# Invalid mail server -- due to refusing connection
frappe.msgprint(_('Invalid Mail Server. Please rectify and try again.'))
raise
except poplib.error_proto, e:
frappe.msgprint(_('Invalid User Name or Support Password. Please rectify and try again.'))
raise

View File

@ -1,87 +0,0 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import frappe
from frappe.utils import cstr, cint, decode_dict, today
from frappe.email import sendmail
from frappe.email.receive import POP3Server
from frappe.core.doctype.communication.communication import _make
class SupportMailbox(POP3Server):
def setup(self, args=None):
self.email_settings = frappe.get_doc("Support Email Settings", "Support Email Settings")
self.settings = args or frappe._dict({
"use_ssl": self.email_settings.use_ssl,
"host": self.email_settings.mail_server,
"username": self.email_settings.mail_login,
"password": self.email_settings.mail_password
})
def process_message(self, mail):
if mail.from_email == self.email_settings.get('support_email'):
return
thread_id = mail.get_thread_id()
new_ticket = False
if not (thread_id and frappe.db.exists("Support Ticket", thread_id)):
new_ticket = True
ticket = add_support_communication(mail.subject, mail.content, mail.from_email,
docname=None if new_ticket else thread_id, mail=mail)
if new_ticket and cint(self.email_settings.send_autoreply) and \
"mailer-daemon" not in mail.from_email.lower():
self.send_auto_reply(ticket)
def send_auto_reply(self, d):
signature = self.email_settings.get('support_signature') or ''
response = self.email_settings.get('support_autoreply') or ("""
A new Ticket has been raised for your query. If you have any additional information, please
reply back to this mail.
### We will get back to you as soon as possible
---
Original Query:
""" + d.description + "\n\n---\n\n" + cstr(signature))
sendmail(\
recipients = [cstr(d.raised_by)], \
sender = cstr(self.email_settings.get('support_email')), \
subject = '['+cstr(d.name)+'] ' + cstr(d.subject), \
msg = cstr(response))
def get_support_mails():
if cint(frappe.db.get_value('Support Email Settings', None, 'sync_support_mails')):
SupportMailbox()
def add_support_communication(subject, content, sender, docname=None, mail=None):
if docname:
ticket = frappe.get_doc("Support Ticket", docname)
ticket.status = 'Open'
ticket.ignore_permissions = True
ticket.save()
else:
ticket = frappe.get_doc(decode_dict({
"doctype":"Support Ticket",
"description": content,
"subject": subject,
"raised_by": sender,
"content_type": mail.content_type if mail else None,
"status": "Open",
}))
ticket.ignore_permissions = True
ticket.ignore_mandatory = True
ticket.insert()
_make(content=content, sender=sender, subject = subject,
doctype="Support Ticket", name=ticket.name,
date=mail.date if mail else today(), sent_or_received="Received")
if mail:
mail.save_attachments_in_doc(ticket)
return ticket

View File

@ -5,26 +5,13 @@ from __future__ import unicode_literals
import frappe
from frappe import _
from erpnext.utilities.transaction_base import TransactionBase
from frappe.utils import now, extract_email_id
from frappe.model.document import Document
from frappe.utils import now
class SupportTicket(TransactionBase):
class SupportTicket(Document):
def get_feed(self):
return "{0}: {1}".format(_(self.status, self.subject))
def get_sender(self, comm):
return frappe.db.get_value('Support Email Settings',None,'support_email')
def get_subject(self, comm):
return '[' + self.name + '] ' + (comm.subject or 'No Subject Specified')
def get_content(self, comm):
signature = frappe.db.get_value('Support Email Settings',None,'support_signature')
content = comm.content
if signature:
content += '<p>' + signature + '</p>'
return content
def get_portal_page(self):
return "ticket"

View File

@ -7,19 +7,14 @@ import frappe
@frappe.whitelist(allow_guest=True)
def send_message(subject="Website Query", message="", sender="", status="Open"):
from frappe.templates.pages.contact import send_message as website_send_message
res = website_send_message(subject, message, sender)
if not res:
return
website_send_message(subject, message, sender)
if subject=="Support":
# create support ticket
from erpnext.support.doctype.support_ticket.get_support_mails import add_support_communication
add_support_communication(subject, message, sender, mail=None)
else:
# make lead / communication
from erpnext.selling.doctype.lead.get_leads import add_sales_communication
add_sales_communication(subject or "Website Query", message, sender, sender,
mail=None, status=status)
return res
comm = frappe.get_doc({
"doctype":"Communication",
"subject": subject,
"content": message,
"sender": sender,
"sent_or_received": "Received"
})
comm.insert(ignore_permissions=True)