diff --git a/utils/Sync/sync/models/Document.py b/utils/Sync/sync/models/Document.py index f793261a..33fd9c02 100644 --- a/utils/Sync/sync/models/Document.py +++ b/utils/Sync/sync/models/Document.py @@ -5,7 +5,7 @@ import settings from db import collection from sync.data import scan_subdirs, request from sync.models import Model -from sync.models.Image import Image +from sync.models.DocumentPreviewImage import DocumentPreviewImage from utils.hash import hash_str, md5 from utils.image import image_magick_pdf_to_img @@ -167,19 +167,7 @@ class Document(Model): ) async def create_preview(self, sizes): - if False and self.has_param('preview'): - preview = self.get_param('preview') - preview = await Image.find_one({'_id': preview}) - else: - def url(_, size, ext): - return self.__url_preview_template.format(id=self.id, size=size, ext=ext) - - temp_preview_path = await pdf_to_jpg(self.provider, self.file) - preview = await Image.new(self.provider, temp_preview_path, sizes, url) - os.remove(temp_preview_path) - - if preview: - self.preview = preview + self.preview = await DocumentPreviewImage.new(self.provider, self.file, sizes) def hide(self): self.hidden = True @@ -189,17 +177,6 @@ class Document(Model): return f'' -async def pdf_to_jpg(provider, pdf): - _, temp_in = mkstemp(suffix='.pdf') - _, temp_out = mkstemp(suffix='.jpg') - - abspdf = provider.copy(pdf, temp_in) - await image_magick_pdf_to_img(abspdf, temp_out) - - os.remove(temp_in) - return temp_out - - async def get_pdf_title(provider, file): from PyPDF2 import PdfFileReader from PyPDF2.generic import TextStringObject diff --git a/utils/Sync/sync/models/DocumentPreviewImage.py b/utils/Sync/sync/models/DocumentPreviewImage.py new file mode 100644 index 00000000..e60d3c46 --- /dev/null +++ b/utils/Sync/sync/models/DocumentPreviewImage.py @@ -0,0 +1,68 @@ +import os +from tempfile import mkstemp + +from sync.models.Image import Image, default_url_factory +from utils.hash import md5 +from utils.image import image_magick_pdf_to_img + + +class DocumentPreviewImage(Image): + @staticmethod + async def find_one(query): + return await Image.find_one(query) + + @staticmethod + async def find(query): + return await Image.find(query) + + @staticmethod + async def delete(query): + return await Image.delete(query) + + @staticmethod + async def new(provider, file, sizes, **kwargs): + img = DocumentPreviewImage(provider, file, data=None) + changed = await img.is_changed() + if changed: + await img.build(sizes=sizes) + await img.upload() + await img.save() + else: + doc = await DocumentPreviewImage.find_one({'file': file}) + img = DocumentPreviewImage(provider, file, doc['data']) + img.ref = doc['_id'] + + return img + + def __init__(self, provider, file, data): + super().__init__(provider, file, data, url_factory=default_url_factory) + self.__hash_salt = '' + self.temp_image_path = None + + async def is_changed(self): + i = await DocumentPreviewImage.find_one({'file': self.file}) + return self._is_changed_hash(i) + + async def build(self, sizes): + self.temp_image_path = await pdf_to_jpg(self.provider, self.file) + await super().build(sizes) + + def _get_image_file(self): + return self.temp_image_path + + def __get_id(self): + return md5(self.file) + + def __get_hash(self): + return self.provider.hash(self.file) + + +async def pdf_to_jpg(provider, pdf): + _, temp_in = mkstemp(suffix='.pdf') + _, temp_out = mkstemp(suffix='.jpg') + + abspdf = provider.copy(pdf, temp_in) + await image_magick_pdf_to_img(abspdf, temp_out) + + os.remove(temp_in) + return temp_out diff --git a/utils/Sync/sync/models/Image.py b/utils/Sync/sync/models/Image.py index 3eb68372..99058f2a 100644 --- a/utils/Sync/sync/models/Image.py +++ b/utils/Sync/sync/models/Image.py @@ -95,9 +95,9 @@ class Image(Model): return self._is_changed_hash(i) async def build(self, sizes): - logger.info('Building Image {}'.format(self.provider.get_abs(self.file))) + logger.info(f'Building Image {self._get_abs(self.file)}') - img_in = self.provider.get_abs(self.file) + img_in = self._get_image_file() img_out = tempfile.mkdtemp() images = await create_image(img_in, sizes, self.url_factory, img_out) @@ -141,6 +141,9 @@ class Image(Model): return self.data[size] return None + def _get_image_file(self): + return self._get_abs(self.file) + def __filename(self): return os.path.basename(self.file) diff --git a/utils/Sync/sync/models/__init__.py b/utils/Sync/sync/models/__init__.py index dd072762..b13a542e 100644 --- a/utils/Sync/sync/models/__init__.py +++ b/utils/Sync/sync/models/__init__.py @@ -76,6 +76,9 @@ class Model: folder = self.get_param('folder', self.file) return os.path.join(folder, path) + def _get_abs(self, path): + return self.provider.get_abs(path) + async def save(self): document = self.bake()