From bae6af55d3ea3a8eeb1cbbdffef99ffe332fcd76 Mon Sep 17 00:00:00 2001 From: Ronald Portier Date: Mon, 14 Nov 2016 09:25:13 +0100 Subject: [PATCH] 8.0 document rtf index (#110) * [ENH] Add module document_rtf_index. * [FIX] Improvements after review. - Only load indexer when module is installed; - Protect non standard imports; - Standardized README.rst. --- .gitattributes | 1 + .travis.yml | 1 + document_rtf_index/README.rst | 58 + document_rtf_index/__init__.py | 4 + document_rtf_index/__openerp__.py | 23 + document_rtf_index/models/__init__.py | 4 + document_rtf_index/models/ir_attachment.py | 74 + .../static/description/icon.png | Bin 0 -> 11989 bytes .../test_files/test_with_cat_image.rtf | 15022 ++++++++++++++++ document_rtf_index/tests/__init__.py | 4 + document_rtf_index/tests/test_rtf_index.py | 30 + 11 files changed, 15221 insertions(+) create mode 100644 .gitattributes create mode 100644 document_rtf_index/README.rst create mode 100644 document_rtf_index/__init__.py create mode 100644 document_rtf_index/__openerp__.py create mode 100644 document_rtf_index/models/__init__.py create mode 100644 document_rtf_index/models/ir_attachment.py create mode 100644 document_rtf_index/static/description/icon.png create mode 100644 document_rtf_index/test_files/test_with_cat_image.rtf create mode 100644 document_rtf_index/tests/__init__.py create mode 100644 document_rtf_index/tests/test_rtf_index.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..016151e2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.rtf -diff diff --git a/.travis.yml b/.travis.yml index 74003680..853f814d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,6 +35,7 @@ install: - git clone --depth=1 https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH} - pip install --upgrade paramiko + - pip install --upgrade pyth - travis_install_nightly script: diff --git a/document_rtf_index/README.rst b/document_rtf_index/README.rst new file mode 100644 index 00000000..ab4929fe --- /dev/null +++ b/document_rtf_index/README.rst @@ -0,0 +1,58 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +Index rtf documents +=================== + +Indexing rtf documents can take a long time, especially when they contain +images. This module will convert rtf documents to only the text contents and +index that text. + +Usage +===== + +Just installing the module will register the rtf indexer. No further user +action or configuration required. + + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/knowledge/8.0 + +.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt +.. branch is "8.0" for example + +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 smashing it by providing a +detailed and welcomed feedback. + +Credits +======= + +Contributors +------------ + +* Ronald Portier +* Icon courtesy of https://www.picol.org (refresh.svg) and + https://github.com/odoo/odoo/blob/8.0/addons/knowledge/static/description/icon.png + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +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. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/document_rtf_index/__init__.py b/document_rtf_index/__init__.py new file mode 100644 index 00000000..7eda98a2 --- /dev/null +++ b/document_rtf_index/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# © 2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import models diff --git a/document_rtf_index/__openerp__.py b/document_rtf_index/__openerp__.py new file mode 100644 index 00000000..b57f9e65 --- /dev/null +++ b/document_rtf_index/__openerp__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# © 2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "Index rtf documents", + "version": "8.0.1.0.0", + "author": "Therp BV, Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Knowledge Management", + "summary": "Index rtf documents", + "depends": [ + 'document', + ], + "data": [], + "auto_install": False, + "installable": True, + "application": False, + "external_dependencies": { + 'python': [ + 'pyth', + ], + }, +} diff --git a/document_rtf_index/models/__init__.py b/document_rtf_index/models/__init__.py new file mode 100644 index 00000000..a15f1b21 --- /dev/null +++ b/document_rtf_index/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# © 2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import ir_attachment diff --git a/document_rtf_index/models/ir_attachment.py b/document_rtf_index/models/ir_attachment.py new file mode 100644 index 00000000..d17b2cf0 --- /dev/null +++ b/document_rtf_index/models/ir_attachment.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# © 2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import logging + +from openerp import api, models + + +_logger = logging.getLogger(__name__) + + +class IrAttachment(models.Model): + _inherit = 'ir.attachment' + + @api.noguess + def _register_hook(self, cr): + """Only register our indexer if module is installed.""" + import StringIO + try: + from pyth import document + from pyth.plugins.rtf15.reader import Rtf15Reader + from pyth.plugins.plaintext.writer import PlaintextWriter + except ImportError: + _logger.warn("pyth not found, RTF indexing disabled.") + return + from openerp.addons.document.content_index import indexer, cntIndex + from openerp.addons.document.std_index import _to_unicode + + def improved_paragraph(self, paragraph, prefix=""): + """Override method to insert image ignoring code.""" + content = [] + for text in paragraph.content: + # Begin patch =========\ + if text.__class__ is document.Image: + continue + # End patch ===========/ + content.append(u"".join(text.content)) + content = u"".join(content).encode("utf-8") + for line in content.split("\n"): + self.target.write(" " * self.indent) + self.target.write(prefix) + self.target.write(line) + self.target.write("\n") + if prefix: + prefix = " " + + PlaintextWriter.paragraph = improved_paragraph + + class RtfDoc(indexer): + """Index Rich Text Format (RTF) files.""" + + def _getMimeTypes(self): + return [ + 'application/rtf', + 'application/x-rtf', + 'text/rtf', + 'text/richtext', + ] + + def _getExtensions(self): + return [ + '.rtf', + ] + + def _doIndexContent(self, content): + """Just get text contents of rtf file.""" + s = StringIO.StringIO(content) + r = Rtf15Reader.read(s) # r will be pyth.document.Document + s.close() + w = PlaintextWriter.write(r) # w will be cStringIO.StringO + result = _to_unicode(w.getvalue()) + return result + + cntIndex.register(RtfDoc()) diff --git a/document_rtf_index/static/description/icon.png b/document_rtf_index/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cbbe0e246e31edae317c87b45d5d3e82eaf132b4 GIT binary patch literal 11989 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 +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import test_rtf_index diff --git a/document_rtf_index/tests/test_rtf_index.py b/document_rtf_index/tests/test_rtf_index.py new file mode 100644 index 00000000..43253ead --- /dev/null +++ b/document_rtf_index/tests/test_rtf_index.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# © 2016 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openerp.tests.common import TransactionCase +from openerp.modules.module import get_module_resource + + +class TestIndexRtf(TransactionCase): + + def test_index_rtf(self): + """Test if the indexer indexes just the text in rtf documents.""" + attachment_model = self.env['ir.attachment'] + # Force loading of indexer (normally _register_hooks runs after tests) + attachment_model._register_hook(self.env.cr) + # we do this to avoid error messages about word files in demo data + attachment_model.search([]).unlink() + # Now take rather large rtf test file, with only few actual words: + rtf_path = get_module_resource( + 'document_rtf_index', + 'test_files', + 'test_with_cat_image.rtf' + ) + rtf_file = open(rtf_path, 'rb').read().encode('base64') + att1 = self.env['ir.attachment'].create({ + 'name': 'test_with_cat_image.rtf', + 'datas_fname': 'test_with_cat_image.rtf', + 'datas': rtf_file, + }) + self.assertEqual(att1.file_type, 'application/rtf') + self.assertEqual(att1.index_content[:16], 'Hello rtf world!')