preview microsoft file
This commit is contained in:
@@ -0,0 +1 @@
|
||||
from . import controllers
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "Custom MS Office Preview",
|
||||
"version": "1.0",
|
||||
"summary": "Preview office files using Microsoft Online Viewer",
|
||||
"description": """
|
||||
This module allows users to preview Microsoft Office files (such as Word, Excel, and PowerPoint)
|
||||
directly within the Odoo interface using the Microsoft Online Viewer.
|
||||
It extends the attachment model to recognize Office file types and provides a seamless viewing experience
|
||||
by embedding the Office Viewer in the file preview interface.
|
||||
""",
|
||||
"depends": ["web"],
|
||||
"data": [
|
||||
],
|
||||
"assets": {
|
||||
"web.assets_backend": [
|
||||
"custom_ms_office_preview/static/src/xml/file_viewer.xml",
|
||||
"custom_ms_office_preview/static/src/xml/mail_attachment_vew.xml",
|
||||
"custom_ms_office_preview/static/src/js/attachment_model_patch.js",
|
||||
],
|
||||
},
|
||||
'author': 'Quang Trinh',
|
||||
"installable": True,
|
||||
"application": False,
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
from . import main
|
||||
@@ -0,0 +1,33 @@
|
||||
import logging
|
||||
from werkzeug.exceptions import NotFound
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class AttachmentPreviewController(http.Controller):
|
||||
|
||||
@http.route("/preview-url/<int:attachment_id>", type="http", auth="public", cors="*")
|
||||
def public_guest_attachment(self, attachment_id, download=False, **kwargs):
|
||||
try:
|
||||
# Todo: Implement a better way to handle guest_token
|
||||
|
||||
attachment_sudo = request.env["ir.attachment"].sudo().browse(attachment_id)
|
||||
_logger.debug(f"✅ Guest env applied {attachment_sudo}")
|
||||
attachment_sudo.public = True
|
||||
|
||||
if not attachment_sudo.exists():
|
||||
raise NotFound()
|
||||
|
||||
stream = request.env["ir.binary"]._get_stream_from(attachment_sudo)
|
||||
|
||||
# stream = request.env['ir.binary']._get_stream_from(record, field, filename, filename_field, mimetype)
|
||||
|
||||
stream.public = True # Allow Microsoft Online Viewer to access the file
|
||||
|
||||
return stream.get_response(as_attachment=bool(download))
|
||||
|
||||
except Exception as e:
|
||||
_logger.exception(f"❌ Error serving attachment preview: {e}")
|
||||
raise NotFound()
|
||||
@@ -0,0 +1,44 @@
|
||||
/** @odoo-module **/
|
||||
|
||||
import { Attachment } from "@mail/core/common/attachment_model";
|
||||
import { patch } from "@web/core/utils/patch";
|
||||
import { url } from "@web/core/utils/urls";
|
||||
|
||||
|
||||
patch(Attachment.prototype, {
|
||||
get isMsOfficeDocument() {
|
||||
console.log("isMsOfficeDocument");
|
||||
const officeMimeTypes = [
|
||||
"application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .docx
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xlsx
|
||||
"application/vnd.openxmlformats-officedocument.presentationml.presentation", // .pptx
|
||||
"application/msword", // .doc
|
||||
"application/vnd.ms-excel", // .xls
|
||||
"application/vnd.ms-powerpoint", // .ppt
|
||||
];
|
||||
return officeMimeTypes.includes(this.mimetype);
|
||||
},
|
||||
|
||||
get isViewable() {
|
||||
return super.isViewable || this.isMsOfficeDocument;
|
||||
},
|
||||
|
||||
|
||||
get urlRoute() {
|
||||
if (this.isMsOfficeDocument) {
|
||||
return `/preview-url/${this.id}`;
|
||||
}
|
||||
return super.urlRoute;
|
||||
},
|
||||
|
||||
get defaultSource() {
|
||||
if (this.isMsOfficeDocument) {
|
||||
const route = url(this.urlRoute, this.urlQueryParams);
|
||||
const encodedRoute = encodeURIComponent(route);
|
||||
console.log("route", route);
|
||||
console.log("encodedRoute", encodedRoute);
|
||||
return `https://view.officeapps.live.com/op/embed.aspx?src=${encodedRoute}&wdStartOn=1&wdPrint=1&wdEmbedCode=0`;
|
||||
}
|
||||
return super.defaultSource;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-inherit="web.FileViewer" t-inherit-mode="extension">
|
||||
<xpath expr="//i[@t-if='state.file.isPdf']" position="after">
|
||||
<i t-if="state.file.isMsOfficeDocument"
|
||||
class="fa fa-file-text"
|
||||
role="img" title="Docs file"/>
|
||||
</xpath>
|
||||
<xpath expr="//iframe[@t-if='state.file.isPdf']" position="after">
|
||||
<iframe t-if="state.file.isMsOfficeDocument"
|
||||
class="o-FileViewer-view w-75 h-100 border-0"
|
||||
t-att-class="{ 'w-100': ui.isSmall }"
|
||||
t-att-src="state.file.defaultSource"
|
||||
allowfullscreen="true"
|
||||
title="Microsoft Office Viewer"/>
|
||||
</xpath>
|
||||
</t>
|
||||
</templates>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-inherit="mail.AttachmentView" t-inherit-mode="extension">
|
||||
<xpath expr="//iframe[@t-if='state.thread.mainAttachment.isPdf']" position="after">
|
||||
<iframe t-if="state.thread.mainAttachment.isMsOfficeDocument"
|
||||
class="d-print-none mb48"
|
||||
t-att-src="state.thread.mainAttachment.defaultSource"
|
||||
style="width: 100%; height: 600px;"
|
||||
allowfullscreen="true"
|
||||
title="Microsoft Office Viewer"/>
|
||||
</xpath>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
Reference in New Issue
Block a user