mirror of
https://gitlab.com/flectra-hq/flectra.git
synced 2026-10-26 07:50:05 -05:00
[PATCH] Upstream patch - 13042023
This commit is contained in:
1 parent
de4c8097b8
commit
0652c3beff
6 files changed
+94
-13
No files matched your search
@@ -170,13 +170,23 @@ class AccountAnalyticLine(models.Model):
|
||||
if self.env.user.has_group('hr_timesheet.group_hr_timesheet_user'):
|
||||
# Then, he is internal user, and we take the domain for this current user
|
||||
return self.env['ir.rule']._compute_domain(self._name)
|
||||
return ['&',
|
||||
return [
|
||||
'|',
|
||||
'&',
|
||||
'|', '|', '|',
|
||||
('task_id.project_id.message_partner_ids', 'child_of', [self.env.user.partner_id.commercial_partner_id.id]),
|
||||
('task_id.message_partner_ids', 'child_of', [self.env.user.partner_id.commercial_partner_id.id]),
|
||||
('task_id.project_id.allowed_portal_user_ids', 'child_of', [self.env.user.id]),
|
||||
('task_id.allowed_user_ids', 'in', [self.env.user.id]),
|
||||
('task_id.project_id.privacy_visibility', '=', 'portal')]
|
||||
('task_id.project_id.message_partner_ids', 'child_of', [self.env.user.partner_id.commercial_partner_id.id]),
|
||||
('task_id.message_partner_ids', 'child_of', [self.env.user.partner_id.commercial_partner_id.id]),
|
||||
('task_id.project_id.allowed_portal_user_ids', 'child_of', [self.env.user.id]),
|
||||
('task_id.allowed_user_ids', 'in', [self.env.user.id]),
|
||||
('task_id.project_id.privacy_visibility', '=', 'portal'),
|
||||
'&',
|
||||
('task_id', '=', False),
|
||||
'&',
|
||||
'|',
|
||||
('project_id.message_partner_ids', 'child_of', [self.env.user.partner_id.commercial_partner_id.id]),
|
||||
('project_id.allowed_portal_user_ids', 'child_of', [self.env.user.id]),
|
||||
('project_id.privacy_visibility', '=', 'portal')
|
||||
]
|
||||
|
||||
def _timesheet_preprocess(self, vals):
|
||||
""" Deduce other field values from the one given.
|
||||
|
||||
@@ -1288,25 +1288,27 @@ class MailThread(models.AbstractModel):
|
||||
filename = part.get_filename() # I may not properly handle all charsets
|
||||
encoding = part.get_content_charset() # None if attachment
|
||||
|
||||
content = part.get_content()
|
||||
info = {'encoding': encoding}
|
||||
# 0) Inline Attachments -> attachments, with a third part in the tuple to match cid / attachment
|
||||
if filename and part.get('content-id'):
|
||||
inner_cid = part.get('content-id').strip('><')
|
||||
attachments.append(self._Attachment(filename, part.get_content(), {'cid': inner_cid}))
|
||||
info['cid'] = part.get('content-id').strip('><')
|
||||
attachments.append(self._Attachment(filename, content, info))
|
||||
continue
|
||||
# 1) Explicit Attachments -> attachments
|
||||
if filename or part.get('content-disposition', '').strip().startswith('attachment'):
|
||||
attachments.append(self._Attachment(filename or 'attachment', part.get_content(), {}))
|
||||
attachments.append(self._Attachment(filename or 'attachment', content, info))
|
||||
continue
|
||||
# 2) text/plain -> <pre/>
|
||||
if part.get_content_type() == 'text/plain' and (not alternative or not body):
|
||||
body = tools.append_content_to_html(body, tools.ustr(part.get_content(),
|
||||
body = tools.append_content_to_html(body, tools.ustr(content,
|
||||
encoding, errors='replace'), preserve=True)
|
||||
# 3) text/html -> raw
|
||||
elif part.get_content_type() == 'text/html':
|
||||
# mutlipart/alternative have one text and a html part, keep only the second
|
||||
# mixed allows several html parts, append html content
|
||||
append_content = not alternative or (html and mixed)
|
||||
html = tools.ustr(part.get_content(), encoding, errors='replace')
|
||||
html = tools.ustr(content, encoding, errors='replace')
|
||||
if not append_content:
|
||||
body = html
|
||||
else:
|
||||
@@ -1315,7 +1317,7 @@ class MailThread(models.AbstractModel):
|
||||
body = tools.html_sanitize(body, sanitize_tags=False, strip_classes=True)
|
||||
# 4) Anything else -> attachment
|
||||
else:
|
||||
attachments.append(self._Attachment(filename or 'attachment', part.get_content(), {}))
|
||||
attachments.append(self._Attachment(filename or 'attachment', content, info))
|
||||
|
||||
return self._message_parse_extract_payload_postprocess(message, {'body': body, 'attachments': attachments})
|
||||
|
||||
@@ -1735,13 +1737,15 @@ class MailThread(models.AbstractModel):
|
||||
cid = False
|
||||
if len(attachment) == 2:
|
||||
name, content = attachment
|
||||
info = {}
|
||||
elif len(attachment) == 3:
|
||||
name, content, info = attachment
|
||||
cid = info and info.get('cid')
|
||||
else:
|
||||
continue
|
||||
if isinstance(content, str):
|
||||
content = content.encode('utf-8')
|
||||
encoding = info and info.get('encoding')
|
||||
content = content.encode(encoding or 'utf-8')
|
||||
elif isinstance(content, EmailMessage):
|
||||
content = content.as_bytes()
|
||||
elif content is None:
|
||||
|
||||
@@ -214,6 +214,39 @@ Content-Type: text/html;
|
||||
--Apple-Mail=_9331E12B-8BD2-4EC7-B53E-01F3FBEC9227--
|
||||
"""
|
||||
|
||||
MAIL_FILE_ENCODING = """MIME-Version: 1.0
|
||||
Date: Sun, 26 Mar 2023 05:23:22 +0200
|
||||
Message-ID: {msg_id}
|
||||
Subject: {subject}
|
||||
From: "Sylvie Lelitre" <test.sylvie.lelitre@agrolait.com>
|
||||
To: groups@test.com
|
||||
Content-Type: multipart/mixed; boundary="000000000000b951de05f7c47a9e"
|
||||
|
||||
--000000000000b951de05f7c47a9e
|
||||
Content-Type: multipart/alternative; boundary="000000000000b951da05f7c47a9c"
|
||||
|
||||
--000000000000b951da05f7c47a9c
|
||||
Content-Type: text/plain; charset="UTF-8"
|
||||
|
||||
Test Body
|
||||
|
||||
--000000000000b951da05f7c47a9c
|
||||
Content-Type: text/html; charset="UTF-8"
|
||||
|
||||
<div dir="ltr">Test Body</div>
|
||||
|
||||
--000000000000b951da05f7c47a9c--
|
||||
--000000000000b951de05f7c47a9e
|
||||
Content-Type: text/plain; name="test.txt"{charset}
|
||||
Content-Disposition: attachment; filename="test.txt"
|
||||
Content-Transfer-Encoding: base64
|
||||
X-Attachment-Id: f_lfosfm0l0
|
||||
Content-ID: <f_lfosfm0l0>
|
||||
|
||||
{content}
|
||||
|
||||
--000000000000b951de05f7c47a9e--
|
||||
"""
|
||||
|
||||
MAIL_MULTIPART_BINARY_OCTET_STREAM = """X-Original-To: raoul@grosbedon.fr
|
||||
Delivered-To: raoul@grosbedon.fr
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import base64
|
||||
import socket
|
||||
|
||||
from unittest.mock import DEFAULT
|
||||
@@ -1468,6 +1469,23 @@ class TestMailgateway(TestMailCommon):
|
||||
self.assertEqual(record.name, 'Spammy')
|
||||
self.assertEqual(record._name, 'mail.test.gateway')
|
||||
|
||||
@mute_logger('flectra.addons.mail.models.mail_thread')
|
||||
def test_message_process_file_encoding(self):
|
||||
""" Incoming email with file encoding """
|
||||
file_content = 'Hello World'
|
||||
for encoding in ['', 'UTF-8', 'UTF-16LE', 'UTF-32BE']:
|
||||
file_content_b64 = base64.b64encode(file_content.encode(encoding or 'utf-8')).decode()
|
||||
record = self.format_and_process(test_mail_data.MAIL_FILE_ENCODING,
|
||||
self.email_from, 'groups@test.com',
|
||||
subject='Test Charset %s' % encoding or 'Unset',
|
||||
charset='; charset="%s"' % encoding if encoding else '',
|
||||
content=file_content_b64
|
||||
)
|
||||
attachment = record.message_ids.attachment_ids
|
||||
self.assertEqual(file_content, attachment.raw.decode(encoding or 'utf-8'))
|
||||
if encoding not in ['', 'UTF-8']:
|
||||
self.assertNotEqual(file_content, attachment.raw.decode('utf-8'))
|
||||
|
||||
|
||||
class TestMailThreadCC(TestMailCommon):
|
||||
|
||||
|
||||
Binary file not shown.
@@ -1,3 +1,19 @@
|
||||
// This is a patch of the font awesome library to add the TikTok icon.
|
||||
@font-face {
|
||||
font-family: 'FontAwesome-tiktok-only';
|
||||
src: url('../../src/fonts/tiktok_only.woff');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-display: block;
|
||||
}
|
||||
.fa.fa-tiktok {
|
||||
font-family: 'FontAwesome-tiktok-only' !important;
|
||||
|
||||
&:before {
|
||||
content: '\e07b';
|
||||
}
|
||||
}
|
||||
|
||||
// This is rtl language specific fix
|
||||
// It will override the font awesome symbols and flip them 180 degree
|
||||
.o_rtl {
|
||||
|
||||
Reference in new issue
Block a user