--- cdli/cdli_files.py 2008/09/29 12:37:37 1.86 +++ cdli/cdli_files.py 2008/10/01 15:58:11 1.87 @@ -31,7 +31,7 @@ from BTrees.IOBTree import IOBTree import cdliSplitter from sets import Set import md5 - +from DownloadBasket import DownloadBasketFinallyThread def makelist(mySet): x = list(mySet) @@ -230,7 +230,7 @@ class BasketContent(SimpleItem): def getContent(self): """get content""" - + return self.contentList def setContent(self,content): @@ -1036,12 +1036,11 @@ class CDLIBasket(Folder,CatalogAware): actualNo=obj[1].getLastVersion().getVersionNumber() storedNo=obj[0].getVersionNumber() - founds=self.CDLICatalog.search({'title':obj[0].getId()}) - if len(founds)>0: - actualNo=founds[0].getObject().getLastVersion().getVersionNumber() + + actualNo=self.getFileObjectLastVersion(obj.getId()).getVersionNumber() - if len(founds)>0 and founds[0].getObject().aq_parent.getId()==".trash": - return False, -1 + #if len(founds)>0 and founds[0].getObject().aq_parent.getId()==".trash": + # return False, -1 if actualNo==storedNo: return True , 0 @@ -1363,7 +1362,7 @@ class CDLIBasketVersion(Implicit,Persist security.declareProtected('manage','downloadObjectsAsOneFile') def downloadObjectsAsOneFile(self,lock=None,procedure=None,REQUEST=None,check="yes",current="no"): """download all selected files in one file""" - + logging.debug("doasof") if self.temp_folder.downloadCounterBaskets > 10000: return """I am sorry, currently the server has to many requests for downloads, please come back later!""" @@ -1377,25 +1376,19 @@ class CDLIBasketVersion(Implicit,Persist return self.downloadObjectsAsOneFileFinally(lock=lock,procedure=procedure,REQUEST=REQUEST,current="no") - def downloadObjectsAsOneFileFinally(self,lock=None,procedure=None,REQUEST=None,current="no"): + def downloadObjectsAsOneFileFinally(self,lock=None,procedure=None,REQUEST=None,current="no",repeat=None): """print do the download""" + logging.debug("HIHHHH") ret="" lockedObjects={} - self.temp_folder.downloadCounterBaskets+=1 - self._p_changed=1 - transaction.get().commit() - + + logging.debug("lock:"+repr(lock)) if lock: - + logging.debug("------lock:"+repr(lock)) if str(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User': - self.temp_folder.downloadCounterBaskets-=1 - self._p_changed=1 - transaction.get().commit() - self.temp_folder.downloadCounterBaskets-=1 - self._p_changed=1 - transaction.get().commit() + return "please login first" #check if a locked object exist in the basket. @@ -1413,59 +1406,95 @@ class CDLIBasketVersion(Implicit,Persist self.REQUEST.SESSION['lockedObjects']=lockedObjects pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','lockedObjects.zpt')).__of__(self) - self.temp_folder.downloadCounterBaskets-=1 - self._p_changed=1 - transaction.get().commit() - + return pt() elif not procedure: #keine fails gesperrt dann alle donwloaden procedure="downloadAll" + + + threadName=repeat + if not threadName or threadName=="": + thread=DownloadBasketFinallyThread() + threadName=thread.getName()[0:] + if (not hasattr(self,'_v_downloadBasket')): + self._v_downloadBasket={} - for object in self.content.getContent(): - logging.error("ret:"+repr(object[0])) - logging.error(" -"+repr(procedure)) - logging.error(" -"+repr(object[1].lockedBy)) - - if (procedure=="downloadAll") or (object[1].lockedBy=='') or (object[1].lockedBy==self.REQUEST['AUTHENTICATED_USER']): - logging.error("ret1") - if current=="no": #version as they are in the basket - logging.error("ret2") - ret+=str(object[0].getData())+"\n" - 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" - - if lock and object[1].lockedBy=='': - object[1].lockedBy=self.REQUEST['AUTHENTICATED_USER'] + + self._v_downloadBasket[threadName]=thread + logging.debug("dwonloadfinally:"+repr(self)) + basketID=self.aq_parent.aq_parent.getId() + versionNumber=self.aq_parent.getId() + self._v_downloadBasket[threadName].set(lock,procedure,REQUEST,current,basketID,versionNumber) + + self._v_downloadBasket[threadName].start() + + + + wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template']) + + if wait_template: + return wait_template[0][1]() + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','downloadBasketWait.zpt')).__of__(self) + + return pt(txt=self.absolute_url()+'/downloadObjectsAsOneFileFinally',threadName=threadName) + #_v_xmltrans.run() - if (not isinstance(self.aq_parent,CDLIBasket)): - basket_name=self.aq_parent.aq_parent.title+"_V"+self.getId() else: - basket_name=self.aq_parent.title+"_V"+self.getId() - - - - #write basketname to header of atf file - ret="#basket: %s\n"%basket_name+ret + #recover thread, if lost + if not hasattr(self,'_v_downloadBasket'): + self._v_downloadBasket={} + if not self._v_downloadBasket.get(threadName,None): + for thread in threading.enumerate(): + if threadName == thread.getName(): + self._v_downloadBasket[threadName]=thread + + if self._v_downloadBasket.get(threadName,None) and (self._v_downloadBasket[threadName] is not None) and (not self._v_downloadBasket[threadName].end) : - self.temp_folder.downloadCounterBaskets-=1 - self._p_changed=1 - transaction.get().commit() + wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template']) + if wait_template: + return wait_template[0][1]() + + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','downloadBasketWait.zpt')).__of__(self) + return pt(txt=self.absolute_url()+'/downloadObjectsAsOneFileFinally',threadName=threadName) + else: + + + logging.debug("FINISHED") + if not self._v_downloadBasket.get(threadName,None): + for thread in threading.enumerate(): + if threadName == thread.getName(): + self._v_downloadBasket[threadName]=thread + + #files = self._v_downloadBasket[threadName].result + files=self.basketContainer.resultHash[threadName] + # fh=file("/var/tmp/test") + #ret =fh.read() + + if (not isinstance(self.aq_parent,CDLIBasket)): + basket_name=self.aq_parent.aq_parent.title+"_V"+self.getId() + else: + basket_name=self.aq_parent.title+"_V"+self.getId() - self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s.atf" """%basket_name) - self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream") - length=len(ret) - self.REQUEST.RESPONSE.setHeader("Content-Length",length) - self.REQUEST.RESPONSE.write(ret) - return True + + #write basketname to header of atf file + + + self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s.atf" """%basket_name) + self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream") + #length=len(ret) + #self.REQUEST.RESPONSE.setHeader("Content-Length",length) + ret="#basket: %s\n"%basket_name + self.REQUEST.RESPONSE.write(ret) + for fileName in files: + self.REQUEST.RESPONSE.write(file(fileName).read()) + + del self.basketContainer.resultHash[threadName] + def numberOfItems(self): """return anzahl der elemente im basket""" return self.content.numberOfItems() @@ -2587,6 +2616,11 @@ class CDLIRoot(Folder): return """ 2;url=%s?repeat=%s """%(self.absolute_url()+txt,threadName) + def refreshTxtBasket(self,txt="",threadName=None): + """txt fuer refresh""" + + return """ 2;url=%s?repeat=%s """%(txt,threadName) + def getResult(self,threadName=None): """result of thread"""