--- cdli/cdli_files.py 2008/01/21 17:19:01 1.81 +++ cdli/cdli_files.py 2008/10/29 12:10:05 1.102 @@ -1,10 +1,8 @@ """CDLI extensions of the filearchive""" from Products.versionedFile.extVersionedFile import * from Products.ZCatalog.CatalogPathAwareness import CatalogAware -from tempfile import mkstemp,mkdtemp import os.path import os -from types import * import urlparse import urllib import cgi @@ -21,16 +19,24 @@ 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 +from DownloadBasket import DownloadBasketFinallyThread +from types import * + +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: @@ -217,18 +223,53 @@ def unique(s): class BasketContent(SimpleItem): """classe fuer den Inhalt eines Baskets""" + def getFileAndVersionFromId(self,pnum,versionNr): + + obj=self.cdliRoot.getFileObject(pnum) + logging.debug("obj : %s"%obj) + version=obj.getVersionNr(versionNr) + logging.debug("-------vs: %s"%version.getFileName()) + return version,obj + def __init__(self,content=[]): """content""" - self.contentList=content[0:] + + self.setContent(content[0:]) - def getContent(self): - """get content""" - + def getContent(self,filtered=True): return self.contentList + def getContentOld(self,filtered=True): + """get content""" + logging.debug("content object: content List %s"%self.contentList) + ret=[] + + return [self.getFileAndVersionFromId(x[0],x[1]) for x in self.contentList] +# +# if filtered: +# for x in self.contentList: +# if not((x[0] is None) or (x[1] is None)): +# ret.append(x) +# logging.debug("content object: content List -done filtered") +# return ret +# +# else: +# logging.debug("content object: content List -done not filtered") +# return self.contentList + + def allContent(self): + """get all content""" + return self.getContent(filtered=False) + def setContent(self,content): - self.contentList=content[0:] - + contentList=[] + for x in content: + if not((x[0] is None) or (x[1] is None)): + + contentList.append((x[1].getId(),x[0].getVersionNumber())) + logging.debug("cl: %s"%contentList) + self.contentList=contentList[0:] + def numberOfItems(self): """number""" @@ -394,6 +435,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") @@ -608,7 +650,7 @@ class CDLIBasketContainer(OrderedFolder) if not basketId: return [] - ob=getattr(self,basketId).getContent() + ob=getattr(self,basketId).getContent() #get the content of a basket ret=[x[0].split(".")[0] for x in ob] @@ -627,15 +669,18 @@ class CDLIBasketContainer(OrderedFolder) return "" ob=getattr(self,basketId).getLastVersion() - for object in ob.getContent(): + for pnum,versionNr in ob.getContent(): + obj=self.cdliRoot.getFileObject(pnum) + # logging.debug("obj : %s"%obj) + # version=obj.getVersionNr(versionNr) + if current=="no": #version as they are in the basket - ret+=str(object[0].getData())+"\n" + cur= obj.getVersionNr(versionNr) + ret+=str(cur.getData())+"\n" elif current=="yes": #search current object - 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" + #logging.debug("current: %s"%object[1].getId().split(".")[0]) + obj.getData() return ret security.declareProtected('manage','upDateBaskets') @@ -651,6 +696,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']) @@ -662,19 +711,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) @@ -813,6 +873,7 @@ class CDLIBasketContainer(OrderedFolder) @param basket2: see above """ + logging.info("CCCCC %s %s"%(basket1,basket2)) try: @@ -853,12 +914,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: @@ -924,10 +989,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 +1009,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: @@ -1018,23 +1086,46 @@ class CDLIBasket(Folder,CatalogAware): return [x[1].getId() for x in self.getLastVersion().getContent()] - def isActual(self,obj): + def isActual(self,obj,nummer): + """teste ob im basket die aktuelle version ist, obj kann entweder ein CDLIFile sein oder eine + eine pnummer, die auf ein CDLIFile verweist""" + try: + #logging.debug("isActual:"+repr(obj)) + if isinstance(obj, CDLIFile): + actualNo=obj.getLastVersion().getVersionNumber() + else: + actualNo=self.cdliRoot.getFileObjectLastVersion(obj).getVersionNumber() + + if actualNo==nummer: + 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])) + logging.error(""" PARAMS: %s %s"""%(obj,nummer)) + return False, -1 + def isActualOld(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() + + + #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": + 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 - - if actualNo==storedNo: - return True , 0 - else: - return False, actualNo - + def history(self): """history""" @@ -1177,6 +1268,11 @@ 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)"%(repr(ids))) logging.info("add to basket (%s)"%(self.getId())) lastVersion=self.getLastVersion() @@ -1188,27 +1284,43 @@ 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 +# 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 - content=oldContent+newContent + hash = md5.new(repr(makelist(ids))).hexdigest() # erzeuge hash als identification + #logging.debug("JJJJJJJ:"+repr(self.makelist(ids))) + + retrieved = self.CDLICache.retrieve(hash) + if retrieved: + newContent=Set(map(swap,retrieved)) + else: + newContent=Set([(self.getFileObjectLastVersion(x),self.getFileObject(x)) for x in ids]) + + + + #remove all Elements which are not stored + if (None,None) in newContent: + newContent.remove((None,None)) + 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 @@ -1219,11 +1331,11 @@ class CDLIBasket(Folder,CatalogAware): ret=[] lv=self.getLastVersion() - for obj in lv.content.getContent(): - logging.info("XXXXXXXXXX %s"%repr(obj)) - ret.append((obj[1].getId(),obj[0].versionNumber)) + #for obj in lv.content.getContent(): + #logging.info("XXXXXXXXXX %s"%repr(obj)) + # ret.append((obj[1].getId(),obj[0].versionNumber)) - return ret + return lv def getContentIds(self): """print basket content""" @@ -1307,7 +1419,7 @@ class CDLIBasketVersion(Implicit,Persist objs=self.getContent() for obj in objs: - if not self.isActual(obj)[0]: + if not self.isActual(obj[0],obj[1])[0]: return True return False @@ -1343,33 +1455,27 @@ 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""" - + + 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. lockedObjects={} for object in self.content.getContent(): - - if (not str(object[1].lockedBy)=="") and (not (str(object[1].lockedBy)==str(self.REQUEST['AUTHENTICATED_USER']))): - lockedObjects[object[1].title]=repr(object[1].lockedBy) + obj=self.getFileObject(object[0]) + if (not str(obj.lockedBy)=="") and (not (str(obj.lockedBy)==str(self.REQUEST['AUTHENTICATED_USER']))): + lockedObjects[obj.title]=repr(obj.lockedBy) keys=lockedObjects.keys() @@ -1379,47 +1485,140 @@ 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(): - - if (procedure=="downloadAll") or (object[1].lockedBy=='') or (object[1].lockedBy==self.REQUEST['AUTHENTICATED_USER']): - if current=="no": #version as they are in the basket - ret+=str(object[0].getData())+"\n" - elif current=="yes": - #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'] - basket_name=self.aq_parent.title+"_V"+self.getId() + + 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(): + obj=self.ctx.getFileObject(object[0]) + if obj.lockedBy =='': + obj.lockedBy=self.REQUEST['AUTHENTICATED_USER'] + logging.debug("-----finished locking") + + #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() - #write basketname to header of atf file - ret="#basket: %s\n"%basket_name+ret + else: + #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, + 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() - 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: + logging.debug("download: %s"%fileName) + 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() @@ -1438,7 +1637,12 @@ class CDLIBasketVersion(Implicit,Persist def getContent(self): """get Basket Content""" - return self.content.getContent() + logging.debug("retrieving content A") + cnt = self.content + logging.debug("retrieving content: obj %s"%cnt) + tmp = self.content.getContent() + logging.debug("got content") + return tmp def __init__(self,id,user,comment="",basketContent=[]): @@ -1461,26 +1665,26 @@ class CDLIBasketVersion(Implicit,Persist security.declareProtected('manage','index_html') def index_html(self): """view the basket""" - + logging.debug("start index_html - Basket version") if self.REQUEST.get('change',False): ob=self.aq_parent.updateObjects(self.REQUEST['change']) self.REQUEST.RESPONSE.redirect(ob.absolute_url())#go to new basket, because changing generates a new basket - + logging.debug("start index_html - Basket version:template") pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketVersionMain.zpt')).__of__(self) return pt() def getObjUrl(self,result): """getUrl of the version of the object""" - objId=result[1].getTitle() - founds=self.CDLICatalog.search({'title':objId}) + + founds=self.CDLICatalog.search({'title':result}) if len(founds)>0: return founds[0].getObject().getLastVersion().absolute_url() else: #assume version number - splitted=objId.split("_") + splitted=result.split("_") founds=self.CDLICatalog.search({'title':splitted[1]}) - return founds[0].getObject().getLastVersion().absolute_url()+'/'+objId + return founds[0].getObject().getLastVersion().absolute_url()+'/'+result def manage_addCDLIBasketVersion(self,user,comment="",basketContent=[],RESPONSE=None): """add a version""" @@ -1522,8 +1726,12 @@ 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 making this version current""" + """form for mthis version current""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','makeThisVersionCurrent.zpt')).__of__(self) return pt() @@ -1616,6 +1824,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') @@ -1729,6 +1938,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() @@ -1931,10 +2143,20 @@ 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,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() @@ -1965,32 +2187,83 @@ class CDLIFileFolder(extVersionedFileFol pt=getattr(self,'filelist.html') return pt(basketName=basketName,numberOfObjects=numberOfObjects) + + result =self.CDLICache.retrieve(hash) + if result: + logging.debug("give result from storage2") + return hash,result + 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 + #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 ? + + #logging.debug("Hash:"+repr(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] - 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'] + if display: pt=getattr(self,'filelist.html') return pt(search=ids) - else: + else: + #self.REQUEST.SESSION['hash'] = ret # store in session + + #logging.debug("HHHHHHNEU:"+repr(self.makelist(ids))) + #logging.debug("HHHHHHNEU:"+repr(hash)) + self.CDLICache.store(hash,ret) + + if returnHash == True: + return hash,ret return ret if start: RESPONSE.redirect("filelist.html?start:int="+str(start)) - security.declareProtected('Manage','createAllFilesAsSingleFile') def createAllFilesAsSingleFile(self,RESPONSE=None): @@ -2119,6 +2392,111 @@ class CDLIRoot(Folder): 'graphemes':cdliSplitter.graphemeSplitter()} + def unicodify(self,txt): + return unicodify(txt) + def invalidateOldCacheVersion(self): + """loescht die alte Version des Cache""" + del self.v_tmpStore + return "done" + + def viewATF(self,id,RESPONSE): + """view an Object""" + ob = self.CDLICatalog({'title':id}) + logging.debug(ob[0].getObject().getLastVersion().absolute_url()+"/view") + if len(ob)>0: + RESPONSE.redirect(ob[0].getObject().getLastVersion().absolute_url()+"/view") + return "not found" + + def history(self,id,RESPONSE): + """view an Object""" + ob = self.CDLICatalog({'title':id}) + if len(ob)>0: + RESPONSE.redirect(ob[0].absolute_url+"/history") + return "not found" + + + def downloadLocked(self,id,RESPONSE): + """view an Object""" + ob = self.CDLICatalog({'title':id}) + if len(ob)>0: + RESPONSE.redirect(ob[0].absolute_url+"/downloadLocked") + return "not found" + + def download(self,id,RESPONSE): + """view an Object""" + ob = self.CDLICatalog({'title':id}) + if len(ob)>0: + RESPONSE.redirect(ob[0].getLastVersion().absolute_url()) + return "not found" + def addCDLIFileObjectForm(self,id,RESPONSE): + """view an Object""" + ob = self.CDLICatalog({'title':id}) + if len(ob)>0: + RESPONSE.redirect(ob[0].absolute_url+"/addCDLIFileObjectForm") + return "not found" + + def addVersionedFileObjectForm(self,id,RESPONSE): + """view an Object""" + ob = self.CDLICatalog({'title':id}) + if len(ob)>0: + RESPONSE.redirect(ob[0].absolute_url+"/addVersionedFileObjectForm") + return "not found" + + def unlock(self,id,RESPONSE): + """view an Object""" + ob = self.CDLICatalog({'title':id}) + if len(ob)>0: + RESPONSE.redirect(ob[0].absolute_url+"/unlock") + return "not found" + + 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("lastVersion: "+repr(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() + 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 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: @@ -2157,7 +2535,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 +2673,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) @@ -2368,6 +2754,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""" @@ -2544,7 +2935,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()) @@ -2559,12 +2961,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() @@ -2572,22 +2977,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()