[MERGE] forward port branch 11.0 up to a9a556178d
This commit is contained in:
@@ -50,6 +50,7 @@ Sidebar.include({
|
||||
* @override
|
||||
*/
|
||||
updateEnv: function (env) {
|
||||
this.env = env;
|
||||
var _super = _.bind(this._super, this, env);
|
||||
var def = this.hasAttachments ? this._updateAttachments() : $.when();
|
||||
def.then(_super);
|
||||
|
||||
@@ -95,7 +95,7 @@ ADAMEquipmentProtocol = ScaleProtocol(
|
||||
parity=serial.PARITY_NONE,
|
||||
timeout=0.2,
|
||||
writeTimeout=0.2,
|
||||
weightRegexp=r"\s*([0-9.]+)kg", # LABEL format 3 + KG in the scale settings, but Label 1/2 should work
|
||||
weightRegexp=b"\s*([0-9.]+)kg", # LABEL format 3 + KG in the scale settings, but Label 1/2 should work
|
||||
statusRegexp=None,
|
||||
statusParse=None,
|
||||
commandTerminator=b"\r\n",
|
||||
|
||||
@@ -9,7 +9,7 @@ A11219,A11219,出庫請求仮,account.data_account_type_current_assets,,FALSE,,l
|
||||
A11301,A11301,未収収益,account.data_account_type_current_assets,,FALSE,,l10n_jp1
|
||||
A11401,A11401,有価証券,account.data_account_type_current_assets,,FALSE,,l10n_jp1
|
||||
A11501,A11501,商品,account.data_account_type_current_assets,,FALSE,,l10n_jp1
|
||||
A11503,A11503,製品,account.data_account_type_current_assets,,FALSE,,l10n_jp1
|
||||
A11502,A11502,製品,account.data_account_type_current_assets,,FALSE,,l10n_jp1
|
||||
A11504,A11504,仕掛品,account.data_account_type_current_assets,,FALSE,,l10n_jp1
|
||||
A11505,A11505,原材料,account.data_account_type_current_assets,,FALSE,,l10n_jp1
|
||||
A11506,A11506,資材,account.data_account_type_current_assets,,FALSE,,l10n_jp1
|
||||
|
||||
|
@@ -405,4 +405,4 @@ lu_2011_tax_VP-PA-3,Sales Services 3% - Country,VP-PA-3,sale,percent,3,lu_2011_a
|
||||
lu_2011_tax_VP-PA-6,Sales Services 6% - Country,VP-PA-6,sale,percent,6,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,504,,"tag_lu_200,tag_lu_278",tax_group_6
|
||||
lu_2015_tax_VP-PA-8,Sales Services 8% - Country,VP-PA-8,sale,percent,8,lu_2011_account_4614111,lu_2011_account_4614111,lu_2011_chart_1,505,,"tag_lu_294,tag_lu_218",tax_group_8
|
||||
lu_2015_tax_SANS,Without Taxes,SANS,purchase,percent,0,,,lu_2011_chart_1,506,,tag_lu_598,tax_group_0
|
||||
lu_2015_tax_SANS,Without Taxes,SANS,sale,percent,0,,,lu_2011_chart_1,507,,tag_lu_598,tax_group_0
|
||||
lu_2015_tax_SANS_sale,Without Taxes,SANS,sale,percent,0,,,lu_2011_chart_1,507,,tag_lu_598,tax_group_0
|
||||
|
||||
|
@@ -507,9 +507,9 @@ class StockMove(models.Model):
|
||||
if not accounts_data.get('stock_journal', False):
|
||||
raise UserError(_('You don\'t have any stock journal defined on your product category, check if you have installed a chart of accounts'))
|
||||
if not acc_src:
|
||||
raise UserError(_('Cannot find a stock input account for the product %s. You must define one on the product category, or on the location, before processing this operation.') % (self.product_id.name))
|
||||
raise UserError(_('Cannot find a stock input account for the product %s. You must define one on the product category, or on the location, before processing this operation.') % (self.product_id.display_name))
|
||||
if not acc_dest:
|
||||
raise UserError(_('Cannot find a stock output account for the product %s. You must define one on the product category, or on the location, before processing this operation.') % (self.product_id.name))
|
||||
raise UserError(_('Cannot find a stock output account for the product %s. You must define one on the product category, or on the location, before processing this operation.') % (self.product_id.display_name))
|
||||
if not acc_valuation:
|
||||
raise UserError(_('You don\'t have any stock valuation account defined on your product category. You must define one before processing this operation.'))
|
||||
journal_id = accounts_data['stock_journal'].id
|
||||
@@ -533,7 +533,7 @@ class StockMove(models.Model):
|
||||
|
||||
# check that all data is correct
|
||||
if self.company_id.currency_id.is_zero(debit_value):
|
||||
raise UserError(_("The cost of %s is currently equal to 0. Change the cost or the configuration of your product to avoid an incorrect valuation.") % (self.product_id.name,))
|
||||
raise UserError(_("The cost of %s is currently equal to 0. Change the cost or the configuration of your product to avoid an incorrect valuation.") % (self.product_id.display_name,))
|
||||
credit_value = debit_value
|
||||
|
||||
|
||||
|
||||
@@ -91,17 +91,17 @@ def make_github_link(app, path, line=None, mode="blob"):
|
||||
'',
|
||||
'' if line is None else 'L%d' % line
|
||||
))
|
||||
|
||||
def add_doc_link(app, pagename, templatename, context, doctree):
|
||||
""" Add github_link function linking to the current page on github """
|
||||
if not app.config.github_user and app.config.github_project:
|
||||
return
|
||||
|
||||
# FIXME: find other way to recover current document's source suffix
|
||||
# in Sphinx 1.3 it's possible to have mutliple source suffixes and that
|
||||
# may be useful in the future
|
||||
source_suffix = app.config.source_suffix
|
||||
source_suffix = source_suffix if isinstance(source_suffix, pycompat.string_types) else source_suffix[0]
|
||||
# in 1.3 source_suffix can be a list
|
||||
# in 1.8 source_suffix can be a mapping
|
||||
# FIXME: will break if we ever add support for !rst markdown documents maybe
|
||||
if not isinstance(source_suffix, pycompat.string_types):
|
||||
source_suffix = next(iter(source_suffix))
|
||||
# can't use functools.partial because 3rd positional is line not mode
|
||||
context['github_link'] = lambda mode='edit': make_github_link(
|
||||
app, 'doc/%s%s' % (pagename, source_suffix), mode=mode)
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
China, 2018-09-28
|
||||
|
||||
Inspur Genersoft Co., Ltd agrees to the terms of the Odoo Corporate Contributor
|
||||
License Agreement v1.0.
|
||||
|
||||
I declare that I am authorized and able to make this agreement and sign this
|
||||
declaration.
|
||||
|
||||
Signed,
|
||||
|
||||
David Yu, yudw@inspur.com
|
||||
|
||||
List of contributors:
|
||||
|
||||
Brain Wang wangbuke@inspur.com
|
||||
David Yu yudw@inspur.com
|
||||
Alex Aisin-Gioro wubai@inspur.com
|
||||
@@ -278,10 +278,6 @@ class IrHttp(models.AbstractModel):
|
||||
obj = None
|
||||
if xmlid:
|
||||
obj = env.ref(xmlid, False)
|
||||
elif id and model == 'ir.attachment' and access_token:
|
||||
obj = env[model].sudo().browse(int(id))
|
||||
if not consteq(obj.access_token or '', access_token):
|
||||
return (403, [], None)
|
||||
elif id and model in env.registry:
|
||||
obj = env[model].browse(int(id))
|
||||
|
||||
@@ -289,6 +285,12 @@ class IrHttp(models.AbstractModel):
|
||||
if not obj or not obj.exists() or field not in obj:
|
||||
return (404, [], None)
|
||||
|
||||
# access token grant access
|
||||
if model == 'ir.attachment' and access_token:
|
||||
obj = obj.sudo()
|
||||
if not consteq(obj.access_token or '', access_token):
|
||||
return (403, [], None)
|
||||
|
||||
# check read access
|
||||
try:
|
||||
last_update = obj['__last_update']
|
||||
|
||||
@@ -79,3 +79,54 @@ class test_ir_http_mimetype(common.TransactionCase):
|
||||
)
|
||||
mimetype = dict(headers).get('Content-Type')
|
||||
self.assertEqual(mimetype, 'image/gif')
|
||||
|
||||
def test_ir_http_attachment_access(self):
|
||||
""" Test attachment access with and without access token """
|
||||
public_user = self.env.ref('base.public_user')
|
||||
attachment = self.env['ir.attachment'].create({
|
||||
'datas': GIF,
|
||||
'name': 'Test valid access token with image',
|
||||
'datas_fname': 'image.gif'
|
||||
})
|
||||
|
||||
defaults = {
|
||||
'id': attachment.id,
|
||||
'default_mimetype': 'image/gif',
|
||||
'env': public_user.sudo(public_user.id).env,
|
||||
}
|
||||
|
||||
def test_access(**kwargs):
|
||||
status, _, _ = self.env['ir.http'].binary_content(
|
||||
**defaults, **kwargs
|
||||
)
|
||||
return status
|
||||
|
||||
status = test_access()
|
||||
self.assertEqual(status, 403, "no access")
|
||||
|
||||
status = test_access(access_token='Secret')
|
||||
self.assertEqual(status, 403,
|
||||
"no access if access token for attachment without access token")
|
||||
|
||||
attachment.access_token = 'Secret'
|
||||
status = test_access(access_token='Secret')
|
||||
self.assertEqual(status, 200, "access for correct access token")
|
||||
|
||||
status = test_access(access_token='Wrong')
|
||||
self.assertEqual(status, 403, "no access for wrong access token")
|
||||
|
||||
attachment.public = True
|
||||
status = test_access()
|
||||
self.assertEqual(status, 200, "access for attachment with access")
|
||||
|
||||
status = test_access(access_token='Wrong')
|
||||
self.assertEqual(status, 403,
|
||||
"no access for wrong access token for attachment with access")
|
||||
|
||||
attachment.unlink()
|
||||
status = test_access()
|
||||
self.assertEqual(status, 404, "no access for deleted attachment")
|
||||
|
||||
status = test_access(access_token='Secret')
|
||||
self.assertEqual(status, 404,
|
||||
"no access with access token for deleted attachment")
|
||||
|
||||
Reference in New Issue
Block a user