From a685e91600cda8f271d098b8d48c7cde6e5ba28d Mon Sep 17 00:00:00 2001 From: phucph Date: Wed, 2 Jul 2025 17:33:39 +0700 Subject: [PATCH 1/4] [ADD] Add web_preview_attachment module --- .../odoo/addons/web_preview_attachment_base | 1 + setup/web_preview_attachment_base/setup.py | 6 + web_preview_attachment_base/README.rst | 97 ++++ web_preview_attachment_base/__init__.py | 0 web_preview_attachment_base/__manifest__.py | 21 + .../readme/CONTRIBUTERS.md | 3 + .../readme/DESCRIPTION.md | 1 + web_preview_attachment_base/readme/USAGE.md | 21 + .../static/description/icon.png | Bin 0 -> 16891 bytes .../static/description/index.html | 443 ++++++++++++++++++ .../many2many_binary/attachment_preview.js | 55 +++ .../many2many_binary/attachment_preview.xml | 21 + 12 files changed, 669 insertions(+) create mode 120000 setup/web_preview_attachment_base/odoo/addons/web_preview_attachment_base create mode 100644 setup/web_preview_attachment_base/setup.py create mode 100644 web_preview_attachment_base/README.rst create mode 100755 web_preview_attachment_base/__init__.py create mode 100755 web_preview_attachment_base/__manifest__.py create mode 100644 web_preview_attachment_base/readme/CONTRIBUTERS.md create mode 100644 web_preview_attachment_base/readme/DESCRIPTION.md create mode 100644 web_preview_attachment_base/readme/USAGE.md create mode 100644 web_preview_attachment_base/static/description/icon.png create mode 100644 web_preview_attachment_base/static/description/index.html create mode 100644 web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js create mode 100644 web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml diff --git a/setup/web_preview_attachment_base/odoo/addons/web_preview_attachment_base b/setup/web_preview_attachment_base/odoo/addons/web_preview_attachment_base new file mode 120000 index 000000000000..1b1ffca47697 --- /dev/null +++ b/setup/web_preview_attachment_base/odoo/addons/web_preview_attachment_base @@ -0,0 +1 @@ +../../../../web_preview_attachment_base \ No newline at end of file diff --git a/setup/web_preview_attachment_base/setup.py b/setup/web_preview_attachment_base/setup.py new file mode 100644 index 000000000000..28c57bb64031 --- /dev/null +++ b/setup/web_preview_attachment_base/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/web_preview_attachment_base/README.rst b/web_preview_attachment_base/README.rst new file mode 100644 index 000000000000..ebc783574500 --- /dev/null +++ b/web_preview_attachment_base/README.rst @@ -0,0 +1,97 @@ +================================= +Base Of Preview Documents in Odoo +================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:6f946b8b59eeeccbcddf7265ccedb0cdc858df3fdab842b9f92dc36c584fa513 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_preview_attachment_base + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_preview_attachment_base + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Base code for Preview Documents in Odoo + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +- Depend to this module to add your own preview types. +- Example of a custom preview type: + +.. code:: javascript + + /** @odoo-module **/ + + import { patch } from "@web/core/utils/patch"; + import { Many2ManyBinaryField } from "@web/views/fields/many2many_binary/many2many_binary_field"; + + patch( + Many2ManyBinaryField.prototype, + "yourModule.AttachmentPreview", + { + isPreviewable(file) { + if (file.mimetype === "special_mimetype") { + return true; + } + return this._super.apply(this, arguments); + }, + } + ); + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Phan Hong Phuc + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_preview_attachment_base/__init__.py b/web_preview_attachment_base/__init__.py new file mode 100755 index 000000000000..e69de29bb2d1 diff --git a/web_preview_attachment_base/__manifest__.py b/web_preview_attachment_base/__manifest__.py new file mode 100755 index 000000000000..9dd09fd1cd6b --- /dev/null +++ b/web_preview_attachment_base/__manifest__.py @@ -0,0 +1,21 @@ +{ + 'name': 'Base Of Preview Documents in Odoo', + 'version': '16.0.1.0.0', + 'summary': 'Base of Preview Documents in Odoo', + 'category': 'Tools', + 'website': 'https://github.com/OCA/web', + 'maintainer': 'Phan Hong Phuc', + 'author': 'Phan Hong Phuc, Odoo Community Association (OCA)', + 'license': 'LGPL-3', + 'depends': ['web', 'mail'], + 'assets': { + 'web.assets_backend': [ + 'web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml', + 'web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js', + ], + }, + 'installable': True, + 'application': False, + 'images': ['static/description/icon.png'], + 'auto_install': False, +} diff --git a/web_preview_attachment_base/readme/CONTRIBUTERS.md b/web_preview_attachment_base/readme/CONTRIBUTERS.md new file mode 100644 index 000000000000..b114d6398f4f --- /dev/null +++ b/web_preview_attachment_base/readme/CONTRIBUTERS.md @@ -0,0 +1,3 @@ +* `Trobz `_: + + * Phan Hong Phuc diff --git a/web_preview_attachment_base/readme/DESCRIPTION.md b/web_preview_attachment_base/readme/DESCRIPTION.md new file mode 100644 index 000000000000..1cc83a78ccaa --- /dev/null +++ b/web_preview_attachment_base/readme/DESCRIPTION.md @@ -0,0 +1 @@ +Base code for Preview Documents in Odoo \ No newline at end of file diff --git a/web_preview_attachment_base/readme/USAGE.md b/web_preview_attachment_base/readme/USAGE.md new file mode 100644 index 000000000000..802093d1430a --- /dev/null +++ b/web_preview_attachment_base/readme/USAGE.md @@ -0,0 +1,21 @@ +- Depend to this module to add your own preview types. +- Example of a custom preview type: +```javascript + /** @odoo-module **/ + +import { patch } from "@web/core/utils/patch"; +import { Many2ManyBinaryField } from "@web/views/fields/many2many_binary/many2many_binary_field"; + +patch( + Many2ManyBinaryField.prototype, + "yourModule.AttachmentPreview", + { + isPreviewable(file) { + if (file.mimetype === "special_mimetype") { + return true; + } + return this._super.apply(this, arguments); + }, + } +); +``` \ No newline at end of file diff --git a/web_preview_attachment_base/static/description/icon.png b/web_preview_attachment_base/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf5b14d5166a3ae14484ce4440c1a0e6aa75218 GIT binary patch literal 16891 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
sy80^A*5V=BM1>er=5$lhIR@ANoix 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 K`9{$u + + + + +Base Of Preview Documents in Odoo + + + +
+

Base Of Preview Documents in Odoo

+ + +

Beta License: LGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

Base code for Preview Documents in Odoo

+

Table of contents

+ +
+

Usage

+
    +
  • Depend to this module to add your own preview types.
  • +
  • Example of a custom preview type:
  • +
+
+   /** @odoo-module **/
+
+import { patch } from "@web/core/utils/patch";
+import { Many2ManyBinaryField } from "@web/views/fields/many2many_binary/many2many_binary_field";
+
+patch(
+    Many2ManyBinaryField.prototype,
+    "yourModule.AttachmentPreview",
+    {
+        isPreviewable(file) {
+            if (file.mimetype === "special_mimetype") {
+                return true;
+            }
+            return this._super.apply(this, arguments);
+        },
+    }
+);
+
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Phan Hong Phuc
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/web project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js b/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js new file mode 100644 index 000000000000..275e58b4dac4 --- /dev/null +++ b/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js @@ -0,0 +1,55 @@ +/** @odoo-module **/ + +import { useService } from "@web/core/utils/hooks"; +import { patch } from "@web/core/utils/patch"; +import { Many2ManyBinaryField } from "@web/views/fields/many2many_binary/many2many_binary_field"; + +Many2ManyBinaryField.extractProps = ({ attrs, field }) => { + return { + acceptedFileExtensions: attrs.options.accepted_file_extensions, + className: attrs.class, + uploadText: attrs.options.upload_text || field.string, + }; +}; + +patch( + Many2ManyBinaryField.prototype, + "web_preview_attachment_base.AttachmentPreview", + { + setup() { + this._super.apply(this, arguments); + this.messaging = useService("messaging"); + this.dialog = useService("dialog"); + }, + + isPreviewable(file) { + return false; + }, + + onFilePreview(file) { + if (this.isPreviewable(file)) { + this._onFilePreview(file); + } + }, + + _onFilePreview(file) { + this.messaging.get().then((messaging) => { + const attachmentList = messaging.models[ + "AttachmentList" + ].insert({ + selectedAttachment: messaging.models[ + "Attachment" + ].insert({ + id: file.id, + filename: file.name, + name: file.name, + mimetype: file.mimetype, + }), + }); + this.dialog = messaging.models["Dialog"].insert({ + attachmentListOwnerAsAttachmentView: attachmentList, + }); + }); + } + } +); diff --git a/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml b/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml new file mode 100644 index 000000000000..3d9432a96512 --- /dev/null +++ b/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml @@ -0,0 +1,21 @@ + + + + + +
+ +
+ +
+
+ + + + + +
+
+
+ +
From 8fccdf826633ba47992f75cc4df3a6b4ce5e3872 Mon Sep 17 00:00:00 2001 From: phucph Date: Wed, 2 Jul 2025 17:39:09 +0700 Subject: [PATCH 2/4] [ADD] Add web_preview_pdf_ module --- .../odoo/addons/web_preview_pdf | 1 + setup/web_preview_pdf/setup.py | 6 + web_preview_attachment_base/__init__.py | 0 web_preview_attachment_base/__manifest__.py | 34 +- .../many2many_binary/attachment_preview.js | 74 ++- .../many2many_binary/attachment_preview.xml | 28 +- web_preview_pdf/README.rst | 91 ++++ web_preview_pdf/__init__.py | 1 + web_preview_pdf/__manifest__.py | 22 + web_preview_pdf/readme/CONTRIBUTERS.md | 3 + web_preview_pdf/readme/DESCRIPTION.md | 1 + web_preview_pdf/readme/USAGE.md | 13 + web_preview_pdf/static/description/icon.png | Bin 0 -> 8183 bytes web_preview_pdf/static/description/index.html | 437 ++++++++++++++++++ .../static/description/preview_pdf.png | Bin 0 -> 16928 bytes .../many2many_binary/attachment_preview.js | 22 + 16 files changed, 670 insertions(+), 63 deletions(-) create mode 120000 setup/web_preview_pdf/odoo/addons/web_preview_pdf create mode 100644 setup/web_preview_pdf/setup.py mode change 100755 => 100644 web_preview_attachment_base/__init__.py mode change 100755 => 100644 web_preview_attachment_base/__manifest__.py create mode 100644 web_preview_pdf/README.rst create mode 100755 web_preview_pdf/__init__.py create mode 100755 web_preview_pdf/__manifest__.py create mode 100644 web_preview_pdf/readme/CONTRIBUTERS.md create mode 100644 web_preview_pdf/readme/DESCRIPTION.md create mode 100644 web_preview_pdf/readme/USAGE.md create mode 100644 web_preview_pdf/static/description/icon.png create mode 100644 web_preview_pdf/static/description/index.html create mode 100644 web_preview_pdf/static/description/preview_pdf.png create mode 100644 web_preview_pdf/static/src/many2many_binary/attachment_preview.js diff --git a/setup/web_preview_pdf/odoo/addons/web_preview_pdf b/setup/web_preview_pdf/odoo/addons/web_preview_pdf new file mode 120000 index 000000000000..68db808ae4a3 --- /dev/null +++ b/setup/web_preview_pdf/odoo/addons/web_preview_pdf @@ -0,0 +1 @@ +../../../../web_preview_pdf \ No newline at end of file diff --git a/setup/web_preview_pdf/setup.py b/setup/web_preview_pdf/setup.py new file mode 100644 index 000000000000..28c57bb64031 --- /dev/null +++ b/setup/web_preview_pdf/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/web_preview_attachment_base/__init__.py b/web_preview_attachment_base/__init__.py old mode 100755 new mode 100644 diff --git a/web_preview_attachment_base/__manifest__.py b/web_preview_attachment_base/__manifest__.py old mode 100755 new mode 100644 index 9dd09fd1cd6b..b1eb657143d3 --- a/web_preview_attachment_base/__manifest__.py +++ b/web_preview_attachment_base/__manifest__.py @@ -1,21 +1,21 @@ { - 'name': 'Base Of Preview Documents in Odoo', - 'version': '16.0.1.0.0', - 'summary': 'Base of Preview Documents in Odoo', - 'category': 'Tools', - 'website': 'https://github.com/OCA/web', - 'maintainer': 'Phan Hong Phuc', - 'author': 'Phan Hong Phuc, Odoo Community Association (OCA)', - 'license': 'LGPL-3', - 'depends': ['web', 'mail'], - 'assets': { - 'web.assets_backend': [ - 'web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml', - 'web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js', + "name": "Base Of Preview Documents in Odoo", + "version": "16.0.1.0.0", + "summary": "Base of Preview Documents in Odoo", + "category": "Tools", + "website": "https://github.com/OCA/web", + "maintainer": "Phan Hong Phuc", + "author": "Phan Hong Phuc, Odoo Community Association (OCA)", + "license": "LGPL-3", + "depends": ["web", "mail"], + "assets": { + "web.assets_backend": [ + "web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml", + "web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js", ], }, - 'installable': True, - 'application': False, - 'images': ['static/description/icon.png'], - 'auto_install': False, + "installable": True, + "application": False, + "images": ["static/description/icon.png"], + "auto_install": False, } diff --git a/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js b/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js index 275e58b4dac4..367feb08a911 100644 --- a/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js +++ b/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.js @@ -1,10 +1,10 @@ /** @odoo-module **/ -import { useService } from "@web/core/utils/hooks"; -import { patch } from "@web/core/utils/patch"; -import { Many2ManyBinaryField } from "@web/views/fields/many2many_binary/many2many_binary_field"; +import {useService} from "@web/core/utils/hooks"; +import {patch} from "@web/core/utils/patch"; +import {Many2ManyBinaryField} from "@web/views/fields/many2many_binary/many2many_binary_field"; -Many2ManyBinaryField.extractProps = ({ attrs, field }) => { +Many2ManyBinaryField.extractProps = ({attrs, field}) => { return { acceptedFileExtensions: attrs.options.accepted_file_extensions, className: attrs.class, @@ -12,44 +12,36 @@ Many2ManyBinaryField.extractProps = ({ attrs, field }) => { }; }; -patch( - Many2ManyBinaryField.prototype, - "web_preview_attachment_base.AttachmentPreview", - { - setup() { - this._super.apply(this, arguments); - this.messaging = useService("messaging"); - this.dialog = useService("dialog"); - }, +patch(Many2ManyBinaryField.prototype, "web_preview_attachment_base.AttachmentPreview", { + setup() { + this._super.apply(this, arguments); + this.messaging = useService("messaging"); + this.dialog = useService("dialog"); + }, - isPreviewable(file) { - return false; - }, + isPreviewable(file) { + return false; + }, - onFilePreview(file) { - if (this.isPreviewable(file)) { - this._onFilePreview(file); - } - }, + onFilePreview(file) { + if (this.isPreviewable(file)) { + this._onFilePreview(file); + } + }, - _onFilePreview(file) { - this.messaging.get().then((messaging) => { - const attachmentList = messaging.models[ - "AttachmentList" - ].insert({ - selectedAttachment: messaging.models[ - "Attachment" - ].insert({ - id: file.id, - filename: file.name, - name: file.name, - mimetype: file.mimetype, - }), - }); - this.dialog = messaging.models["Dialog"].insert({ - attachmentListOwnerAsAttachmentView: attachmentList, - }); + _onFilePreview(file) { + this.messaging.get().then((messaging) => { + const attachmentList = messaging.models["AttachmentList"].insert({ + selectedAttachment: messaging.models["Attachment"].insert({ + id: file.id, + filename: file.name, + name: file.name, + mimetype: file.mimetype, + }), }); - } - } -); + this.dialog = messaging.models["Dialog"].insert({ + attachmentListOwnerAsAttachmentView: attachmentList, + }); + }); + }, +}); diff --git a/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml b/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml index 3d9432a96512..28a1033f04bc 100644 --- a/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml +++ b/web_preview_attachment_base/static/src/many2many_binary/attachment_preview.xml @@ -1,17 +1,35 @@ - + - +
-
- +
+
- +
diff --git a/web_preview_pdf/README.rst b/web_preview_pdf/README.rst new file mode 100644 index 000000000000..424724e0ddb8 --- /dev/null +++ b/web_preview_pdf/README.rst @@ -0,0 +1,91 @@ +============================= +Preview PDF Documents in Odoo +============================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:fbeef18c283278d4e0980b2cd6b74442b29d66d5751952a75909f01f1b92bdee + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_preview_pdf + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_preview_pdf + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module provides a preview of PDF documents in Odoo. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +1. Install the module in your Odoo instance. + +2. Add field in your model to include the ``attachment_ids`` field. + +.. code:: python + + attachment_ids = fields.Many2Many('ir.attachment', string='Attachments') + +3. In your xml file, include the ``many2many_binary`` widget: + +.. code:: xml + + + +4. The PDF preview will be displayed in the form view of the model where + you added the ``attachment_ids`` field. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Phan Hong Phuc + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_preview_pdf/__init__.py b/web_preview_pdf/__init__.py new file mode 100755 index 000000000000..40a96afc6ff0 --- /dev/null +++ b/web_preview_pdf/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/web_preview_pdf/__manifest__.py b/web_preview_pdf/__manifest__.py new file mode 100755 index 000000000000..10928550c393 --- /dev/null +++ b/web_preview_pdf/__manifest__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +{ + 'name': 'Preview PDF Documents in Odoo', + 'version': '16.0.1.0.0', + 'summary': 'Preview PDF Documents in Odoo', + 'category': 'Tools', + 'website': 'https://github.com/OCA/web', + 'maintainer': 'Phan Hong Phuc', + 'author': 'Phan Hong Phuc, Odoo Community Association (OCA)', + 'license': 'LGPL-3', + 'depends': ['web_preview_attachment_base'], + 'assets': { + 'web.assets_backend': [ + 'web_preview_pdf/static/src/many2many_binary/attachment_preview.js', + ], + }, + 'installable': True, + 'application': False, + 'images': ['static/description/icon.png'], + 'auto_install': False, +} diff --git a/web_preview_pdf/readme/CONTRIBUTERS.md b/web_preview_pdf/readme/CONTRIBUTERS.md new file mode 100644 index 000000000000..b114d6398f4f --- /dev/null +++ b/web_preview_pdf/readme/CONTRIBUTERS.md @@ -0,0 +1,3 @@ +* `Trobz `_: + + * Phan Hong Phuc diff --git a/web_preview_pdf/readme/DESCRIPTION.md b/web_preview_pdf/readme/DESCRIPTION.md new file mode 100644 index 000000000000..9188ac82609c --- /dev/null +++ b/web_preview_pdf/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module provides a preview of PDF documents in Odoo. \ No newline at end of file diff --git a/web_preview_pdf/readme/USAGE.md b/web_preview_pdf/readme/USAGE.md new file mode 100644 index 000000000000..5df00e8fe2a7 --- /dev/null +++ b/web_preview_pdf/readme/USAGE.md @@ -0,0 +1,13 @@ +1. Install the module in your Odoo instance. + +2. Add field in your model to include the `attachment_ids` field. +```python +attachment_ids = fields.Many2Many('ir.attachment', string='Attachments') +``` + +3. In your xml file, include the `many2many_binary` widget: +```xml + +``` + +4. The PDF preview will be displayed in the form view of the model where you added the `attachment_ids` field. \ No newline at end of file diff --git a/web_preview_pdf/static/description/icon.png b/web_preview_pdf/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5196ca4687953f37eacf7ccc2ab0aed13ed1ce13 GIT binary patch literal 8183 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

$W5 zMw8Cn%)rYII(u4FUG<=4o}ApG)6IOqX5?nTTYMV zRi?G-Ha8r%LY#XaB&J93UD;q5b{hf``PFP#eY)<v>Bh|Upu~Ny8YeQomq%F zpe3K@A>zF)(L)Oh(nT#fw9L7oRjH~H7oJJ0yLAV#+K@t-@=9qz*5+(V&YC`=q34v+ zC`&)+mZ)L5cNSF$Sl!1ZN+14729}08fc4X*qz1V+j0(D@REZ4+Vy-I)i z<+Ss$_w-09M=zo3yu(egn}pHgniCEkmYZ{`q%zscxsNE2et;XO#9 zO7DN7hGf(;Fzum1x}4b6>Tk<|-cb{!nu1AK{Se7{snoLqJm6g0v9;N}Z$V_5d#;*i z^Uo#ym`7WP-rl&zv6*X6?wc9E)xDUNtq+5uppq*OkZaoGPOlW$PD&6W+qw?z>wH}1 zS+4N4U1B6m8+CsCh&*}3P%xx+u2%wbR3#Qx7;sF&EV|8VcA%Qk*)w~_B;OF_HK{QI z6+bc`je2e=Y1yZEw(}!E%t$l0Y+UPO+5$IjW>dIM;qV3KdjZ1K&rKutq56Kz#&K2- zI4HYRD%e0gk7ty+maDh>aJ&&GA0}+%KT&1>l@c#Op$JMLfj|`{bUQIZG;cw}UA%Q} zN&d5R6b{b}J%F#NJW5T(9D2PvW+8YQ3BFZkf$Rl*0apH{MuSwjNyz9Xl&ZKY@P!tH zzB}O;L0zALvAk6vxSHY?Z#8H=7xhcWW|(8Z{^A*(8G@{mIS=^tAnfiZqZa0wUVfl} zsJr>5-{ftoUIni{%yvbPWe*HknSt!L?=kN?jzb?r0{MfcIM!FuM{9141-%M^tUsmY z?}?uA^j z{|s;+B)78sOp5_pt0%@>uTST^kadD*Rca!TzZ@LL+1(U zu`@wJ(Ags9&iJ<(TqP-M0;y%w8aQ$b+q_5?4u5cCKvoDgS!fd3!QY2HrJ@h!IdQ7q zQEyitXm~0(-}6^*flN`Dt^&J)YU!OVyRO+oEH4) zf{QJbmtjz7jMrR@4tP9DWjHRf;MVfgsx#Lar@4^0C(w@*y-%zMR^18fDy8u3V6%=8 zeW_6dGmW8NsTU2~gc#;jUjt`D#Dlm(8m86_YQ{xmFt>fkMWycFp0MK%4}HZRurJ^njhQ1k zbzOUe1GgtiNGrRE@k#CED8n^HF|;Rs@U7=wv?rD^;p-#mR!r?FA<#MeYg=Jd#%gC?YW;r5(e7t(bi__5 zS{(iuME^iq7xyRX2RE{?ZobKQ?h%dNtfxVzt0Y~^x?|vW+mkR-Hx#^%g$sz!(U=c^ zDW11m@T!tms5RSC>Z%hremR_;VLt4aTzivpLL1b5TYudPMX}!n2(xFL<iE; zgX~@Orb)ro^C3)8D9a~MJWR7wyd!;z4))}4R$#W@%!Ul)XFA5sC{7VxrNaE299co;NA#w)L1 z%b$zbVD*St>(M3Z+Mmrci5v~Y%CV2AKM7uAwxvg2fD%;n{3MevTL@jN5my-(KY1Rhz&{BCRI22!~pK|`|XFb zw?Z!aiPB>wD8`-}Be|kt(zgB&Rl)%%%0x#rcKHqyb!i<{acy*qetdMjY^v86h|vIB zujzZkZz=S)-x71Ci}7Q`T^}^HL5HS$iF!Ps?jwHvp~Tfx5zir%mDLZAXogp4>_R3p zv@t!bHef;&`s%{I@ucaNHjudNR%u%ad$0iqp6P1ZY-Bl3FwgZA)49;!Il0dw!I%L| z&LhCDX6j2Htue1xKyCG$1?qv?VrLBSk+Iy4=uki2T2610s)Gz78_gU`(m2wXU+ZxQ z($QKX$zhozJ#wPdB4rN}i19ye6xjGIXTx(JTYE(Z_B;dwr9!1FMlc2kS-e9My ztcSU4c}jM{ia;vdVoszmz-jOM$m23SfH#hT3 z4L7}lh#%z1bVG%Tjee16A&g}ed8|*pML*MzE~}Pt5tO90=0&)>xCpHhG%YtGI#hc= zy8FmRSD@8;zW1D4m_8;b7_~jNBERw7SUh@R5XG$a5W%NDaP{ECE^NPrq7k1ULMvM4 zh6UCe<>G2+Jhw%%i=4kD8XHo1m@92%r7t-8#3mX#i|!A%Q&U$GW>yYnhqZAJ_ngzj z%vE~0>sK`$Lx-X^y79p>+Ntcl1{!L=K}DDA+zmYoVdK$Rv~Pj^GCHfz^*NvI@m!8h zkA;o|Lf>Aft>kvbEHw}XYz(>IEest>II4c(IVPeutY;0HebZnly}i&et|oJ)fb`DB zb7juKWs2% zl(O<^ZhR#4{fZBxLI=OBGtZLDPKFCESi5vQE=)S|;Ep z@H-77lzpe4-5Mqa9YX+I3w&*Gfyz`7Q0JdTs=u#N;J|+>kNkJxxIQF~ON12{CTaYO z7ZNTevMvV|jop^uP|*ddZhPyMrMf_5FDgWq0%dk6s3Wrmb=n@eEV@IT!YgHKBJ8*@ z3FB0e2Adkzr&N#}(3RNG(vA(00A%~MGqI2JEyehq)b0fP2;pJg99giUV5N#B_5RIJdr&w(bsO}!~-8Q(1+wSlt`(GfBHYWN4==sw^YGH1_Z8ztYD zIAk4q4WKrk;=&UakB<+*fRQ-8gqc^KD!^Ssxs2ad$TKN$raj#$W2m&Wx3mOYEizh* zhdBj}r(dX9S7%c4F`XsLog+#_3xxG~tk*?=vPAmDi5xsHH4tD}7MwM70P6!1R!?iz zwhugm&*p4Q!i!k_&OW$frRGVvmkk+F}L70GJ!52 z0M#lBYTC)iq54;9Y(QHav<0Bcg$rC40f-l$V*^zeR5>s0v};CE4G_stloqqVGjb_w z0uP|3@m6RRdXLG@xJ~L}7qQ=y2M%34T&|^RI=W+n7G)u^T@#wVx6-wlhbKb?Kuikd zSL{|RabjoWKBb2-$HwTUZcEc4HesplIqG%~ek-^a8g=bz)UcWAp>Fi}(sFaDMxDzu zCp6(WX}Q3mxksSx!K(DXDx&>qdul=Z^^ek<7}SFOw>P?x8&rw-M&-b5Te=~@Ivrk@ z000dG8#4enbS+pu0qO{LAZS0hO_T*Md(`!I8|0ZhC!w>fxM2ao5r|jK>O6L-X=*y+ z6f9myQy3zF3Fvz5*G_)0>1$bZJqGsr`*l6)CLA|71maF9_rFAFwN(Z9rOSeiaE=)0 z6}DiiQ>7&UFAqxIhw4+;;5cS66iJ>=O`k{ru9o6YmKOE^WAd7ll`|)hb{Uw}&`>~V zmBqr%6H@q$;IF^GI$s&bzq5I*Q-`g+_5~tueM&hu z8KKpqa>q|J%@Qs~(|CchQ)I>Etn_xF19SG`eu(aQdqnR_SwaKk1ePzBvNQ!#_R(E1 zSev&u3MAVdpgYP4apjqlR<&-xskLtQcV@fu=KVcdtGab*ALf2~ruvdq>(m>&HC3rL z(TyQtZ`iqCruGJy`4k%$**FM-1R3>vLmKU68>;Xx+xjdFsR|YK0b5r=z;{}`oEc@Q z){qXGEs(;$42P)=yhvuP`|XPCT#9YQ+CuyCMNL?I9CG%m*XUD}zW5MheDMfQ@7;+Z z#g+j3qSSB43EhvL299T+qcmfT(#tEQEGeR%rFJHu1jG5p z?y%Z + + + + +Preview PDF Documents in Odoo + + + +

+

Preview PDF Documents in Odoo

+ + +

Beta License: LGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

This module provides a preview of PDF documents in Odoo.

+

Table of contents

+ +
+

Usage

+
    +
  1. Install the module in your Odoo instance.
  2. +
  3. Add field in your model to include the attachment_ids field.
  4. +
+
+attachment_ids = fields.Many2Many('ir.attachment', string='Attachments')
+
+
    +
  1. In your xml file, include the many2many_binary widget:
  2. +
+
+<field name="attachment_ids" widget="many2many_binary"/>
+
+
    +
  1. The PDF preview will be displayed in the form view of the model where +you added the attachment_ids field.
  2. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Phan Hong Phuc
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/web project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/web_preview_pdf/static/description/preview_pdf.png b/web_preview_pdf/static/description/preview_pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7713ab8d98fec2171f447db54d5bbe8564f4cb GIT binary patch literal 16928 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 Lu6{1-oD!M Date: Wed, 2 Jul 2025 18:22:33 +0700 Subject: [PATCH 3/4] [IMP] Update CONTRIBUTERS.md file --- .../readme/CONTRIBUTERS.md | 2 +- web_preview_pdf/__init__.py | 1 - web_preview_pdf/__manifest__.py | 34 +++++++++---------- web_preview_pdf/readme/CONTRIBUTERS.md | 2 +- .../many2many_binary/attachment_preview.js | 34 +++++++++---------- 5 files changed, 35 insertions(+), 38 deletions(-) mode change 100755 => 100644 web_preview_pdf/__init__.py mode change 100755 => 100644 web_preview_pdf/__manifest__.py diff --git a/web_preview_attachment_base/readme/CONTRIBUTERS.md b/web_preview_attachment_base/readme/CONTRIBUTERS.md index b114d6398f4f..d3b16f651bfd 100644 --- a/web_preview_attachment_base/readme/CONTRIBUTERS.md +++ b/web_preview_attachment_base/readme/CONTRIBUTERS.md @@ -1,3 +1,3 @@ -* `Trobz `_: +* [Trobz](https://trobz.com) * Phan Hong Phuc diff --git a/web_preview_pdf/__init__.py b/web_preview_pdf/__init__.py old mode 100755 new mode 100644 index 40a96afc6ff0..e69de29bb2d1 --- a/web_preview_pdf/__init__.py +++ b/web_preview_pdf/__init__.py @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/web_preview_pdf/__manifest__.py b/web_preview_pdf/__manifest__.py old mode 100755 new mode 100644 index 10928550c393..bd6fca868cad --- a/web_preview_pdf/__manifest__.py +++ b/web_preview_pdf/__manifest__.py @@ -1,22 +1,20 @@ -# -*- coding: utf-8 -*- - { - 'name': 'Preview PDF Documents in Odoo', - 'version': '16.0.1.0.0', - 'summary': 'Preview PDF Documents in Odoo', - 'category': 'Tools', - 'website': 'https://github.com/OCA/web', - 'maintainer': 'Phan Hong Phuc', - 'author': 'Phan Hong Phuc, Odoo Community Association (OCA)', - 'license': 'LGPL-3', - 'depends': ['web_preview_attachment_base'], - 'assets': { - 'web.assets_backend': [ - 'web_preview_pdf/static/src/many2many_binary/attachment_preview.js', + "name": "Preview PDF Documents in Odoo", + "version": "16.0.1.0.0", + "summary": "Preview PDF Documents in Odoo", + "category": "Tools", + "website": "https://github.com/OCA/web", + "maintainer": "Phan Hong Phuc", + "author": "Phan Hong Phuc, Odoo Community Association (OCA)", + "license": "LGPL-3", + "depends": ["web_preview_attachment_base"], + "assets": { + "web.assets_backend": [ + "web_preview_pdf/static/src/many2many_binary/attachment_preview.js", ], }, - 'installable': True, - 'application': False, - 'images': ['static/description/icon.png'], - 'auto_install': False, + "installable": True, + "application": False, + "images": ["static/description/icon.png"], + "auto_install": False, } diff --git a/web_preview_pdf/readme/CONTRIBUTERS.md b/web_preview_pdf/readme/CONTRIBUTERS.md index b114d6398f4f..d3b16f651bfd 100644 --- a/web_preview_pdf/readme/CONTRIBUTERS.md +++ b/web_preview_pdf/readme/CONTRIBUTERS.md @@ -1,3 +1,3 @@ -* `Trobz `_: +* [Trobz](https://trobz.com) * Phan Hong Phuc diff --git a/web_preview_pdf/static/src/many2many_binary/attachment_preview.js b/web_preview_pdf/static/src/many2many_binary/attachment_preview.js index 80a8f6a89d0c..35c5dcf8146b 100644 --- a/web_preview_pdf/static/src/many2many_binary/attachment_preview.js +++ b/web_preview_pdf/static/src/many2many_binary/attachment_preview.js @@ -1,22 +1,22 @@ /** @odoo-module **/ -import { patch } from "@web/core/utils/patch"; -import { Many2ManyBinaryField } from "@web/views/fields/many2many_binary/many2many_binary_field"; +import {patch} from "@web/core/utils/patch"; +import {Many2ManyBinaryField} from "@web/views/fields/many2many_binary/many2many_binary_field"; -patch( - Many2ManyBinaryField.prototype, - "web_preview_pdf.AttachmentPreview", - { - isPdfDocument(file) { - return file.mimetype === "application/pdf"; - }, +patch(Many2ManyBinaryField.prototype, "web_preview_pdf.AttachmentPreview", { + isPdfDocument(file) { + return file.mimetype === "application/pdf"; + }, - isImageDocument(file) { - return file.mimetype.startsWith("image/"); - }, + isImageDocument(file) { + return file.mimetype.startsWith("image/"); + }, - isPreviewable(file) { - return this.isPdfDocument(file) || this.isImageDocument(file) || this._super.apply(this, arguments); - } - } -); + isPreviewable(file) { + return ( + this.isPdfDocument(file) || + this.isImageDocument(file) || + this._super.apply(this, arguments) + ); + }, +}); From e7022500c4d70653786fe1caf1ca0254beb067c0 Mon Sep 17 00:00:00 2001 From: phucph Date: Mon, 7 Jul 2025 10:17:55 +0700 Subject: [PATCH 4/4] [IMP] Change CONTRIBUTORS file name --- web_preview_attachment_base/README.rst | 7 +++++++ .../readme/{CONTRIBUTERS.md => CONTRIBUTORS.md} | 0 .../static/description/index.html | 14 ++++++++++++-- web_preview_pdf/README.rst | 7 +++++++ .../readme/{CONTRIBUTERS.md => CONTRIBUTORS.md} | 0 web_preview_pdf/static/description/index.html | 14 ++++++++++++-- 6 files changed, 38 insertions(+), 4 deletions(-) rename web_preview_attachment_base/readme/{CONTRIBUTERS.md => CONTRIBUTORS.md} (100%) rename web_preview_pdf/readme/{CONTRIBUTERS.md => CONTRIBUTORS.md} (100%) diff --git a/web_preview_attachment_base/README.rst b/web_preview_attachment_base/README.rst index ebc783574500..0d72408bf8dd 100644 --- a/web_preview_attachment_base/README.rst +++ b/web_preview_attachment_base/README.rst @@ -79,6 +79,13 @@ Authors * Phan Hong Phuc +Contributors +------------ + +- `Trobz `__ + + - Phan Hong Phuc phucph@trobz.com + Maintainers ----------- diff --git a/web_preview_attachment_base/readme/CONTRIBUTERS.md b/web_preview_attachment_base/readme/CONTRIBUTORS.md similarity index 100% rename from web_preview_attachment_base/readme/CONTRIBUTERS.md rename to web_preview_attachment_base/readme/CONTRIBUTORS.md diff --git a/web_preview_attachment_base/static/description/index.html b/web_preview_attachment_base/static/description/index.html index 893f754ad1f8..69d521769a6e 100644 --- a/web_preview_attachment_base/static/description/index.html +++ b/web_preview_attachment_base/static/description/index.html @@ -378,7 +378,8 @@

Base Of Preview Documents in Odoo

  • Bug Tracker
  • Credits
  • @@ -425,8 +426,17 @@

    Authors

  • Phan Hong Phuc
  • +
    +

    Contributors

    + +
    +
    +

    Contributors

    + +
    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association