--- cdli/cdli_files.py 2008/09/29 12:37:37 1.86 +++ cdli/cdli_files.py 2008/10/13 10:45:02 1.98 @@ -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): @@ -401,7 +401,7 @@ class uploadATFfinallyThread(Thread): basketId=ob.getId() basket=getattr(ctx2.basketContainer,str(basketId)) ids=os.listdir(SESSION['tmpdir']) - logging.debug("should add:"+repr(ids)) + #logging.debug("should add:"+repr(ids)) basket.addObjects(ids,deleteOld=True,username=str(username)) logging.debug("uploadatffinallythread uploadfinally done") @@ -640,7 +640,7 @@ class CDLIBasketContainer(OrderedFolder) ret+=str(object[0].getData())+"\n" elif current=="yes": #search current object - logging.debug("current: %s"%object[1].getId().split(".")[0]) + #logging.debug("current: %s"%object[1].getId().split(".")[0]) founds=self.CDLICatalog.search({'title':object[1].getId().split(".")[0]}) if len(founds)>0: ret+=str(founds[0].getObject().getLastVersion().getData())+"\n" @@ -659,6 +659,10 @@ class CDLIBasketContainer(OrderedFolder) def deleteBaskets(self,ids=None): """delete baskets, i.e. move them into trash folder""" + if ids is None: + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','cdliError_html.zpt')).__of__(self) + txt="Sorry, no basket selected!" + return pt(txt=txt) found=self.ZopeFind(self,obj_ids=['trash']) @@ -670,19 +674,30 @@ class CDLIBasketContainer(OrderedFolder) if type(ids) is not ListType: ids=[ids] + logging.error("XERXON:"+repr(ids)) + if len(ids)==0: + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','cdliError_html.zpt')).__of__(self) + txt="Sorry, no basket selected!" + return pt(txt=txt) + cut=self.manage_cutObjects(ids) trash.manage_pasteObjects(cut) - + return None security.declareProtected('manage','manageBaskets') def manageBaskets(self,submit,ids=None,basket1="",basket2="",joinBasket="",subtractBasket="",REQUEST=None,RESPONSE=None): """manage baskets, delete or copy""" if submit=="delete": - self.deleteBaskets(ids) - + ret= self.deleteBaskets(ids) + if ret: + return ret elif submit=="join": flag,msg=self.joinBasket(joinBasket, ids) logging.info("joining %s %s"%(flag,msg)) - + if not flag: + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','cdliError_html.zpt')).__of__(self) + + return pt(txt=msg) + elif submit=="subtract": logging.info("BBBb %s %s"%(basket1,basket2)) flag,msg=self.subtractBasket(subtractBasket, basket1,basket2) @@ -821,6 +836,7 @@ class CDLIBasketContainer(OrderedFolder) @param basket2: see above """ + logging.info("CCCCC %s %s"%(basket1,basket2)) try: @@ -861,12 +877,16 @@ class CDLIBasketContainer(OrderedFolder) @param newbasket: name of the new basket @param oldbaskets: list of baskets to be joined """ + if oldBaskets is None: + return False, "No Baskets selected!" + try: newB=self.addBasket(newBasket) except: return False, "cannot create the new basket" newBasketContent={} + for ob in oldBaskets: x= getattr(self,ob,None) if x is None: @@ -1032,22 +1052,23 @@ class CDLIBasket(Folder,CatalogAware): def isActual(self,obj): """teste ob im basket die aktuelle version ist""" try: - logging.debug("isActual:"+repr(obj)) + #logging.debug("isActual:"+repr(obj)) 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 else: return False, actualNo except: + logging.error( """is actual: %s (%s %s)"""%(repr(obj),sys.exc_info()[0],sys.exc_info()[1])) + return False, -1 def history(self): @@ -1223,9 +1244,9 @@ class CDLIBasket(Folder,CatalogAware): hash = md5.new(repr(makelist(ids))).hexdigest() # erzeuge hash als identification #logging.debug("JJJJJJJ:"+repr(self.makelist(ids))) - logging.debug("JJJJJJJ:"+repr(hash)) + - if hasattr(self.cdliRoot,'v_tmpStore') and self.cdliRoot.v_tmpStore.has_key(hash): + if hasattr(self.cdliRoot,'v_tmpStore') and self.cdliRoot.v_tmpStore.has_key("hash"): #TODO: muss eigentlich self.cdliRoot.v_tmpStore.has_key(hash): heissen (ohne "), erstmal so gesetzt damit der hash hier nie benutzt wird logging.debug("from store!") newContent=Set(map(swap,self.cdliRoot.v_tmpStore[hash])) @@ -1254,7 +1275,7 @@ class CDLIBasket(Folder,CatalogAware): lv=self.getLastVersion() for obj in lv.content.getContent(): - logging.info("XXXXXXXXXX %s"%repr(obj)) + #logging.info("XXXXXXXXXX %s"%repr(obj)) ret.append((obj[1].getId(),obj[0].versionNumber)) return ret @@ -1363,7 +1384,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""" - + 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 +1398,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() + 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 +1428,138 @@ 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)) + self._v_downloadBasket[threadName]=thread + logging.debug("dwonloadfinally:"+repr(self)) + + if isinstance(self,CDLIBasketVersion): + obj=self + else: + obj=self.aq_parent + logging.debug("dwonloadfinally2:"+repr(obj)) + logging.debug("dwonloadfinally2:"+repr(obj.aq_parent)) + + obj2=obj.aq_parent + if not isinstance(obj2,CDLIBasket): + obj2=obj2.aq_parent + + basketID=obj2.getId() + versionNumber=obj.getId() + logging.debug("dwonloadfinally2:"+repr(basketID)) + logging.debug("dwonloadfinally2:"+repr(versionNumber)) + + + if lock: + logging.debug("-----start locking") + for object in self.content.getContent(): + if object[1].lockedBy =='': + object[1].lockedBy=self.REQUEST['AUTHENTICATED_USER'] + logging.debug("-----finished locking") - 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'] + #obj.lockedBy=user + self._v_downloadBasket[threadName].set(lock,procedure,self.REQUEST['AUTHENTICATED_USER'],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, + counter=self._v_downloadBasket[threadName].getCounter(), + number=self._v_downloadBasket[threadName].getNumberOfFiles()) + #_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() + #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) : + + 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, + counter=self._v_downloadBasket[threadName].getCounter(), + number=self._v_downloadBasket[threadName].getNumberOfFiles()) + 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] + lockedFiles=self.basketContainer.resultLockedHash[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() - #write basketname to header of atf file - ret="#basket: %s\n"%basket_name+ret + #write basketname to header of atf file + - self.temp_folder.downloadCounterBaskets-=1 - self._p_changed=1 - transaction.get().commit() - - 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 + 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: + try: + self.REQUEST.RESPONSE.write(file(fileName).read()) + except: + logging.error("downloadasonefile: cannot read %s"%fileName) + + + self.REQUEST.RESPONSE.write("\n# locked files\n") + for fileName in lockedFiles: + self.REQUEST.RESPONSE.write("# %s by %s\n"%fileName) + + self.REQUEST.RESPONSE.write("# locked files end\n") + + del self.basketContainer.resultHash[threadName] + del self.basketContainer.resultLockedHash[threadName] + def numberOfItems(self): """return anzahl der elemente im basket""" return self.content.numberOfItems() @@ -1568,6 +1662,10 @@ class CDLIFileObject(CatalogAware,extVer """Return cataloguable key for ourselves.""" return str(self) + def setAuthor(self, author): + """change the author""" + self.author = author + def makeThisVersionCurrent_html(self): """form for mthis version current""" @@ -2058,7 +2156,7 @@ class CDLIFileFolder(extVersionedFileFol ids = fileTree & self.v_file_ids #self.REQUEST.SESSION['fileIds']=ids#store fieldIds in session for further usage l=makelist(fileTree)[0:] - logging.debug("l-list:"+repr(l)) + #logging.debug("l-list:"+repr(l)) self.REQUEST.SESSION['fileIds']=l#store fieldIds in session for further usage self.REQUEST.SESSION['searchList']=l #self.REQUEST.SESSION['searchList']=['P000001.atf'] @@ -2291,7 +2389,7 @@ class CDLIRoot(Folder): def getFileObjectLastVersion(self,fileId): """get an object""" x=self.v_files_lastVersion.get(fileId) - #logging.debug(x) + #logging.debug("lastVersion: "+repr(x)) return x def showFileIds(self): @@ -2587,6 +2685,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"""