diff --git a/webnotes/__init__.py b/webnotes/__init__.py index 56478c139d..df30cb4e43 100644 --- a/webnotes/__init__.py +++ b/webnotes/__init__.py @@ -109,6 +109,7 @@ def init(site, sites_path=None): local.restrictions = None local.user_perms = {} local.test_objects = {} + local.jenv = None setup_module_map() @@ -544,11 +545,8 @@ def get_list(doctype, filters=None, fields=None, docstatus=None, group_by=group_by, order_by=order_by, limit_start=limit_start, limit_page_length=limit_page_length, as_list=as_list, debug=debug) -jenv = None - def get_jenv(): - global jenv - if not jenv: + if not local.jenv: from jinja2 import Environment, ChoiceLoader, PackageLoader, DebugUndefined import webnotes.utils @@ -567,7 +565,9 @@ def get_jenv(): "_": _ }) - return jenv + local.jenv = jenv + + return local.jenv def set_filters(jenv): from webnotes.utils import global_date_format diff --git a/webnotes/core/doctype/communication/communication.py b/webnotes/core/doctype/communication/communication.py index afc2e72d3d..8dce5ee0ee 100644 --- a/webnotes/core/doctype/communication/communication.py +++ b/webnotes/core/doctype/communication/communication.py @@ -37,7 +37,7 @@ def make(doctype=None, name=None, content=None, subject=None, sent_or_received = raise webnotes.PermissionError("You are not allowed to send emails related to: {doctype} {name}".format( doctype=doctype, name=name)) - _send(doctype=doctype, name=name, content=content, subject=subject, sent_or_received=sent_or_received, + _make(doctype=doctype, name=name, content=content, subject=subject, sent_or_received=sent_or_received, sender=sender, recipients=recipients, communication_medium=communication_medium, send_email=send_email, print_html=print_html, attachments=attachments, send_me_a_copy=send_me_a_copy, set_lead=set_lead, date=date) @@ -116,9 +116,13 @@ def send_comm_email(d, name, sent_via=None, print_html=None, attachments='[]', s d.content = sent_via.get_content(d) footer = set_portal_link(sent_via, d) - + + send_print_in_body = webnotes.conn.get_value("Email Settings", None, "send_print_in_body_and_attachment") + if not send_print_in_body: + d.content += "

Please see attachment for document details.

" + mail = get_email(d.recipients, sender=d.sender, subject=d.subject, - msg=d.content, footer=footer) + msg=d.content, footer=footer, print_html=print_html if send_print_in_body else None) if send_me_a_copy: mail.cc.append(webnotes.conn.get_value("Profile", webnotes.session.user, "email")) diff --git a/webnotes/core/doctype/profile/profile.py b/webnotes/core/doctype/profile/profile.py index 4b1216aa53..3fac8626fc 100644 --- a/webnotes/core/doctype/profile/profile.py +++ b/webnotes/core/doctype/profile/profile.py @@ -43,7 +43,7 @@ class DocType: pass # email server not set, don't send email self.doc.new_password = "" - + self.update_gravatar() def check_enable_disable(self): # do not allow disabling administrator/guest @@ -106,6 +106,15 @@ class DocType: # owner is always name webnotes.conn.set(self.doc, 'owner', self.doc.name) webnotes.clear_cache(user=self.doc.name) + + def update_gravatar(self): + import md5 + if not self.doc.user_image: + if self.doc.fb_username: + self.doc.user_image = "https://graph.facebook.com/" + self.doc.fb_username + "/picture" + else: + self.doc.user_image = "https://secure.gravatar.com/avatar/" + md5.md5(self.doc.name).hexdigest() \ + + "?d=retro" def reset_password(self): from webnotes.utils import random_string, get_url diff --git a/webnotes/core/page/setup/setup.txt b/webnotes/core/page/setup/setup.txt index faf64a661d..3978b77034 100644 --- a/webnotes/core/page/setup/setup.txt +++ b/webnotes/core/page/setup/setup.txt @@ -2,7 +2,7 @@ { "creation": "2012-06-14 15:07:28", "docstatus": 0, - "modified": "2014-02-07 14:48:08", + "modified": "2014-02-07 14:50:08", "modified_by": "Administrator", "owner": "Administrator" }, diff --git a/webnotes/hooks.txt b/webnotes/hooks.txt index 02c550237b..1a57c2e015 100644 --- a/webnotes/hooks.txt +++ b/webnotes/hooks.txt @@ -31,6 +31,7 @@ scheduler_event = all:webnotes.utils.email_lib.bulk.flush scheduler_event = daily:webnotes.utils.email_lib.bulk.clear_outbox scheduler_event = daily:webnotes.core.doctype.notification_count.notification_count.delete_event_notification_count scheduler_event = daily:webnotes.core.doctype.event.event.send_event_digest +scheduler_event = hourly:webnotes.templates.generator.website_group.clear_event_cache on_session_creation = webnotes.auth.notify_administrator_login diff --git a/webnotes/public/js/wn/views/communication.js b/webnotes/public/js/wn/views/communication.js index 012f9fde10..d46013def1 100644 --- a/webnotes/public/js/wn/views/communication.js +++ b/webnotes/public/js/wn/views/communication.js @@ -274,22 +274,13 @@ wn.views.CommunicationComposer = Class.extend({ }); }, - send_email: function(btn, form_values, selected_attachments, print_format_html) { + send_email: function(btn, form_values, selected_attachments, print_html) { var me = this; - if(form_values.attach_document_print) { - var print_html = print_format_html; - if(cint(wn.boot.send_print_in_body_and_attachment)) { - form_values.content = form_values.content - + "


" + print_html; - } else { - form_values.content = form_values.content + "

" - + "Please see attachment for document details.

" - } - } else { - var print_html = ""; + if(!form_values.attach_document_print) { + print_html = ""; } - + if(form_values.send_email) { if(cur_frm && !wn.model.can_email(me.doc.doctype, cur_frm)) { msgprint(wn._("You are not allowed to send emails related to this document.")); diff --git a/webnotes/templates/base.html b/webnotes/templates/base.html index 2014fa00e7..49a4ec9e40 100644 --- a/webnotes/templates/base.html +++ b/webnotes/templates/base.html @@ -60,7 +60,12 @@
diff --git a/webnotes/templates/emails/standard.html b/webnotes/templates/emails/standard.html index 12fc2ea276..0ecfafd6a3 100644 --- a/webnotes/templates/emails/standard.html +++ b/webnotes/templates/emails/standard.html @@ -8,14 +8,6 @@ /* ------------------------------------- GLOBAL ------------------------------------- */ -* { - margin:0; - padding:0; - font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; - font-size: 100%; - line-height: 1.6; -} - img { max-width: 100%; } @@ -23,15 +15,26 @@ img { body { -webkit-font-smoothing:antialiased; -webkit-text-size-adjust:none; - width: 100%!important; + width: 100% !important; height: 100%; +} + +.wrapper { background-color: #eee; } +.wrapper * { + margin:0; + padding:0; + font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; + font-size: 100%; + line-height: 1.6; +} + /* ------------------------------------- ELEMENTS ------------------------------------- */ -a { +.wrapper a { color: #348eda; } @@ -69,7 +72,7 @@ a { margin-bottom: 0; } -.first{ +.first { margin-top: 0; } @@ -113,7 +116,9 @@ table.footer-wrap a{ /* ------------------------------------- TYPOGRAPHY ------------------------------------- */ -h1,h2,h3{ +.wrapper h1, +.wrapper h2, +.wrapper h3{ font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-top:15px; @@ -123,26 +128,29 @@ h1,h2,h3{ font-weight:200; } -h1 { +.wrapper h1 { font-size: 36px; } -h2 { +.wrapper h2 { font-size: 28px; } -h3 { +.wrapper h3 { font-size: 22px; } -hr { +.wrapper hr { margin: 20px 0; border-top: 1px solid #eee; } -p, ul, ol { +.wrapper p, +.wrapper ul, +.wrapper ol { margin-bottom: 10px; font-weight: normal; font-size:14px; } -ul li, ol li { +.wrapper ul li, +.wrapper ol li { margin-left:5px; list-style-position: inside; } @@ -180,7 +188,9 @@ ul li, ol li { - + + +
@@ -230,5 +240,9 @@ ul li, ol li {
+
+ + + \ No newline at end of file diff --git a/webnotes/templates/generators/website_group.py b/webnotes/templates/generators/website_group.py index e377e85b1b..9fca8cc909 100644 --- a/webnotes/templates/generators/website_group.py +++ b/webnotes/templates/generators/website_group.py @@ -17,7 +17,6 @@ def get_context(context): raise webnotes.PermissionError group_context = get_group_context(group, view, bean, context) - group_context["access"] = get_access(group) group_context.update(context) return group_context @@ -122,3 +121,7 @@ def clear_cache(page_name=None, website_group=None): for group in website_groups: for view in get_views(group.group_type): cache.delete_value("website_group_context:{}:{}".format(group.page_name, view)) + +def clear_event_cache(): + for group in webnotes.conn.sql_list("""select name from `tabWebsite Group` where group_type='Event'"""): + clear_unit_views(website_group=group) diff --git a/webnotes/utils/email_lib/email_body.py b/webnotes/utils/email_lib/email_body.py index 57eb3ea772..752eefe625 100644 --- a/webnotes/utils/email_lib/email_body.py +++ b/webnotes/utils/email_lib/email_body.py @@ -9,12 +9,12 @@ import email.utils from inlinestyler.utils import inline_css def get_email(recipients, sender='', msg='', subject='[No Subject]', - text_content = None, footer=None, formatted=None): + text_content = None, footer=None, print_html=None, formatted=None): """send an html email as multipart with attachments and all""" email = EMail(sender, recipients, subject) if (not '
' in msg) and (not '

' in msg) and (not '') - email.set_html(msg, text_content, footer=footer, formatted=formatted) + email.set_html(msg, text_content, footer=footer, print_html=print_html, formatted=formatted) return email @@ -47,10 +47,10 @@ class EMail: self.cc = [] self.html_set = False - def set_html(self, message, text_content = None, footer=None, formatted=None): + def set_html(self, message, text_content = None, footer=None, print_html=None, formatted=None): """Attach message in the html portion of multipart/alternative""" if not formatted: - formatted = get_formatted_html(self.subject, message, footer) + formatted = get_formatted_html(self.subject, message, footer, print_html) # this is the first html part of a multi-part message, # convert to text well @@ -68,12 +68,12 @@ class EMail: Attach message in the text portion of multipart/alternative """ from email.mime.text import MIMEText - part = MIMEText(message.encode('utf-8'), 'plain', 'utf-8') + part = MIMEText(message, 'plain', 'utf-8') self.msg_multipart.attach(part) def set_part_html(self, message): from email.mime.text import MIMEText - part = MIMEText(message.encode('utf-8'), 'html', 'utf-8') + part = MIMEText(message, 'html', 'utf-8') self.msg_multipart.attach(part) def set_html_as_text(self, html): @@ -191,13 +191,14 @@ class EMail: self.make() return self.msg_root.as_string() -def get_formatted_html(subject, message, footer=None): +def get_formatted_html(subject, message, footer=None, print_html=None): message = scrub_urls(message) return inline_css(webnotes.get_template("templates/emails/standard.html").render({ "content": message, "footer": get_footer(footer), - "title": subject + "title": subject, + "print_html": print_html })) def get_footer(footer=None): diff --git a/webnotes/webutils.py b/webnotes/webutils.py index cede34cf05..2d20eb1b20 100644 --- a/webnotes/webutils.py +++ b/webnotes/webutils.py @@ -91,13 +91,24 @@ def get_context(page_name): if can_cache(): context = webnotes.cache().get_value(cache_key) + access = get_access(page_name) if not context: - sitemap_options = get_sitemap_options(page_name) - context = build_context(sitemap_options) + context = get_sitemap_options(page_name) + + # permission may be required for rendering + context["access"] = access + + context = build_context(context) + if can_cache(context.no_cache): + del context["access"] webnotes.cache().set_value(cache_key, context) + context["access"] = access context.update(context.data or {}) + + # TODO private pages + return context def get_sitemap_options(page_name): @@ -133,8 +144,8 @@ def build_sitemap_options(page_name): where lft < %s and rgt > %s order by lft asc""", (sitemap_options.lft, sitemap_options.rgt), as_dict=True) sitemap_options.children = webnotes.conn.sql("""select * from `tabWebsite Sitemap` - where parent_website_sitemap=%s""", (sitemap_options.page_name,), as_dict=True) - + where parent_website_sitemap=%s and public_read=1""", (sitemap_options.page_name,), as_dict=True) + # determine templates to be used if not sitemap_options.base_template_path: sitemap_options.base_template_path = "templates/base.html"