[12.0] Add base_fileurl_field

This commit is contained in:
Akim Juillerat
2019-03-13 19:18:07 +01:00
parent a7207cc3e7
commit d83aca68e6
13 changed files with 297 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
# Copyright 2019 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
from . import models
+16
View File
@@ -0,0 +1,16 @@
# Copyright 2019 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
{
'name': 'test base fileurl fields',
'version': '12.0.1.0.0',
'category': 'Tests',
'description': """A module to verify fileurl field.""",
'depends': [
'base_fileurl_field'
],
'data': [
"views/res_partner.xml",
],
'installable': True,
'auto_install': False,
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

+1
View File
@@ -0,0 +1 @@
This is a simple text file.
@@ -0,0 +1 @@
from . import res_partner
@@ -0,0 +1,44 @@
# Copyright 2019 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class ResPartner(models.Model):
_inherit = 'res.partner'
name = fields.Char()
url_file = fields.FileURL(
storage_location='s3',
filename='url_file_fname',
storage_path='partner'
)
url_file_fname = fields.Char()
url_image = fields.FileURL(
storage_location='s3',
filename='url_image_fname',
storage_path='partner_image',
)
url_image_fname = fields.Char()
@api.constrains('url_file', 'url_file_fname')
def _check_url_file_fname(self):
rec = self.search([('url_file_fname', '=', self.url_file_fname)])
if len(rec) > 1:
raise ValidationError(_(
"This file name is already used on an existing record. "
"Please use another file name or delete the url_file on :\n"
"Model: %s Id: %s" % (self._name, rec.id)
))
@api.constrains('url_image', 'url_image_fname')
def _check_url_image_fname(self):
rec = self.search([('url_image_fname', '=', self.url_image_fname)])
if len(rec) > 1:
raise ValidationError(_(
"This file name is already used on an existing record. "
"Please use another file name or delete the url_image on :\n"
"Model: %s Id: %s" % (self._name, rec.id)
))
@@ -0,0 +1,2 @@
from . import ir_attachment
from . import test_fileurl_fields
@@ -0,0 +1,44 @@
# Copyright 2019 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
import logging
from odoo import _, api, exceptions, models
_logger = logging.getLogger(__name__)
FAKE_S3_BUCKET = {}
class IrAttachment(models.Model):
_inherit = "ir.attachment"
def _get_stores(self):
l = ['s3']
l += super(IrAttachment, self)._get_stores()
return l
@api.model
def _store_file_read(self, fname, bin_size=False):
if fname.startswith('s3://'):
return FAKE_S3_BUCKET.get(fname)
else:
return super(IrAttachment, self)._store_file_read(fname, bin_size)
@api.model
def _store_file_write(self, key, bin_data):
location = self.env.context.get('storage_location') or self._storage()
if location == 's3':
FAKE_S3_BUCKET[key] = bin_data
filename = 's3://fake_bucket/%s' % key
else:
_super = super(IrAttachment, self)
filename = _super._store_file_write(key, bin_data)
return filename
@api.model
def _store_file_delete(self, fname):
if fname.startswith('s3://'):
FAKE_S3_BUCKET.pop(fname)
else:
super(IrAttachment, self)._store_file_delete(fname)
@@ -0,0 +1,39 @@
# Copyright 2019 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
import base64
from odoo.tests import TransactionCase
from odoo.modules.module import get_module_resource
from odoo.exceptions import ValidationError
class TestFileUrlFields(TransactionCase):
def test_fileurl_fields(self):
file_path = get_module_resource('test_base_fileurl_field', 'data',
'sample.txt')
image_path = get_module_resource('test_base_fileurl_field', 'data',
'pattern.png')
partner = self.env.ref('base.main_partner')
with open(file_path, 'rb') as f:
with open(image_path, 'rb') as i:
partner.write({
'url_file': base64.b64encode(f.read()),
'url_file_fname': 'sample.txt',
'url_image': base64.b64encode(i.read()),
'url_image_fname': 'pattern.png',
})
with open(file_path, 'rb') as f:
self.assertEqual(base64.decodebytes(partner.url_file), f.read())
with open(image_path, 'rb') as image:
self.assertEqual(base64.decodebytes(partner.url_image), i.read())
partner2 = self.env.ref('base.partner_admin')
with open(file_path, 'rb') as f:
with self.assertRaises(ValidationError):
partner2.write({
'url_file': base64.b64encode(f.read()),
'url_file_fname': 'sample.txt',
})
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_partner_form_inherit" model="ir.ui.view">
<field name="name">res.partner.form.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page name="fileurl_test" string="FileURL Test fields">
<group string="Default widget">
<field name="url_file" filename="url_file_fname" />
<field name="url_file_fname" invisible="1"/>
</group>
<group string="Image widget">
<field name="url_image" widget="image" filename="url_image_fname" />
<field name="url_image_fname" invisible="1"/>
</group>
</page>
</xpath>
</field>
</record>
</odoo>