From 229dd46f230d702477cda37d7bb3b5334b6de408 Mon Sep 17 00:00:00 2001 From: vancouver29 Date: Mon, 1 Aug 2022 14:22:11 +0200 Subject: [PATCH] [MIG] : Migration to 13.0 --- attachment_preview/__manifest__.py | 22 ++---- .../i18n/attachment_preview.pot | 13 ++-- attachment_preview/i18n/de.po | 22 +++--- attachment_preview/models/ir_attachment.py | 68 +++++++++---------- attachment_preview/readme/INSTALL.rst | 4 +- .../static/src/js/attachment_preview.js | 57 +++++++++++----- .../static/src/js/viewerjs_tweaks.js | 1 + .../tests/test_attachment_preview.py | 44 +++++------- 8 files changed, 116 insertions(+), 115 deletions(-) diff --git a/attachment_preview/__manifest__.py b/attachment_preview/__manifest__.py index 32827993..9412990d 100644 --- a/attachment_preview/__manifest__.py +++ b/attachment_preview/__manifest__.py @@ -3,22 +3,14 @@ { "name": "Preview attachments", - "version": "12.0.1.0.2", - "author": "Therp BV," - "Onestein," - "Odoo Community Association (OCA)", + "version": "13.0.1.0.0", + "author": "Therp BV," "Onestein," "Odoo Community Association (OCA)", "license": "AGPL-3", - "summary": 'Preview attachments supported by Viewer.js', + "summary": "Preview attachments supported by Viewer.js", "category": "Knowledge Management", - "depends": [ - 'web', - 'mail' - ], - "data": [ - "templates/assets.xml", - ], - "qweb": [ - 'static/src/xml/attachment_preview.xml', - ], + "depends": ["web", "mail"], + "data": ["templates/assets.xml"], + "qweb": ["static/src/xml/attachment_preview.xml"], + "external_dependencies": {"python": ["magic"]}, "installable": True, } diff --git a/attachment_preview/i18n/attachment_preview.pot b/attachment_preview/i18n/attachment_preview.pot index d9f9efe3..72b484f6 100644 --- a/attachment_preview/i18n/attachment_preview.pot +++ b/attachment_preview/i18n/attachment_preview.pot @@ -1,12 +1,14 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * attachment_preview +# * attachment_preview # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"POT-Creation-Date: 2022-08-09 15:27+0000\n" +"PO-Revision-Date: 2022-08-09 15:27+0000\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,9 +22,8 @@ msgstr "" #. module: attachment_preview #. openerp-web -#: code:addons/attachment_preview/static/src/js/attachment_preview.js:188 -#: code:addons/attachment_preview/static/src/js/attachment_preview.js:216 +#: code:addons/attachment_preview/static/src/js/attachment_preview.js:0 +#: code:addons/attachment_preview/static/src/js/attachment_preview.js:0 #, python-format msgid "Preview %s" msgstr "" - diff --git a/attachment_preview/i18n/de.po b/attachment_preview/i18n/de.po index ef1547dd..3d0bd532 100644 --- a/attachment_preview/i18n/de.po +++ b/attachment_preview/i18n/de.po @@ -1,23 +1,19 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * attachment_preview +# * attachment_preview # -# Translators: -# Rudolf Schnapka , 2015 msgid "" msgstr "" -"Project-Id-Version: knowledge (8.0)\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-12-08 08:32+0000\n" -"PO-Revision-Date: 2015-11-25 09:41+0000\n" -"Last-Translator: Rudolf Schnapka \n" -"Language-Team: German (http://www.transifex.com/oca/OCA-knowledge-8-0/" -"language/de/)\n" -"Language: de\n" +"POT-Creation-Date: 2022-08-09 15:30+0000\n" +"PO-Revision-Date: 2022-08-09 15:30+0000\n" +"Last-Translator: \n" +"Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: \n" #. module: attachment_preview #: model:ir.model,name:attachment_preview.model_ir_attachment @@ -26,8 +22,8 @@ msgstr "" #. module: attachment_preview #. openerp-web -#: code:addons/attachment_preview/static/src/js/attachment_preview.js:188 -#: code:addons/attachment_preview/static/src/js/attachment_preview.js:216 +#: code:addons/attachment_preview/static/src/js/attachment_preview.js:0 +#: code:addons/attachment_preview/static/src/js/attachment_preview.js:0 #, python-format msgid "Preview %s" msgstr "Vorschau %s" diff --git a/attachment_preview/models/ir_attachment.py b/attachment_preview/models/ir_attachment.py index cad170cf..6ed5b3a3 100644 --- a/attachment_preview/models/ir_attachment.py +++ b/attachment_preview/models/ir_attachment.py @@ -12,64 +12,62 @@ _logger = logging.getLogger(__name__) class IrAttachment(models.Model): - _inherit = 'ir.attachment' + _inherit = "ir.attachment" @api.model - def get_binary_extension(self, model, ids, binary_field, - filename_field=None): + def get_binary_extension(self, model, ids, binary_field, filename_field=None): result = {} ids_to_browse = ids if isinstance(ids, collections.Iterable) else [ids] # First pass: load fields in bin_size mode to avoid loading big files # unnecessarily. if filename_field: - for this in self.env[model].with_context( - bin_size=True).browse(ids_to_browse): - if not this.id: - result[this.id] = False - continue - extension = '' + for this in ( + self.env[model].with_context(bin_size=True).browse(ids_to_browse) + ): + # if not this.id: + # result[this.id] = False + # continue + result[this.id] = False + extension = "" if this[filename_field]: - filename, extension = os.path.splitext( - this[filename_field]) + filename, extension = os.path.splitext(this[filename_field]) if this[binary_field] and extension: result[this.id] = extension - _logger.debug('Got extension %s from filename %s', - extension, this[filename_field]) + _logger.debug( + "Got extension %s from filename %s", + extension, + this[filename_field], + ) # Second pass for all attachments which have to be loaded fully # to get the extension from the content ids_to_browse = [_id for _id in ids_to_browse if _id not in result] - for this in self.env[model].with_context( - bin_size=True).browse(ids_to_browse): - if not this[binary_field]: - result[this.id] = False - continue + for this in self.env[model].with_context(bin_size=True).browse(ids_to_browse): + # if not this[binary_field]: + # result[this.id] = False + # continue + result[this.id] = False try: import magic - if model == self._name and binary_field == 'datas'\ - and this.store_fname: + + if model == self._name and binary_field == "datas" and this.store_fname: mimetype = magic.from_file( - this._full_path(this.store_fname), mime=True) - _logger.debug('Magic determined mimetype %s from file %s', - mimetype, this.store_fname) + this._full_path(this.store_fname), mime=True + ) else: - mimetype = magic.from_buffer( - this[binary_field], mime=True) - _logger.debug('Magic determined mimetype %s from buffer', - mimetype) + mimetype = magic.from_buffer(this[binary_field], mime=True) + _logger.debug("Magic determined mimetype %s from buffer", mimetype) except ImportError: (mimetype, encoding) = mimetypes.guess_type( - 'data:;base64,' + this[binary_field], strict=False) - _logger.debug('Mimetypes guessed type %s from buffer', - mimetype) - extension = mimetypes.guess_extension( - mimetype.split(';')[0], strict=False) + "data:;base64," + this[binary_field].decode("utf-8"), strict=False + ) + _logger.debug("Mimetypes guessed type %s from buffer", mimetype) + extension = mimetypes.guess_extension(mimetype.split(";")[0], strict=False) result[this.id] = extension for _id in result: - result[_id] = (result[_id] or '').lstrip('.').lower() + result[_id] = (result[_id] or "").lstrip(".").lower() return result if isinstance(ids, collections.Iterable) else result[ids] @api.model def get_attachment_extension(self, ids): - return self.get_binary_extension( - self._name, ids, 'datas', 'datas_fname') + return self.get_binary_extension(self._name, ids, "datas", "name") diff --git a/attachment_preview/readme/INSTALL.rst b/attachment_preview/readme/INSTALL.rst index eb26fced..7908e45c 100644 --- a/attachment_preview/readme/INSTALL.rst +++ b/attachment_preview/readme/INSTALL.rst @@ -1,4 +1,4 @@ For filetype recognition, you'll get the best results by installing -``python-magic``: +``python3-magic``: -sudo apt-get install python-magic +sudo apt-get install python3-magic diff --git a/attachment_preview/static/src/js/attachment_preview.js b/attachment_preview/static/src/js/attachment_preview.js index 78ed690b..8d4afb9d 100644 --- a/attachment_preview/static/src/js/attachment_preview.js +++ b/attachment_preview/static/src/js/attachment_preview.js @@ -6,13 +6,15 @@ odoo.define("attachment_preview", function(require) { var core = require("web.core"); var _t = core._t; - var qweb = core.qweb; var Chatter = require("mail.Chatter"); var basic_fields = require("web.basic_fields"); var FormRenderer = require("web.FormRenderer"); - var FormController = require("web.FormController"); var Widget = require("web.Widget"); + var active_attachment_id = 0; + var active_attachment_index = 0; + var first_click = true; + var AttachmentPreviewMixin = { canPreview: function(extension) { return ( @@ -81,13 +83,15 @@ odoo.define("attachment_preview", function(require) { _openAttachmentBox: function() { var res = this._super.apply(this, arguments); - this.getPreviewableAttachments().done( - function(atts) { - this.previewableAttachments = atts; - this.updatePreviewButtons(atts); - this.getParent().attachmentPreviewWidget.setAttachments(atts); - }.bind(this) - ); + setTimeout(() => { + this.getPreviewableAttachments().done( + function(atts) { + this.previewableAttachments = atts; + this.updatePreviewButtons(atts); + this.getParent().attachmentPreviewWidget.setAttachments(atts); + }.bind(this) + ); + }, 0); return res; }, @@ -96,7 +100,7 @@ odoo.define("attachment_preview", function(require) { var res = this._super.apply(this, arguments); var self = this; if (this.getParent().$el.hasClass("attachment_preview")) { - this._fetchAttachments().done(function() { + this._fetchAttachments().then(function() { self._openAttachmentBox(); self.getPreviewableAttachments().done(function(atts) { self.updatePreviewButtons(self.previewableAttachments); @@ -118,6 +122,11 @@ odoo.define("attachment_preview", function(require) { attachment_extension = $target.attr("data-extension"), attachment_title = $target.attr("data-original-title"); + if (attachment_id !== active_attachment_id) { + active_attachment_id = attachment_id; + first_click = true; + } + if (attachment_extension) { this.showPreview( attachment_id, @@ -145,9 +154,10 @@ odoo.define("attachment_preview", function(require) { getPreviewableAttachments: function() { var self = this; + var deferred = $.Deferred(); - var $items = this.$el.find(".o_attachment_preview"); + var $items = self.$el.find(".o_attachment_preview"); var attachments = _.object( $items.map(function() { return parseInt($(this).attr("data-id"), 10); @@ -173,7 +183,7 @@ odoo.define("attachment_preview", function(require) { function(extensions) { var reviewableAttachments = _.map( _.keys( - _.pick(extensions, function(extension, id) { + _.pick(extensions, function(extension) { return self.canPreview(extension); }) ), @@ -218,7 +228,7 @@ odoo.define("attachment_preview", function(require) { basic_fields.FieldBinaryFile.include(AttachmentPreviewMixin); basic_fields.FieldBinaryFile.include({ events: _.extend({}, basic_fields.FieldBinaryFile.prototype.events, { - "click .fa-search": "_onPreview", + "click .fa-external-link": "_onPreview", }), _renderReadonly: function() { @@ -226,7 +236,7 @@ odoo.define("attachment_preview", function(require) { this._super.apply(this, arguments); if (this.recordData.id) { - this._getBinaryExtension().done(function(extension) { + this._getBinaryExtension().then(function(extension) { if (self.canPreview(extension)) { self._renderPreviewButton(extension); } @@ -236,7 +246,7 @@ odoo.define("attachment_preview", function(require) { _renderPreviewButton: function(extension) { this.$previewBtn = $(""); - this.$previewBtn.addClass("fa fa-search mr-2"); + this.$previewBtn.addClass("fa fa-external-link mr-2"); this.$previewBtn.attr("href", "javascript:void(0)"); this.$previewBtn.attr( "title", @@ -284,6 +294,7 @@ odoo.define("attachment_preview", function(require) { }, start: function() { + first_click = true; var res = this._super.apply(this, arguments); this.$overlay = this.$el.find(".attachment_preview_overlay"); this.$iframe = this.$el.find(".attachment_preview_iframe"); @@ -337,6 +348,7 @@ odoo.define("attachment_preview", function(require) { }, hide: function() { + first_click = true; this.$el.addClass("d-none"); this.trigger("hidden"); }, @@ -356,7 +368,18 @@ odoo.define("attachment_preview", function(require) { return; } - var att = this.attachments[this.activeIndex]; + if (first_click) { + for (var i in this.attachments) { + if (this.attachments[i].id === active_attachment_id.toString()) { + active_attachment_index = i; + first_click = false; + } + } + } else { + active_attachment_index = this.activeIndex; + } + + var att = this.attachments[active_attachment_index]; this.$iframe.attr("src", att.previewUrl); }, @@ -411,7 +434,7 @@ odoo.define("attachment_preview", function(require) { return this._super.apply(this, arguments); }, - _onAttachmentPreview: function(event) { + _onAttachmentPreview: function() { this.showAttachmentPreviewWidget(); }, }); diff --git a/attachment_preview/static/src/js/viewerjs_tweaks.js b/attachment_preview/static/src/js/viewerjs_tweaks.js index 1e166df2..b748bfe4 100644 --- a/attachment_preview/static/src/js/viewerjs_tweaks.js +++ b/attachment_preview/static/src/js/viewerjs_tweaks.js @@ -4,6 +4,7 @@ // This file contains tweaks for viewerjs itself and is not meant to be run in // OpenERP's context (function(original_Viewer) { + "use strict"; window.Viewer = function(plugin, parameters) { if (!plugin) { // eslint-disable-next-line no-alert diff --git a/attachment_preview/tests/test_attachment_preview.py b/attachment_preview/tests/test_attachment_preview.py index 1aaa003c..c5fedd86 100644 --- a/attachment_preview/tests/test_attachment_preview.py +++ b/attachment_preview/tests/test_attachment_preview.py @@ -8,40 +8,30 @@ from odoo.tests.common import TransactionCase class TestAttachmentPreview(TransactionCase): def test_get_extension(self): - attachment = self.env['ir.attachment'].create({ - 'datas': base64.b64encode(b'from this, to that.'), - 'name': 'doc.txt', - 'datas_fname': 'doc.txt' - }) - attachment2 = self.env['ir.attachment'].create({ - 'datas': base64.b64encode(b'Png'), - 'name': 'image.png', - 'datas_fname': 'image.png' - }) - res = self.env['ir.attachment'].get_attachment_extension( - attachment.id + attachment = self.env["ir.attachment"].create( + {"datas": base64.b64encode(b"from this, to that."), "name": "doc.txt"} ) - self.assertEqual(res, 'txt') + attachment2 = self.env["ir.attachment"].create( + {"datas": base64.b64encode(b"Png"), "name": "image.png"} + ) + res = self.env["ir.attachment"].get_attachment_extension(attachment.id) + self.assertEqual(res, "txt") - res = self.env['ir.attachment'].get_attachment_extension( + res = self.env["ir.attachment"].get_attachment_extension( [attachment.id, attachment2.id] ) - self.assertEqual(res[attachment.id], 'txt') - self.assertEqual(res[attachment2.id], 'png') + self.assertEqual(res[attachment.id], "txt") + self.assertEqual(res[attachment2.id], "png") - res2 = self.env['ir.attachment'].get_binary_extension( - 'ir.attachment', - attachment.id, - 'datas' + res2 = self.env["ir.attachment"].get_binary_extension( + "ir.attachment", attachment.id, "datas" ) self.assertTrue(res2) - module = self.env['ir.module.module'].search([]).filtered( - lambda m: m.icon_image - )[0] - res3 = self.env['ir.attachment'].get_binary_extension( - 'ir.module.module', - module.id, - 'icon_image' + module = ( + self.env["ir.module.module"].search([]).filtered(lambda m: m.icon_image)[0] + ) + res3 = self.env["ir.attachment"].get_binary_extension( + "ir.module.module", module.id, "icon_image" ) self.assertTrue(res3)