diff options
| author | Christophe Matthieu <chm@odoo.com> | 2015-02-06 11:21:20 +0100 |
|---|---|---|
| committer | Julien De Coster <jdc@odoo.com> | 2015-02-12 11:58:13 +0100 |
| commit | 70c30fe5b1dbc12142fdac74819fe0e71817e5e3 (patch) | |
| tree | fab7010d51179d1acee6ec76e80210cd1f571c06 /addons/website_mail/controllers | |
| parent | 28ed28f9451edcb32f70daf7082d2ae91148b79c (diff) | |
[IMP] website_mail: improved template designer, added support for background color, font color and convert class to inline style in mail designer, changed snippet according to new format, added theme selector in mail_designer, added font-awesome support (convert in image) in mail snippets
Diffstat (limited to 'addons/website_mail/controllers')
| -rw-r--r-- | addons/website_mail/controllers/email_designer.py | 146 |
1 files changed, 84 insertions, 62 deletions
diff --git a/addons/website_mail/controllers/email_designer.py b/addons/website_mail/controllers/email_designer.py index 5de3107a2fe..16ef40095a5 100644 --- a/addons/website_mail/controllers/email_designer.py +++ b/addons/website_mail/controllers/email_designer.py @@ -1,74 +1,96 @@ # -*- coding: utf-8 -*- -from urllib import urlencode +import io +from PIL import Image, ImageFont, ImageDraw +import werkzeug.wrappers +from openerp import addons from openerp.addons.web import http from openerp.addons.web.http import request -from openerp.tools.mail import html_sanitize +import time class WebsiteEmailDesigner(http.Controller): - @http.route('/website_mail/email_designer', type='http', auth="user", website=True) - def index(self, model, res_id, template_model=None, **kw): - if not model or not model in request.registry or not res_id: - return request.redirect('/') - model_fields = request.registry[model]._fields - if 'body' not in model_fields and 'body_html' not in model_fields or \ - 'email' not in model_fields and 'email_from' not in model_fields or \ - 'name' not in model_fields and 'subject' not in model_fields: - return request.redirect('/') - res_id = int(res_id) - obj_ids = request.registry[model].exists(request.cr, request.uid, [res_id], context=request.context) - if not obj_ids: - return request.redirect('/') - # try to find fields to display / edit -> as t-field is static, we have to limit - # the available fields to a given subset - email_from_field = 'email' - if 'email_from' in model_fields: - email_from_field = 'email_from' - subject_field = 'name' - if 'subject' in model_fields: - subject_field = 'subject' - body_field = 'body' - if 'body_html' in model_fields: - body_field = 'body_html' - - cr, uid, context = request.cr, request.uid, request.context - record = request.registry[model].browse(cr, uid, res_id, context=context) - - values = { - 'record': record, - 'templates': None, - 'model': model, - 'res_id': res_id, - 'email_from_field': email_from_field, - 'subject_field': subject_field, - 'body_field': body_field, - } - - if getattr(record, body_field): - values['mode'] = 'email_designer' - else: - if kw.get('enable_editor'): - kw.pop('enable_editor') - fragments = dict(model=model, res_id=res_id, **kw) - if template_model: - fragments['template_model'] = template_model - return request.redirect('/website_mail/email_designer?%s' % urlencode(fragments)) - values['mode'] = 'email_template' - - tmpl_obj = request.registry['mail.template'] - if template_model: - tids = tmpl_obj.search(cr, uid, [('model', '=', template_model)], context=context) - else: - tids = tmpl_obj.search(cr, uid, [], context=context) - templates = tmpl_obj.browse(cr, uid, tids, context=context) - values['templates'] = templates - values['html_sanitize'] = html_sanitize - - return request.website.render("website_mail.email_designer", values) - @http.route(['/website_mail/snippets'], type='json', auth="user", website=True) def snippets(self): return request.website._render('website_mail.email_designer_snippets') + + @http.route([ + '/website_mail/font_to_img/<icon>', + '/website_mail/font_to_img/<icon>/<color>', + '/website_mail/font_to_img/<icon>/<color>/<int:size>', + '/website_mail/font_to_img/<icon>/<color>/<int:size>/<int:alpha>', + ], auth="public", website=True) + def export_icon_to_png(self, icon, color='#000', size=100, alpha=255, font='/web/static/lib/fontawesome/fonts/fontawesome-webfont.ttf'): + """ This method converts FontAwesom pictograms to Images and is Used only + for mass mailing becuase custom fonts are not supported in mail. + :param icon : character from FontAwesom cheatsheet + :param color : RGB code of the color + :param size : Pixels in integer + :param alpha : transparency of the image from 0 to 255 + :param font : font path + + :returns PNG image converted from given font + """ + # Initialize font + addons_path = http.addons_manifest['web']['addons_path'] + font_obj = ImageFont.truetype(addons_path + font, size) + + # Determine the dimensions of the icon + image = Image.new("RGBA", (size, size), color=(0, 0, 0, 0)) + draw = ImageDraw.Draw(image) + + boxw, boxh = draw.textsize(icon, font=font_obj) + draw.text((0, 0), icon, font=font_obj) + left, top, right, bottom = image.getbbox() + + # Create an alpha mask + imagemask = Image.new("L", (boxw, boxh), 0) + drawmask = ImageDraw.Draw(imagemask) + drawmask.text((-left, -top), icon, font=font_obj, fill=alpha) + + # Create a solid color image and apply the mask + if color.startswith('rgba'): + color = color.replace('rgba', 'rgb') + color = ','.join(color.split(',')[:-1])+')' + iconimage = Image.new("RGBA", (boxw, boxh), color) + iconimage.putalpha(imagemask) + + # Create output image + outimage = Image.new("RGBA", (boxw, size), (0, 0, 0, 0)) + outimage.paste(iconimage, (left, top)) + + # output image + output = io.BytesIO() + outimage.save(output, format="PNG") + response = werkzeug.wrappers.Response() + response.mimetype = 'image/png' + response.data = output.getvalue() + response.headers['Cache-Control'] = 'public, max-age=604800' + response.headers['Access-Control-Allow-Origin'] = '*' + response.headers['Access-Control-Allow-Methods'] = 'GET, POST' + response.headers['Connection'] = 'close' + response.headers['Date'] = time.strftime("%a, %d-%b-%Y %T GMT", time.gmtime()) + response.headers['Expires'] = time.strftime("%a, %d-%b-%Y %T GMT", time.gmtime(time.time()+604800*60)) + + return response + + +class Website(addons.website.controllers.main.Website): + + #------------------------------------------------------ + # Backend email template field + #------------------------------------------------------ + @http.route('/website_mail/field/email', type='http', auth="public", website=True) + def FieldTextHtmlEmail(self, model=None, res_id=None, field=None, callback=None, **kwargs): + kwargs['template'] = "website_mail.FieldTextHtmlEmail" + return self.FieldTextHtml(model, res_id, field, callback, **kwargs) + + @http.route('/website_mail/field/email_template', type='http', auth="public", website=True) + def FieldTextHtmlEmailTemplate(self, model=None, res_id=None, field=None, callback=None, **kwargs): + cr, uid, context = request.cr, request.uid, request.context + kwargs['theme'] = True + kwargs['snippets'] = 'snippets' not in kwargs and '/website_mail/snippets' or kwargs['snippets'] + kwargs['dont_load_assets'] = not kwargs.get('enable_editor') + return self.FieldTextHtmlEmail(model, res_id, field, callback, **kwargs) |
