summaryrefslogtreecommitdiff
path: root/addons/website_mail/controllers
diff options
context:
space:
mode:
authorChristophe Matthieu <chm@odoo.com>2015-02-06 11:21:20 +0100
committerJulien De Coster <jdc@odoo.com>2015-02-12 11:58:13 +0100
commit70c30fe5b1dbc12142fdac74819fe0e71817e5e3 (patch)
treefab7010d51179d1acee6ec76e80210cd1f571c06 /addons/website_mail/controllers
parent28ed28f9451edcb32f70daf7082d2ae91148b79c (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.py146
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)