[MERGE] forward port branch saas-11.3 up to ecd8c023b7

This commit is contained in:
Christophe Simonis
2019-03-08 16:10:55 +01:00
24 changed files with 60 additions and 58 deletions
@@ -3,7 +3,6 @@
from odoo.addons.account.tests.account_test_classes import AccountingTestCase
from odoo.exceptions import ValidationError
from odoo.tests import tagged
from odoo.tools import mute_logger
import time
@@ -60,8 +59,7 @@ class TestAccountInvoiceRounding(AccountingTestCase):
# to avoid a ValidationError from _check_cash_rounding because the onchange
# are not well triggered in the tests.
try:
with mute_logger('odoo.models'):
invoice_id.cash_rounding_id = cash_rounding_id
invoice_id.cash_rounding_id = cash_rounding_id
except ValidationError:
pass
@@ -71,7 +71,7 @@
</div>
<div class="col-6">
<span class="float-right badge badge-secondary">
<field name="state" widget="kanban_label_selection" options="{'classes': {'draft': 'default', 'sent': 'success'}}"/>
<field name="state" widget="label_selection" options="{'classes': {'draft': 'default', 'sent': 'success'}}"/>
</span>
</div>
</div>
+1 -1
View File
@@ -1541,7 +1541,7 @@
</div>
<div class="col-6">
<span class="float-right">
<field name="state" widget="kanban_label_selection" options="{'classes': {'draft': 'default', 'posted': 'success'}}"/>
<field name="state" widget="label_selection" options="{'classes': {'draft': 'default', 'posted': 'success'}}"/>
</span>
</div>
</div>
+1 -1
View File
@@ -231,7 +231,7 @@ class GamificationBadge(models.Model):
elif self.rule_auth == 'users' and self.env.user not in self.rule_auth_user_ids:
return self.USER_NOT_VIP
elif self.rule_auth == 'having':
all_user_badges = self.env['gamification.badge.user'].search([('user_id', '=', self.env.uid)])
all_user_badges = self.env['gamification.badge.user'].search([('user_id', '=', self.env.uid)]).mapped('badge_id')
if self.rule_auth_badge_ids - all_user_badges:
return self.BADGE_REQUIRED
@@ -77,7 +77,7 @@
<div>
<strong class="o_kanban_record_title"><t t-esc="record.employee_id.value"/></strong>
<span class="float-right">
<field name="state" widget="kanban_label_selection" options="{'classes': {'draft': 'default', 'validate': 'success','confirm': 'default', 'cancel': 'danger'}}"/>
<field name="state" widget="label_selection" options="{'classes': {'draft': 'default', 'validate': 'success','confirm': 'default', 'cancel': 'danger'}}"/>
</span>
</div>
<div class="text-muted o_kanban_record_subtitle">
+1 -1
View File
@@ -383,7 +383,7 @@
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title"><field name="product_id"/></strong>
</div>
<field name="state" widget="kanban_label_selection" options="{'classes': {'new': 'default', 'confirmed': 'success', 'cancelled':'danger'}}"/>
<field name="state" widget="label_selection" options="{'classes': {'new': 'default', 'confirmed': 'success', 'cancelled':'danger'}}"/>
</div>
<div>
<field name="note"/>
@@ -46,7 +46,7 @@
<div class="btn btn-secondary pull-right" id="button_add_blacklist" style="display:none">Blacklist Me</div>
</div>
<div class="btn btn-secondary pull-right" id="button_remove_blacklist" style="display:none">Come Back</div>
<input type="submit" id="send_form" class="btn btn-primary" value="Update my subscriptions"/>
<button type="submit" id="send_form" class="btn btn-primary">Update my subscriptions</button>
</div>
</div>
+1 -1
View File
@@ -83,7 +83,7 @@
</div>
<div class="col-4">
<span class="float-right text-right">
<field name="state" widget="kanban_label_selection" options="{'classes': {'draft': 'default', 'done': 'success'}}"/>
<field name="state" widget="label_selection" options="{'classes': {'draft': 'default', 'done': 'success'}}"/>
</span>
</div>
</div>
+12 -3
View File
@@ -6,6 +6,7 @@ from datetime import datetime
import hashlib
import hmac
import logging
import string
import time
from odoo import _, api, fields, models
@@ -54,8 +55,16 @@ class PaymentAcquirerAuthorize(models.Model):
values['x_fp_sequence'],
values['x_fp_timestamp'],
values['x_amount'],
values['x_currency_code']])
return hmac.new(values['x_trans_key'].encode('utf-8'), data.encode('utf-8'), hashlib.md5).hexdigest()
values['x_currency_code']]).encode('utf-8')
# [BACKWARD COMPATIBILITY] Check that the merchant did update his transaction
# key to signature key (end of MD5 support from Authorize.net)
# The signature key is now '128-character hexadecimal format', while the
# transaction key was only 16-character.
if len(values['x_trans_key']) == 128:
return hmac.new(values['x_trans_key'].decode("hex").encode('utf-8'), data, hashlib.sha512).hexdigest().upper()
else:
return hmac.new(values['x_trans_key'].encode('utf-8'), data, hashlib.md5).hexdigest()
@api.multi
def authorize_form_generate_values(self, values):
@@ -172,7 +181,7 @@ class TxAuthorize(models.Model):
def _authorize_form_get_tx_from_data(self, data):
""" Given a data dict coming from authorize, verify it and find the related
transaction record. """
reference, trans_id, fingerprint = data.get('x_invoice_num'), data.get('x_trans_id'), data.get('x_MD5_Hash')
reference, trans_id, fingerprint = data.get('x_invoice_num'), data.get('x_trans_id'), data.get('x_SHA2_Hash') or data.get('x_MD5_Hash')
if not reference or not trans_id or not fingerprint:
error_msg = _('Authorize: received data with missing reference (%s) or trans_id (%s) or fingerprint (%s)') % (reference, trans_id, fingerprint)
_logger.info(error_msg)
@@ -1,7 +1,5 @@
# -*- coding: utf-8 -*-
import hashlib
import hmac
import time
from werkzeug import urls
from lxml import objectify
@@ -29,15 +27,6 @@ class AuthorizeCommon(PaymentAcquirerCommon):
@odoo.tests.tagged('post_install', '-at_install', '-standard', 'external')
class AuthorizeForm(AuthorizeCommon):
def _authorize_generate_hashing(self, values):
data = '^'.join([
values['x_login'],
values['x_fp_sequence'],
values['x_fp_timestamp'],
values['x_amount'],
]) + '^'
return hmac.new(values['x_trans_key'].encode('utf-8'), data.encode('utf-8'), hashlib.md5).hexdigest()
def test_10_Authorize_form_render(self):
self.assertEqual(self.authorize.environment, 'test', 'test without test environment')
@@ -82,7 +71,7 @@ class AuthorizeForm(AuthorizeCommon):
'x_ship_to_state': None,
}
form_values['x_fp_hash'] = self._authorize_generate_hashing(form_values)
form_values['x_fp_hash'] = self.env['payment.acquirer']._authorize_generate_hashing(form_values)
# render the button
res = self.authorize.render('SO004', 56.16, self.currency_usd.id, values=self.buyer_values)
# check form result
@@ -109,7 +98,9 @@ class AuthorizeForm(AuthorizeCommon):
# typical data posted by authorize after client has successfully paid
authorize_post_data = {
'return_url': u'/shop/payment/validate',
# x_MD5_Hash will be empty starting the 28th March 2019
'x_MD5_Hash': u'7934485E1C105940BE854208D10FAB4F',
'x_SHA2_Hash': u'7D3AC844BE8CA3F649AB885A90D22CFE35B850338EC91D1A5ADD819A85FF948A3D777334A18CDE36821DC8F2B42A6E1950C1FF96B52B60F23201483A656195FB',
'x_account_number': u'XXXX0027',
'x_address': u'Huge Street 2/543',
'x_amount': u'320.00',
@@ -1318,7 +1318,7 @@ var ClientListScreenWidget = ScreenWidget.extend({
// what happens when we've just pushed modifications for a partner of id partner_id
saved_client_details: function(partner_id){
var self = this;
this.reload_partners().then(function(){
return this.reload_partners().then(function(){
var partner = self.pos.db.get_partner_by_id(partner_id);
if (partner) {
self.new_client = partner;
@@ -142,7 +142,7 @@
</div>
<div class="col-4">
<span class="float-right text-right">
<field name="state" widget="kanban_label_selection" options="{'classes': {'draft': 'default',
<field name="state" widget="label_selection" options="{'classes': {'draft': 'default',
'invoiced': 'success', 'cancel': 'danger'}}"/>
</span>
</div>
@@ -161,7 +161,7 @@
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title"><span><field name="config_id"/></span></strong>
</div>
<field name="state" widget="kanban_label_selection" options="{'classes': {'opening_control': 'default',
<field name="state" widget="label_selection" options="{'classes': {'opening_control': 'default',
'opened': 'success', 'closing_control': 'warning', 'closed': 'warning'}}"/>
</div>
<div class="o_kanban_record_body">
@@ -30,7 +30,7 @@
<div class="o_kanban_record_headings mt4">
<strong class="o_kanban_record_title"><field name="name"/></strong>
</div>
<field name="exclusive" widget="kanban_label_selection"/>
<field name="exclusive" widget="label_selection"/>
</div>
</div>
</t>
@@ -252,7 +252,7 @@
<div class="o_kanban_record_headings mt4">
<strong class="o_kanban_record_title"><span><field name="name"/></span></strong>
</div>
<field name="state" widget="kanban_label_selection" options="{'classes': {'draft': 'default', 'in_progress': 'default', 'open': 'success', 'done': 'success', 'close': 'danger'}}"/>
<field name="state" widget="label_selection" options="{'classes': {'draft': 'default', 'in_progress': 'default', 'open': 'success', 'done': 'success', 'close': 'danger'}}"/>
</div>
<div class="o_kanban_record_body">
<span class="text-muted"><field name="type_id"/></span>
+1 -1
View File
@@ -206,7 +206,7 @@
<strong><span><t t-esc="record.name.value"/></span></strong>
</div>
<div class="col-6 text-right">
<span class="badge badge-secondary"><field name="state" widget="kanban_label_selection" options="{'classes': {'draft': 'info', 'cancel': 'danger', 'done': 'success', 'under_repair': 'dafault'}}"/></span>
<span class="badge badge-secondary"><field name="state" widget="label_selection" options="{'classes': {'draft': 'info', 'cancel': 'danger', 'done': 'success', 'under_repair': 'dafault'}}"/></span>
</div>
</div>
<div class="row">
+1 -1
View File
@@ -97,7 +97,7 @@
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title"><span><t t-esc="record.name.value"/></span></strong>
</div>
<field name="state" widget="kanban_label_selection" options="{'classes': {'draft': 'info', 'cancel': 'default', 'confirm': 'success', 'done': 'success'}}"/>
<field name="state" widget="label_selection" options="{'classes': {'draft': 'info', 'cancel': 'default', 'confirm': 'success', 'done': 'success'}}"/>
</div>
<div class="o_kanban_record_bottom">
<div class="oe_kanban_bottom_left">
+2 -2
View File
@@ -447,7 +447,7 @@
</div>
<div class="col-4">
<span class="float-right text-right">
<field name="state" widget="kanban_label_selection" options="{'classes': {'draft': 'default', 'cancel': 'danger',
<field name="state" widget="label_selection" options="{'classes': {'draft': 'default', 'cancel': 'danger',
'assigned': 'success', 'confirmed': 'default'}}"/>
</span>
</div>
@@ -511,7 +511,7 @@
</div>
<div class="col-6">
<span class="float-right">
<field name="state" widget="kanban_label_selection" options="{'classes': {'draft': 'info', 'cancel': 'default',
<field name="state" widget="label_selection" options="{'classes': {'draft': 'info', 'cancel': 'default',
'assigned': 'success', 'done': 'success'}}"/>
</span>
</div>
@@ -69,7 +69,7 @@
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title"><field name="name"/></strong>
</div>
<field name="state" widget="kanban_label_selection"/>
<field name="state" widget="label_selection"/>
</div>
<div class="o_kanban_record_bottom">
<div class="oe_kanban_bottom_left"/>
+1 -1
View File
@@ -109,7 +109,7 @@
<field name="date_create"/>
</div>
<div class="oe_kanban_bottom_right mr4">
<field name="state" widget="kanban_label_selection" options="{'classes': {'new': 'default', 'done': 'success', 'skip':'warning'}}"/>
<field name="state" widget="label_selection" options="{'classes': {'new': 'default', 'done': 'success', 'skip':'warning'}}"/>
</div>
</div>
</div>
@@ -44,8 +44,9 @@ registry
.add('priority', basic_fields.PriorityWidget)
.add('attachment_image', basic_fields.AttachmentImage)
.add('label_selection', basic_fields.LabelSelection)
.add('kanban_label_selection', basic_fields.LabelSelection) // deprecated, use label_selection
.add('state_selection', basic_fields.StateSelectionWidget)
.add('kanban_state_selection', basic_fields.StateSelectionWidget)
.add('kanban_state_selection', basic_fields.StateSelectionWidget) // deprecated, use state_selection
.add('boolean_favorite', basic_fields.FavoriteWidget)
.add('boolean_button', basic_fields.FieldBooleanButton)
.add('boolean_toggle', basic_fields.BooleanToggle)
@@ -90,6 +90,11 @@ msgstr ""
msgid "Mailing List"
msgstr ""
#. module: website_mass_mailing
#: model:ir.ui.view,arch_db:website_mass_mailing.unsubscribe
msgid "Update my subscriptions"
msgstr ""
#. module: website_mass_mailing
#. openerp-web
#: code:addons/website_mass_mailing/static/src/js/website_mass_mailing.editor.js:21
@@ -160,4 +165,3 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:website_mass_mailing.s_newsletter_subscribe_popup
msgid "your email..."
msgstr ""
+1 -1
View File
@@ -236,7 +236,7 @@ class Website(models.Model):
country_code = request.session['geoip'].get('country_code')
if country_code:
country_id = request.env['res.country'].search([('code', '=', country_code)], limit=1).id
fp_id = request.env['account.fiscal.position'].sudo()._get_fpos_by_region(country_id)
fp_id = request.env['account.fiscal.position'].sudo().with_context(force_company=request.website.company_id.id)._get_fpos_by_region(country_id)
sale_order.fiscal_position_id = fp_id
else:
# if no geolocation, use the public user fp
+18 -18
View File
@@ -1107,7 +1107,7 @@ class TestViews(ViewCase):
# implemeted elsewhere...
modifiers_tests()
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_invalid_field(self):
with self.assertRaises(ValidationError):
self.View.create({
@@ -1121,7 +1121,7 @@ class TestViews(ViewCase):
""",
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_invalid_subfield(self):
with self.assertRaises(ValidationError):
self.View.create({
@@ -1140,7 +1140,7 @@ class TestViews(ViewCase):
""",
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_context_in_view(self):
arch = """
<form string="View">
@@ -1160,7 +1160,7 @@ class TestViews(ViewCase):
'arch': arch % '',
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_context_in_subview(self):
arch = """
<form string="View">
@@ -1192,7 +1192,7 @@ class TestViews(ViewCase):
'arch': arch % ('<field name="model"/>', ''),
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_context_in_subview_with_parent(self):
arch = """
<form string="View">
@@ -1223,7 +1223,7 @@ class TestViews(ViewCase):
'arch': arch % ('', '<field name="model"/>'),
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_context_in_subsubview_with_parent(self):
arch = """
<form string="View">
@@ -1265,7 +1265,7 @@ class TestViews(ViewCase):
'arch': arch % ('', '', '<field name="model"/>'),
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_domain_in_view(self):
arch = """
<form string="View">
@@ -1285,7 +1285,7 @@ class TestViews(ViewCase):
'arch': arch % '',
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_domain_in_subview(self):
arch = """
<form string="View">
@@ -1316,7 +1316,7 @@ class TestViews(ViewCase):
'arch': arch % ('<field name="model"/>', ''),
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_domain_in_subview_with_parent(self):
arch = """
<form string="View">
@@ -1347,7 +1347,7 @@ class TestViews(ViewCase):
'arch': arch % ('', '<field name="model"/>'),
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_domain_on_field_in_view(self):
field = self.env['ir.ui.view']._fields['inherit_id']
self.patch(field, 'domain', "[('model', '=', model)]")
@@ -1370,7 +1370,7 @@ class TestViews(ViewCase):
'arch': arch % '',
})
@mute_logger('odoo.addons.base.ir.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.ir.ir_ui_view')
def test_domain_on_field_in_subview(self):
field = self.env['ir.ui.view']._fields['inherit_id']
self.patch(field, 'domain', "[('model', '=', model)]")
@@ -1404,7 +1404,7 @@ class TestViews(ViewCase):
'arch': arch % ('<field name="model"/>', ''),
})
@mute_logger('odoo.addons.base.ir.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.ir.ir_ui_view')
def test_domain_on_field_in_subview_with_parent(self):
field = self.env['ir.ui.view']._fields['inherit_id']
self.patch(field, 'domain', "[('model', '=', parent.model)]")
@@ -1438,7 +1438,7 @@ class TestViews(ViewCase):
'arch': arch % ('', '<field name="model"/>'),
})
@mute_logger('odoo.addons.base.ir.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.ir.ir_ui_view')
def test_domain_on_field_in_noneditable_subview(self):
field = self.env['ir.ui.view']._fields['inherit_id']
self.patch(field, 'domain', "[('model', '=', model)]")
@@ -1466,7 +1466,7 @@ class TestViews(ViewCase):
'arch': arch % ' editable="bottom"',
})
@mute_logger('odoo.addons.base.ir.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.ir.ir_ui_view')
def test_domain_on_readonly_field_in_view(self):
field = self.env['ir.ui.view']._fields['inherit_id']
self.patch(field, 'domain', "[('model', '=', model)]")
@@ -1496,7 +1496,7 @@ class TestViews(ViewCase):
'arch': arch,
})
@mute_logger('odoo.addons.base.ir.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.ir.ir_ui_view')
def test_domain_on_readonly_field_in_subview(self):
field = self.env['ir.ui.view']._fields['inherit_id']
self.patch(field, 'domain', "[('model', '=', model)]")
@@ -1524,7 +1524,7 @@ class TestViews(ViewCase):
'arch': arch % '',
})
@mute_logger('odoo.addons.base.ir.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.ir.ir_ui_view')
def test_attrs_field(self):
arch = """
<form string="View">
@@ -1545,7 +1545,7 @@ class TestViews(ViewCase):
'arch': arch % '',
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_attrs_subfield(self):
arch = """
<form string="View">
@@ -1577,7 +1577,7 @@ class TestViews(ViewCase):
'arch': arch % ('<field name="model"/>', ''),
})
@mute_logger('odoo.addons.base.models.ir_ui_view', 'odoo.models')
@mute_logger('odoo.addons.base.models.ir_ui_view')
def test_attrs_subfield_with_parent(self):
arch = """
<form string="View">
-1
View File
@@ -1109,7 +1109,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
except ValidationError as e:
raise
except Exception as e:
_logger.exception('Exception while validating constraint')
raise ValidationError("%s\n\n%s" % (_("Error while validating constraint"), tools.ustr(e)))
@api.model