[sync] updated
This commit is contained in:
1 parent
40a5d09e78
commit
f38ddf8bd0
12 files changed
+285
-46
No files matched your search
@@ -0,0 +1,124 @@
|
||||
import os
|
||||
from tempfile import mkstemp
|
||||
|
||||
import settings
|
||||
from sync.models import Model
|
||||
from utils.fn import last_good, lmap
|
||||
from utils.hash import hash_str
|
||||
from utils.image import create_image
|
||||
from utils.image.resize import image_magick_pdf_to_img
|
||||
from utils.text.transform import url_encode_text, url_encode_file
|
||||
|
||||
|
||||
class Document(Model):
|
||||
@staticmethod
|
||||
def read(path):
|
||||
name = os.path.basename(path)
|
||||
|
||||
document = {
|
||||
'file': path,
|
||||
'category': os.path.dirname(path),
|
||||
'title': os.path.splitext(name)[0]
|
||||
}
|
||||
|
||||
return document
|
||||
|
||||
def __init__(self, provider, path, url_base, preview_compiler):
|
||||
super().__init__()
|
||||
|
||||
self.path = path
|
||||
|
||||
self.category = None
|
||||
self.file = None
|
||||
self.id = None
|
||||
self.type = None
|
||||
self.url = None
|
||||
self.title = None
|
||||
self.preview = None
|
||||
|
||||
for k, v in m.items():
|
||||
setattr(self, k, v)
|
||||
|
||||
self.provider = provider
|
||||
|
||||
def bake(self):
|
||||
file = self.file
|
||||
filename = os.path.basename(file)
|
||||
|
||||
self.type = document_type(self.type)
|
||||
self.preview = self.create_preview(file)
|
||||
self.title = last_good([
|
||||
self.title,
|
||||
get_pdf_title(self.provider, self.file)
|
||||
])
|
||||
self.file = {
|
||||
'name': filename,
|
||||
'size': self.provider.size(file)
|
||||
}
|
||||
|
||||
def __set_id(self):
|
||||
bn = os.path.basename(self.file)
|
||||
self.id = url_encode_text('{category}-{file}'.format(
|
||||
category=self.category,
|
||||
file=bn
|
||||
))
|
||||
|
||||
def __set_url(self):
|
||||
filename = os.path.basename(self.file)
|
||||
self.url = self.url_base_document.format(file=url_encode_file(filename))
|
||||
|
||||
def __set_hash(self):
|
||||
hash_keys = ['id', 'url']
|
||||
hash_doc = lmap(
|
||||
lambda key: getattr(self, key),
|
||||
hash_keys
|
||||
)
|
||||
self.hash = hash_str(
|
||||
hash_str(hash_doc) + self.provider.hash(self.file)
|
||||
)
|
||||
|
||||
def create_preview(self, file):
|
||||
def url(size, ext):
|
||||
return self.url_base_preview.format(id=file, size=size, ext=ext)
|
||||
|
||||
temp_preview_path = pdf_to_jpg(self.provider, file)
|
||||
file = os.path.basename(file)
|
||||
file = url_encode_text(file)
|
||||
img = create_image(temp_preview_path, self.sizes, url, settings.dir_static_images)
|
||||
os.remove(temp_preview_path)
|
||||
return img
|
||||
|
||||
|
||||
def document_type(doctype):
|
||||
if doctype == 'Награды':
|
||||
return 'award'
|
||||
return 'document'
|
||||
|
||||
|
||||
def pdf_to_jpg(provider, pdf):
|
||||
_, temp_in = mkstemp(suffix='.pdf')
|
||||
_, temp_out = mkstemp(suffix='.jpg')
|
||||
|
||||
abspdf = provider.copy(pdf, temp_in)
|
||||
image_magick_pdf_to_img(abspdf, temp_out)
|
||||
|
||||
os.remove(temp_in)
|
||||
return temp_out
|
||||
|
||||
|
||||
def get_pdf_title(provider, file):
|
||||
from PyPDF2 import PdfFileReader
|
||||
from PyPDF2.generic import TextStringObject
|
||||
from PyPDF2.generic import IndirectObject
|
||||
|
||||
pdf = PdfFileReader(provider.read(file))
|
||||
info = pdf.getDocumentInfo()
|
||||
|
||||
if info:
|
||||
if type(info.title) == TextStringObject:
|
||||
return str(info.title)
|
||||
|
||||
if type(info.title_raw) == IndirectObject:
|
||||
o = pdf.getObject(info.title_raw)
|
||||
return str(o)
|
||||
return None
|
||||
Reference in new issue
Block a user