diff --git a/addons/account/account.py b/addons/account/account.py index 4d9baf36a17..3537c4f4c55 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -30,7 +30,7 @@ from openerp import SUPERUSER_ID from openerp import tools from openerp.osv import fields, osv, expression from openerp.tools.translate import _ -from openerp.tools.float_utils import float_round +from openerp.tools.float_utils import float_round as round import openerp.addons.decimal_precision as dp @@ -1937,15 +1937,15 @@ class account_tax(osv.osv): # 'base_code_id': fields.many2one('account.tax.code', 'Account Base Code', help="Use this code for the tax declaration."), 'tax_code_id': fields.many2one('account.tax.code', 'Account Tax Code', help="Use this code for the tax declaration."), - 'base_sign': fields.float('Base Code Sign', help="Usually 1 or -1."), - 'tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1."), + 'base_sign': fields.float('Base Code Sign', help="Usually 1 or -1.", digits_compute=get_precision_tax()), + 'tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1.", digits_compute=get_precision_tax()), # Same fields for refund invoices 'ref_base_code_id': fields.many2one('account.tax.code', 'Refund Base Code', help="Use this code for the tax declaration."), 'ref_tax_code_id': fields.many2one('account.tax.code', 'Refund Tax Code', help="Use this code for the tax declaration."), - 'ref_base_sign': fields.float('Refund Base Code Sign', help="Usually 1 or -1."), - 'ref_tax_sign': fields.float('Refund Tax Code Sign', help="Usually 1 or -1."), + 'ref_base_sign': fields.float('Refund Base Code Sign', help="Usually 1 or -1.", digits_compute=get_precision_tax()), + 'ref_tax_sign': fields.float('Refund Tax Code Sign', help="Usually 1 or -1.", digits_compute=get_precision_tax()), 'include_base_amount': fields.boolean('Included in base amount', help="Indicates if the amount of tax must be included in the base amount for the computation of the next taxes"), 'company_id': fields.many2one('res.company', 'Company', required=True), 'description': fields.char('Tax Code'), @@ -2143,7 +2143,7 @@ class account_tax(osv.osv): tax_compute_precision = precision if taxes and taxes[0].company_id.tax_calculation_rounding_method == 'round_globally': tax_compute_precision += 5 - totalin = totalex = float_round(price_unit * quantity, precision) + totalin = totalex = round(price_unit * quantity, precision) tin = [] tex = [] for tax in taxes: diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml index 24723d7fb12..eebc95ae0e2 100644 --- a/addons/account/report/account_invoice_report_view.xml +++ b/addons/account/report/account_invoice_report_view.xml @@ -25,7 +25,7 @@ - + diff --git a/addons/account_check_writing/account_voucher.py b/addons/account_check_writing/account_voucher.py index e4933708f7a..c3abe28eef0 100644 --- a/addons/account_check_writing/account_voucher.py +++ b/addons/account_check_writing/account_voucher.py @@ -41,6 +41,23 @@ class account_voucher(osv.osv): 'number': fields.char('Number', size=32), } + def _amount_to_text(self, cr, uid, amount, currency_id, context=None): + # Currency complete name is not available in res.currency model + # Exceptions done here (EUR, USD, BRL) cover 75% of cases + # For other currencies, display the currency code + currency = self.pool['res.currency'].browse(cr, uid, currency_id, context=context) + if currency.name.upper() == 'EUR': + currency_name = 'Euro' + elif currency.name.upper() == 'USD': + currency_name = 'Dollars' + elif currency.name.upper() == 'BRL': + currency_name = 'reais' + else: + currency_name = currency.name + #TODO : generic amount_to_text is not ready yet, otherwise language (and country) and currency can be passed + #amount_in_word = amount_to_text(amount, context=context) + return amount_to_text(amount, currency=currency_name) + def onchange_amount(self, cr, uid, ids, amount, rate, partner_id, journal_id, currency_id, ttype, date, payment_rate_currency_id, company_id, context=None): """ Inherited - add amount_in_word and allow_check_writting in returned value dictionary """ if not context: @@ -48,22 +65,7 @@ class account_voucher(osv.osv): default = super(account_voucher, self).onchange_amount(cr, uid, ids, amount, rate, partner_id, journal_id, currency_id, ttype, date, payment_rate_currency_id, company_id, context=context) if 'value' in default: amount = 'amount' in default['value'] and default['value']['amount'] or amount - - # Currency complete name is not available in res.currency model - # Exceptions done here (EUR, USD, BRL) cover 75% of cases - # For other currencies, display the currency code - currency = self.pool['res.currency'].browse(cr, uid, currency_id, context=context) - if currency.name.upper() == 'EUR': - currency_name = 'Euro' - elif currency.name.upper() == 'USD': - currency_name = 'Dollars' - elif currency.name.upper() == 'BRL': - currency_name = 'reais' - else: - currency_name = currency.name - #TODO : generic amount_to_text is not ready yet, otherwise language (and country) and currency can be passed - #amount_in_word = amount_to_text(amount, context=context) - amount_in_word = amount_to_text(amount, currency=currency_name) + amount_in_word = self._amount_to_text(cr, uid, amount, currency_id, context=context) default['value'].update({'amount_in_word':amount_in_word}) if journal_id: allow_check_writing = self.pool.get('account.journal').browse(cr, uid, journal_id, context=context).allow_check_writing @@ -92,6 +94,19 @@ class account_voucher(osv.osv): }, 'nodestroy': True } + def create(self, cr, uid, vals, context=None): + if vals.get('amount') and vals.get('journal_id') and 'amount_in_word' not in vals: + vals['amount_in_word'] = self._amount_to_text(cr, uid, vals['amount'], vals.get('currency_id') or \ + self.pool['account.journal'].browse(cr, uid, vals['journal_id'], context=context).currency.id or \ + self.pool['res.company'].browse(cr, uid, vals['company_id']).currency_id.id, context=context) + return super(account_voucher, self).create(cr, uid, vals, context=context) + + def write(self, cr, uid, ids, vals, context=None): + if vals.get('amount') and vals.get('journal_id') and 'amount_in_word' not in vals: + vals['amount_in_word'] = self._amount_to_text(cr, uid, vals['amount'], vals.get('currency_id') or \ + self.pool['account.journal'].browse(cr, uid, vals['journal_id'], context=context).currency.id or \ + self.pool['res.company'].browse(cr, uid, vals['company_id']).currency_id.id, context=context) + return super(account_voucher, self).write(cr, uid, ids, vals, context=context) def fields_view_get(self, cr, uid, view_id=None, view_type=False, context=None, toolbar=False, submenu=False): """ diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py index ca4a15bca6e..71008e0855b 100644 --- a/addons/audittrail/audittrail.py +++ b/addons/audittrail/audittrail.py @@ -463,14 +463,12 @@ def process_data(cr, uid, pool, res_ids, model, method, old_values=None, new_val # if at least one modification has been found for model_id, resource_id in lines: line_model = pool.get('ir.model').browse(cr, SUPERUSER_ID, model_id).model - name = pool.get(line_model).name_get(cr, uid, [resource_id])[0][1] vals = { 'method': method, 'object_id': model_id, 'user_id': uid, 'res_id': resource_id, - 'name': name, } if (model_id, resource_id) not in old_values and method not in ('copy', 'read'): # the resource was not existing so we are forcing the method to 'create' @@ -481,7 +479,11 @@ def process_data(cr, uid, pool, res_ids, model, method, old_values=None, new_val # the resource is not existing anymore so we are forcing the method to 'unlink' # (because it could also come with the value 'write' if we are deleting the # record through a one2many field) + name = old_values[(model_id, resource_id)]['value'].get('name',False) vals.update({'method': 'unlink'}) + else : + name = pool[line_model].name_get(cr, uid, [resource_id])[0][1] + vals.update({'name': name}) # create the audittrail log in super admin mode, only if a change has been detected if lines[(model_id, resource_id)]: log_id = pool.get('audittrail.log').create(cr, SUPERUSER_ID, vals) diff --git a/addons/calendar/calendar.py b/addons/calendar/calendar.py index 784358dceed..3dc1fa75b8d 100644 --- a/addons/calendar/calendar.py +++ b/addons/calendar/calendar.py @@ -456,7 +456,7 @@ class calendar_alarm_manager(osv.AbstractModel): bFound = False LastFound = False for one_date in self.pool.get('calendar.event').get_recurrent_date_by_event(cr, uid, curEvent, context=context): - in_date_format = datetime.strptime(one_date, '%Y-%m-%d %H:%M:%S') + in_date_format = one_date.replace(tzinfo=None) LastFound = self.do_check_alarm_for_one_date(cr, uid, in_date_format, curEvent, max_delta, cron_interval, notif=False, context=context) if LastFound: for alert in LastFound: @@ -490,7 +490,7 @@ class calendar_alarm_manager(osv.AbstractModel): bFound = False LastFound = False for one_date in self.pool.get("calendar.event").get_recurrent_date_by_event(cr, uid, curEvent, context=context): - in_date_format = datetime.strptime(one_date, '%Y-%m-%d %H:%M:%S') + in_date_format = one_date.replace(tzinfo=None) LastFound = self.do_check_alarm_for_one_date(cr, uid, in_date_format, curEvent, max_delta, ajax_check_every_seconds, after=partner.calendar_last_notif_ack, mail=False, context=context) if LastFound: for alert in LastFound: @@ -680,19 +680,23 @@ class calendar_event(osv.Model): return [d.astimezone(pytz.UTC) for d in rset1] def _get_recurrency_end_date(self, data, context=None): - if data.get('recurrency') and data.get('end_type') in ('count', unicode('count')): - data_date_deadline = datetime.strptime(data.get('date_deadline'), '%Y-%m-%d %H:%M:%S') - if data.get('rrule_type') in ('daily', unicode('count')): - rel_date = relativedelta(days=data.get('count') + 1) - elif data.get('rrule_type') in ('weekly', unicode('weekly')): - rel_date = relativedelta(days=(data.get('count') + 1) * 7) - elif data.get('rrule_type') in ('monthly', unicode('monthly')): - rel_date = relativedelta(months=data.get('count') + 1) - elif data.get('rrule_type') in ('yearly', unicode('yearly')): - rel_date = relativedelta(years=data.get('count') + 1) - end_date = data_date_deadline + rel_date - else: - end_date = data.get('end_date') + if not data.get('recurrency'): + return False + + end_type = data.get('end_type') + end_date = data.get('end_date') + + if end_type == 'count' and all(data.get(key) for key in ['count', 'rrule_type', 'date_deadline']): + count = data['count'] + 1 + delay, mult = { + 'daily': ('days', 1), + 'weekly': ('days', 7), + 'monthly': ('months', 1), + 'yearly': ('years', 1), + }[data['rrule_type']] + + deadline = datetime.strptime(data['date_deadline'], tools.DEFAULT_SERVER_DATETIME_FORMAT) + return deadline + relativedelta(**{delay: count * mult}) return end_date def _find_my_attendee(self, cr, uid, meeting_ids, context=None): @@ -774,7 +778,11 @@ class calendar_event(osv.Model): result[event] = "" return result + # retro compatibility function def _rrule_write(self, cr, uid, ids, field_name, field_value, args, context=None): + return self._set_rulestring(self, cr, uid, ids, field_name, field_value, args, context=context) + + def _set_rulestring(self, cr, uid, ids, field_name, field_value, args, context=None): if not isinstance(ids, list): ids = [ids] data = self._get_empty_rrule_data() @@ -812,7 +820,7 @@ class calendar_event(osv.Model): 'class': fields.selection([('public', 'Public'), ('private', 'Private'), ('confidential', 'Public for Employees')], 'Privacy', states={'done': [('readonly', True)]}), 'location': fields.char('Location', help="Location of Event", track_visibility='onchange', states={'done': [('readonly', True)]}), 'show_as': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Show Time as', states={'done': [('readonly', True)]}), - 'rrule': fields.function(_get_rulestring, type='char', fnct_inv=_rrule_write, store=True, string='Recurrent Rule'), + 'rrule': fields.function(_get_rulestring, type='char', fnct_inv=_set_rulestring, store=True, string='Recurrent Rule'), 'rrule_type': fields.selection([('daily', 'Day(s)'), ('weekly', 'Week(s)'), ('monthly', 'Month(s)'), ('yearly', 'Year(s)')], 'Recurrency', states={'done': [('readonly', True)]}, help="Let the event automatically repeat at that interval"), 'recurrency': fields.boolean('Recurrent', help="Recurrent Meeting"), 'recurrent_id': fields.integer('Recurrent ID'), @@ -1169,7 +1177,7 @@ class calendar_event(osv.Model): #repeat monthly by nweekday ((weekday, weeknumber), ) if r._bynweekday: data['week_list'] = day_list[r._bynweekday[0][0]].upper() - data['byday'] = r._bynweekday[0][1] + data['byday'] = str(r._bynweekday[0][1]) data['month_by'] = 'day' data['rrule_type'] = 'monthly' @@ -1423,7 +1431,7 @@ class calendar_event(osv.Model): # set end_date for calendar searching if values.get('recurrency', True) and values.get('end_type', 'count') in ('count', unicode('count')) and \ (values.get('rrule_type') or values.get('count') or values.get('date') or values.get('date_deadline')): - for data in self.read(cr, uid, ids, ['date', 'date_deadline', 'recurrency', 'rrule_type', 'count', 'end_type'], context=context): + for data in self.read(cr, uid, ids, ['end_date', 'date_deadline', 'recurrency', 'rrule_type', 'count', 'end_type'], context=context): end_date = self._get_recurrency_end_date(data, context=context) super(calendar_event, self).write(cr, uid, [data['id']], {'end_date': end_date}, context=context) @@ -1454,11 +1462,12 @@ class calendar_event(osv.Model): if not 'user_id' in vals: # Else bug with quick_create when we are filter on an other user vals['user_id'] = uid - if vals.get('recurrency', True) and vals.get('end_type', 'count') in ('count', unicode('count')) and \ - (vals.get('rrule_type') or vals.get('count') or vals.get('date') or vals.get('date_deadline')): - vals['end_date'] = self._get_recurrency_end_date(vals, context=context) - res = super(calendar_event, self).create(cr, uid, vals, context=context) + + data = self.read(cr, uid, [res], ['end_date', 'date_deadline', 'recurrency', 'rrule_type', 'count', 'end_type'], context=context)[0] + end_date = self._get_recurrency_end_date(data, context=context) + self.write(cr, uid, [res], {'end_date': end_date}, context=context) + self.create_attendees(cr, uid, [res], context=context) return res diff --git a/addons/calendar/calendar_data.xml b/addons/calendar/calendar_data.xml index 4435e8a4324..268c4b96bed 100644 --- a/addons/calendar/calendar_data.xml +++ b/addons/calendar/calendar_data.xml @@ -401,7 +401,7 @@
Dear ${object.cn} ,
-

this it a reminder for the event below :

+

That is a reminder for the event below :

diff --git a/addons/calendar/test/calendar_test.yml b/addons/calendar/test/calendar_test.yml index 1454a635a4f..44290d8166f 100644 --- a/addons/calendar/test/calendar_test.yml +++ b/addons/calendar/test/calendar_test.yml @@ -65,3 +65,20 @@ - !python {model: calendar.event}: | self.write(cr, uid, [ref("calendar_event_alldaytestevent0")], {'alarm_ids': [(6,0,[ref("res_alarm_daybeforeeventstarts0")])]}) +- + I create a recuring rule for my event +- + !record {model: calendar.event, id: calendar.event_sprintreview1}: + name: Begin of month meeting + date: !eval time.strftime('%Y-%m-%d 12:00:00') + recurrency: true + rrule: FREQ=MONTHLY;INTERVAL=1;COUNT=12;BYDAY=1MO +- + I check that the attributes are set correctly +- + !assert {model: calendar.event, id: calendar.event_sprintreview1}: + - rrule_type == 'monthly' + - count == 12 + - month_by == 'day' + - byday == '1' + - week_list == 'MO' diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index fd9462d9c34..4da0a509ed1 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -313,7 +313,10 @@ class crm_lead(format_address, osv.osv): stage = self.pool.get('crm.case.stage').browse(cr, uid, stage_id, context=context) if not stage.on_change: return {'value': {}} - return {'value': {'probability': stage.probability}} + vals = {'probability': stage.probability} + if stage.probability >= 100 or (stage.probability == 0 and stage.sequence > 1): + vals['date_closed'] = fields.datetime.now() + return {'value': vals} def on_change_partner_id(self, cr, uid, ids, partner_id, context=None): values = {} @@ -407,7 +410,7 @@ class crm_lead(format_address, osv.osv): 'probability = 0 %, select "Change Probability Automatically".\n' 'Create a specific stage or edit an existing one by editing columns of your opportunity pipe.')) for stage_id, lead_ids in stages_leads.items(): - self.write(cr, uid, lead_ids, {'stage_id': stage_id, 'date_closed': fields.datetime.now()}, context=context) + self.write(cr, uid, lead_ids, {'stage_id': stage_id}, context=context) return True def case_mark_won(self, cr, uid, ids, context=None): @@ -428,7 +431,7 @@ class crm_lead(format_address, osv.osv): 'probability = 100 % and select "Change Probability Automatically".\n' 'Create a specific stage or edit an existing one by editing columns of your opportunity pipe.')) for stage_id, lead_ids in stages_leads.items(): - self.write(cr, uid, lead_ids, {'stage_id': stage_id, 'date_closed': fields.datetime.now()}, context=context) + self.write(cr, uid, lead_ids, {'stage_id': stage_id}, context=context) return True def case_escalate(self, cr, uid, ids, context=None): diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index d054e956ed6..a33b215fb8f 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -95,7 +95,6 @@
or - Discard + Discard @@ -97,7 +97,7 @@ target="fileframe" class="col-sm-8">
- + diff --git a/addons/website/static/src/xml/website.snippets.xml b/addons/website/static/src/xml/website.snippets.xml index ae109139e3c..c5cf94d4791 100644 --- a/addons/website/static/src/xml/website.snippets.xml +++ b/addons/website/static/src/xml/website.snippets.xml @@ -22,7 +22,7 @@
-
+
+
+
+
+
+
+
Resize
+
x
+
+
+
@@ -45,13 +55,6 @@
-
-
-
-
-
Resize
-
-
Margin resize
diff --git a/addons/website/tests/test_converter.py b/addons/website/tests/test_converter.py index d31df8e6956..ca72a361ac2 100644 --- a/addons/website/tests/test_converter.py +++ b/addons/website/tests/test_converter.py @@ -135,7 +135,7 @@ class TestConvertBack(common.TransactionCase): rendered = self.registry('website.qweb').render_tag_field( e, {'field': field_value}, '', ir_qweb.QWebContext(self.cr, self.uid, { 'record': record, - })) + }, context={'inherit_branding': True})) element = html.fromstring( rendered, parser=html.HTMLParser(encoding='utf-8')) @@ -216,7 +216,7 @@ class TestConvertBack(common.TransactionCase): rendered = self.registry('website.qweb').render_tag_field( e, {'field': field_value}, '', ir_qweb.QWebContext(self.cr, self.uid, { 'record': record, - })) + }, context={'inherit_branding': True})) element = html.fromstring(rendered, parser=html.HTMLParser(encoding='utf-8')) # emulate edition diff --git a/addons/website/tests/test_requests.py b/addons/website/tests/test_requests.py index 9fb29b63c75..2a22ae04445 100644 --- a/addons/website/tests/test_requests.py +++ b/addons/website/tests/test_requests.py @@ -121,6 +121,6 @@ class URL(object): def load_tests(loader, base, _): base.addTest(CrawlSuite()) - base.addTest(CrawlSuite('admin', tools.config['admin_passwd'])) + base.addTest(CrawlSuite('admin', 'admin')) base.addTest(CrawlSuite('demo', 'demo')) return base diff --git a/addons/website/tests/test_ui.py b/addons/website/tests/test_ui.py index c9dd80ff885..54cd8a73a67 100644 --- a/addons/website/tests/test_ui.py +++ b/addons/website/tests/test_ui.py @@ -8,6 +8,6 @@ class TestUi(openerp.tests.HttpCase): self.phantom_js("/", "console.log('ok')", "openerp.website.editor", login='admin') def test_04_admin_tour_banner(self): - self.phantom_js("/", "openerp.website.Tour.run_test('banner')", "openerp.website.Tour", login='admin') + self.phantom_js("/", "openerp.website.Tour.run_test('banner')", "openerp.website.Tour.tours.banner", login='admin') # vim:et: diff --git a/addons/website/views/snippets.xml b/addons/website/views/snippets.xml index eb32feef194..55bd7679b66 100644 --- a/addons/website/views/snippets.xml +++ b/addons/website/views/snippets.xml @@ -13,14 +13,7 @@
-
-
  • -
  • - Add Slide -
  • -
  • - Remove Slide -
  • +
    Banner @@ -51,7 +44,7 @@
    -
    +
    Text-Image @@ -79,7 +72,7 @@
    -
    +
    Image-Text @@ -107,7 +100,7 @@
    -
    +
    Big Message @@ -128,7 +121,7 @@
    -
    +
    Text Block @@ -166,7 +159,7 @@
    -
    +
    Title @@ -183,7 +176,7 @@
    -
    +
    Features @@ -214,7 +207,7 @@
    -
    +
    Big Picture @@ -246,7 +239,7 @@
    -
    +
    Three Columns @@ -291,7 +284,7 @@
    -
    +
    Well @@ -303,7 +296,7 @@
    -
    +
    Quote @@ -318,7 +311,7 @@
    -
    +
    Panel @@ -335,7 +328,7 @@
    -
    +
    Separator @@ -343,11 +336,29 @@
    + +
    +
    + + Share +
    +
    +

    + Share + + + + + +

    +
    +
    +
    -
    +
    Portfolio @@ -380,7 +391,7 @@
    -
    +
    Image Gallery @@ -422,7 +433,7 @@
    -
    +
    Comparisons @@ -528,7 +539,7 @@
    -
    +
    Button @@ -545,7 +556,7 @@
    -
    +
    FAQ @@ -592,7 +603,7 @@
    -
    +
    References @@ -609,7 +620,7 @@
    -
    +

    Write a quote here from one of your customers. Quotes are a great way to build confidence in your products or services. @@ -618,7 +629,7 @@

    -
    +

    OpenERP provides essential platform for our project management. Things are better organized and more visible with it. @@ -646,14 +657,7 @@

    -
    -
  • -
  • - Add Slide -
  • -
  • - Remove Slide -
  • +
    Quotes Slider @@ -706,7 +710,7 @@
    -
    +
    Feature Grid @@ -766,22 +770,11 @@
    -
    +
    Parallax
    -
    @@ -789,16 +782,16 @@
    -
    +
    Parallax Slider
    -
    - + + + + - + \ No newline at end of file diff --git a/addons/website/views/themes.xml b/addons/website/views/themes.xml index f56ab2b5dd7..82f5105adcd 100644 --- a/addons/website/views/themes.xml +++ b/addons/website/views/themes.xml @@ -206,6 +206,7 @@ @@ -218,48 +219,56 @@ @@ -272,6 +281,7 @@ diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 580957b81d6..4b4cca1a19a 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -364,7 +364,7 @@
  • - Edit
  • diff --git a/addons/website_blog/static/src/js/website.tour.blog.js b/addons/website_blog/static/src/js/website.tour.blog.js index e76e793dfda..3470e2e383b 100644 --- a/addons/website_blog/static/src/js/website.tour.blog.js +++ b/addons/website_blog/static/src/js/website.tour.blog.js @@ -65,7 +65,7 @@ popover: { fixed: true }, }, { - snippet: 'image-text', + snippet: '#snippet_structure .oe_snippet:eq(2)', placement: 'bottom', title: _t("Drag & Drop a Block"), content: _t("Drag this block and drop it in your page."), @@ -79,7 +79,7 @@ popover: { fixed: true }, }, { - snippet: 'text-block', + snippet: '#snippet_structure .oe_snippet:eq(4)', placement: 'bottom', title: _t("Drag & Drop a block"), content: _t("Drag this block and drop it below the image block."), diff --git a/addons/website_blog/views/website_blog_templates.xml b/addons/website_blog/views/website_blog_templates.xml index 203dcc3bb71..179b1b49ff0 100644 --- a/addons/website_blog/views/website_blog_templates.xml +++ b/addons/website_blog/views/website_blog_templates.xml @@ -155,7 +155,19 @@ + + + + diff --git a/addons/website_mail/views/website_mail.xml b/addons/website_mail/views/website_mail.xml index e7a17c8f3db..2882125de67 100644 --- a/addons/website_mail/views/website_mail.xml +++ b/addons/website_mail/views/website_mail.xml @@ -9,7 +9,6 @@ @@ -22,6 +21,7 @@