--- cdli/cdli_files.py 2008/09/25 13:41:58 1.84 +++ cdli/cdli_files.py 2008/09/26 16:03:30 1.85 @@ -32,6 +32,12 @@ import cdliSplitter from sets import Set import md5 + +def makelist(mySet): + x = list(mySet) + x.sort() + return x + def unicodify(s): """decode str (utf-8 or latin-1 representation) into unicode object""" if not s: @@ -395,6 +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)) basket.addObjects(ids,deleteOld=True,username=str(username)) logging.debug("uploadatffinallythread uploadfinally done") @@ -1024,21 +1031,25 @@ class CDLIBasket(Folder,CatalogAware): def isActual(self,obj): """teste ob im basket die aktuelle version ist""" - 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() + try: + 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() + + 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": + if actualNo==storedNo: + return True , 0 + else: + return False, actualNo + except: return False, -1 - - if actualNo==storedNo: - return True , 0 - else: - return False, actualNo - + def history(self): """history""" @@ -1210,13 +1221,13 @@ class CDLIBasket(Folder,CatalogAware): # newContent.append((found.getObject().getLastVersion(),found.getObject())) # added+=1 - hash = md5.new(repr(self.makelist(ids))).digest() # erzeuge hash als identification + 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): logging.debug("from store!") - newContent=Set(map(swap,self.cdliRoot._v_tmpStore[hash])) + newContent=Set(map(swap,self.cdliRoot.v_tmpStore[hash])) else: logging.debug("not from store!") @@ -1552,7 +1563,7 @@ class CDLIFileObject(CatalogAware,extVer return str(self) def makeThisVersionCurrent_html(self): - """form for making this version current""" + """form for mthis version current""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','makeThisVersionCurrent.zpt')).__of__(self) return pt() @@ -1645,6 +1656,7 @@ def manage_addCDLIFileObject(self,id,vC= logging.debug("reindex2: %s in %s"%(repr(fob), repr(fob.default_catalog))) fob.index_object() + self.CDLIRoot.updateOrAddToFileBTree(ob) if REQUEST is not None: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main') @@ -1758,6 +1770,9 @@ class CDLIFile(extVersionedFile,CatalogA except: pass + #self.cdliRoot.updateOrAddToFileBTree(self)# now update the object in the cache + + if RESPONSE: if ob.getSize()==0: self.REQUEST.SESSION['objID']=ob.getId() @@ -1967,10 +1982,13 @@ class CDLIFileFolder(extVersionedFileFol fileTree.add(found.getId) logging.debug("ADDD:"+found.getId) - def findObjectsFromList(self,enterList=None,display=False,start=None,upload=None,list=None,basketName=None,numberOfObjects=None,RESPONSE=None,REQUEST=None): + def findObjectsFromList(self,enterList=None,display=False,start=None,upload=None,list=None,basketName=None,numberOfObjects=None,RESPONSE=None,REQUEST=None,returnHash=False,hash=None): """findObjectsFromList (, TAB oder LINE separated)""" logging.debug("start: findObjectsFromList") + #logging.debug("start: findObjectsFromList"+repr(list)) + + if upload: # list from file upload txt=upload.read() @@ -2001,6 +2019,14 @@ class CDLIFileFolder(extVersionedFileFol pt=getattr(self,'filelist.html') return pt(basketName=basketName,numberOfObjects=numberOfObjects) + if hash is not None and hasattr(self.cdliRoot,'v_tmpStore') and self.cdliRoot.v_tmpStore.has_key(hash): + + logging.debug("asking for storage2") + result =self.cdliRoot.v_tmpStore[hash] + if result: + logging.debug("give result from storage2") + return hash,self.cdliRoot.v_tmpStore[hash] + if list is not None: # got already a list logging.debug(" ----List version") @@ -2024,15 +2050,27 @@ 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)) + self.REQUEST.SESSION['fileIds']=l#store fieldIds in session for further usage + self.REQUEST.SESSION['searchList']=l + #self.REQUEST.SESSION['searchList']=['P000001.atf'] + + hash = md5.new(repr(makelist(fileTree))).hexdigest() # erzeuge hash als identification + self.REQUEST.SESSION['hash']=hash + #TODO: do I need garbage collection for v_tmpStore ? - hash = md5.new(repr(self.makelist(ids))).digest() # erzeuge hash als identification - #TODO: do I need garbage collection for _v_tmpStore ? - #logging.debug("list:"+repr(self.makelist(ids))) #logging.debug("Hash:"+repr(hash)) - if hasattr(self.cdliRoot,'_v_tmpStore') and self.cdliRoot._v_tmpStore.has_key(hash): - logging.debug("asking for storage") - return self.cdliRoot._v_tmpStore[hash] +# +# if hasattr(self.cdliRoot,'v_tmpStore') and self.cdliRoot.v_tmpStore.has_key(hash): +# logging.debug("asking for storage") +# res=self.cdliRoot.v_tmpStore[hash] +# if res: +# if returnHash == True: +# return hash,res +# return res #TODO: get rid of one of these.. #ids=[x.getObject().getId() for x in ret] @@ -2040,32 +2078,27 @@ class CDLIFileFolder(extVersionedFileFol #self.REQUEST.SESSION['fileIds']=ids#store fieldIds in session for further usage #self.REQUEST.SESSION['searchList']=self.REQUEST.SESSION['fileIds'] - self.REQUEST.SESSION['fileIds']=list#store fieldIds in session for further usage - self.REQUEST.SESSION['searchList']=self.REQUEST.SESSION['fileIds'] - + if display: pt=getattr(self,'filelist.html') return pt(search=ids) else: #self.REQUEST.SESSION['hash'] = ret # store in session - if not hasattr(self,'_v_tmpStore'): - self.cdliRoot._v_tmpStore={} + if not hasattr(self,'v_tmpStore'): + self.cdliRoot.v_tmpStore={} #logging.debug("HHHHHHNEU:"+repr(self.makelist(ids))) #logging.debug("HHHHHHNEU:"+repr(hash)) - self.cdliRoot._v_tmpStore[hash] = ret # store in session + self.cdliRoot.v_tmpStore[hash] = ret # store in session + if returnHash == True: + return hash,ret return ret if start: RESPONSE.redirect("filelist.html?start:int="+str(start)) - - def makelist(self,mySet): - x = list(mySet) - x.sort() - return x - + security.declareProtected('Manage','createAllFilesAsSingleFile') def createAllFilesAsSingleFile(self,RESPONSE=None): """download all files""" @@ -2194,15 +2227,21 @@ class CDLIRoot(Folder): def getFileObject(self,fileId): + """get an object""" x=self.v_files.get(fileId) #logging.debug(x) return x def getFileObjectLastVersion(self,fileId): + """get an object""" x=self.v_files_lastVersion.get(fileId) #logging.debug(x) return x + def showFileIds(self): + """showIds""" + return self.v_file_ids + def generateFileBTree(self): """erzeuge einen Btree aus allen Files""" self.v_files = OOBTree() @@ -2216,7 +2255,25 @@ class CDLIRoot(Folder): self.v_file_ids.add(x.getId) logging.debug("add:"+x.getId+"XXX"+repr(x.getObject())) - return "done" + return True + + + def updateOrAddToFileBTree(self,obj): + """update a BTree""" + self.v_files.update({obj.getId():obj}) + self.v_files_lastVersion.update({obj.getId():obj.getLastVersion()}) + + self.v_file_ids.add(obj.getId()) + logging.debug("update:"+obj.getId()+"XXX"+repr(obj)) + + def deleteFromBTree(self,objId): + """delete an obj""" + self.v_files.pop(objId) + self.v_files_lastVersion.pop(objId) + self.v_file_ids.remove(objId) + + + def deleteFiles(self,ids): """delete files""" for id in ids: @@ -2650,7 +2707,18 @@ class CDLIRoot(Folder): pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadATFWait.zpt')).__of__(self) return pt(txt='/uploadATFfinally',threadName=threadName) else: + + + idTmp=self.REQUEST.SESSION['idTmp'] + stObj=getattr(self.temp_folder,idTmp) self.REQUEST.SESSION['idTmp']=None + + #update changed + logging.debug("dir:"+repr(stObj.returnValue['changed'])) + for x in stObj.returnValue['changed']: + ob=self.CDLICatalog.search({'title':x[0]}) + + self.cdliRoot.updateOrAddToFileBTree(ob[0].getObject()) if RESPONSE is not None: RESPONSE.redirect(self.absolute_url()) @@ -2665,12 +2733,15 @@ class CDLIRoot(Folder): for f in files: folder=f[0:3] f2=f[0:5] + + #check if main folder PXX already exists obj=self.ZopeFind(root,obj_ids=[folder]) logging.debug("importFiles: folder=%s f2=%s obj=%s"%(folder,f2,obj)) if ext: ext.result="

adding: %s

"%f+ext.result - if not obj: + + if not obj: # if not create it manage_addCDLIFileFolder(root,folder,folder) fobj=getattr(root,folder) #transaction.get().commit() @@ -2678,22 +2749,28 @@ class CDLIRoot(Folder): else: fobj=obj[0][1] + #check IF PYYYYY already exist obj2=fobj.ZopeFind(fobj,obj_ids=[f2]) logging.debug("importFiles: fobj=%s obj2=%s"%(fobj,obj2)) - if not obj2: + if not obj2:# if not create it manage_addCDLIFileFolder(fobj,f2,f2) fobj2=getattr(fobj,f2) else: fobj2=obj2[0][1] + # not add the file file2=os.path.join(folderName,f) id=f logging.debug("importFiles: addCDLIFile fobj2=%s, f=%s file2=%s"%(fobj2,repr(f),repr(file2))) fobj2.addFile(vC='',file=file(file2),author=author,newName=f) count+=1 - + + #now add the file to the storage + ob = getattr(fobj2,f) + self.cdliRoot.updateOrAddToFileBTree(ob) + if count%100==0: logging.debug("importfiles: committing") transaction.get().commit()