From 98f9de7d602fa4ef47c3256c1f94d3f56de9b3df Mon Sep 17 00:00:00 2001 From: Roman Timashev Date: Mon, 11 Sep 2017 19:22:28 +0300 Subject: [PATCH] [Sync] Image update: do not compile unchanged images --- utils/Sync/sync/models/Image.py | 27 +++++++++++++++++++++++---- utils/Sync/sync/models/__init__.py | 21 ++++++++++++++++++++- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/utils/Sync/sync/models/Image.py b/utils/Sync/sync/models/Image.py index ca0fc2fc..b15cdb25 100644 --- a/utils/Sync/sync/models/Image.py +++ b/utils/Sync/sync/models/Image.py @@ -13,7 +13,9 @@ import logging import settings from utils.image.resize import optimize, thumbnail -logger = logging.getLogger(settings.name) +logger = logging.getLogger(settings.name + '.Image') + +store = collection(settings.collection_images) def get_upload_url(url): @@ -21,12 +23,25 @@ def get_upload_url(url): class Image(Model): + @staticmethod + async def find_one(query): + document = store.find_one(query) + return document + @staticmethod async def new(provider, file, sizes, url_factory): img = Image(provider, file, url_factory) - await img.compile(sizes) - await img.upload() - await img.save() + changed = await img.is_changed() + if changed: + await img.compile(sizes) + await img.upload() + await img.save() + else: + doc = await Image.find_one({'file': file}) + + img.image = [i for i in doc['data'].values()] + img.id = doc['_id'] + return img def __init__(self, provider, file, url_factory): @@ -38,6 +53,10 @@ class Image(Model): def init(self): self.hash = self.__get_hash() + async def is_changed(self): + i = await Image.find_one({'file': self.file}) + return self._is_changed_hash(i) + async def compile(self, sizes): img_in = self.provider.get_abs(self.file) img_out = tempfile.mkdtemp() diff --git a/utils/Sync/sync/models/__init__.py b/utils/Sync/sync/models/__init__.py index 1f29260b..df47f68d 100644 --- a/utils/Sync/sync/models/__init__.py +++ b/utils/Sync/sync/models/__init__.py @@ -1,3 +1,12 @@ +def find(store, item_id: str): + q = {'id': item_id} + try: + return store.find_one(q) + except ValueError: + pass + return None + + class Model: def __init__(self, provider, store, file): super().__init__() @@ -19,7 +28,17 @@ class Model: return None async def is_changed(self): - return False + i = find(self.store, self.id) + return self._is_changed_hash(i) + + def _is_changed_hash(self, item): + if not item: + return True + + if 'hash' not in item: + return True + + return not (self.hash == item['hash']) async def save(self): pass