X-Git-Url: https://scm.cri.ensmp.fr/git/Portfolio.git/blobdiff_plain/011a53d5681ad1f5fa88a534ec041c93d3e7be95..ec42482bea99052d631ecf6062f2a7e1e8376091:/manipulation.py?ds=sidebyside diff --git a/manipulation.py b/manipulation.py index e27ab1e..ce74a7d 100755 --- a/manipulation.py +++ b/manipulation.py @@ -1,24 +1,24 @@ # -*- coding: utf-8 -*- -#################################################### -# Copyright © 2009 Luxia SAS. All rights reserved. # -# # -# Contributors: # -# - Benoît Pin # -#################################################### +############################################################ +# Copyright © 2005-2010 Benoît PIN # +# Plinn - http://plinn.org # +# # +# This program is free software; you can redistribute it # +# and/or modify it under the terms of the Creative Commons # +# "Attribution-Noncommercial 2.0 Generic" # +# http://creativecommons.org/licenses/by-nc/2.0/ # +############################################################ """ Image threaded batch computation module - -$Id: manipulation.py 1391 2009-09-16 23:36:05Z pin $ -$URL: http://svn.luxia.fr/svn/labo/projects/zope/Portfolio/trunk/manipulation.py $ """ import threading import logging import atexit -import time -import Zope2 +from types import StringTypes from math import ceil import transaction from ZODB.POSException import ConflictError +from zope.site.hooks import setSite from cStringIO import StringIO console = logging.getLogger('[manipulation thread]') @@ -28,20 +28,16 @@ class ImageQueueProcessorThread(threading.Thread) : """ __stopped = False - - def __init__(self, portal_path, itemPath): + + + def __init__(self, portal_path, itemsPath) : threading.Thread.__init__(self) - self.app = app = Zope2.app() - self.portal = portal = app.unrestrictedTraverse(portal_path) - self.imgTool = portal.portal_image_manipulation + self.portal_path = portal_path self.queue = [] - if itemPath : - self.queueAdd(itemPath) - else : - ctool = portal.portal_catalog - brains = ctool.unrestrictedSearchResults(portal_type='Photo', tiles_available=0) - for b in brains : - self.queueAdd(b.getPath()) + if isinstance(itemsPath, StringTypes) : + itemsPath = [itemsPath] + for i in itemsPath : + self.queueAdd(i) @property def queueSize(self) : @@ -52,21 +48,30 @@ class ImageQueueProcessorThread(threading.Thread) : def run(self) : console.info('process started.') - atexit.register(self.stop) + #atexit.register(self.stop) + import Zope2 + app = Zope2.app() + portal = app.unrestrictedTraverse(self.portal_path) + setSite(portal) while not self.__stopped and self.queueSize : - self._process() + self._process(app) + + con = app._p_jar + con.close() + #con.close() console.info('process finished.') + #print con + #print con.transaction_manager + def stop(self): console.info('process stopped.') self.__stopped = True - def _process(self) : - + def _process(self, app) : path = self.queue.pop(0) - try : - p = self.app.unrestrictedTraverse(path) + p = app.unrestrictedTraverse(path) except KeyError : console.warn('deleted during processing: %s' % path) return @@ -120,13 +125,15 @@ class ImageQueueProcessorThread(threading.Thread) : pass p.tiles_available = 1 + assert p._getCatalogTool() p.reindexObject(idxs=['tiles_available']) transaction.commit() except ConflictError : console.warn('Resync after ZODB ConflicError') transaction.abort() - self.portal._p_jar.sync() + portal = app.unrestrictedTraverse(self.portal_path) + portal._p_jar.sync() self.queueAdd(path) return except :