[REF] *: removes datas_fname from ir.attachment

This commit removes the field `datas_fname` from `ir.attachment` as
it was unnecessary and most of the time the duplicate of `name` or
`url`.

Task #1909865

closes odoo/odoo#32976

Signed-off-by: Martin Geubelle (mge) <mge@openerp.com>
This commit is contained in:
Thanh Dodeur
2019-06-05 09:12:13 +00:00
parent d6847bacb1
commit c212cfe899
55 changed files with 119 additions and 232 deletions
@@ -308,7 +308,7 @@ class AccountInvoice(models.Model):
try:
tree = etree.fromstring(content)
except Exception:
raise UserError(_('The xml file is badly formatted : {}').format(attachment.datas_fname))
raise UserError(_('The xml file is badly formatted : {}').format(attachment.name))
for xml_type, check_func, decode_func in decoders:
check_res = check_func(tree)
@@ -327,4 +327,4 @@ class AccountInvoice(models.Model):
try:
return invoice
except UnboundLocalError:
raise UserError(_('No decoder was found for the xml file: {}. The file is badly formatted, not supported or the decoder is not installed').format(attachment.datas_fname))
raise UserError(_('No decoder was found for the xml file: {}. The file is badly formatted, not supported or the decoder is not installed').format(attachment.name))
@@ -107,10 +107,10 @@ class IrAttachment(models.Model):
return buf
@api.model
def _index(self, bin_data, datas_fname, mimetype):
def _index(self, bin_data, mimetype):
for ftype in FTYPES:
buf = getattr(self, '_index_%s' % ftype)(bin_data)
if buf:
return buf
return super(IrAttachment, self)._index(bin_data, datas_fname, mimetype)
return super(IrAttachment, self)._index(bin_data, mimetype)
@@ -95,7 +95,6 @@ class IrModule(models.Model):
filename = os.path.split(url_path)[1]
values = dict(
name=filename,
datas_fname=filename,
url=url_path,
res_model='ir.ui.view',
type='binary',
-1
View File
@@ -207,7 +207,6 @@ class Attendee(models.Model):
email_values['attachment_ids'] = [
(0, 0, {'name': 'invitation.ics',
'mimetype': 'text/calendar',
'datas_fname': 'invitation.ics',
'datas': base64.b64encode(ics_file)})
]
mail_ids.append(invitation_template.send_mail(attendee.id, email_values=email_values, notif_layout='mail.mail_notification_light'))
-1
View File
@@ -444,7 +444,6 @@ Andrew</p>]]></field>
</record>
<record id="msg_case15_attach1" model="ir.attachment">
<field name="datas">bWlncmF0aW9uIHRlc3Q=</field>
<field name="datas_fname">YourCompany2012.doc</field>
<field name="name">YourCompany2012.doc</field>
<field name="res_model">crm.lead</field>
<field name="res_id" ref="crm_case_15"/>
@@ -234,21 +234,18 @@
<record id="hr_case_salesman0_cv" model="ir.attachment">
<field name="name">Jones_CV.pdf</field>
<field name="datas_fname">Jones_CV.pdf</field>
<field name="datas" type="base64" file="hr_recruitment/data/hr_recruitment_demo_jones_cv.pdf"></field>
<field name="res_model">hr.applicant</field>
<field name="res_id" ref="hr_recruitment.hr_case_salesman0"/>
</record>
<record id="hr_case_fresher0_cv" model="ir.attachment">
<field name="name">Jose_CV.txt</field>
<field name="datas_fname">Jose_CV.txt</field>
<field name="datas" type="base64" file="hr_recruitment/data/hr_recruitment_demo_jose_cv.txt"></field>
<field name="res_model">hr.applicant</field>
<field name="res_id" ref="hr_recruitment.hr_case_fresher0"/>
</record>
<record id="hr_case_programmer_cv" model="ir.attachment">
<field name="name">Williams_CV.doc</field>
<field name="datas_fname">Williams_CV.doc</field>
<field name="datas" type="base64" file="hr_recruitment/data/hr_recruitment_demo_williams_cv.doc"></field>
<field name="res_model">hr.applicant</field>
<field name="res_id" ref="hr_recruitment.hr_case_programmer"/>
@@ -30,7 +30,7 @@ class TestRecruitmentProcess(common.TransactionCase):
applicant = self.env['hr.applicant'].search([('email_from', '=', 'Mr. Richard Anderson <Richard_Anderson@yahoo.com>')], limit=1)
self.assertTrue(applicant, "Applicant is not created after getting the mail")
resume_ids = self.env['ir.attachment'].search([
('datas_fname', '=', 'resume.pdf'),
('name', '=', 'resume.pdf'),
('res_model', '=', self.env['hr.applicant']._name),
('res_id', '=', applicant.id)])
self.assertEquals(applicant.name, 'Application for the post of Jr.application Programmer.', 'Applicant name does not match.')
@@ -119,7 +119,6 @@ class AccountInvoice(models.Model):
'res_id': self.id,
'res_model': 'account.invoice',
'datas': attachment_data,
'datas_fname': attachment_name,
'type': 'binary',
})
self.with_context(no_new_invoice=True).message_post(attachment_ids=[attachment_id.id])
-1
View File
@@ -20,7 +20,6 @@ class TestUBL(common.TransactionCase):
attachment_id = self.env['ir.attachment'].create({
'name': 'efff_test.xml',
'datas_fname': 'efff_test.xml',
'datas': base64.encodestring(xml_file),
'res_id': invoice_id.id,
'res_model': 'account.invoice',
@@ -139,10 +139,9 @@
<field name="type">in_invoice</field>
</record>
<record id="ir_attachment_in_invoice_draft" model="ir.attachment">
<field name="name">in_invoice_pdf</field>
<field name="type">binary</field>
<field name="datas" type="base64" file="l10n_generic_coa/static/src/demo/in_invoice_yourcompany_demo.pdf"/>
<field name="datas_fname">in_invoice_yourcompany_demo.pdf</field>
<field name="name">in_invoice_yourcompany_demo.pdf</field>
</record>
<record id="mail_message_in_invoice_0" model="mail.message">
<field name="model">account.invoice</field>
@@ -163,7 +163,6 @@ class AccountInvoice(models.Model):
'res_id': invoice.id,
'res_model': invoice._name,
'datas': base64.encodestring(data),
'datas_fname': report_name,
'description': description,
'type': 'binary',
})
@@ -660,7 +659,6 @@ class AccountInvoice(models.Model):
attachment_64 = self.env['ir.attachment'].create({
'name': name_attachment,
'datas': attachment_64,
'datas_fname': name_attachment,
'type': 'binary',
})
@@ -135,7 +135,6 @@ class FetchmailServer(models.Model):
invoice_attachment = self.env['ir.attachment'].create({
'name': att_name,
'datas': base64.encodestring(att_content),
'datas_fname': att_name,
'type': 'binary',
})
+1 -5
View File
@@ -41,12 +41,10 @@ virginie@agrolait.fr</pre></field>
<!-- Admin and Demo with attachments -->
<record id="msg_discus4_attach1" model="ir.attachment">
<field name="datas">bWlncmF0aW9uIHRlc3Q=</field>
<field name="datas_fname">catalog.doc</field>
<field name="name">catalog.doc</field>
</record>
<record id="msg_discus4_attach2" model="ir.attachment">
<field name="datas_fname">activity_graph_2012.jpg</field>
<field name="name">activity_graph_2012</field>
<field name="name">activity_graph_2012.jpg</field>
<field name="datas" type="base64" file="mail/static/img/msg_discus4_attach2-datas.jpg"/>
</record>
<record id="msg_discus4" model="mail.message">
@@ -82,12 +80,10 @@ virginie@agrolait.fr</pre></field>
<!-- Discussion: attachments and spec [DEMO: search on has_attachments -->
<record id="msg_discus6_attach1" model="ir.attachment">
<field name="datas">bWlncmF0aW9uIHRlc3Q=</field>
<field name="datas_fname">RedHat_spec.doc</field>
<field name="name">RedHat_spec.doc</field>
</record>
<record id="msg_discus6_attach2" model="ir.attachment">
<field name="datas">bWlncmF0aW9uIHRlc3Q=</field>
<field name="datas_fname">RedHat_spec_draft_v3.doc</field>
<field name="name">RedHat_spec_draft_v3.doc</field>
</record>
<record id="msg_discus6" model="mail.message">
+2 -2
View File
@@ -294,8 +294,8 @@ class MailMail(models.Model):
# load attachment binary data with a separate read(), as prefetching all
# `datas` (binary field) could bloat the browse cache, triggerring
# soft/hard mem limits with temporary data.
attachments = [(a['datas_fname'], base64.b64decode(a['datas']), a['mimetype'])
for a in attachments.sudo().read(['datas_fname', 'datas', 'mimetype'])]
attachments = [(a['name'], base64.b64decode(a['datas']), a['mimetype'])
for a in attachments.sudo().read(['name', 'datas', 'mimetype'])]
# specific behavior to customize the send email for notified partners
email_list = []
+2 -3
View File
@@ -336,11 +336,11 @@ class Message(models.Model):
partner_tree = dict((partner[0], partner) for partner in partners_names)
# 2. Attachments as SUPERUSER, because could receive msg and attachments for doc uid cannot see
attachments_data = attachments.sudo().read(['id', 'datas_fname', 'name', 'mimetype'])
attachments_data = attachments.sudo().read(['id', 'name', 'mimetype'])
safari = request and request.httprequest.user_agent.browser == 'safari'
attachments_tree = dict((attachment['id'], {
'id': attachment['id'],
'filename': attachment['datas_fname'],
'filename': attachment['name'],
'name': attachment['name'],
'mimetype': 'application/octet-stream' if safari and attachment['mimetype'] and 'video' in attachment['mimetype'] else attachment['mimetype'],
}) for attachment in attachments_data)
@@ -1035,7 +1035,6 @@ class Message(models.Model):
attachment = Attachments.create({
'name': name,
'datas': match.group(2),
'datas_fname': name,
'res_model': values.get('model'),
'res_id': values.get('res_id'),
})
-1
View File
@@ -549,7 +549,6 @@ class MailTemplate(models.Model):
for attachment in attachments:
attachment_data = {
'name': attachment[0],
'datas_fname': attachment[0],
'datas': attachment[1],
'type': 'binary',
'res_model': 'mail.message',
-1
View File
@@ -1633,7 +1633,6 @@ class MailThread(models.AbstractModel):
'name': name,
'datas': base64.b64encode(content),
'type': 'binary',
'datas_fname': name,
'description': name,
'res_model': model,
'res_id': res_id,
+1 -1
View File
@@ -36,7 +36,7 @@ var AttachmentBox = Widget.extend({
_.each(attachments, function (attachment) {
// required for compatibility with the chatter templates.
attachment.url = '/web/content/' + attachment.id + '?download=true';
attachment.filename = attachment.datas_fname || 'unnamed';
attachment.filename = attachment.name || 'unnamed';
});
var sortedAttachments = _.partition(attachments, function (att) {
return att.mimetype && att.mimetype.split('/')[0] === 'image';
+1 -1
View File
@@ -258,7 +258,7 @@ var Chatter = Widget.extend({
model: 'ir.attachment',
method: 'search_read',
domain: domain,
fields: ['id', 'name', 'datas_fname', 'mimetype'],
fields: ['id', 'name', 'mimetype'],
}).then(function (result) {
self._areAttachmentsLoaded = true;
self.attachments = result;
+9 -11
View File
@@ -170,15 +170,14 @@ QUnit.module('Chatter', {
url:{type:'char', string:'url'},
type:{ type:'selection', selection:[['url',"URL"],['binary',"BINARY"]]},
mimetype:{type:'char', string:"mimetype"},
datas_fname:{type:'char', string:"filename"},
},
records:[
{id:1, name:"name1", type:'url', mimetype:'image/png', datas_fname:'filename.jpg',
{id:1, type:'url', mimetype:'image/png', name:'filename.jpg',
res_id: 7, res_model: 'partner'},
{id:2, name:"name2", type:'binary', mimetype:"application/x-msdos-program",
datas_fname:"file2.txt", res_id: 7, res_model: 'partner'},
{id:3, name:"name2", type:'binary', mimetype:"application/x-msdos-program",
datas_fname:"file2.txt", res_id: 5, res_model: 'partner'},
{id:2, type:'binary', mimetype:"application/x-msdos-program",
name:"file2.txt", res_id: 7, res_model: 'partner'},
{id:3, type:'binary', mimetype:"application/x-msdos-program",
name:"file3.txt", res_id: 5, res_model: 'partner'},
],
},
};
@@ -321,10 +320,9 @@ QUnit.test('Activity Done by uploading a file', async function (assert) {
$(window).trigger(fileuploadID, [{
id:3,
name:"name2",
type:'binary',
mimetype:"application/x-msdos-program",
datas_fname:"file2.txt",
name:"file2.txt",
res_id: 5,
res_model: 'partner'
}]);
@@ -438,12 +436,12 @@ QUnit.test('attachmentBox basic rendering', async function (assert) {
assert.hasAttrValue($resIdInput, 'value', '7');
assert.hasAttrValue($resIdInput, 'type', 'hidden');
assert.strictEqual(form.$('.o_attachment_title').text(), 'name1',
assert.strictEqual(form.$('.o_attachment_title').text(), 'filename.jpg',
"the image name should be correct");
// since there are two elements "Download name2"; one "name" and the other "txt" as text content, the following test
// asserts both at the same time.
assert.strictEqual(form.$('a[title = "Download name2"]').text().trim(), 'name2txt',
"the attachment name should be correct");
assert.strictEqual(form.$('a[title = "Download file2.txt"]').text().trim(), 'file2.txttxt',
"the attachment name and the extension display should be correct");
assert.ok(form.$('.o_attachment_image').css('background-image').indexOf('/web/image/1/160x160/?crop=true') >= 0,
"the attachment image URL should be correct");
assert.hasAttrValue(form.$('.o_attachment_download').eq(0), 'href', '/web/content/1?download=true',
@@ -65,12 +65,12 @@ var createViewer = function (params) {
QUnit.module('DocumentViewer', {
beforeEach: function () {
this.attachments = [
{id: 1, datas_fname: 'filePdf.pdf', type: 'binary', mimetype: 'application/pdf', datas:'R0lGOP////ywAADs='},
{id: 2, name: 'urlYoutubeName', type: 'url', mimetype: '', url: 'https://youtu.be/FYqW0Gdwbzk', datas_fname: 'urlYoutube'},
{id: 3, name: 'urlGoogle', type: 'url', mimetype: '', url: 'https://www.google.com', datas_fname: 'urlRandom'},
{id: 4, name: 'text.html', datas_fname: 'text.html', type: 'binary', mimetype: 'text/html', datas:'testee'},
{id: 5, name: 'video.mp4', datas_fname: 'video.mp4', type: 'binary', mimetype: 'video/mp4', datas:'R0lDOP////ywAADs='},
{id: 6, name: 'image.jpg', datas_fname: 'image.jpg', type: 'binary', mimetype: 'image/jpeg', checksum: 999, datas:'R0lVOP////ywAADs='},
{id: 1, name: 'filePdf.pdf', type: 'binary', mimetype: 'application/pdf', datas:'R0lGOP////ywAADs='},
{id: 2, name: 'urlYoutube', type: 'url', mimetype: '', url: 'https://youtu.be/FYqW0Gdwbzk'},
{id: 3, name: 'urlRandom', type: 'url', mimetype: '', url: 'https://www.google.com'},
{id: 4, name: 'text.html', type: 'binary', mimetype: 'text/html', datas:'testee'},
{id: 5, name: 'video.mp4', type: 'binary', mimetype: 'video/mp4', datas:'R0lDOP////ywAADs='},
{id: 6, name: 'image.jpg', type: 'binary', mimetype: 'image/jpeg', checksum: 999, datas:'R0lVOP////ywAADs='},
];
},
}, function () {
@@ -116,7 +116,7 @@ QUnit.module('DocumentViewer', {
},
});
assert.strictEqual(viewer.$(".o_image_caption:contains('urlYoutubeName')").length, 1,
assert.strictEqual(viewer.$(".o_image_caption:contains('urlYoutube')").length, 1,
"the viewer should be on the right attachment");
assert.containsOnce(viewer, '.o_viewer_text[data-src="' + youtubeURL + '"]',
"there should be a video player");
+2 -8
View File
@@ -139,7 +139,6 @@
<field name="id"/>
<field name="mimetype"/>
<field name="type"/>
<field name="datas_fname"/>
<field name="create_uid"/>
<field name="url"/>
<field name="type"/>
@@ -159,13 +158,8 @@
</div>
<div class="o_kanban_details">
<div class="o_kanban_details_wrapper">
<div t-att-title="record.datas_fname.raw_value" class="o_kanban_record_title">
<t t-if="record.type.raw_value == 'url'">
<field name="name" class="o_text_overflow"/>
</t>
<t t-else="">
<field name="datas_fname" class="o_text_overflow"/>
</t>
<div t-att-title="record.name.raw_value" class="o_kanban_record_title">
<field name="name" class="o_text_overflow"/>
</div>
<div class="o_kanban_record_body">
<t t-if="record.type.raw_value == 'url'">
@@ -415,7 +415,6 @@ class MailComposer(models.TransientModel):
data_attach = {
'name': attach_fname,
'datas': attach_datas,
'datas_fname': attach_fname,
'res_model': 'mail.compose.message',
'res_id': 0,
'type': 'binary', # override default_type from context, possibly meant for another model!
@@ -4,7 +4,6 @@
<record id="mass_mail_attach_1" model="ir.attachment">
<field name="datas">bWlncmF0aW9uIHRlc3Q=</field>
<field name="datas_fname">SampleDoc.doc</field>
<field name="name">SampleDoc.doc</field>
</record>
+1 -2
View File
@@ -704,9 +704,8 @@ class MassMailing(models.Model):
def _image_to_url(b64image: bytes):
"""Store an image in an attachement and returns an url"""
attachment = self.env['ir.attachment'].create({
'name': "cropped_image",
'datas': b64image,
'datas_fname': "cropped_image_mailing_{}".format(self.id),
'name': "cropped_image_mailing_{}".format(self.id),
'type': 'binary',})
attachment.generate_access_token()
+1 -2
View File
@@ -9,7 +9,6 @@
<field name="ir_attachment_id"/>
<field name="mimetype"/>
<field name="type"/>
<field name="datas_fname"/>
<field name="name"/>
<field name="priority"/>
<field name="create_uid"/>
@@ -30,7 +29,7 @@
<field name="name" class="o_text_overflow"/>
</div>
<div class="o_kanban_record_body">
<field name="datas_fname" attrs="{'invisible':[('type','=','url')]}"/>
<field name="name" attrs="{'invisible':[('type','=','url')]}"/>
<field name="url" widget="url" attrs="{'invisible':[('type','=','binary')]}"/>
</div>
<div class="o_kanban_record_bottom">
+1 -2
View File
@@ -37,7 +37,7 @@ class SnailmailLetter(models.Model):
attachment_id = fields.Many2one('ir.attachment', string='Attachment', ondelete='cascade')
attachment_datas = fields.Binary('Document', related='attachment_id.datas')
attachment_fname = fields.Char('Attachment Filename', related='attachment_id.datas_fname')
attachment_fname = fields.Char('Attachment Filename', related='attachment_id.name')
color = fields.Boolean(string='Color', default=lambda self: self.env.company.snailmail_color)
cover = fields.Boolean(string='Cover Page', default=lambda self: self.env.company.snailmail_cover)
duplex = fields.Boolean(string='Both side', default=lambda self: self.env.company.snailmail_duplex)
@@ -125,7 +125,6 @@ class SnailmailLetter(models.Model):
attachment = self.env['ir.attachment'].create({
'name': filename,
'datas': base64.b64encode(pdf_bin),
'datas_fname': filename,
'res_model': 'snailmail.letter',
'res_id': self.id,
'type': 'binary', # override default_type from context, possibly meant for another model!
+1 -2
View File
@@ -237,8 +237,7 @@ class TestMessageAccess(common.BaseFunctionalTest, common.MockEmails):
def test_mail_message_access_read_notification(self):
attachment = self.env['ir.attachment'].create({
'datas': base64.b64encode(b'My attachment'),
'name': 'doc.txt',
'datas_fname': 'doc.txt'})
'name': 'doc.txt'})
# attach the attachment to the message
self.message.write({'attachment_ids': [(4, attachment.id)]})
self.message.write({'partner_ids': [(4, self.user_employee.partner_id.id)]})
+2 -4
View File
@@ -20,14 +20,12 @@ class TestMailTemplate(BaseFunctionalTest, MockEmails, TestRecipients):
})
self._attachments = [{
'name': '_Test_First',
'datas_fname': 'first.txt',
'name': 'first.txt',
'datas': base64.b64encode(b'My first attachment'),
'res_model': 'res.partner',
'res_id': self.user_admin.partner_id.id
}, {
'name': '_Test_Second',
'datas_fname': 'second.txt',
'name': 'second.txt',
'datas': base64.b64encode(b'My second attachment'),
'res_model': 'res.partner',
'res_id': self.user_admin.partner_id.id
@@ -86,11 +86,11 @@ class TestMessagePost(BaseFunctionalTest, MockEmails, TestRecipients):
('List2', b'My second attachment')
]
_attach_1 = self.env['ir.attachment'].sudo(self.user_employee).create({
'name': 'Attach1', 'datas_fname': 'Attach1',
'name': 'Attach1',
'datas': 'bWlncmF0aW9uIHRlc3Q=',
'res_model': 'mail.compose.message', 'res_id': 0})
_attach_2 = self.env['ir.attachment'].sudo(self.user_employee).create({
'name': 'Attach2', 'datas_fname': 'Attach2',
'name': 'Attach2',
'datas': 'bWlncmF0aW9uIHRlc3Q=',
'res_model': 'mail.compose.message', 'res_id': 0})
-1
View File
@@ -63,7 +63,6 @@ class TestOdoobot(BaseFunctionalTest, MockEmails, TestRecipients):
kwargs['body'] = ''
attachment = self.env['ir.attachment'].sudo(self.user_employee).create({
'datas': 'bWlncmF0aW9uIHRlc3Q=',
'datas_fname': 'catalog.doc',
'name': 'picture_of_your_dog.doc',
})
kwargs['attachment_ids'] = [attachment.id]
+1 -2
View File
@@ -728,8 +728,7 @@ class TestMailPerformancePost(TransactionCase):
})
self.vals = [{
'datas': base64.b64encode(bytes("attachement content %s" % i, 'utf-8')),
'name': 'attach %s' % i,
'datas_fname': 'fileText_test%s.txt' % i,
'name': 'fileText_test%s.txt' % i,
'mimetype': 'text/plain',
'res_model': 'mail.compose.message',
'res_id': 0,
+3 -4
View File
@@ -1009,7 +1009,7 @@ class Binary(http.Controller):
'/web/content/<string:model>/<int:id>/<string:field>',
'/web/content/<string:model>/<int:id>/<string:field>/<string:filename>'], type='http', auth="public")
def content_common(self, xmlid=None, model='ir.attachment', id=None, field='datas',
filename=None, filename_field='datas_fname', unique=None, mimetype=None,
filename=None, filename_field='name', unique=None, mimetype=None,
download=None, data=None, token=None, access_token=None, **kw):
status, headers, content = request.env['ir.http'].binary_content(
@@ -1053,7 +1053,7 @@ class Binary(http.Controller):
'/web/image/<int:id>-<string:unique>/<int:width>x<int:height>',
'/web/image/<int:id>-<string:unique>/<int:width>x<int:height>/<string:filename>'], type='http', auth="public")
def content_image(self, xmlid=None, model='ir.attachment', id=None, field='datas',
filename_field='datas_fname', unique=None, filename=None, mimetype=None,
filename_field='name', unique=None, filename=None, mimetype=None,
download=None, width=0, height=0, crop=False, access_token=None,
**kwargs):
# other kwargs are ignored on purpose
@@ -1063,7 +1063,7 @@ class Binary(http.Controller):
quality=int(kwargs.get('quality', 0)), access_token=access_token)
def _content_image(self, xmlid=None, model='ir.attachment', id=None, field='datas',
filename_field='datas_fname', unique=None, filename=None, mimetype=None,
filename_field='name', unique=None, filename=None, mimetype=None,
download=None, width=0, height=0, crop=False, quality=0, access_token=None,
placeholder='placeholder.png', **kwargs):
status, headers, image_base64 = request.env['ir.http'].binary_content(
@@ -1134,7 +1134,6 @@ class Binary(http.Controller):
attachment = Model.create({
'name': filename,
'datas': base64.encodestring(ufile.read()),
'datas_fname': filename,
'res_model': model,
'res_id': int(id)
})
@@ -1803,7 +1803,6 @@ var FieldMany2ManyBinaryMultiFiles = AbstractField.extend({
supportedFieldTypes: ['many2many'],
fieldsToFetch: {
name: {type: 'char'},
datas_fname: {type: 'char'},
mimetype: {type: 'char'},
},
events: {
@@ -2247,7 +2247,7 @@ QUnit.module('relational_fields', {
mockRPC: function (route, args) {
assert.step(route);
if (route === '/web/dataset/call_kw/ir.attachment/read') {
assert.deepEqual(args.args[1], ['name', 'datas_fname', 'mimetype']);
assert.deepEqual(args.args[1], ['name', 'mimetype']);
}
return this._super.apply(this, arguments);
},
+1 -2
View File
@@ -173,11 +173,10 @@ class Assets(models.AbstractModel):
# If not, create a new attachment to copy the original scss/js file
# content, with its modifications
new_attach = {
'name': custom_url,
'name': url.split("/")[-1],
'type': "binary",
'mimetype': (file_type == 'js' and 'text/javascript' or 'text/scss'),
'datas': datas,
'datas_fname': url.split("/")[-1],
'url': custom_url,
}
new_attach.update(self._save_asset_attachment_hook())
@@ -800,7 +800,6 @@ var ImagePlugin = AbstractMediaPlugin.extend({
res_model: resModel,
res_id: resID,
name: name,
datas_fname: name,
datas: datas,
mimetype: mimetype,
url: originalSrc, // To save the original image that was cropped
@@ -233,13 +233,13 @@ var FileWidget = SearchableMediaWidget.extend({
.sortBy(function (r) {
if (_.any(self.options.firstFilters, function (filter) {
var regex = new RegExp(filter, 'i');
return r.name.match(regex) || r.name && r.name.match(regex);
return r.name && r.name.match(regex);
})) {
return -1;
}
if (_.any(self.options.lastFilters, function (filter) {
var regex = new RegExp(filter, 'i');
return r.name.match(regex) || r.name && r.name.match(regex);
return r.name && r.name.match(regex);
})) {
return 1;
}
@@ -323,9 +323,9 @@ var FileWidget = SearchableMediaWidget.extend({
domain = ['|', ['public', '=', true]].concat(domain);
domain = domain.concat(this.options.mimetypeDomain);
if (needle && needle.length) {
domain.push('|', ['name', 'ilike', needle], ['name', 'ilike', needle]);
domain.push(['name', 'ilike', needle]);
}
domain.push('|', ['name', '=', false], '!', ['name', '=like', '%.crop'], '!', ['name', '=like', '%.crop']);
domain.push('!', ['name', '=like', '%.crop']);
domain.push('|', ['type', '=', 'binary'], ['url', '!=', false]);
return domain;
},
@@ -319,10 +319,6 @@ function wysiwygData(data) {
string: "display_name",
type: 'char',
},
datas_fname: {
string: "datas_fname",
type: 'char',
},
mimetype: {
string: "mimetype",
type: 'char',
@@ -371,7 +367,6 @@ function wysiwygData(data) {
records: [{
id: 1,
name: 'image',
datas_fname: 'image.png',
mimetype: 'image/png',
checksum: false,
url: '/web_editor/static/src/img/transparent.png',
+1 -2
View File
@@ -106,9 +106,8 @@ class Web_Unsplash(http.Controller):
url_frags = ['unsplash', key, query]
attachment = Attachments.create({
'name': query,
'name': '_'.join(url_frags),
'url': '/' + '/'.join(url_frags),
'datas_fname': '_'.join(url_frags),
'mimetype': mimetype,
'datas': image_base64,
'public': res_model == 'ir.ui.view',
+49 -98
View File
@@ -173,136 +173,119 @@
<!-- Pre loaded images -->
<record id="website.business_conference" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">business_conference</field>
<field name="datas_fname">business_conference.jpg</field>
<field name="name">business_conference.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">binary</field>
<field name="datas" type="base64" file="website/static/src/img/library/business_conference.jpg"/>
</record>
<record id="website.library_image_01" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 01</field>
<field name="datas_fname">bridge.jpg</field>
<field name="name">bridge.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/bridge.jpg</field>
</record>
<record id="website.library_image_02" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 02</field>
<field name="datas_fname">deliver.jpg</field>
<field name="name">deliver.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/deliver.jpg</field>
</record>
<record id="website.library_image_03" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 03</field>
<field name="datas_fname">clock.jpg</field>
<field name="name">clock.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/clock.jpg</field>
</record>
<record id="website.library_image_04" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 04</field>
<field name="datas_fname">manufacturing.jpg</field>
<field name="name">manufacturing.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/manufacturing.jpg</field>
</record>
<record id="website.library_image_05" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 05</field>
<field name="datas_fname">compass.jpg</field>
<field name="name">compass.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/compass.jpg</field>
</record>
<record id="website.library_image_06" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 06</field>
<field name="datas_fname">gift.jpg</field>
<field name="name">gift.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/gift.jpg</field>
</record>
<record id="website.library_image_07" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 07</field>
<field name="datas_fname">mobile_device.jpg</field>
<field name="name">mobile_device.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/mobile_device.jpg</field>
</record>
<record id="website.library_image_08" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 08</field>
<field name="datas_fname">mobile.jpg</field>
<field name="name">mobile.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/mobile.jpg</field>
</record>
<record id="website.library_image_09" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 09</field>
<field name="datas_fname">office.jpg</field>
<field name="name">office.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/office.jpg</field>
</record>
<record id="website.library_image_10" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 10</field>
<field name="datas_fname">ice_coffe.jpg</field>
<field name="name">ice_coffe.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/ice_coffe.jpg</field>
</record>
<record id="website.library_image_11" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 11</field>
<field name="datas_fname">rocket.jpg</field>
<field name="name">rocket.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/rocket.jpg</field>
</record>
<record id="website.library_image_12" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 12</field>
<field name="datas_fname">sell.jpg</field>
<field name="name">sell.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/sell.jpg</field>
</record>
<record id="website.library_image_13" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 13</field>
<field name="datas_fname">shop.jpg</field>
<field name="name">shop.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/shop.jpg</field>
</record>
<record id="website.library_image_14" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 14</field>
<field name="datas_fname">sign.jpg</field>
<field name="name">sign.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/sign.jpg</field>
</record>
<record id="website.library_image_15" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 15</field>
<field name="datas_fname">sweet.jpg</field>
<field name="name">sweet.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/sweet.jpg</field>
</record>
<record id="website.library_image_16" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Library Image 16</field>
<field name="datas_fname">wine.jpg</field>
<field name="name">wine.jpg</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/library/wine.jpg</field>
@@ -311,72 +294,63 @@
<!-- Website Builder Background Images -->
<record id="website.s_background_image_01" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Background Image 01</field>
<field name="datas_fname">s_background_image_01.jpg</field>
<field name="name">s_background_image_01.jpg</field>
<field name="type">url</field>
<field name="res_model">ir.ui.view</field>
<field name="url">/website/static/src/img/backgrounds/peak.jpg</field>
</record>
<record id="website.s_background_image_02" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Background Image 02</field>
<field name="datas_fname">s_background_image_02.jpg</field>
<field name="name">s_background_image_02.jpg</field>
<field name="type">url</field>
<field name="res_model">ir.ui.view</field>
<field name="url">/website/static/src/img/backgrounds/la.jpg</field>
</record>
<record id="website.s_background_image_03" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Background Image 03</field>
<field name="datas_fname">s_background_image_03.jpg</field>
<field name="name">s_background_image_03.jpg</field>
<field name="type">url</field>
<field name="res_model">ir.ui.view</field>
<field name="url">/website/static/src/img/backgrounds/panama-sky.jpg</field>
</record>
<record id="website.s_background_image_04" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Background Image 04</field>
<field name="datas_fname">s_background_image_04.jpg</field>
<field name="name">s_background_image_04.jpg</field>
<field name="type">url</field>
<field name="res_model">ir.ui.view</field>
<field name="url">/website/static/src/img/backgrounds/cubes.jpg</field>
</record>
<record id="website.s_background_image_05" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Background Image 05</field>
<field name="datas_fname">s_background_image_05.jpg</field>
<field name="name">s_background_image_05.jpg</field>
<field name="type">url</field>
<field name="res_model">ir.ui.view</field>
<field name="url">/website/static/src/img/backgrounds/building-profile.jpg</field>
</record>
<record id="website.s_background_image_06" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Background Image 06</field>
<field name="datas_fname">s_background_image_06.jpg</field>
<field name="name">s_background_image_06.jpg</field>
<field name="type">url</field>
<field name="res_model">ir.ui.view</field>
<field name="url">/website/static/src/img/backgrounds/type.jpg</field>
</record>
<record id="website.s_background_image_07" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Background Image 07</field>
<field name="datas_fname">s_background_image_07.jpg</field>
<field name="name">s_background_image_07.jpg</field>
<field name="type">url</field>
<field name="res_model">ir.ui.view</field>
<field name="url">/website/static/src/img/backgrounds/people.jpg</field>
</record>
<record id="website.s_background_image_08" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Background Image 08</field>
<field name="datas_fname">s_background_image_08.jpg</field>
<field name="name">s_background_image_08.jpg</field>
<field name="type">url</field>
<field name="res_model">ir.ui.view</field>
<field name="url">/website/static/src/img/backgrounds/city.jpg</field>
</record>
<record id="website.s_background_image_09" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Website Background Image 09</field>
<field name="datas_fname">s_background_image_09.jpg</field>
<field name="name">s_background_image_09.jpg</field>
<field name="type">url</field>
<field name="res_model">ir.ui.view</field>
<field name="url">/website/static/src/img/backgrounds/sails.jpg</field>
@@ -385,162 +359,139 @@
<!-- Snippets' Default Images (to be replaced by themes) -->
<record id="website.s_cover_default_image" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Cover Snippet - Default Image</field>
<field name="datas_fname">s_cover_default_image.jpg</field>
<field name="name">s_cover_default_image.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_cover.jpg</field>
</record>
<record id="website.s_quotes_carousel_demo_image_1" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Quotes Carousel Snippet - Demo Image 1</field>
<field name="datas_fname">s_quotes_carousel_image_01.jpg</field>
<field name="name">s_quotes_carousel_image_01.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_quotes_carousel_1.jpg</field>
</record>
<record id="website.s_quotes_carousel_demo_image_2" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Quotes Carousel Snippet - Demo Image 2</field>
<field name="datas_fname">s_quotes_carousel_image_02.jpg</field>
<field name="name">s_quotes_carousel_image_02.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_quotes_carousel_2.jpg</field>
</record>
<record id="website.s_quotes_carousel_demo_image_3" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Quotes Carousel Snippet - Demo Image 3</field>
<field name="datas_fname">s_quotes_carousel_image_3.png</field>
<field name="name">s_quotes_carousel_image_3.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_team_member_3.png</field>
</record>
<record id="website.s_quotes_carousel_demo_image_4" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Quotes Carousel Snippet - Demo Image 4</field>
<field name="datas_fname">s_quotes_carousel_image_4.png</field>
<field name="name">s_quotes_carousel_image_4.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_team_member_2.png</field>
</record>
<record id="website.s_quotes_carousel_demo_image_5" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Quotes Carousel Snippet - Demo Image 5</field>
<field name="datas_fname">s_quotes_carousel_image_5.png</field>
<field name="name">s_quotes_carousel_image_5.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_team_member_4.png</field>
</record>
<record id="website.s_image_text_default_image" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Image Text Snippet - Default Image</field>
<field name="datas_fname">s_image_text_default_image.jpg</field>
<field name="name">s_image_text_default_image.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_image_text.jpg</field>
</record>
<record id="website.s_text_image_default_image" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Text Image Snippet - Default Image</field>
<field name="datas_fname">s_text_image_default_image.jpg</field>
<field name="name">s_text_image_default_image.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_text_image.jpg</field>
</record>
<record id="website.s_carousel_default_image_1" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Carousel Snippet - Default Image 1</field>
<field name="datas_fname">s_carousel_default_image_1.jpg</field>
<field name="name">s_carousel_default_image_1.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_carousel_1.jpg</field>
</record>
<record id="website.s_carousel_default_image_2" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Carousel Snippet - Default Image 2</field>
<field name="datas_fname">s_carousel_default_image_2.jpg</field>
<field name="name">s_carousel_default_image_2.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_carousel_2.jpg</field>
</record>
<record id="website.s_carousel_default_image_3" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Carousel Snippet - Default Image 3</field>
<field name="datas_fname">s_carousel_default_image_3.jpg</field>
<field name="name">s_carousel_default_image_3.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_carousel_3.jpg</field>
</record>
<record id="website.s_picture_default_image" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Picture Snippet - Default Image</field>
<field name="datas_fname">s_picture_default_image.jpg</field>
<field name="name">s_picture_default_image.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_picture.jpg</field>
</record>
<record id="website.s_banner_default_image" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Banner Snippet - Default Image</field>
<field name="datas_fname">s_banner_default_image.jpg</field>
<field name="name">s_banner_default_image.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_banner.jpg</field>
</record>
<record id="website.s_parallax_default_image" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Parallax Snippet - Default Image</field>
<field name="datas_fname">s_parallax_default_image.jpg</field>
<field name="name">s_parallax_default_image.jpg</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_parallax.jpg</field>
</record>
<record id="website.s_reference_demo_image_1" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Reference Snippet - Demo Image 1</field>
<field name="datas_fname">s_reference_demo_image_1.png</field>
<field name="name">s_reference_demo_image_1.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_references_1.png</field>
</record>
<record id="website.s_reference_demo_image_2" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Reference Snippet - Demo Image 2</field>
<field name="datas_fname">s_reference_demo_image_2.png</field>
<field name="name">s_reference_demo_image_2.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_references_2.png</field>
</record>
<record id="website.s_reference_demo_image_3" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Reference Snippet - Demo Image 3</field>
<field name="datas_fname">s_reference_demo_image_3.png</field>
<field name="name">s_reference_demo_image_3.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_references_3.png</field>
</record>
<record id="website.s_reference_demo_image_4" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Reference Snippet - Demo Image 4</field>
<field name="datas_fname">s_reference_demo_image_4.png</field>
<field name="name">s_reference_demo_image_4.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_references_4.png</field>
</record>
<record id="website.s_reference_demo_image_5" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Reference Snippet - Demo Image 5</field>
<field name="datas_fname">s_reference_demo_image_5.png</field>
<field name="name">s_reference_demo_image_5.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_references_5.png</field>
</record>
<record id="website.s_company_team_image_1" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Company Team Snippet - Image 1</field>
<field name="datas_fname">s_company_team_image_1.png</field>
<field name="name">s_company_team_image_1.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_team_member_1.png</field>
</record>
<record id="website.s_company_team_image_2" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Company Team Snippet - Image 2</field>
<field name="datas_fname">s_company_team_image_2.png</field>
<field name="name">s_company_team_image_2.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_team_member_2.png</field>
</record>
<record id="website.s_company_team_image_3" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Company Team Snippet - Image 3</field>
<field name="datas_fname">s_company_team_image_3.png</field>
<field name="name">s_company_team_image_3.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_team_member_3.png</field>
</record>
<record id="website.s_company_team_image_4" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Company Team Snippet - Image 4</field>
<field name="datas_fname">s_company_team_image_4.png</field>
<field name="name">s_company_team_image_4.png</field>
<field name="type">url</field>
<field name="url">/website/static/src/img/snippets_demo/s_team_member_4.png</field>
</record>
+1 -1
View File
@@ -287,7 +287,7 @@ class Http(models.AbstractModel):
return werkzeug.wrappers.Response(html, status=code, content_type='text/html;charset=utf-8')
def binary_content(self, xmlid=None, model='ir.attachment', id=None, field='datas',
unique=False, filename=None, filename_field='datas_fname', download=False,
unique=False, filename=None, filename_field='name', download=False,
mimetype=None, default_mimetype='application/octet-stream',
access_token=None):
obj = None
@@ -434,7 +434,6 @@ var WysiwygMultizone = Wysiwyg.extend({
res_model: resModel,
res_id: resID,
name: name,
datas_fname: name,
datas: datas,
mimetype: mimetype,
url: originalSrc, // To save the original image that was cropped
+1 -1
View File
@@ -15,7 +15,7 @@
<field name="model">ir.attachment</field>
<field name="inherit_id" ref="base.view_attachment_tree"/>
<field name="arch" type="xml">
<field name="datas_fname" position="after">
<field name="name" position="after">
<field name="website_id" groups="website.group_multi_website"/>
</field>
</field>
@@ -17,7 +17,6 @@
<record id="blog_post_cover_01" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Blog Post Cover 1</field>
<field name="datas_fname">Blog Post Cover 1</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website_blog/static/src/img/demo/blog_post_cover_1.jpg</field>
@@ -26,7 +25,6 @@
<record id="blog_post_cover_02" model="ir.attachment">
<field name="public" eval="True"/>
<field name="name">Blog Post Cover 2</field>
<field name="datas_fname">Blog Post Cover 2</field>
<field name="res_model">ir.ui.view</field>
<field name="type">url</field>
<field name="url">/website_blog/static/src/img/demo/blog_post_cover_2.jpg</field>
-1
View File
@@ -213,7 +213,6 @@ class WebsiteForm(http.Controller):
attachment_value = {
'name': file.filename,
'datas': base64.encodestring(file.read()),
'datas_fname': file.filename,
'res_model': model_name,
'res_id': record.id,
}
@@ -13,7 +13,6 @@
<record id="website_sale_digital.attach1" model="ir.attachment">
<field name="name">ebook.pdf</field>
<field name="datas_fname">ebook.pdf</field>
<field name="type">binary</field>
<field name="datas" type="base64" file="website_sale_digital/static/ebook.pdf"/>
<field name="res_id" ref="website_sale_digital.product_1"/>
@@ -419,7 +419,6 @@ class IrModuleModule(models.Model):
IrAttachment.create({
'type': 'url',
'name': image_name,
'datas_fname': image_name,
'url': image_path,
'res_model': self._name,
'res_id': app.id,
@@ -69,7 +69,6 @@ class ThemeAttachment(models.Model):
url = fields.Char()
copy_ids = fields.One2many('ir.attachment', 'theme_template_id', 'Attachment using a copy of me', copy=False, readonly=True)
# TODO in master: add missing field: datas_fname
@api.multi
def _convert_to_base_model(self, website, **kwargs):
+4 -7
View File
@@ -262,8 +262,8 @@ class AssetsBundle(object):
FROM ir_attachment
WHERE create_uid = %s
AND url like %s
GROUP BY datas_fname
ORDER BY datas_fname
GROUP BY name
ORDER BY name
""", [SUPERUSER_ID, url_pattern])
attachment_ids = [r[0] for r in self.env.cr.fetchall()]
return self.env['ir.attachment'].sudo().browse(attachment_ids)
@@ -279,8 +279,7 @@ class AssetsBundle(object):
fname = '%s.%s' % (self.name, type)
mimetype = 'application/javascript' if type == 'js' else 'text/css'
values = {
'name': "/web/content/%s" % type,
'datas_fname': fname,
'name': fname,
'mimetype': mimetype,
'res_model': 'ir.ui.view',
'res_id': False,
@@ -299,7 +298,6 @@ class AssetsBundle(object):
type=''
)
values = {
'name': url,
'url': url,
}
attachment.write(values)
@@ -448,9 +446,8 @@ class AssetsBundle(object):
datas=base64.b64encode(asset.content.encode('utf8')),
mimetype='text/css',
type='binary',
name=url,
name=fname,
url=url,
datas_fname=fname,
res_model=False,
res_id=False,
))
+1 -2
View File
@@ -154,7 +154,7 @@ class IrActionsReport(models.Model):
if not attachment_name:
return None
return self.env['ir.attachment'].search([
('datas_fname', '=', attachment_name),
('name', '=', attachment_name),
('res_model', '=', self.model),
('res_id', '=', record.id)
], limit=1)
@@ -175,7 +175,6 @@ class IrActionsReport(models.Model):
attachment_vals = {
'name': attachment_name,
'datas': base64.encodestring(buffer.getvalue()),
'datas_fname': attachment_name,
'res_model': self.model,
'res_id': record.id,
}
+6 -7
View File
@@ -201,7 +201,7 @@ class IrAttachment(models.Model):
vals = {
'file_size': len(bin_data),
'checksum': self._compute_checksum(bin_data),
'index_content': self._index(bin_data, attach.datas_fname, attach.mimetype),
'index_content': self._index(bin_data, attach.mimetype),
'store_fname': False,
'db_datas': value,
}
@@ -232,8 +232,8 @@ class IrAttachment(models.Model):
mimetype = None
if values.get('mimetype'):
mimetype = values['mimetype']
if not mimetype and values.get('datas_fname'):
mimetype = mimetypes.guess_type(values['datas_fname'])[0]
if not mimetype and values.get('name'):
mimetype = mimetypes.guess_type(values['name'])[0]
if not mimetype and values.get('url'):
mimetype = mimetypes.guess_type(values['url'])[0]
if values.get('datas') and (not mimetype or mimetype == 'application/octet-stream'):
@@ -251,8 +251,8 @@ class IrAttachment(models.Model):
return values
@api.model
def _index(self, bin_data, datas_fname, file_type):
""" compute the index content of the given filename, or binary data.
def _index(self, bin_data, file_type):
""" compute the index content of the given binary data.
This is a python implementation of the unix command 'strings'.
:param bin_data : datas in binary form
:return index_content : string containing all the printable character of the binary data
@@ -275,7 +275,6 @@ class IrAttachment(models.Model):
return ['base.group_system']
name = fields.Char('Name', required=True)
datas_fname = fields.Char('Filename')
description = fields.Text('Description')
res_name = fields.Char('Resource Name', compute='_compute_res_name', store=True)
res_model = fields.Char('Resource Model', readonly=True, help="The database object this attachment will be attached to.")
@@ -374,7 +373,7 @@ class IrAttachment(models.Model):
raise AccessError(_("Sorry, you are not allowed to access this document."))
def _read_group_allowed_fields(self):
return ['type', 'company_id', 'res_id', 'create_date', 'create_uid', 'res_name', 'name', 'mimetype', 'id', 'url', 'datas_fname', 'res_field', 'res_model']
return ['type', 'company_id', 'res_id', 'create_date', 'create_uid', 'res_name', 'name', 'mimetype', 'id', 'url', 'res_field', 'res_model']
@api.model
def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
+2 -2
View File
@@ -338,7 +338,7 @@ class IrHttp(models.AbstractModel):
def _binary_record_content(
self, record, field='datas', filename=None,
filename_field='datas_fname', default_mimetype='application/octet-stream'):
filename_field='name', default_mimetype='application/octet-stream'):
model = record._name
mimetype = 'mimetype' in record and record.mimetype or False
@@ -387,7 +387,7 @@ class IrHttp(models.AbstractModel):
return (status, headers, content)
def binary_content(self, xmlid=None, model='ir.attachment', id=None, field='datas',
unique=False, filename=None, filename_field='datas_fname', download=False,
unique=False, filename=None, filename_field='name', download=False,
mimetype=None, default_mimetype='application/octet-stream',
access_token=None):
""" Get file, attachment or downloadable content
+3 -6
View File
@@ -12,8 +12,7 @@ class test_ir_http_mimetype(common.TransactionCase):
""" Test mimetype for attachment """
attachment = self.env['ir.attachment'].create({
'datas': GIF,
'name': 'Test mimetype gif',
'datas_fname': 'file.gif'})
'name': 'file.gif'})
status, headers, content = self.env['ir.http'].binary_content(
id=attachment.id,
@@ -27,8 +26,7 @@ class test_ir_http_mimetype(common.TransactionCase):
""" Test mimetype for attachment with bad name"""
attachment = self.env['ir.attachment'].create({
'datas': GIF,
'name': 'Test mimetype gif with png name',
'datas_fname': 'file.png'})
'name': 'file.png'})
status, headers, content = self.env['ir.http'].binary_content(
id=attachment.id,
@@ -81,8 +79,7 @@ class test_ir_http_mimetype(common.TransactionCase):
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'
'name': 'image.gif'
})
defaults = {
@@ -13,8 +13,7 @@
<group>
<group>
<field name="type"/>
<field name="datas" filename="datas_fname" attrs="{'invisible':[('type','=','url')]}"/>
<field name="datas_fname" invisible="1" attrs="{'invisible':[('type','=','url')]}" class="oe_inline oe_right"/>
<field name="datas" filename="name" attrs="{'invisible':[('type','=','url')]}"/>
<field name="url" widget="url" attrs="{'invisible':[('type','=','binary')]}"/>
<field name="mimetype" groups="base.group_no_one"/>
</group>
@@ -49,7 +48,6 @@
<field name="arch" type="xml">
<tree string="Attachments">
<field name="name"/>
<field name="datas_fname"/>
<field name="res_model"/>
<field name="res_field"/>
<field name="res_id"/>
@@ -64,7 +62,7 @@
<field name="model">ir.attachment</field>
<field name="arch" type="xml">
<search string="Attachments">
<field name="name" filter_domain="['|', ('name','ilike',self), ('datas_fname','ilike',self)]" string="Attachment"/>
<field name="name" filter_domain="[('name','ilike',self)]" string="Attachment"/>
<field name="create_date"/>
<filter name="my_documents_filter"
string="My Document(s)"