--- cdli/cdli_files.py 2008/09/26 16:03:30 1.85 +++ cdli/cdli_files.py 2008/11/05 19:53:32 1.103 @@ -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,7 +19,6 @@ from ZPublisher.HTTPRequest import HTTPR from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.BaseRequest import RequestContainer import threading -from BTrees.OOBTree import OOBTree, OOTreeSet import logging import transaction import copy @@ -31,8 +28,10 @@ from BTrees.IOBTree import IOBTree import cdliSplitter from sets import Set import md5 - - +from DownloadBasket import DownloadBasketFinallyThread +from types import * +import pickle + def makelist(mySet): x = list(mySet) x.sort() @@ -224,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""" @@ -401,7 +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)) + #logging.debug("should add:"+repr(ids)) basket.addObjects(ids,deleteOld=True,username=str(username)) logging.debug("uploadatffinallythread uploadfinally done") @@ -607,6 +641,10 @@ class CDLIBasketContainer(OrderedFolder) security=ClassSecurityInfo() meta_type="CDLIBasketContainer" + def getResultHash(self): + """get the result hash for debug purposes""" + return self.resultHash.keys() + def getPNumbersOfBasket(self,basketName): """get all pnumbers of a basket as a list, returns an empty list if basket not found @param basketName: name of the basket @@ -616,7 +654,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] @@ -635,15 +673,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') @@ -659,6 +700,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 +715,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 +877,7 @@ class CDLIBasketContainer(OrderedFolder) @param basket2: see above """ + logging.info("CCCCC %s %s"%(basket1,basket2)) try: @@ -861,12 +918,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: @@ -1029,25 +1090,44 @@ 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""" 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): @@ -1196,6 +1276,7 @@ class CDLIBasket(Folder,CatalogAware): 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() @@ -1223,17 +1304,18 @@ 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): - logging.debug("from store!") - newContent=Set(map(swap,self.cdliRoot.v_tmpStore[hash])) - + + retrieved = self.CDLICache.retrieve(hash) + if retrieved: + newContent=Set(map(swap,retrieved)) else: - logging.debug("not from store!") - newContent=Set([(self.getFileObjectLastVersion(x),self.getFileObject(x)) for x in ids]) - + 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: @@ -1253,11 +1335,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""" @@ -1341,7 +1423,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 @@ -1368,42 +1450,43 @@ class CDLIBasketVersion(Implicit,Persist return """I am sorry, currently the server has to many requests for downloads, please come back later!""" - if (check=="yes") and self.containsNonActualFiles(): - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','downloadObjectAsOneFile_check.zpt')).__of__(self) - + #if (check=="yes") and self.containsNonActualFiles(): + # pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','downloadObjectAsOneFile_check.zpt')).__of__(self) + # + # return pt(lock=lock) + + # neue Version aus Performancegruenden, es wird nicht mehr getestet, ob es nicht aktuelle Objekte gibt + # sondern lediglich gefragt. + if (check=="yes"): + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','downloadObjectAsOneFile_ask.zpt')).__of__(self) + return pt(lock=lock) else: 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() @@ -1413,53 +1496,167 @@ 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'] - 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 + # lade die files und die locked files, bei grossen Baskets muss u.U. gewartet werden + # bis das Commit aus dem Thread alles geschrieben hat, in dem Falle existiert resultHash[threadName] + # noch nicht. + o1 = file("/tmp/"+threadName,'r') + files=pickle.load(o1) + os.remove("/tmp/"+threadName) + o2 = file("/tmp/"+threadName+'_lockedFiles','r') + + lockedFiles=pickle.load(o2) + os.remove("/tmp/"+threadName+'_lockedFiles') +# try: +# files=self.basketContainer.resultHash[threadName] +# except: +# i=0 +# while (not self.basketContainer.resultHash.has_key(threadName)) and (i<100): +# logging.debug(" downloadFinally: I am waiting for thread %s to write the resultHashfile: %s"%(threadName,i)) +# time.sleep(5) +# i+=1 +# files=self.basketContainer.resultHash[threadName] +# +# try: +# lockedFiles=self.basketContainer.resultLockedHash[threadName] +# except: +# i=0 +# while (not self.basketContainer.resultLockedHash.has_key(threadName)) and (i<100): +# logging.debug(" downloadFinally: I am waiting for thread %s to write the LockedHashfile: %s"%(threadName,i)) +# time.sleep(5) +# i+=1 +# 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() @@ -1478,7 +1675,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=[]): @@ -1501,26 +1703,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""" @@ -1562,6 +1764,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""" @@ -2019,14 +2225,12 @@ 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] - + + 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") @@ -2052,7 +2256,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'] @@ -2085,11 +2289,11 @@ class CDLIFileFolder(extVersionedFileFol return pt(search=ids) 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 + self.CDLICache.store(hash,ret) + if returnHash == True: return hash,ret return ret @@ -2226,6 +2430,63 @@ 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) @@ -2235,7 +2496,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): @@ -2531,6 +2792,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"""