[newsletter] fixed tests
diff --git a/erpnext/crm/doctype/newsletter/newsletter.json b/erpnext/crm/doctype/newsletter/newsletter.json
index b17a386..a18c7b3 100644
--- a/erpnext/crm/doctype/newsletter/newsletter.json
+++ b/erpnext/crm/doctype/newsletter/newsletter.json
@@ -30,7 +30,7 @@
"label": "Sender",
"no_copy": 1,
"permlevel": 0,
- "reqd": 1
+ "reqd": 0
},
{
"fieldname": "email_sent",
@@ -78,7 +78,7 @@
],
"icon": "icon-envelope",
"idx": 1,
- "modified": "2015-03-18 08:19:24.393173",
+ "modified": "2015-03-19 07:39:53.550198",
"modified_by": "Administrator",
"module": "CRM",
"name": "Newsletter",
diff --git a/erpnext/crm/doctype/newsletter/newsletter.py b/erpnext/crm/doctype/newsletter/newsletter.py
index 66fd264..29376fa 100644
--- a/erpnext/crm/doctype/newsletter/newsletter.py
+++ b/erpnext/crm/doctype/newsletter/newsletter.py
@@ -7,13 +7,14 @@
import frappe.utils
from frappe import throw, _
from frappe.model.document import Document
+from frappe.utils.verified_command import verify_request
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(name)
- from `tabBulk Email` where ref_doctype=%s and ref_docname=%s
+ from `tabBulk Email` where reference_doctype=%s and reference_name=%s
group by status""", (self.doctype, self.name))) or None
def test_send(self, doctype="Lead"):
@@ -41,10 +42,6 @@
frappe.db.set(self, "email_sent", 1)
- def get_recipients(self):
- """Get recipients from Newsletter List"""
- return frappe.db.get_all("Newsletter List Subscriber", ["email"], {"unsubscribed": 0})
-
def send_bulk(self):
if not self.get("recipients"):
# in case it is called via worker
@@ -61,12 +58,18 @@
send(recipients = self.recipients, sender = sender,
subject = self.subject, message = self.message,
- ref_doctype = self.doctype, ref_docname = self.name,
- unsubscribe_url = "/api/method/erpnext.crm.doctype.newsletter.newsletter.unsubscribe?name=%s&email={email}" % self.name)
+ reference_doctype = self.doctype, reference_name = self.name,
+ unsubscribe_method = "/api/method/erpnext.crm.doctype.newsletter.newsletter.unsubscribe",
+ unsubscribe_params = {"name": self.name})
if not frappe.flags.in_test:
frappe.db.auto_commit_on_many_writes = False
+ def get_recipients(self):
+ """Get recipients from Newsletter List"""
+ return [d.email for d in frappe.db.get_all("Newsletter List Subscriber", ["email"],
+ {"unsubscribed": 0, "newsletter_list": self.newsletter_list})]
+
def validate_send(self):
if self.get("__islocal"):
throw(_("Please save the Newsletter before sending"))
@@ -85,10 +88,13 @@
def unsubscribe(email, name):
from frappe.email.bulk import return_unsubscribed_page
- name = frappe.db.get_value("Newsletter List Subscriber", {"email": email, "newsletter_list": name})
+ if not verify_request():
+ return
+
+ subs_id = frappe.db.get_value("Newsletter List Subscriber", {"email": email, "newsletter_list": name})
if name:
- subscriber = frappe.get_doc("Newsletter List Subscriber", name)
- subscriber.unsubscribe = 1
+ subscriber = frappe.get_doc("Newsletter List Subscriber", subs_id)
+ subscriber.unsubscribed = 1
subscriber.save(ignore_permissions=True)
return_unsubscribed_page(email)
diff --git a/erpnext/crm/doctype/newsletter/test_newsletter.py b/erpnext/crm/doctype/newsletter/test_newsletter.py
index b924321..ce1d2d1 100644
--- a/erpnext/crm/doctype/newsletter/test_newsletter.py
+++ b/erpnext/crm/doctype/newsletter/test_newsletter.py
@@ -4,40 +4,41 @@
import frappe, unittest
+from erpnext.crm.doctype.newsletter.newsletter import unsubscribe
+from urllib import unquote
+
class TestNewsletter(unittest.TestCase):
- def test_get_recipients_lead(self):
- w = frappe.get_doc(test_records[0])
- w.insert()
- self.assertTrue("test_lead@example.com" in w.get_recipients())
- frappe.db.sql("""delete from `tabBulk Email`""")
- w.send_emails()
- self.assertTrue(frappe.db.get_value("Bulk Email", {"recipient": "test_lead@example.com"}))
+ def setUp(self):
+ frappe.db.sql("update `tabNewsletter List Subscriber` set unsubscribed = 0")
- def test_get_recipients_lead_by_status(self):
- w = frappe.get_doc(test_records[0])
- w.lead_status="Converted"
- w.insert()
- self.assertTrue("test_lead3@example.com" in w.get_recipients())
+ def test_send(self):
+ self.send_newsletter()
+ self.assertEquals(len(frappe.get_all("Bulk Email")), 3)
- def test_get_recipients_contact_customer(self):
- w = frappe.get_doc(test_records[1])
- w.insert()
- self.assertTrue("test_contact_customer@example.com" in w.get_recipients())
+ def test_unsubscribe(self):
+ # test unsubscribe
+ self.send_newsletter()
- def test_get_recipients_contact_supplier(self):
- w = frappe.get_doc(test_records[1])
- w.contact_type="Supplier"
- w.insert()
- self.assertTrue("test_contact_supplier@example.com" in w.get_recipients())
+ email = unquote(frappe.local.flags.signed_query_string.split("email=")[1].split("&")[0])
- def test_get_recipients_custom(self):
- w = frappe.get_doc(test_records[2])
- w.insert()
- self.assertTrue("test_custom2@example.com" in w.get_recipients())
- self.assertTrue(frappe.db.get("Lead",
- {"email_id": "test_custom2@example.com"}))
+ unsubscribe(email, "_Test Newsletter List")
+
+ self.send_newsletter()
+ self.assertEquals(len(frappe.get_all("Bulk Email")), 2)
+
+ def send_newsletter(self):
+ frappe.db.sql("delete from `tabBulk Email`")
+ frappe.delete_doc("Newsletter", "_Test Newsletting")
+ newsletter = frappe.get_doc({
+ "doctype": "Newsletter",
+ "subject": "_Test Newsletting",
+ "newsletter_list": "_Test Newsletter List",
+ "send_from": "Test Sender <test_sender@example.com>",
+ "message": "Testing my news."
+ }).insert(ignore_permissions=True)
+
+ newsletter.send_emails()
-test_dependencies = ["Lead", "Contact"]
-test_records = frappe.get_test_records('Newsletter')
+test_dependencies = ["Newsletter List"]
diff --git a/erpnext/crm/doctype/newsletter/test_records.json b/erpnext/crm/doctype/newsletter/test_records.json
deleted file mode 100644
index cceabca..0000000
--- a/erpnext/crm/doctype/newsletter/test_records.json
+++ /dev/null
@@ -1,26 +0,0 @@
-[
- {
- "doctype": "Newsletter",
- "lead_source": "All",
- "message": "This is a test newsletter",
- "send_from": "admin@example.com",
- "send_to_type": "Lead",
- "subject": "_Test Newsletter to Lead"
- },
- {
- "contact_type": "Customer",
- "doctype": "Newsletter",
- "message": "This is a test newsletter",
- "send_from": "admin@example.com",
- "send_to_type": "Contact",
- "subject": "_Test Newsletter to Contact"
- },
- {
- "doctype": "Newsletter",
- "email_list": "test_custom@example.com, test_custom1@example.com, test_custom2@example.com",
- "message": "This is a test newsletter",
- "send_from": "admin@example.com",
- "send_to_type": "Custom",
- "subject": "_Test Newsletter to Custom"
- }
-]
\ No newline at end of file
diff --git a/erpnext/crm/doctype/newsletter_list/test_records.json b/erpnext/crm/doctype/newsletter_list/test_records.json
new file mode 100644
index 0000000..5afc9df
--- /dev/null
+++ b/erpnext/crm/doctype/newsletter_list/test_records.json
@@ -0,0 +1,21 @@
+[
+ {
+ "doctype": "Newsletter List",
+ "title": "_Test Newsletter List"
+ },
+ {
+ "doctype": "Newsletter List Subscriber",
+ "email": "test_subscriber1@example.com",
+ "newsletter_list": "_Test Newsletter List"
+ },
+ {
+ "doctype": "Newsletter List Subscriber",
+ "email": "test_subscriber2@example.com",
+ "newsletter_list": "_Test Newsletter List"
+ },
+ {
+ "doctype": "Newsletter List Subscriber",
+ "email": "test_subscriber3@example.com",
+ "newsletter_list": "_Test Newsletter List"
+ }
+]
diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py
index c73f9f5..9c73c60 100644
--- a/erpnext/utilities/transaction_base.py
+++ b/erpnext/utilities/transaction_base.py
@@ -78,9 +78,9 @@
self.compare_values(ref_doc, val["compare_fields"])
def compare_values(self, ref_doc, fields, doc=None):
- for ref_doctype, ref_dn_list in ref_doc.items():
- for ref_docname in ref_dn_list:
- prevdoc_values = frappe.db.get_value(ref_doctype, ref_docname,
+ for reference_doctype, ref_dn_list in ref_doc.items():
+ for reference_name in ref_dn_list:
+ prevdoc_values = frappe.db.get_value(reference_doctype, reference_name,
[d[0] for d in fields], as_dict=1)
for field, condition in fields: