[Sync] Image refactoring. Added DocumentPreviewImage
This commit is contained in:
1 parent
544f0e218f
commit
73865fcea2
4 files changed
+78
-27
No files matched your search
@@ -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'<Document file={self.file} id={self.id}>'
|
||||
|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in new issue
Block a user