--- cdli/DownloadBasket.py 2008/10/01 15:58:11 1.1 +++ cdli/DownloadBasket.py 2008/10/29 12:10:05 1.6 @@ -1,4 +1,3 @@ - from threading import Thread from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.HTTPRequest import HTTPRequest @@ -6,6 +5,15 @@ from ZPublisher.BaseRequest import Reque import logging import os import transaction + + +def correctFileName(filename): + m1=filename[0:3] + m2=filename[3:5] + name=os.path.join("cdliRoot","cdlimain",m1,m2,filename) + logging.debug("%s corrected zu name %s"%(filename,name)) + return name + class DownloadBasketFinallyThread(Thread): def __init__(self): @@ -13,17 +21,21 @@ class DownloadBasketFinallyThread(Thread self.continueVar=True self.returnValue=None self.end=False + self.counter=0 # zaehlt wieviele Files schon gefunden wurden + + self.number=0 # Anzahl der Files im Basket Thread.__init__(self) - def set(self,lock,procedure,REQUEST,current,basketID,versionNumber,serverport="28080"): + def set(self,lock,procedure,user,current,basketID,versionNumber,serverport="28080"): self.procedure=procedure self.lock=lock - self.REQUEST=REQUEST + self.user=user self.basketID = basketID self.versionNumber = versionNumber self.serverport=serverport self.current=current logging.debug("download thread:set") + logging.debug("download thread:user"+repr(self.user)) def __call__(self): """call of the thread (equals run)""" @@ -44,7 +56,7 @@ class DownloadBasketFinallyThread(Thread baskets=self.ctx.ZopeFind(self.ctx,obj_metatypes=['CDLIBasket'],obj_ids=[self.basketID]) logging.error("---------download thread:run3") if len(baskets)!=1: - logging.error("ERROR: donwloadBasketcannot find basket:"+self.basketID) + logging.error("ERROR: downloadBasket: cannot find basket:"+self.basketID) self.end=True return @@ -53,7 +65,7 @@ class DownloadBasketFinallyThread(Thread basketVersion=getattr(basket[1],self.versionNumber) - self.downloadObjectsAsOneFileFinally(self.lock,self.procedure,self.REQUEST,self.current,basketVersion) + self.downloadObjectsAsOneFileFinally(self.lock,self.procedure,self.user,self.current,basketVersion) self.end=True def getResult(self): @@ -61,6 +73,16 @@ class DownloadBasketFinallyThread(Thread return self.result + def getCounter(self): + """gibt den Counter zurueck, wieviele Objekte schon gefunden wurden""" + logging.error("counter:"+repr(self.counter)) + return self.counter + + + + def getNumberOfFiles(self): + """gibt anzahl zurueck""" + return self.number; def getContext(self, app,serverport="8080"): """get the context within the ZODB""" @@ -72,43 +94,73 @@ class DownloadBasketFinallyThread(Thread } req = HTTPRequest(None, env, resp) return app.__of__(RequestContainer(REQUEST = req)) - - def downloadObjectsAsOneFileFinally(self,lock=None,procedure=None,REQUEST=None,current="no",basketVersion=None): + + + def downloadObjectsAsOneFileFinally(self,lock=None,procedure=None,user=None,current="no",basketVersion=None): """print do the download""" logging.debug("download thread") - logging.debug("donwloadBasketasonefile: found basket:"+repr(basketVersion)) + logging.debug("downloadBasketasonefile: found basket:"+repr(basketVersion)) ret="" - i=0 + self.counter=0 #fh=file("/var/tmp/test","w") files=[] - for object in basketVersion.getContent(): - logging.error(i) - i+=1 + lockedFiles=[] + objects=basketVersion.getContent() + loggin.debug("got object in main call") + self.number=len(objects) + logging.debug("objects:"+repr(self.number)) + for object in objects: + obj=self.ctx.getFileObject(object[0]) + self.counter+=1 # logging.error("ret:"+repr(object[0])) # logging.error(" -"+repr(procedure)) -# #lockedBy=object[1].lockedBy - lockedBy="" + try: + lockedBy=obj.lockedBy + except: + logging.error("no object:"+repr(self.counter)) + logging.error("no object:"+repr(object)) + continue + +# lockedBy="" # logging.error(" -"+repr(lockedBy)) # - if (procedure=="downloadAll") or (lockedBy=='') or (lockedBy==self.REQUEST['AUTHENTICATED_USER']): - logging.error("ret1") - if current=="no": #version as they are in the basket - logging.error("ret2") - #object[0].addToFile2("/var/tmp/test2") - #ret+=str(object[0].getData())+"\n" - files.append(object[0].getFileName()) - elif current=="yes": - logging.error("ret3") - #search current object - founds=self.CDLICatalog.search({'title':object[1].getId().split(".")[0]}) - if len(founds)>0: - ret+=str(founds[0].getObject().getLastVersion().getData())+"\n" - + + #logging.error("ret1") + if current=="no": #version as they are in the basket + #logging.error("ret2") + #object[0].addToFile2("/var/tmp/test2") + #ret+=str(object[0].getData())+"\n" + logging.debug("CURRENT YES") + files.append(obj.getVersionNr(object[1]).getFileName()) + elif current=="yes": + #logging.error("ret3") + #search current object + #founds=self.CDLICatalog.search({'title':object[1].getId().split(".")[0]}) + obj=self.ctx.getFileObjectLastVersion(object[0]) + if obj: + logging.debug("CURRENT NO") + files.append(correctFileName(obj.getFileName())) + else: + logging.error("downloadBasketasonefile: don't know: "+repr(object[0])) + #if len(founds)>0: + # ret+=str(founds[0].getObject().getLastVersion().getData())+"\n" + + #falls die Datei gesperrit ist nimm sie in die Liste auf. + if not((procedure=="downloadAll") or (lockedBy=='') or (lockedBy==user)): + #logging.error("ret4") + lockedFiles.append((object[0],lockedBy)) - if lock and lockedBy=='': - object[1].lockedBy=self.REQUEST['AUTHENTICATED_USER'] + #if lock and lockedBy=='': + #obj=self.ctx.getFileObject(object[1].getId()) + # founds=self.ctx.CDLICatalog.search({'title':object[1].getId().split(".")[0]}) + #if len(founds)>0: + #founds[0].getObject().lockedBy=user + + # object[1].lockedBy=user + # transaction.get().commit() + #obj.lockedBy=user # logging.error("---------download thread:run5") # pin,pout =os.popen2("xargs cat") # logging.error("---------download thread:run6") @@ -126,6 +178,11 @@ class DownloadBasketFinallyThread(Thread if not hasattr(self.ctx,'resultHash'): self.ctx.resultHash={} self.ctx.resultHash[self.getName()]=files + + if not hasattr(self.ctx,'resultLockedHash'): + self.ctx.resultLockedHash={} + self.ctx.resultLockedHash[self.getName()]=lockedFiles + transaction.get().commit() self.conn.close() logging.error("---------download thread:run9")