From ed268f81f48042a484a54f22f3fa90d7b86d89a3 Mon Sep 17 00:00:00 2001 From: kais-odoo Date: Fri, 24 Feb 2023 13:00:34 +0530 Subject: [PATCH] [IMP] mail,portal,project: add preview to portal link Before this commit, when the user shares a portal link, the receiver has to click on the link to understand what it is about. This commit uses new key called `preview_object` inside `portal.frontend_layout` template. When it is defined, it will add some useful information for the preview link. This commit also defines `preview_object` in portal view of project and task to be able to have the preview link to prevent the user from having to click on the link to understand what it is about. task-3186692 closes odoo/odoo#113622 Related: odoo/enterprise#37514 Signed-off-by: Xavier Bol (xbo) --- addons/mail/models/mail_link_preview.py | 2 ++ .../static/src/core/common/link_preview.xml | 1 + .../src/core/common/link_preview_model.js | 3 +++ addons/mail/tests/test_link_preview.py | 3 +++ addons/mail/tools/link_preview.py | 2 ++ addons/portal/views/portal_templates.xml | 22 +++++++++++++++++++ addons/project/controllers/portal.py | 2 ++ .../project_portal_project_task_templates.xml | 22 +++++++++++++++++++ 8 files changed, 57 insertions(+) diff --git a/addons/mail/models/mail_link_preview.py b/addons/mail/models/mail_link_preview.py index 07e9c9e0b49..77deb7fa933 100644 --- a/addons/mail/models/mail_link_preview.py +++ b/addons/mail/models/mail_link_preview.py @@ -19,6 +19,7 @@ class LinkPreview(models.Model): source_url = fields.Char('URL', required=True) og_type = fields.Char('Type') og_title = fields.Char('Title') + og_site_name = fields.Char('Site name') og_image = fields.Char('Image') og_description = fields.Text('Description') og_mimetype = fields.Char('MIME type') @@ -97,5 +98,6 @@ class LinkPreview(models.Model): 'og_mimetype': preview.og_mimetype, 'og_title': preview.og_title, 'og_type': preview.og_type, + 'og_site_name': preview.og_site_name, 'source_url': preview.source_url, } for preview in self] diff --git a/addons/mail/static/src/core/common/link_preview.xml b/addons/mail/static/src/core/common/link_preview.xml index 5de0fdf42bb..9f54a542770 100644 --- a/addons/mail/static/src/core/common/link_preview.xml +++ b/addons/mail/static/src/core/common/link_preview.xml @@ -21,6 +21,7 @@
+

diff --git a/addons/mail/static/src/core/common/link_preview_model.js b/addons/mail/static/src/core/common/link_preview_model.js index 66290aa9f68..801e7e95c3a 100644 --- a/addons/mail/static/src/core/common/link_preview_model.js +++ b/addons/mail/static/src/core/common/link_preview_model.js @@ -39,6 +39,8 @@ export class LinkPreview extends Record { /** @type {string} */ og_type; /** @type {string} */ + og_site_name; + /** @type {string} */ source_url; get imageUrl() { @@ -56,6 +58,7 @@ export class LinkPreview extends Record { get isCard() { return !this.isImage && !this.isVideo; } + } LinkPreview.register(); diff --git a/addons/mail/tests/test_link_preview.py b/addons/mail/tests/test_link_preview.py index 790ea367164..b273eb8c890 100644 --- a/addons/mail/tests/test_link_preview.py +++ b/addons/mail/tests/test_link_preview.py @@ -115,6 +115,7 @@ class TestLinkPreview(MailCommon): 'og_mimetype': False, 'og_title': self.og_title, 'og_type': False, + 'og_site_name': False, 'source_url': self.source_url, }] for link_preview in message.link_preview_ids } @@ -134,6 +135,7 @@ class TestLinkPreview(MailCommon): 'og_mimetype': None, 'og_title': self.og_title, 'og_type': None, + 'og_site_name': None, 'source_url': self.source_url, }, { @@ -142,6 +144,7 @@ class TestLinkPreview(MailCommon): 'og_mimetype': None, 'og_title': self.title, 'og_type': None, + 'og_site_name': None, 'source_url': self.source_url, }, { diff --git a/addons/mail/tools/link_preview.py b/addons/mail/tools/link_preview.py index 7bc04752c79..75bc595c103 100644 --- a/addons/mail/tools/link_preview.py +++ b/addons/mail/tools/link_preview.py @@ -73,6 +73,7 @@ def get_link_preview_from_html(url, response): return False og_description = tree.xpath('//meta[@property="og:description"]/@content') og_type = tree.xpath('//meta[@property="og:type"]/@content') + og_site_name = tree.xpath('//meta[@property="og:site_name"]/@content') og_image = tree.xpath('//meta[@property="og:image"]/@content') og_mimetype = tree.xpath('//meta[@property="og:image:type"]/@content') return { @@ -81,5 +82,6 @@ def get_link_preview_from_html(url, response): 'og_mimetype': og_mimetype[0] if og_mimetype else None, 'og_title': og_title, 'og_type': og_type[0] if og_type else None, + 'og_site_name': og_site_name[0] if og_site_name else None, 'source_url': url, } diff --git a/addons/portal/views/portal_templates.xml b/addons/portal/views/portal_templates.xml index dd786494a70..58f7207040b 100644 --- a/addons/portal/views/portal_templates.xml +++ b/addons/portal/views/portal_templates.xml @@ -35,6 +35,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/addons/project/controllers/portal.py b/addons/project/controllers/portal.py index c6c8cda472f..62cbca06ea4 100644 --- a/addons/project/controllers/portal.py +++ b/addons/project/controllers/portal.py @@ -46,6 +46,7 @@ class ProjectCustomerPortal(CustomerPortal): pager=pager, project=project, task_url=f'projects/{project.id}/task', + preview_object=project, ) if not groupby: @@ -255,6 +256,7 @@ class ProjectCustomerPortal(CustomerPortal): 'user': request.env.user, 'project_accessible': project_accessible, 'task_link_section': [], + 'preview_object': task, } values = self._get_page_view_values(task, access_token, values, history, False, **kwargs) diff --git a/addons/project/views/project_portal_project_task_templates.xml b/addons/project/views/project_portal_project_task_templates.xml index 2c95b5628fe..b10d0f170fa 100644 --- a/addons/project/views/project_portal_project_task_templates.xml +++ b/addons/project/views/project_portal_project_task_templates.xml @@ -120,7 +120,29 @@ + + + +