[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:
@@ -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',
|
||||
|
||||
@@ -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'))
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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',
|
||||
})
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
@@ -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'),
|
||||
})
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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)]})
|
||||
|
||||
@@ -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})
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
},
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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,
|
||||
))
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)"
|
||||
|
||||
Reference in New Issue
Block a user