# HG changeset patch # User ymh # Date 1426089908 -3600 # Node ID 5d3b4e1e5b3465b637970c6fdb9e3d0131f999c0 # Parent f479d60ca5023352e7573032591d3908b65b1e6d correct email formatting diff -r f479d60ca502 -r 5d3b4e1e5b34 src/hdalab/management/commands/send_moderation_mail.py --- a/src/hdalab/management/commands/send_moderation_mail.py Tue Mar 10 18:41:29 2015 +0100 +++ b/src/hdalab/management/commands/send_moderation_mail.py Wed Mar 11 17:05:08 2015 +0100 @@ -6,6 +6,7 @@ ''' import logging +import os from django.conf import settings from django.contrib.auth import get_user_model @@ -14,6 +15,7 @@ from django.core.management.base import NoArgsCommand from django.template.base import TemplateDoesNotExist from django.template.loader import render_to_string +import premailer from hdalab.models.renkan import HdalabRenkan @@ -52,8 +54,8 @@ 'WEB_URL': settings.WEB_URL, 'email_recipient': email_recipient } - msg_html = render_to_string(TEMPLATE_NAME+".txt", context) - msg_txt = render_to_string(TEMPLATE_NAME+".html", context) + msg_html = premailer.transform(render_to_string(TEMPLATE_NAME+".html", context), base_url=os.path.join(settings.STATIC_ROOT,'site')) + msg_txt = render_to_string(TEMPLATE_NAME+".txt", context) except TemplateDoesNotExist: logger.error("Mail template %s not found", TEMPLATE_NAME) return diff -r f479d60ca502 -r 5d3b4e1e5b34 src/hdalab/signals.py --- a/src/hdalab/signals.py Tue Mar 10 18:41:29 2015 +0100 +++ b/src/hdalab/signals.py Wed Mar 11 17:05:08 2015 +0100 @@ -5,16 +5,17 @@ @author: ymh ''' import logging +import os +from renkanmanager.models import Renkan from django.conf import settings from django.core.mail.message import EmailMultiAlternatives from django.db.models.signals import post_save, pre_delete from django.template.base import TemplateDoesNotExist from django.template.loader import render_to_string -from django.utils.html import strip_tags +import premailer from hdalab.models.renkan import HdalabRenkan, HdalabRenkanStateTransition -from renkanmanager.models import Renkan logger = logging.getLogger(__name__) @@ -23,6 +24,7 @@ (HdalabRenkan.MODERATED,HdalabRenkan.PUBLISHED): ("mails/published_renkan", "Renkan publié"), (HdalabRenkan.MODERATED,HdalabRenkan.REJECTED): ("mails/rejected_renkan", "Renkan rejeté"), (HdalabRenkan.PUBLISHED, HdalabRenkan.EDITION): ("mails/unpublished_renkan", "Renkan dépublié"), + (HdalabRenkan.PUBLISHED, HdalabRenkan.REJECTED): ("mails/rejected_renkan", "Renkan rejeté"), } @@ -40,17 +42,19 @@ template_name, subject = MAIL_TEMPLATES[template_key] # template = loader.get_template(template_name) context = {'renkan_state': renkan_state, 'WEB_URL': settings.WEB_URL} - msg_html = render_to_string(template_name+".txt", context) - msg_txt = render_to_string(template_name+".html", context) + msg_html = premailer.transform(render_to_string(template_name+".html", context), base_url=os.path.join(settings.STATIC_ROOT,'site')) + msg_txt = render_to_string(template_name+".txt", context) except TemplateDoesNotExist: logger.error("Mail template %s for state %s not found", MAIL_TEMPLATES[template_key], HdalabRenkan.STATE_CHOICES_DICT[renkan_state.to_state]) return - except Exception as e: - logger.error("Error rendering template %s for state %s : %r", MAIL_TEMPLATES[template_key], HdalabRenkan.STATE_CHOICES_DICT[renkan_state.to_state], e) +# except Exception as e: +# logger.error("Error rendering template %s for state %s : %r", MAIL_TEMPLATES[template_key], HdalabRenkan.STATE_CHOICES_DICT[renkan_state.to_state], e) +# return +# raise e if msg_txt and msg_html and renkan_state.renkan and renkan_state.renkan.renkan and renkan_state.renkan.renkan.owner and renkan_state.renkan.renkan.owner.email: logger.debug("Sending following mail to %s : %s", renkan_state.renkan.renkan.owner.email, msg_txt) - emsg = EmailMultiAlternatives(subject, strip_tags(msg_txt), settings.DEFAULT_FROM_EMAIL, [renkan_state.renkan.renkan.owner.email]) + emsg = EmailMultiAlternatives(subject, msg_txt, settings.DEFAULT_FROM_EMAIL, [renkan_state.renkan.renkan.owner.email]) emsg.attach_alternative(msg_html, "text/html") emsg.send(fail_silently=True) diff -r f479d60ca502 -r 5d3b4e1e5b34 src/hdalab/static/hdalab/css/email.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hdalab/static/hdalab/css/email.css Wed Mar 11 17:05:08 2015 +0100 @@ -0,0 +1,170 @@ +@CHARSET "UTF-8"; + +/* ------------------------------------- + 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%; +} + +body { + -webkit-font-smoothing: antialiased; + -webkit-text-size-adjust: none; + width: 100%!important; + height: 100%; +} + + +/* ------------------------------------- + ELEMENTS +------------------------------------- */ +a { + color: #348eda; +} + +.btn-primary { + text-decoration: none; + color: #FFF; + background-color: #348eda; + border: solid #348eda; + border-width: 10px 20px; + line-height: 2; + font-weight: bold; + margin-right: 10px; + text-align: center; + cursor: pointer; + display: inline-block; + border-radius: 25px; +} + +.btn-secondary { + text-decoration: none; + color: #FFF; + background-color: #aaa; + border: solid #aaa; + border-width: 10px 20px; + line-height: 2; + font-weight: bold; + margin-right: 10px; + text-align: center; + cursor: pointer; + display: inline-block; + border-radius: 25px; +} + +.last { + margin-bottom: 0; +} + +.first { + margin-top: 0; +} + +.padding { + padding: 10px 0; +} + + +/* ------------------------------------- + BODY +------------------------------------- */ +table.body-wrap { + width: 100%; + padding: 20px; +} + +table.body-wrap .container { + border: 1px solid #f0f0f0; +} + + +/* ------------------------------------- + FOOTER +------------------------------------- */ +table.footer-wrap { + width: 100%; + clear: both!important; +} + +.footer-wrap .container p { + font-size: 12px; + color: #666; + +} + +table.footer-wrap a { + color: #999; +} + + +/* ------------------------------------- + TYPOGRAPHY +------------------------------------- */ +h1, h2, h3 { + font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + line-height: 1.1; + margin-bottom: 15px; + color: #000; + margin: 40px 0 10px; + line-height: 1.2; + font-weight: 200; +} + +h1 { + font-size: 36px; +} +h2 { + font-size: 28px; +} +h3 { + font-size: 22px; +} + +p, ul, ol { + margin-bottom: 10px; + font-weight: normal; + font-size: 14px; +} + +ul li, ol li { + margin-left: 5px; + list-style-position: inside; +} + +/* --------------------------------------------------- + RESPONSIVENESS + +------------------------------------------------------ */ + +/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */ +.container { + display: block!important; + max-width: 600px!important; + margin: 0 auto!important; /* makes it centered */ + clear: both!important; +} + +/* Set the padding on the td rather than the div for Outlook compatibility */ +.body-wrap .container { + padding: 20px; +} + +/* This should also be a block element, so that it will fill 100% of the .container */ +.content { + max-width: 600px; + margin: 0 auto; + display: block; +} + +/* Let's make sure tables in the content area are 100% wide */ +.content table { + width: 100%; +} diff -r f479d60ca502 -r 5d3b4e1e5b34 src/hdalab/templates/mails/moderation_notice.html --- a/src/hdalab/templates/mails/moderation_notice.html Tue Mar 10 18:41:29 2015 +0100 +++ b/src/hdalab/templates/mails/moderation_notice.html Wed Mar 11 17:05:08 2015 +0100 @@ -5,177 +5,7 @@ Renkan à modérer - + diff -r f479d60ca502 -r 5d3b4e1e5b34 src/hdalab/templates/mails/published_renkan.html --- a/src/hdalab/templates/mails/published_renkan.html Tue Mar 10 18:41:29 2015 +0100 +++ b/src/hdalab/templates/mails/published_renkan.html Wed Mar 11 17:05:08 2015 +0100 @@ -5,177 +5,7 @@ Renkan publié - + diff -r f479d60ca502 -r 5d3b4e1e5b34 src/hdalab/templates/mails/rejected_renkan.html --- a/src/hdalab/templates/mails/rejected_renkan.html Tue Mar 10 18:41:29 2015 +0100 +++ b/src/hdalab/templates/mails/rejected_renkan.html Wed Mar 11 17:05:08 2015 +0100 @@ -5,177 +5,7 @@ Renkan rejeté - + diff -r f479d60ca502 -r 5d3b4e1e5b34 src/hdalab/templates/mails/unpublished_renkan.html --- a/src/hdalab/templates/mails/unpublished_renkan.html Tue Mar 10 18:41:29 2015 +0100 +++ b/src/hdalab/templates/mails/unpublished_renkan.html Wed Mar 11 17:05:08 2015 +0100 @@ -5,177 +5,7 @@ Renkan dépublié - + diff -r f479d60ca502 -r 5d3b4e1e5b34 virtualenv/res/lib/lib_create_env.py --- a/virtualenv/res/lib/lib_create_env.py Tue Mar 10 18:41:29 2015 +0100 +++ b/virtualenv/res/lib/lib_create_env.py Wed Mar 11 17:05:08 2015 +0100 @@ -59,6 +59,9 @@ 'CELERY-EMAIL': { 'setup': 'django-celery-email', 'url':'https://github.com/pmclanahan/django-celery-email/archive/1.1.0.tar.gz', 'local':"django-celery-email-1.1.0.tar.gz", 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}}, 'DJANGO-ENVELOPE': { 'setup': 'django-envelope', 'url':'https://github.com/zsiciarz/django-envelope/archive/1.0.0.tar.gz', 'local':'django-envelope-1.0.0.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}}, 'DJANGO-HONEYPOT': { 'setup': 'django-honeypot', 'url':'https://github.com/sunlightlabs/django-honeypot/archive/0.3.0.tar.gz', 'local':'django-honeypot-0.3.0.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}}, + 'CSSSELECT': { 'setup': 'cssselect', 'url':'https://github.com/SimonSapin/cssselect/archive/v0.9.1.tar.gz', 'local':'cssselect-0.9.1.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}}, + 'CSSUTILS': { 'setup': 'cssutils', 'url':'https://bitbucket.org/cthedot/cssutils/get/v1.0.tar.gz', 'local':'cssutils-1.0.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}}, + 'PREMAILER': { 'setup': 'premailer', 'url':'https://pypi.python.org/packages/source/p/premailer/premailer-2.8.3.tar.gz', 'local':'premailer-2.8.3.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}}, } diff -r f479d60ca502 -r 5d3b4e1e5b34 virtualenv/res/src/cssselect-0.9.1.tar.gz Binary file virtualenv/res/src/cssselect-0.9.1.tar.gz has changed diff -r f479d60ca502 -r 5d3b4e1e5b34 virtualenv/res/src/cssutils-1.0.tar.gz Binary file virtualenv/res/src/cssutils-1.0.tar.gz has changed diff -r f479d60ca502 -r 5d3b4e1e5b34 virtualenv/res/src/premailer-2.8.3.tar.gz Binary file virtualenv/res/src/premailer-2.8.3.tar.gz has changed diff -r f479d60ca502 -r 5d3b4e1e5b34 virtualenv/web/res/requirements.txt --- a/virtualenv/web/res/requirements.txt Tue Mar 10 18:41:29 2015 +0100 +++ b/virtualenv/web/res/requirements.txt Wed Mar 11 17:05:08 2015 +0100 @@ -13,6 +13,8 @@ anyjson==0.3.3 billiard==3.3.0.19 celery==3.1.17 +cssselect==0.9.1 +cssutils==1.0 django-appconf==1.0.1 django-celery-email==1.1.0 django-envelope==1.0 @@ -27,6 +29,7 @@ isodate==0.5.1 kombu==3.0.24 lxml==3.4.0 +premailer==2.8.3 psycopg2==2.5.4 pycrypto==2.6.1 pyparsing==2.0.3