[IMP] website_mail: make the template / mail editor work. We now have a limited

set of fields that we try to edit (body_html and body for body, email_from and email for
email-from, name and subject for subject), because t-field is not dynamic. If the model
that should be edited does not hold those fields, the mail editor won't work.

Also fixed editor not being actiated when going into the body edition.

bzr revid: tde@openerp.com-20140416105901-vavkh9erjsq4mof9
This commit is contained in:
Thibault Delavallée 2014-04-16 12:59:01 +02:00
parent f9b2b667a0
commit d264cd1640
6 changed files with 82 additions and 60 deletions

View File

@ -516,7 +516,7 @@ class MassMailing(osv.Model):
if not len(ids) == 1: if not len(ids) == 1:
raise ValueError('One and only one ID allowed for this action') raise ValueError('One and only one ID allowed for this action')
mail = self.browse(cr, uid, ids[0], context=context) mail = self.browse(cr, uid, ids[0], context=context)
url = '/website_mail/email_designer?model=mail.mass_mailing&res_id=%d&field_body=body_html&field_from=email_form&field_subject=name&template_model=%s' % (ids[0], mail.mailing_model) url = '/website_mail/email_designer?model=mail.mass_mailing&res_id=%d&template_model=%s&enable_editor=1' % (ids[0], mail.mailing_model)
return { return {
'name': _('Open with Visual Editor'), 'name': _('Open with Visual Editor'),
'type': 'ir.actions.act_url', 'type': 'ir.actions.act_url',

View File

@ -427,6 +427,7 @@
editor.edit(); editor.edit();
} }
}); });
website.editor_bar = editor;
}; };
/* ----- TOP EDITOR BAR FOR ADMIN ---- */ /* ----- TOP EDITOR BAR FOR ADMIN ---- */

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# from openerp import SUPERUSER_ID from urllib import urlencode
from openerp.addons.web import http from openerp.addons.web import http
from openerp.addons.web.http import request from openerp.addons.web.http import request
@ -8,33 +9,63 @@ from openerp.addons.web.http import request
class WebsiteEmailDesigner(http.Controller): class WebsiteEmailDesigner(http.Controller):
@http.route('/website_mail/email_designer', type='http', auth="user", website=True, multilang=True) @http.route('/website_mail/email_designer', type='http', auth="user", website=True, multilang=True)
def index(self, model, res_id, template_model, field_body='body', field_from='email_from', field_subject='name', **kw): def index(self, model, res_id, template_model=None, **kw):
if not model or not model in request.registry or not res_id: if not model or not model in request.registry or not res_id:
return request.redirect('/') return request.redirect('/')
# if not 'body' in request.registry[model]._all_columns and not 'body_html' in request.registry[model]._all_columns: model_cols = request.registry[model]._all_columns
# return request.redirect('/') if 'body' not in model_cols and 'body_html' not in model_cols or \
'email' not in model_cols and 'email_from' not in model_cols or \
'name' not in model_cols and 'subject' not in model_cols:
return request.redirect('/')
obj_ids = request.registry[model].exists(request.cr, request.uid, [res_id], context=request.context) obj_ids = request.registry[model].exists(request.cr, request.uid, [res_id], context=request.context)
if not obj_ids: if not obj_ids:
return request.redirect('/') 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_cols:
email_from_field = 'email_from'
subject_field = 'name'
if 'subject' in model_cols:
subject_field = 'subject'
body_field = 'body'
if 'body_html' in model_cols:
body_field = 'body_html'
cr, uid, context = request.cr, request.uid, request.context cr, uid, context = request.cr, request.uid, request.context
tmpl_obj = request.registry['email.template']
res_id = int(res_id) res_id = int(res_id)
record = request.registry[model].browse(cr, uid, res_id, context=context)
tids = tmpl_obj.search(cr, uid, [('model','=',template_model)], context=context)
templates = tmpl_obj.browse(cr, uid, tids, context=context)
print templates
values = { values = {
'object': request.registry[model].browse(cr, uid, res_id, context=context), 'record': record,
'templates': templates, 'templates': None,
'model': model, 'model': model,
'res_id': res_id, 'res_id': res_id,
'field_body': field_body, 'email_from_field': email_from_field,
'field_from': field_from, 'subject_field': subject_field,
'field_subject': field_subject, 'body_field': body_field,
} }
print '*', values
return request.website.render("website_mail.designer_index", values) 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['email.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
return request.website.render("website_mail.email_designer", values)
@http.route(['/website_mail/snippets'], type='json', auth="user", website=True) @http.route(['/website_mail/snippets'], type='json', auth="user", website=True)
def snippets(self): def snippets(self):

View File

@ -1,35 +1,16 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2014-Today OpenERP SA (<http://www.openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import osv, fields from openerp.osv import osv
from openerp.tools.translate import _ from openerp.tools.translate import _
class EmailTemplate(osv.Model): class EmailTemplate(osv.Model):
_inherit = 'email.template' _inherit = 'email.template'
def action_edit_html(self, cr, uid, ids, name, args, context=None): def action_edit_html(self, cr, uid, ids, context=None):
# tde fixme: avoid asserts if not len(ids) == 1:
assert len(ids)==1, "One and only one ID allowed for this action" raise ValueError('One and only one ID allowed for this action')
url = '/website_mail/email_designer?model=email.template&res_id=%d&field_body=body_html&field_from=email_form&field_subject=name' % (ids[0],) url = '/website_mail/email_designer?model=email.template&res_id=%d&enable_editor=1' % (ids[0],)
return { return {
'name': _('Edit Template'), 'name': _('Edit Template'),
'type': 'ir.actions.act_url', 'type': 'ir.actions.act_url',

View File

@ -3,9 +3,6 @@
var website = openerp.website; var website = openerp.website;
website.snippet.BuildingBlock.include({ website.snippet.BuildingBlock.include({
// init: function (parent) {
// this._super.apply(this, arguments);
// },
_get_snippet_url: function () { _get_snippet_url: function () {
return '/website_mail/snippets'; return '/website_mail/snippets';
} }
@ -18,7 +15,7 @@
$('#email_template').hide(); $('#email_template').hide();
$(".js_content", $(this).parent()).children().clone().appendTo('#email_body'); $(".js_content", $(this).parent()).children().clone().appendTo('#email_body');
// Todo: switch to edit mode openerp.website.editor_bar.edit();
event.preventDefault(); event.preventDefault();
}); });
}); });

View File

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<openerp> <openerp>
<data> <data>
<!-- Email Designer main page --> <!-- Template Choice page -->
<template id="designer_index" name="Email Designer"> <template id="email_designer" name="Email Designer">
<t t-call="website.layout"> <t t-call="website.layout">
<t t-set="head"> <t t-set="head">
<script type="text/javascript" src="/website_mail/static/src/js/website_email_designer.js"></script> <script type="text/javascript" src="/website_mail/static/src/js/website_email_designer.js"></script>
</t> </t>
<div id="wrap" class="container" t-ignore="True"> <div id="wrap" class="container" t-ignore="True">
<div id="email_template" t-att-style="(object.body_html and len(templates)&gt;0) and 'display: none'" class="mb32"> <div id="email_template" class="mb32" t-att-style="mode != 'email_template' and 'display: none' or ''">
<a class="mt16 btn btn-default pull-right" <a class="mt16 btn btn-default pull-right"
t-attf-href="/web#return_label=Website&amp;model=#{model}&amp;id=#{res_id}&amp;view_type=form"> t-attf-href="/web#return_label=Website&amp;model=#{model}&amp;id=#{res_id}&amp;view_type=form">
Back Back
@ -34,7 +34,7 @@
</div> </div>
</div> </div>
</div> </div>
<div id="email_designer" t-att-style="not (object.body_html and len(templates)&gt; 0) and 'display: none'" class="mb32"> <div id="email_designer" class="mb32" t-att-style="mode != 'email_designer' and 'display: none' or ''">
<a class="mt16 btn btn-primary pull-right" <a class="mt16 btn btn-primary pull-right"
t-attf-href="/web#return_label=Website&amp;model=#{model}&amp;id=#{res_id}&amp;view_type=form"> t-attf-href="/web#return_label=Website&amp;model=#{model}&amp;id=#{res_id}&amp;view_type=form">
Save and Continue Save and Continue
@ -43,28 +43,40 @@
Design Your Email Design Your Email
</h1> </h1>
<div class="form-horizontal"> <div class="form-horizontal">
<div class="form-group"> <!-- email_from fields-->
<div class="form-group" t-if="email_from_field == 'email_from'">
<label class="col-sm-2 control-label">From:</label> <label class="col-sm-2 control-label">From:</label>
<div class="col-sm-7"> <div class="col-sm-7"><span t-field="record.email_from" class="form-control"/></div>
<span t-field="object.email_from" class="form-control"/>
</div>
</div> </div>
<div class="form-group"> <div class="form-group" t-if="email_from_field == 'email'">
<label class="col-sm-2 control-label">From:</label>
<div class="col-sm-7"><span t-field="record.email" class="form-control"/></div>
</div>
<!-- email_from fields-->
<div class="form-group" t-if="subject_field == 'subject'">
<label class="col-sm-2 control-label">Subject:</label> <label class="col-sm-2 control-label">Subject:</label>
<div class="col-sm-7"> <div class="col-sm-7"><span t-field="record.subject" class="form-control"/></div>
<span t-field="object.name" class="form-control"/> </div>
</div> <div class="form-group" t-if="subject_field == 'name'">
<label class="col-sm-2 control-label">Subject:</label>
<div class="col-sm-7"><span t-field="record.name" class="form-control"/></div>
</div> </div>
</div> </div>
<hr/> <hr/>
<div t-field="object.body_html" id="email_body"/> <!-- body fields -->
<div t-if="body_field == 'body_html'">
<div t-field="record.body_html" id="email_body_html"/>
</div>
<div t-if="body_field == 'body'">
<div t-field="record.body" id="email_body"/>
</div>
</div> </div>
</div> </div>
</t> </t>
<t t-set="website.footer"></t> <t t-set="website.footer"></t>
</template> </template>
</data> </data>
</openerp> </openerp>