From ef0c6b44f7f3c8a33d43bd68ee20f229fab401cd Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 22 May 2015 17:04:25 +0530 Subject: [PATCH] [email] consistent email, website branding --- frappe/email/bulk.py | 6 +- frappe/email/email_body.py | 5 + .../public/js/frappe/views/communication.js | 1 + frappe/templates/emails/print_link.html | 2 +- frappe/templates/emails/standard.html | 3 +- frappe/templates/includes/footer/footer.html | 13 +- frappe/utils/data.py | 3 +- frappe/utils/verified_command.py | 5 + .../website_settings/website_settings.json | 437 +++++++++--------- .../website_settings/website_settings.py | 2 +- 10 files changed, 249 insertions(+), 228 deletions(-) diff --git a/frappe/email/bulk.py b/frappe/email/bulk.py index 7ba0c9d815..73a30aadac 100644 --- a/frappe/email/bulk.py +++ b/frappe/email/bulk.py @@ -121,9 +121,9 @@ def check_bulk_limit(recipients): BulkLimitCrossedError) def add_unsubscribe_link(message, email, reference_doctype, reference_name, unsubscribe_url, unsubscribe_message): - unsubscribe_link = """
- {email}. {unsubscribe_message}. + unsubscribe_link = """
+ {email} {unsubscribe_message}.
""".format(unsubscribe_url = unsubscribe_url, email= _("This email was sent to {0}").format(email), diff --git a/frappe/email/email_body.py b/frappe/email/email_body.py index 979452fa56..dd0698a5fe 100644 --- a/frappe/email/email_body.py +++ b/frappe/email/email_body.py @@ -235,6 +235,11 @@ def get_footer(footer=None): footer += "" + company_address = frappe.db.get_default("email_footer_address") + + if company_address: + footer += '
{0}
'.format(company_address) + if not cint(frappe.db.get_default("disable_standard_email_footer")): for default_mail_footer in frappe.get_hooks("default_mail_footer"): footer += default_mail_footer diff --git a/frappe/public/js/frappe/views/communication.js b/frappe/public/js/frappe/views/communication.js index 52065badc7..7af8baf71c 100644 --- a/frappe/public/js/frappe/views/communication.js +++ b/frappe/public/js/frappe/views/communication.js @@ -395,6 +395,7 @@ frappe.views.CommunicationComposer = Class.extend({ $(this.dialog.fields_dict.recipients.input) .bind( "keydown", function(event) { if (event.keyCode === $.ui.keyCode.TAB && + $(this).data( "autocomplete" ) && $(this).data( "autocomplete" ).menu.active ) { event.preventDefault(); } diff --git a/frappe/templates/emails/print_link.html b/frappe/templates/emails/print_link.html index 4e69190fa3..dde65ef68d 100644 --- a/frappe/templates/emails/print_link.html +++ b/frappe/templates/emails/print_link.html @@ -1,3 +1,3 @@

- {{ _("View this in your browser") }} + {{ _("View this in your browser") }}

diff --git a/frappe/templates/emails/standard.html b/frappe/templates/emails/standard.html index 6e4129d9a8..47dece3aed 100644 --- a/frappe/templates/emails/standard.html +++ b/frappe/templates/emails/standard.html @@ -12,7 +12,8 @@
- diff --git a/frappe/templates/includes/footer/footer.html b/frappe/templates/includes/footer/footer.html index a02ffdbd41..ca1f0a1441 100644 --- a/frappe/templates/includes/footer/footer.html +++ b/frappe/templates/includes/footer/footer.html @@ -18,8 +18,9 @@
{% if facebook_share or google_plus_one or twitter_share or linked_in_share %} -
@@ -52,4 +53,4 @@
{% block extension %}{% include "templates/includes/footer/footer_extension.html" %}{% endblock %}
- \ No newline at end of file + diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 8ce4f5cb44..9aa7e127bf 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -578,7 +578,8 @@ def compare(val1, condition, val2): def scrub_urls(html): html = expand_relative_urls(html) - html = quote_urls(html) + # encoding should be responsibility of the composer + # html = quote_urls(html) return html def expand_relative_urls(html): diff --git a/frappe/utils/verified_command.py b/frappe/utils/verified_command.py index dad7a2216e..82491c1250 100644 --- a/frappe/utils/verified_command.py +++ b/frappe/utils/verified_command.py @@ -16,6 +16,8 @@ def get_signed_params(params): if not isinstance(params, basestring): params = urllib.urlencode(params) + print params + signature = hmac.new(params) signature.update(get_secret()) return params + "&_signature=" + signature.hexdigest() @@ -31,6 +33,9 @@ def verify_request(): params, signature = query_string.split("&_signature=") given_signature = hmac.new(params.encode("utf-8")) + + print params + given_signature.update(get_secret()) valid = signature == given_signature.hexdigest() diff --git a/frappe/website/doctype/website_settings/website_settings.json b/frappe/website/doctype/website_settings/website_settings.json index f8c4cdcc24..9df4654b72 100644 --- a/frappe/website/doctype/website_settings/website_settings.json +++ b/frappe/website/doctype/website_settings/website_settings.json @@ -1,292 +1,299 @@ { - "creation": "2013-04-30 12:58:46", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Other", + "creation": "2013-04-30 12:58:46", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Other", "fields": [ { - "fieldname": "sb0", - "fieldtype": "Section Break", - "label": "Landing Page", + "fieldname": "sb0", + "fieldtype": "Section Break", + "label": "Landing Page", "permlevel": 0 - }, - { - "description": "Link that is the website home page. Standard Links (index, login, products, blog, about, contact)", - "fieldname": "home_page", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Home Page", - "options": "", - "permlevel": 0, + }, + { + "description": "Link that is the website home page. Standard Links (index, login, products, blog, about, contact)", + "fieldname": "home_page", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Home Page", + "options": "", + "permlevel": 0, "reqd": 0 - }, + }, { - "description": "If checked, the Home page will be the default Item Group for the website.", - "fieldname": "home_page_is_products", - "fieldtype": "Check", - "in_list_view": 1, - "label": "Home Page is Products", + "description": "If checked, the Home page will be the default Item Group for the website.", + "fieldname": "home_page_is_products", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Home Page is Products", "permlevel": 0 - }, + }, { - "fieldname": "cb4", - "fieldtype": "Column Break", + "fieldname": "cb4", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "description": "Show title in browser window as \"Prefix - title\"", - "fieldname": "title_prefix", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Title Prefix", + "description": "Show title in browser window as \"Prefix - title\"", + "fieldname": "title_prefix", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Title Prefix", "permlevel": 0 - }, + }, { - "fieldname": "section_break_6", - "fieldtype": "Section Break", - "permlevel": 0, + "fieldname": "section_break_6", + "fieldtype": "Section Break", + "permlevel": 0, "precision": "" - }, - { - "default": "Standard", - "fieldname": "website_theme", - "fieldtype": "Link", - "label": "Website Theme", - "options": "Website Theme", - "permlevel": 0, + }, + { + "default": "Standard", + "fieldname": "website_theme", + "fieldtype": "Link", + "label": "Website Theme", + "options": "Website Theme", + "permlevel": 0, "precision": "" - }, - { - "fieldname": "website_theme_image", - "fieldtype": "Image", - "hidden": 1, - "label": "Website Theme Image", - "options": "website_theme_image_link", - "permlevel": 0, + }, + { + "fieldname": "website_theme_image", + "fieldtype": "Image", + "hidden": 1, + "label": "Website Theme Image", + "options": "website_theme_image_link", + "permlevel": 0, "precision": "" - }, + }, { - "fieldname": "website_theme_image_link", - "fieldtype": "Small Text", - "hidden": 1, - "label": "Website Theme Image Link", - "permlevel": 0, + "fieldname": "website_theme_image_link", + "fieldtype": "Small Text", + "hidden": 1, + "label": "Website Theme Image Link", + "permlevel": 0, "precision": "" - }, + }, { - "description": "Add a banner to the site. (small banners are usually good)", - "fieldname": "banner", - "fieldtype": "Section Break", - "label": "Banner", + "description": "Add a banner to the site. (small banners are usually good)", + "fieldname": "banner", + "fieldtype": "Section Break", + "label": "Banner", "permlevel": 0 - }, + }, { - "description": "Select an image of approx width 150px with a transparent background for best results.", - "fieldname": "banner_image", - "fieldtype": "Attach Image", - "label": "Banner Image", - "options": "", + "description": "Select an image of approx width 150px with a transparent background for best results.", + "fieldname": "banner_image", + "fieldtype": "Attach Image", + "label": "Banner Image", + "options": "", "permlevel": 0 - }, + }, { - "fieldname": "set_banner_from_image", - "fieldtype": "Button", - "label": "Set Banner from Image", + "fieldname": "set_banner_from_image", + "fieldtype": "Button", + "label": "Set Banner from Image", "permlevel": 0 - }, + }, { - "fieldname": "column_break_14", - "fieldtype": "Column Break", - "permlevel": 0, + "fieldname": "column_break_14", + "fieldtype": "Column Break", + "permlevel": 0, "precision": "" - }, + }, { - "description": "Banner is above the Top Menu Bar.", - "fieldname": "banner_html", - "fieldtype": "Small Text", - "label": "Banner HTML", + "description": "Banner is above the Top Menu Bar.", + "fieldname": "banner_html", + "fieldtype": "Small Text", + "label": "Banner HTML", "permlevel": 0 - }, + }, { - "description": "Menu items in the Top Bar. For setting the color of the Top Bar, go to selected Website Theme.", - "fieldname": "top_bar", - "fieldtype": "Section Break", - "label": "Top Bar", + "description": "Menu items in the Top Bar. For setting the color of the Top Bar, go to selected Website Theme.", + "fieldname": "top_bar", + "fieldtype": "Section Break", + "label": "Top Bar", "permlevel": 0 - }, + }, { - "description": "Brand is what appears on the top-left of the toolbar. If it is an image, make sure it\nhas a transparent background and use the <img /> tag. Keep size as 200px x 30px", - "fieldname": "brand_html", - "fieldtype": "Small Text", - "label": "Brand HTML", + "description": "Brand is what appears on the top-left of the toolbar. If it is an image, make sure it\nhas a transparent background and use the <img /> tag. Keep size as 200px x 30px", + "fieldname": "brand_html", + "fieldtype": "Small Text", + "label": "Brand HTML", "permlevel": 0 - }, + }, { - "fieldname": "top_bar_items", - "fieldtype": "Table", - "label": "Top Bar Items", - "options": "Top Bar Item", + "fieldname": "top_bar_items", + "fieldtype": "Table", + "label": "Top Bar Items", + "options": "Top Bar Item", "permlevel": 0 - }, + }, { - "description": "Sidebar Links for Home Page only", - "fieldname": "sidebar", - "fieldtype": "Section Break", - "label": "Sidebar", + "description": "Sidebar Links for Home Page only", + "fieldname": "sidebar", + "fieldtype": "Section Break", + "label": "Sidebar", "permlevel": 0 - }, + }, { - "fieldname": "sidebar_items", - "fieldtype": "Table", - "label": "Sidebar Items", - "options": "Top Bar Item", + "fieldname": "sidebar_items", + "fieldtype": "Table", + "label": "Sidebar Items", + "options": "Top Bar Item", "permlevel": 0 - }, + }, { - "fieldname": "footer", - "fieldtype": "Section Break", - "label": "Footer", + "fieldname": "footer", + "fieldtype": "Section Break", + "label": "Footer", "permlevel": 0 - }, + }, { - "fieldname": "copyright", - "fieldtype": "Data", - "label": "Copyright", + "fieldname": "copyright", + "fieldtype": "Data", + "label": "Copyright", "permlevel": 0 - }, + }, { - "description": "Address and other legal information you may want to put in the footer.", - "fieldname": "address", - "fieldtype": "Text Editor", - "label": "Address", + "description": "Address and other legal information you may want to put in the footer.", + "fieldname": "address", + "fieldtype": "Text Editor", + "label": "Address", "permlevel": 0 - }, + }, { - "fieldname": "footer_items", - "fieldtype": "Table", - "label": "Footer Items", - "options": "Top Bar Item", + "fieldname": "footer_items", + "fieldtype": "Table", + "label": "Footer Items", + "options": "Top Bar Item", "permlevel": 0 - }, + }, { - "fieldname": "integrations", - "fieldtype": "Section Break", - "label": "Integrations", + "fieldname": "hide_footer_signup", + "fieldtype": "Check", + "label": "Hide Footer Signup", + "permlevel": 0, + "precision": "" + }, + { + "fieldname": "integrations", + "fieldtype": "Section Break", + "label": "Integrations", "permlevel": 0 - }, + }, { - "description": "Add Google Analytics ID: eg. UA-89XXX57-1. Please search help on Google Analytics for more information.", - "fieldname": "google_analytics_id", - "fieldtype": "Data", - "label": "Google Analytics ID", + "description": "Add Google Analytics ID: eg. UA-89XXX57-1. Please search help on Google Analytics for more information.", + "fieldname": "google_analytics_id", + "fieldtype": "Data", + "label": "Google Analytics ID", "permlevel": 0 - }, + }, { - "fieldname": "column_break_17", - "fieldtype": "Column Break", + "fieldname": "column_break_17", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "fieldname": "google_plus_one", - "fieldtype": "Check", - "label": "Google Plus One", + "fieldname": "google_plus_one", + "fieldtype": "Check", + "label": "Google Plus One", "permlevel": 0 - }, + }, { - "fieldname": "facebook_share", - "fieldtype": "Check", - "label": "Facebook Share", + "fieldname": "facebook_share", + "fieldtype": "Check", + "label": "Facebook Share", "permlevel": 0 - }, + }, { - "fieldname": "linked_in_share", - "fieldtype": "Check", - "label": "Linked In Share", + "fieldname": "linked_in_share", + "fieldtype": "Check", + "label": "Linked In Share", "permlevel": 0 - }, + }, { - "fieldname": "twitter_share", - "fieldtype": "Check", - "label": "Twitter Share", + "fieldname": "twitter_share", + "fieldtype": "Check", + "label": "Twitter Share", "permlevel": 0 - }, + }, { - "description": "Tweet will be shared via your user account (if specified)", - "fieldname": "twitter_share_via", - "fieldtype": "Data", - "label": "Twitter Share via", + "description": "Tweet will be shared via your user account (if specified)", + "fieldname": "twitter_share_via", + "fieldtype": "Data", + "label": "Twitter Share via", "permlevel": 0 - }, + }, { - "fieldname": "misc_section", - "fieldtype": "Section Break", - "label": "Misc", + "fieldname": "misc_section", + "fieldtype": "Section Break", + "label": "Misc", "permlevel": 0 - }, + }, { - "description": "An icon file with .ico extension. Should be 16 x 16 px. Generated using a favicon generator. [favicon-generator.org]", - "fieldname": "favicon", - "fieldtype": "Attach", - "label": "FavIcon", - "options": "", + "description": "An icon file with .ico extension. Should be 16 x 16 px. Generated using a favicon generator. [favicon-generator.org]", + "fieldname": "favicon", + "fieldtype": "Attach", + "label": "FavIcon", + "options": "", "permlevel": 0 - }, - { - "description": "Sub-domain provided by erpnext.com", - "fieldname": "subdomain", - "fieldtype": "Text", - "label": "Subdomain", - "permlevel": 0, - "read_only": 1, + }, + { + "description": "Sub-domain provided by erpnext.com", + "fieldname": "subdomain", + "fieldtype": "Text", + "label": "Subdomain", + "permlevel": 0, + "read_only": 1, "reqd": 0 - }, + }, { - "fieldname": "column_break_28", - "fieldtype": "Column Break", + "fieldname": "column_break_28", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "description": "Disable Customer Signup link in Login page", - "fieldname": "disable_signup", - "fieldtype": "Check", - "label": "Disable Signup", + "description": "Disable Customer Signup link in Login page", + "fieldname": "disable_signup", + "fieldtype": "Check", + "label": "Disable Signup", "permlevel": 0 } - ], - "icon": "icon-cog", - "idx": 1, - "issingle": 1, - "max_attachments": 10, - "modified": "2015-02-21 08:48:35.438463", - "modified_by": "Administrator", - "module": "Website", - "name": "Website Settings", - "owner": "Administrator", + ], + "icon": "icon-cog", + "idx": 1, + "issingle": 1, + "max_attachments": 10, + "modified": "2015-05-22 07:32:01.899112", + "modified_by": "Administrator", + "module": "Website", + "name": "Website Settings", + "owner": "Administrator", "permissions": [ { - "cancel": 0, - "create": 1, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "Website Manager", - "share": 1, - "submit": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "Website Manager", + "share": 1, + "submit": 0, "write": 1 - }, - { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 1, - "read": 1, - "report": 0, - "role": "All", + }, + { + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "permlevel": 1, + "read": 1, + "report": 0, + "role": "All", "submit": 0 } ] -} +} \ No newline at end of file diff --git a/frappe/website/doctype/website_settings/website_settings.py b/frappe/website/doctype/website_settings/website_settings.py index f36b7f0dde..ff9696dfd8 100644 --- a/frappe/website/doctype/website_settings/website_settings.py +++ b/frappe/website/doctype/website_settings/website_settings.py @@ -95,7 +95,7 @@ def get_website_settings(): settings = frappe.get_doc("Website Settings", "Website Settings") for k in ["banner_html", "brand_html", "copyright", "twitter_share_via", "favicon", "facebook_share", "google_plus_one", "twitter_share", "linked_in_share", - "disable_signup"]: + "disable_signup", "hide_footer_signup"]: if hasattr(settings, k): context[k] = settings.get(k)