From b3994f1a794d1f41eb77e5e89df01f1cbea56ed2 Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Tue, 5 Sep 2017 02:37:57 +0530 Subject: [PATCH 1/5] portal viewe for the newsletter --- frappe/hooks.py | 15 ++++- .../includes/newsletter/newsletter_row.html | 15 +++++ frappe/templates/pages/newsletters.html | 65 +++++++++++++++++++ frappe/templates/pages/newsletters.py | 18 +++++ 4 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 frappe/templates/includes/newsletter/newsletter_row.html create mode 100644 frappe/templates/pages/newsletters.html create mode 100644 frappe/templates/pages/newsletters.py diff --git a/frappe/hooks.py b/frappe/hooks.py index f5d98f0421..aefd1f2c61 100755 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -1,5 +1,7 @@ from __future__ import unicode_literals from . import __version__ as app_version +from frappe import _ + app_name = "frappe" app_title = "Frappe Framework" @@ -50,7 +52,18 @@ web_include_css = [ ] website_route_rules = [ {"from_route": "/blog/", "to_route": "Blog Post"}, - {"from_route": "/kb/", "to_route": "Help Article"} + {"from_route": "/kb/", "to_route": "Help Article"}, + {"from_route": "/newsletters", "to_route": "Newsletter"}, + {"from_route": "/newsletters/", "to_route": "newsletters", + "defaults": { + "doctype": "Newsletter", + "parents": [{"label": _("Newsletter"), "route": "newsletters"}] + } + } +] + +standard_portal_menu_items = [ + {"title": _("Newsletter"), "route": "/newsletters", "reference_doctype": "Newsletter"} ] write_file_keys = ["file_url", "file_name"] diff --git a/frappe/templates/includes/newsletter/newsletter_row.html b/frappe/templates/includes/newsletter/newsletter_row.html new file mode 100644 index 0000000000..466d9c97ca --- /dev/null +++ b/frappe/templates/includes/newsletter/newsletter_row.html @@ -0,0 +1,15 @@ + diff --git a/frappe/templates/pages/newsletters.html b/frappe/templates/pages/newsletters.html new file mode 100644 index 0000000000..89558f9b60 --- /dev/null +++ b/frappe/templates/pages/newsletters.html @@ -0,0 +1,65 @@ +{% extends "templates/web.html" %} + +{% block title %} {{ _("Newsletter") }} {% endblock %} + +{% block page_content %} + + +
+
+
+

{{ doc.subject }}

+

+ {{ frappe.format_date(doc.modified) }} +

+
+
+ {{ doc.message }} +
+
+ + {% if attachments %} +
+
+
+ {{ _("Attachments") }} +
+
+
+
+ {% for attachment in attachments %} +

+ + {{ attachment.file_name }} + +

+ {% endfor %} +
+
+
+ {% endif %} + +
+{% endblock %} \ No newline at end of file diff --git a/frappe/templates/pages/newsletters.py b/frappe/templates/pages/newsletters.py new file mode 100644 index 0000000000..cb1f1e9016 --- /dev/null +++ b/frappe/templates/pages/newsletters.py @@ -0,0 +1,18 @@ +# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +from frappe import _ + +def get_context(context): + context.no_cache = 1 + context.show_sidebar = True + context.doc = frappe.get_doc(frappe.form_dict.doctype, frappe.form_dict.name) + context.attachments = get_attachments(frappe.form_dict.doctype, frappe.form_dict.name) + +def get_attachments(dt, dn): + return frappe.get_all("File", + fields=["name", "file_name", "file_url", "is_private"], + filters = {"attached_to_name": dn, "attached_to_doctype": dt, "is_private":0}) From f26f4353fcd3bde63cd5db08edabcdc10a502edc Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Tue, 5 Sep 2017 11:40:15 +0530 Subject: [PATCH 2/5] minor changes in the sql query --- frappe/email/doctype/newsletter/newsletter.py | 20 ++++++++++- frappe/templates/pages/newsletters.html | 34 +++++++++---------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py index 1813b01c53..66bf8cf354 100755 --- a/frappe/email/doctype/newsletter/newsletter.py +++ b/frappe/email/doctype/newsletter/newsletter.py @@ -219,4 +219,22 @@ def send_newsletter(newsletter): frappe.db.commit() - +def get_list_context(context=None): + return { + "show_sidebar": True, + "show_search": True, + 'no_breadcrumbs': True, + "title": _("Newsletter"), + "get_list": get_newsletter_list, + "row_template": "templates/includes/newsletter/newsletter_row.html" + } + +def get_newsletter_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"): + email_group_list = frappe.db.sql('''select eg.name from `tabEmail Group` eg, `tabEmail Group Member` egm + where egm.unsubscribed=0 and eg.name=egm.email_group and egm.email = %s''', frappe.session.user) + if email_group_list: + return frappe.db.sql('''select n.name, n.subject, n.message, n.modified + from `tabNewsletter` n, `tabNewsletter Email Group` neg + where n.name = neg.parent and n.email_sent=1 and neg.email_group in %s + order by n.modified desc limit {0}, {1} + '''.format(limit_start, limit_page_length), [email_group_list], as_dict=1) diff --git a/frappe/templates/pages/newsletters.html b/frappe/templates/pages/newsletters.html index 89558f9b60..733c7df6af 100644 --- a/frappe/templates/pages/newsletters.html +++ b/frappe/templates/pages/newsletters.html @@ -40,26 +40,26 @@ - {% if attachments %} -
-
-
- {{ _("Attachments") }} + {% if attachments %} +
+
+
+ {{ _("Attachments") }} +
-
-
-
- {% for attachment in attachments %} -

- - {{ attachment.file_name }} - -

- {% endfor %} +
+
+ {% for attachment in attachments %} +

+ + {{ attachment.file_name }} + +

+ {% endfor %} +
-
- {% endif %} + {% endif %}
{% endblock %} \ No newline at end of file From d0d92d5ebda633ca9890cf229eb1bb59712e830c Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Wed, 6 Sep 2017 12:38:44 +0530 Subject: [PATCH 3/5] codacy fix and change template path --- frappe/email/doctype/newsletter/newsletter.py | 2 +- .../doctype/newsletter/templates}/newsletter_row.html | 0 frappe/templates/pages/newsletters.py | 2 -- 3 files changed, 1 insertion(+), 3 deletions(-) rename frappe/{templates/includes/newsletter => email/doctype/newsletter/templates}/newsletter_row.html (100%) diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py index 66bf8cf354..55a3073729 100755 --- a/frappe/email/doctype/newsletter/newsletter.py +++ b/frappe/email/doctype/newsletter/newsletter.py @@ -226,7 +226,7 @@ def get_list_context(context=None): 'no_breadcrumbs': True, "title": _("Newsletter"), "get_list": get_newsletter_list, - "row_template": "templates/includes/newsletter/newsletter_row.html" + "row_template": "email/doctype/newsletter/templates/newsletter_row.html", } def get_newsletter_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"): diff --git a/frappe/templates/includes/newsletter/newsletter_row.html b/frappe/email/doctype/newsletter/templates/newsletter_row.html similarity index 100% rename from frappe/templates/includes/newsletter/newsletter_row.html rename to frappe/email/doctype/newsletter/templates/newsletter_row.html diff --git a/frappe/templates/pages/newsletters.py b/frappe/templates/pages/newsletters.py index cb1f1e9016..02e0459d00 100644 --- a/frappe/templates/pages/newsletters.py +++ b/frappe/templates/pages/newsletters.py @@ -4,8 +4,6 @@ from __future__ import unicode_literals import frappe -from frappe import _ - def get_context(context): context.no_cache = 1 context.show_sidebar = True From 1bbcfc5f9fa55be1ca6b72ad2d44c55fc7dda92a Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Mon, 11 Sep 2017 11:25:26 +0530 Subject: [PATCH 4/5] webview for the newsletter --- .../email/doctype/newsletter/newsletter.json | 84 ++++++++++++++++++- frappe/email/doctype/newsletter/newsletter.py | 30 +++++-- .../newsletter/templates/newsletter.html} | 0 .../newsletter/templates/newsletter_row.html | 4 +- .../doctype/newsletter/test_newsletter.js | 23 +++++ frappe/hooks.py | 8 +- frappe/templates/pages/newsletters.py | 16 ---- 7 files changed, 131 insertions(+), 34 deletions(-) rename frappe/{templates/pages/newsletters.html => email/doctype/newsletter/templates/newsletter.html} (100%) create mode 100644 frappe/email/doctype/newsletter/test_newsletter.js delete mode 100644 frappe/templates/pages/newsletters.py diff --git a/frappe/email/doctype/newsletter/newsletter.json b/frappe/email/doctype/newsletter/newsletter.json index 4fd21e8b5e..3314b8aa61 100644 --- a/frappe/email/doctype/newsletter/newsletter.json +++ b/frappe/email/doctype/newsletter/newsletter.json @@ -15,6 +15,7 @@ "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -44,6 +45,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -74,6 +76,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -103,6 +106,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -131,6 +135,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -159,6 +164,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -170,7 +176,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 1, - "in_list_view": 0, + "in_list_view": 1, "in_standard_filter": 0, "label": "Subject", "length": 0, @@ -187,6 +193,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -198,7 +205,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_standard_filter": 0, "label": "Message", "length": 0, @@ -215,6 +222,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -245,6 +253,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -275,6 +284,68 @@ "unique": 0 }, { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Check this, if you want the Portal User to view this.", + "fieldname": "published", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Published", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "route", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Route", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -304,6 +375,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -333,6 +405,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -362,6 +435,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -391,19 +465,20 @@ "unique": 0 } ], - "has_web_view": 0, + "has_web_view": 1, "hide_heading": 0, "hide_toolbar": 0, "icon": "fa fa-envelope", "idx": 1, "image_view": 0, "in_create": 0, + "is_published_field": "published", "is_submittable": 0, "issingle": 0, "istable": 0, "max_attachments": 3, "menu_index": 0, - "modified": "2017-03-07 12:59:18.173824", + "modified": "2017-09-11 11:21:29.067493", "modified_by": "Administrator", "module": "Email", "name": "Newsletter", @@ -433,6 +508,7 @@ "quick_entry": 0, "read_only": 0, "read_only_onload": 0, + "route": "newsletters", "show_name_in_global_search": 0, "sort_order": "ASC", "title_field": "subject", diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py index 55a3073729..9fec93c4fd 100755 --- a/frappe/email/doctype/newsletter/newsletter.py +++ b/frappe/email/doctype/newsletter/newsletter.py @@ -6,7 +6,7 @@ from __future__ import unicode_literals import frappe import frappe.utils from frappe import throw, _ -from frappe.model.document import Document +from frappe.website.website_generator import WebsiteGenerator from frappe.email.queue import check_email_limit from frappe.utils.verified_command import get_signed_params, verify_request from frappe.utils.background_jobs import enqueue @@ -17,7 +17,7 @@ from frappe.utils import parse_addr from frappe.utils import validate_email_add -class Newsletter(Document): +class Newsletter(WebsiteGenerator): def onload(self): if self.email_sent: self.get("__onload").status_count = dict(frappe.db.sql("""select status, count(name) @@ -25,6 +25,7 @@ class Newsletter(Document): group by status""", (self.doctype, self.name))) or None def validate(self): + self.route = "newsletters/" + self.name if self.send_from: validate_email_add(self.send_from, True) @@ -105,6 +106,24 @@ class Newsletter(Document): throw(_("Please save the Newsletter before sending")) check_email_limit(self.recipients) + def get_context(self, context): + newsletter_list = [d.name for d in get_newsletter_list("Newsletter", None, None, 0)] + context.no_cache = 1 + context.show_sidebar = True + if self.name not in newsletter_list: + frappe.redirect_to_message(_('Permission Error'), + _("You are not permitted to view the newsletter.")) + frappe.local.flags.redirect_location = frappe.local.response.location + raise frappe.Redirect + else: + context.attachments = get_attachments(self.name) + + +def get_attachments(name): + return frappe.get_all("File", + fields=["name", "file_name", "file_url", "is_private"], + filters = {"attached_to_name": name, "attached_to_doctype": "Newsletter", "is_private":0}) + def get_email_groups(name): return frappe.db.get_all("Newsletter Email Group", ["email_group"],{"parent":name, "parenttype":"Newsletter"}) @@ -220,14 +239,15 @@ def send_newsletter(newsletter): def get_list_context(context=None): - return { + context.update({ "show_sidebar": True, "show_search": True, 'no_breadcrumbs': True, "title": _("Newsletter"), "get_list": get_newsletter_list, "row_template": "email/doctype/newsletter/templates/newsletter_row.html", - } + }) + def get_newsletter_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"): email_group_list = frappe.db.sql('''select eg.name from `tabEmail Group` eg, `tabEmail Group Member` egm @@ -235,6 +255,6 @@ def get_newsletter_list(doctype, txt, filters, limit_start, limit_page_length=20 if email_group_list: return frappe.db.sql('''select n.name, n.subject, n.message, n.modified from `tabNewsletter` n, `tabNewsletter Email Group` neg - where n.name = neg.parent and n.email_sent=1 and neg.email_group in %s + where n.name = neg.parent and n.email_sent=1 and n.published=1 and neg.email_group in %s order by n.modified desc limit {0}, {1} '''.format(limit_start, limit_page_length), [email_group_list], as_dict=1) diff --git a/frappe/templates/pages/newsletters.html b/frappe/email/doctype/newsletter/templates/newsletter.html similarity index 100% rename from frappe/templates/pages/newsletters.html rename to frappe/email/doctype/newsletter/templates/newsletter.html diff --git a/frappe/email/doctype/newsletter/templates/newsletter_row.html b/frappe/email/doctype/newsletter/templates/newsletter_row.html index 466d9c97ca..503fadb1ea 100644 --- a/frappe/email/doctype/newsletter/templates/newsletter_row.html +++ b/frappe/email/doctype/newsletter/templates/newsletter_row.html @@ -1,5 +1,5 @@ +
\ No newline at end of file diff --git a/frappe/email/doctype/newsletter/test_newsletter.js b/frappe/email/doctype/newsletter/test_newsletter.js new file mode 100644 index 0000000000..40664a439a --- /dev/null +++ b/frappe/email/doctype/newsletter/test_newsletter.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Newsletter", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Newsletter + () => frappe.tests.make('Newsletter', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/frappe/hooks.py b/frappe/hooks.py index aefd1f2c61..0d1b5f8c79 100755 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -53,13 +53,7 @@ web_include_css = [ website_route_rules = [ {"from_route": "/blog/", "to_route": "Blog Post"}, {"from_route": "/kb/", "to_route": "Help Article"}, - {"from_route": "/newsletters", "to_route": "Newsletter"}, - {"from_route": "/newsletters/", "to_route": "newsletters", - "defaults": { - "doctype": "Newsletter", - "parents": [{"label": _("Newsletter"), "route": "newsletters"}] - } - } + {"from_route": "/newsletters", "to_route": "Newsletter"} ] standard_portal_menu_items = [ diff --git a/frappe/templates/pages/newsletters.py b/frappe/templates/pages/newsletters.py deleted file mode 100644 index 02e0459d00..0000000000 --- a/frappe/templates/pages/newsletters.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe - -def get_context(context): - context.no_cache = 1 - context.show_sidebar = True - context.doc = frappe.get_doc(frappe.form_dict.doctype, frappe.form_dict.name) - context.attachments = get_attachments(frappe.form_dict.doctype, frappe.form_dict.name) - -def get_attachments(dt, dn): - return frappe.get_all("File", - fields=["name", "file_name", "file_url", "is_private"], - filters = {"attached_to_name": dn, "attached_to_doctype": dt, "is_private":0}) From 2f885191da06817027951a162fba11dc411fc95e Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Thu, 14 Sep 2017 20:48:33 +0530 Subject: [PATCH 5/5] added the test case --- .../email/doctype/newsletter/newsletter.json | 5 +-- frappe/email/doctype/newsletter/newsletter.py | 19 ++++++----- .../doctype/newsletter/test_newsletter.py | 33 +++++++++++++++---- frappe/hooks.py | 6 +--- 4 files changed, 42 insertions(+), 21 deletions(-) diff --git a/frappe/email/doctype/newsletter/newsletter.json b/frappe/email/doctype/newsletter/newsletter.json index 3314b8aa61..dce8a9e44f 100644 --- a/frappe/email/doctype/newsletter/newsletter.json +++ b/frappe/email/doctype/newsletter/newsletter.json @@ -289,7 +289,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "description": "Check this, if you want the Portal User to view this.", + "default": "0", + "description": "", "fieldname": "published", "fieldtype": "Check", "hidden": 0, @@ -478,7 +479,7 @@ "istable": 0, "max_attachments": 3, "menu_index": 0, - "modified": "2017-09-11 11:21:29.067493", + "modified": "2017-09-14 15:38:01.891251", "modified_by": "Administrator", "module": "Email", "name": "Newsletter", diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py index 9fec93c4fd..d69fae1f1d 100755 --- a/frappe/email/doctype/newsletter/newsletter.py +++ b/frappe/email/doctype/newsletter/newsletter.py @@ -107,16 +107,18 @@ class Newsletter(WebsiteGenerator): check_email_limit(self.recipients) def get_context(self, context): - newsletter_list = [d.name for d in get_newsletter_list("Newsletter", None, None, 0)] + newsletters = get_newsletter_list("Newsletter", None, None, 0) + if newsletters: + newsletter_list = [d.name for d in newsletters] + if self.name not in newsletter_list: + frappe.redirect_to_message(_('Permission Error'), + _("You are not permitted to view the newsletter.")) + frappe.local.flags.redirect_location = frappe.local.response.location + raise frappe.Redirect + else: + context.attachments = get_attachments(self.name) context.no_cache = 1 context.show_sidebar = True - if self.name not in newsletter_list: - frappe.redirect_to_message(_('Permission Error'), - _("You are not permitted to view the newsletter.")) - frappe.local.flags.redirect_location = frappe.local.response.location - raise frappe.Redirect - else: - context.attachments = get_attachments(self.name) def get_attachments(name): @@ -258,3 +260,4 @@ def get_newsletter_list(doctype, txt, filters, limit_start, limit_page_length=20 where n.name = neg.parent and n.email_sent=1 and n.published=1 and neg.email_group in %s order by n.modified desc limit {0}, {1} '''.format(limit_start, limit_page_length), [email_group_list], as_dict=1) + diff --git a/frappe/email/doctype/newsletter/test_newsletter.py b/frappe/email/doctype/newsletter/test_newsletter.py index 2b13799775..9b2f275260 100644 --- a/frappe/email/doctype/newsletter/test_newsletter.py +++ b/frappe/email/doctype/newsletter/test_newsletter.py @@ -7,24 +7,26 @@ import frappe, unittest from frappe.email.doctype.newsletter.newsletter import confirmed_unsubscribe from six.moves.urllib.parse import unquote + emails = ["test_subscriber1@example.com", "test_subscriber2@example.com", - "test_subscriber3@example.com"] + "test_subscriber3@example.com", "test1@example.com"] class TestNewsletter(unittest.TestCase): def setUp(self): + frappe.set_user("Administrator") frappe.db.sql('delete from `tabEmail Group Member`') for email in emails: frappe.get_doc({ "doctype": "Email Group Member", "email": email, "email_group": "_Test Email Group" - }).insert() + }).insert() def test_send(self): name = self.send_newsletter() email_queue_list = [frappe.get_doc('Email Queue', e.name) for e in frappe.get_all("Email Queue")] - self.assertEquals(len(email_queue_list), 3) + self.assertEquals(len(email_queue_list), 4) recipients = [e.recipients[0].recipient for e in email_queue_list] for email in emails: self.assertTrue(email in recipients) @@ -41,13 +43,14 @@ class TestNewsletter(unittest.TestCase): name = self.send_newsletter() email_queue_list = [frappe.get_doc('Email Queue', e.name) for e in frappe.get_all("Email Queue")] - self.assertEquals(len(email_queue_list), 2) + self.assertEquals(len(email_queue_list), 3) recipients = [e.recipients[0].recipient for e in email_queue_list] for email in emails: if email != to_unsubscribe: self.assertTrue(email in recipients) - def send_newsletter(self): + @staticmethod + def send_newsletter(published=0): frappe.db.sql("delete from `tabEmail Queue`") frappe.db.sql("delete from `tabEmail Queue Recipient`") frappe.db.sql("delete from `tabNewsletter`") @@ -55,7 +58,8 @@ class TestNewsletter(unittest.TestCase): "doctype": "Newsletter", "subject": "_Test Newsletter", "send_from": "Test Sender ", - "message": "Testing my news." + "message": "Testing my news.", + "published": published }).insert(ignore_permissions=True) newsletter.append("email_group", {"email_group": "_Test Email Group"}) @@ -63,4 +67,21 @@ class TestNewsletter(unittest.TestCase): newsletter.send_emails() return newsletter.name + def test_portal(self): + self.send_newsletter(1) + frappe.set_user("test1@example.com") + from frappe.email.doctype.newsletter.newsletter import get_newsletter_list + newsletters = get_newsletter_list("Newsletter", None, None, 0) + self.assertEquals(len(newsletters), 1) + + def test_newsletter_context(self): + context = frappe._dict() + newsletter_name = self.send_newsletter(1) + frappe.set_user("test2@example.com") + doc = frappe.get_doc("Newsletter", newsletter_name) + doc.get_context(context) + self.assertEquals(context.no_cache, 1) + self.assertTrue("attachments" not in context.keys()) + + test_dependencies = ["Email Group"] diff --git a/frappe/hooks.py b/frappe/hooks.py index 0d1b5f8c79..9bdd8352a6 100755 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -1,6 +1,5 @@ from __future__ import unicode_literals from . import __version__ as app_version -from frappe import _ app_name = "frappe" @@ -50,16 +49,13 @@ bootstrap = "assets/frappe/css/bootstrap.css" web_include_css = [ "assets/css/frappe-web.css" ] + website_route_rules = [ {"from_route": "/blog/", "to_route": "Blog Post"}, {"from_route": "/kb/", "to_route": "Help Article"}, {"from_route": "/newsletters", "to_route": "Newsletter"} ] -standard_portal_menu_items = [ - {"title": _("Newsletter"), "route": "/newsletters", "reference_doctype": "Newsletter"} -] - write_file_keys = ["file_url", "file_name"] notification_config = "frappe.core.notifications.get_notification_config"