[IMP] web: many2many_binary, binary, image, add the option `accepted_file_extensions`

Purpose
=======
We want to add an option on the widgets
- many2many_binary,
- binary,
- image

This option specifies what file extensions the user can pick from the file input dialog box.

Examples
========
```xml
<field widget="many2many_binary" options="{'accepted_file_extensions': 'image/*'}"/>
<field widget="many2many_binary" options="{'accepted_file_extensions': '.png,.jpeg'}"/>
<field widget="many2many_binary" options="{'accepted_file_extensions': 'application/pdf'}"/>
<field widget="image" options="{'accepted_file_extensions': '.png,.jpeg'}"/>
<field widget="binary" options="{'accepted_file_extensions': '.pdf,.svg'}"/>
```

How
===
Add an option (accepted_file_extensions) in the template ``HiddenInputFile`` (the widget many2many_binary is using this template)
So, we can also use this new option in others widgets using ``HiddenInputFile``
In the many2many_binary, read the ``nodeOptions`` and set the widget attribute ``accepted_file_extensions``

We also have to fix some other widget, because an property ``image_only`` was already existing in the template ``HiddenInputFile``
(we just need to replace ``image_only=True`` to ``accepted_file_extensions='image/*'``

The widget ``FieldPdfViewer`` (pdf_viewer) now use the new option to filtrate PDF
(instead of removing the <input/> and adding <input accept='.pdf'/>).

Tests
=====
We also test if the option is correctly set on the <input/>
- binary
- image
- many2many_binary

Impacted widgets
===============
- many2many_binary
- image: this widget use ``options="{accepted_file_extensions='image/*'}"`` instead of ``image_only=True``
- tablet_image: same as ``image``

Task #2082815

closes odoo/odoo#38351

Signed-off-by: VincentSchippefilt <VincentSchippefilt@users.noreply.github.com>
This commit is contained in:
Debauche Stéphane
2019-10-16 13:57:49 +00:00
parent 594206d4f3
commit e981e3312d
7 changed files with 69 additions and 15 deletions
@@ -2095,6 +2095,22 @@ QUnit.module('basic_fields', {
session.get_file = oldGetFile;
});
QUnit.test('binary fields: option accepted_file_extensions', async function (assert) {
assert.expect(1);
var form = await createView({
View: FormView,
model: 'partner',
data: this.data,
arch: `<form string="Partners">
<field name="document" widget="binary" options="{'accepted_file_extensions': '.dat,.bin'}"/>
</form>`
});
assert.strictEqual(form.$('input.o_input_file').attr('accept'), '.dat,.bin',
"the input should have the correct ``accept`` attribute");
form.destroy();
});
QUnit.test('binary fields that are readonly in create mode do not download', async function (assert) {
assert.expect(2);
@@ -2414,6 +2430,34 @@ QUnit.module('basic_fields', {
form.destroy();
});
QUnit.test('image: option accepted_file_extensions', async function (assert) {
assert.expect(2);
var form = await createView({
View: FormView,
model: 'partner',
data: this.data,
arch: `<form string="Partners">
<field name="document" widget="image" options="{'accepted_file_extensions': '.png,.jpeg'}"/>
</form>`
});
assert.strictEqual(form.$('input.o_input_file').attr('accept'), '.png,.jpeg',
"the input should have the correct ``accept`` attribute");
form.destroy();
var form = await createView({
View: FormView,
model: 'partner',
data: this.data,
arch: `<form string="Partners">
<field name="document" widget="image"/>
</form>`
});
assert.strictEqual(form.$('input.o_input_file').attr('accept'), 'image/*',
'the default value for the attribute "accept" on the "image" widget must be "image/*"');
form.destroy();
});
QUnit.test('image fields in subviews are loaded correctly', async function (assert) {
assert.expect(6);