--- cdli/cdli_files.py 2008/01/21 17:19:01 1.81 +++ cdli/cdli_files.py 2008/09/25 13:41:58 1.84 @@ -21,15 +21,16 @@ from ZPublisher.HTTPRequest import HTTPR from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.BaseRequest import RequestContainer import threading -from BTrees.OOBTree import OOBTree +from BTrees.OOBTree import OOBTree, OOTreeSet import logging import transaction import copy import codecs import sys - +from BTrees.IOBTree import IOBTree import cdliSplitter - +from sets import Set +import md5 def unicodify(s): """decode str (utf-8 or latin-1 representation) into unicode object""" @@ -924,10 +925,13 @@ class CDLIBasketContainer(OrderedFolder) """store it""" if not ids: ids=self.REQUEST.SESSION['fileIds'] - - if type(ids) is not ListType: + + if (type(ids) is not ListType) and (not isinstance(ids,Set)): ids=[ids] + if isinstance(ids,Set): + ids=list(ids) + if (submit.lower()=="store in new basket") or (submit.lower()=="new basket"): basketRet=self.addBasket(newBasketName) self.setActiveBasket(basketRet.getId()) @@ -941,7 +945,7 @@ class CDLIBasketContainer(OrderedFolder) if fromFileList: - return self.cdli_main.findObjectsFromList(list=self.REQUEST.SESSION['fileIds'],basketName=basket.title,numberOfObjects=added) + return self.cdli_main.findObjectsFromList(list=ids,basketName=basket.title,numberOfObjects=added) if RESPONSE: @@ -1177,6 +1181,10 @@ class CDLIBasket(Folder,CatalogAware): def addObjects(self,ids,deleteOld=None,username=None): """generate a new version of the basket with objects added""" + + def swap(x): + return (x[1],x[0]) + logging.info("add to basket (%s)"%(self.getId())) lastVersion=self.getLastVersion() @@ -1188,27 +1196,42 @@ class CDLIBasket(Folder,CatalogAware): if deleteOld: oldContent=[] - newContent=[] added=0 - for id in ids: - try: - founds=self.CDLICatalog.search({'title':id}) - except: - founds=[] - - for found in founds: - if found.getObject() not in oldContent: - #TODO: was passiert wenn, man eine Object dazufŸgt, das schon da ist aber eine neuere version - newContent.append((found.getObject().getLastVersion(),found.getObject())) - added+=1 - - content=oldContent+newContent +# for id in ids: +# logging.debug("adding:"+id) +# try: +# founds=self.CDLICatalog.search({'title':id}) +# except: +# founds=[] +# +# for found in founds: +# if found.getObject() not in oldContent: +# #TODO: was passiert wenn, man eine Object dazufŸgt, das schon da ist aber eine neuere version +# newContent.append((found.getObject().getLastVersion(),found.getObject())) +# added+=1 + + hash = md5.new(repr(self.makelist(ids))).digest() # 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): + logging.debug("from store!") + newContent=Set(map(swap,self.cdliRoot._v_tmpStore[hash])) + + else: + logging.debug("not from store!") + newContent=Set([(self.getFileObjectLastVersion(x),self.getFileObject(x)) for x in ids]) + + + content=Set(oldContent).union(newContent) + added = len(content)-len(oldContent) if not username: user=self.getActualUserName() else: user = username - - ob=manage_addCDLIBasketVersion(self,user,comment="",basketContent=content) + + #logging.debug("content:"+repr(list(content))) + ob=manage_addCDLIBasketVersion(self,user,comment="",basketContent=list(content)) logging.info("add to basket (%s) done"%(self.getId())) return added @@ -1392,11 +1415,17 @@ class CDLIBasketVersion(Implicit,Persist 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: @@ -1931,10 +1960,17 @@ class CDLIFileFolder(extVersionedFileFol return ret - def findObjectsFromList(self,enterList=None,display=False,start=None,upload=None,list=None,basketName=None,numberOfObjects=None,RESPONSE=None): + def expandFile(self,fileId,fileTree): + """wildcard in fileID suche alle Treffer""" + founds=self.CDLICatalog({'title':fileId}) + for found in founds: + 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): """findObjectsFromList (, TAB oder LINE separated)""" - + logging.debug("start: findObjectsFromList") if upload: # list from file upload txt=upload.read() @@ -1966,24 +2002,58 @@ class CDLIFileFolder(extVersionedFileFol return pt(basketName=basketName,numberOfObjects=numberOfObjects) if list is not None: # got already a list + + logging.debug(" ----List version") ret=[] + fileTree=Set() + for fileId in list: - if fileId.find("*"): #check for wildcards - fileId=fileId + + if fileId.find("*")>-1: #check for wildcards + self.expandFile(fileId,fileTree) + elif len(fileId.split("."))==1: fileId=fileId+".atf" + fileTree.add(fileId) + #logging.debug(" -----:"+fileId) + #ret+=self.CDLICatalog({'title':fileId}) + #x =self.getFileObject(fileId) + #if x is not None: + # ret.append(x) - ret+=self.CDLICatalog({'title':fileId}) + + + ids = fileTree & self.v_file_ids + + + 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] + #TODO: get rid of one of these.. - ids=[x.getObject().getId() for x in ret] - self.REQUEST.SESSION['fileIds']=ids#store fieldIds in session for further usage - self.REQUEST.SESSION['searchList']=self.REQUEST.SESSION['fileIds'] + #ids=[x.getObject().getId() for x in ret] + ret=[(self.getFileObject(x),self.getFileObjectLastVersion(x)) for x in ids] + #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: + else: + #self.REQUEST.SESSION['hash'] = ret # store in session + 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 return ret @@ -1991,7 +2061,11 @@ class CDLIFileFolder(extVersionedFileFol 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""" @@ -2119,6 +2193,30 @@ class CDLIRoot(Folder): 'graphemes':cdliSplitter.graphemeSplitter()} + def getFileObject(self,fileId): + x=self.v_files.get(fileId) + #logging.debug(x) + return x + + def getFileObjectLastVersion(self,fileId): + x=self.v_files_lastVersion.get(fileId) + #logging.debug(x) + return x + + def generateFileBTree(self): + """erzeuge einen Btree aus allen Files""" + self.v_files = OOBTree() + self.v_files_lastVersion = OOBTree() + self.v_file_ids = Set() + + for x in self.CDLICatalog.searchResults(): + + self.v_files.update({x.getId:x.getObject()}) + self.v_files_lastVersion.update({x.getId:x.getObject().getLastVersion()}) + self.v_file_ids.add(x.getId) + logging.debug("add:"+x.getId+"XXX"+repr(x.getObject())) + + return "done" def deleteFiles(self,ids): """delete files""" for id in ids: @@ -2157,7 +2255,6 @@ class CDLIRoot(Folder): return f[0].getObject().getData() - def showFile(self,fileId,wholePage=False): """show a file @param fileId: P-Number of the document to be displayed @@ -2296,6 +2393,15 @@ class CDLIRoot(Folder): return dict([(id,self.tagWordInFile(id, word, indexName, regExp)) for id in fileIds]) + def getFileVersionList(self, pnum): + """get the version history as a list for the translit file with the given pnum""" + f = getattr(self, self.file_catalog).search({'textid':pnum}) + if not f: + return [] + + return f[0].getObject().getVersionList() + + def URLquote(self,str): """quote url""" return urllib.quote(str)