From de85a3af15393945891711587abfd0c25ab6e5e3 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 22 Jul 2014 19:48:26 +0530 Subject: [PATCH] Newsletter: Bulk Send via worker --- .../support/doctype/newsletter/newsletter.py | 19 ++++++++---- erpnext/tasks.py | 29 +++++++++++++++++++ 2 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 erpnext/tasks.py diff --git a/erpnext/support/doctype/newsletter/newsletter.py b/erpnext/support/doctype/newsletter/newsletter.py index 88040e21b41..aaf4ddf9500 100644 --- a/erpnext/support/doctype/newsletter/newsletter.py +++ b/erpnext/support/doctype/newsletter/newsletter.py @@ -8,11 +8,12 @@ import frappe.utils from frappe.utils import cstr from frappe import throw, _ from frappe.model.document import Document +import erpnext.tasks class Newsletter(Document): def onload(self): if self.email_sent: - self.get("__onload").status_count = dict(frappe.db.sql("""select status, count(*) + self.get("__onload").status_count = dict(frappe.db.sql("""select status, count(name) from `tabBulk Email` where ref_doctype=%s and ref_docname=%s group by status""", (self.doctype, self.name))) or None @@ -28,7 +29,13 @@ class Newsletter(Document): throw(_("Newsletter has already been sent")) self.recipients = self.get_recipients() - self.send_bulk() + + if frappe.local.is_ajax: + # to avoid request timed out! + self.validate_send() + erpnext.tasks.send_newsletter.delay(frappe.local.site, self.name) + else: + self.send_bulk() frappe.msgprint(_("Scheduled to send to {0} recipients").format(len(self.recipients))) @@ -77,6 +84,10 @@ class Newsletter(Document): return email_list def send_bulk(self): + if not self.get("recipients"): + # in case it is called via worker + self.recipients = self.get_recipients() + self.validate_send() sender = self.send_from or frappe.utils.get_formatted_email(self.owner) @@ -98,10 +109,6 @@ class Newsletter(Document): if self.get("__islocal"): throw(_("Please save the Newsletter before sending")) - from frappe import conf - if (conf.get("status") or None) == "Trial": - throw(_("Newsletters is not allowed for Trial users")) - @frappe.whitelist() def get_lead_options(): return { diff --git a/erpnext/tasks.py b/erpnext/tasks.py new file mode 100644 index 00000000000..da2ab03ccc3 --- /dev/null +++ b/erpnext/tasks.py @@ -0,0 +1,29 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# MIT License. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe.celery_app import celery_task, task_logger + +@celery_task() +def send_newsletter(site, newsletter): + try: + frappe.connect(site=site) + doc = frappe.get_doc("Newsletter", newsletter) + doc.send_bulk() + + except: + frappe.db.rollback() + task_logger.warn(frappe.get_traceback()) + + # wasn't able to send emails :( + doc.db_set("email_sent", 0) + frappe.db.commit() + + raise + + else: + frappe.db.commit() + + finally: + frappe.destroy()