server-ux/document_quick_access_folder_auto_classification/models/ir_attachment.py
2021-10-17 02:13:25 +00:00

77 lines
2.3 KiB
Python

# Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import base64
import logging
import traceback
from io import StringIO
from flectra import api, models
from .document_quick_access_rule import OCRException
_logger = logging.getLogger(__name__)
try:
from pyzbar.pyzbar import ZBarSymbol, decode
except (ImportError, IOError) as err:
_logger.warning(err)
try:
import pdf2image
from pdf2image.exceptions import (
PDFInfoNotInstalledError,
PDFPageCountError,
PDFSyntaxError,
)
except (ImportError, IOError) as err:
_logger.warning(err)
class IrAttachment(models.Model):
_inherit = "ir.attachment"
def _search_document_pdf(self):
self.ensure_one()
records = []
try:
images = pdf2image.convert_from_bytes(base64.b64decode(self.datas))
except (PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError) as e:
buff = StringIO()
traceback.print_exc(file=buff)
_logger.warning(buff.getvalue())
raise OCRException(str(e))
for im in images:
records += self._search_pil_image(im)
return records
@api.model
def _search_pil_image(self, image):
results = decode(image, symbols=[ZBarSymbol.QRCODE])
records = []
rule_obj = self.env["document.quick.access.rule"]
for result in results:
record = rule_obj.with_context(no_raise_document_access=True).read_code(
result.data.decode("utf-8")
)
if record and record not in records:
records += record
return records
def _search_document(self):
if self.mimetype == "application/pdf":
return self._search_document_pdf()
return []
def _process_quick_access_rules(self):
self.ensure_one()
results = self.env["ir.attachment"]
records = self._search_document()
for record in records:
if not results:
result = self
result.write({"res_id": record.id, "res_model": record._name})
else:
result = self.copy({"res_id": record.id, "res_model": record._name})
results |= result
return results or self