--- cdli/cdli_files.py 2008/10/15 10:00:06 1.101 +++ 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 @@ -32,6 +30,7 @@ import cdliSplitter from sets import Set import md5 from DownloadBasket import DownloadBasketFinallyThread +from types import * def makelist(mySet): x = list(mySet) @@ -224,29 +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,filtered=True): + return self.contentList + + def getContentOld(self,filtered=True): """get content""" + logging.debug("content object: content List %s"%self.contentList) ret=[] - if filtered: - for x in self.contentList: - if not((x[0] is None) or (x[1] is None)): - ret.append(x) - return ret - - else: - return self.contentList + + 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""" @@ -627,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] @@ -646,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" + obj.getData() return ret security.declareProtected('manage','upDateBaskets') @@ -1060,7 +1086,25 @@ 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)) @@ -1257,14 +1301,13 @@ class CDLIBasket(Folder,CatalogAware): hash = md5.new(repr(makelist(ids))).hexdigest() # erzeuge hash als identification #logging.debug("JJJJJJJ:"+repr(self.makelist(ids))) - - 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])) - + 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: @@ -1288,11 +1331,11 @@ class CDLIBasket(Folder,CatalogAware): ret=[] lv=self.getLastVersion() - for obj in lv.content.getContent(): + #for obj in lv.content.getContent(): #logging.info("XXXXXXXXXX %s"%repr(obj)) - ret.append((obj[1].getId(),obj[0].versionNumber)) + # ret.append((obj[1].getId(),obj[0].versionNumber)) - return ret + return lv def getContentIds(self): """print basket content""" @@ -1376,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 @@ -1430,9 +1473,9 @@ class CDLIBasketVersion(Implicit,Persist #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() @@ -1483,8 +1526,9 @@ class CDLIBasketVersion(Implicit,Persist if lock: logging.debug("-----start locking") for object in self.content.getContent(): - if object[1].lockedBy =='': - object[1].lockedBy=self.REQUEST['AUTHENTICATED_USER'] + obj=self.ctx.getFileObject(object[0]) + if obj.lockedBy =='': + obj.lockedBy=self.REQUEST['AUTHENTICATED_USER'] logging.debug("-----finished locking") #obj.lockedBy=user @@ -1559,6 +1603,7 @@ class CDLIBasketVersion(Implicit,Persist self.REQUEST.RESPONSE.write(ret) for fileName in files: + logging.debug("download: %s"%fileName) try: self.REQUEST.RESPONSE.write(file(fileName).read()) except: @@ -1592,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=[]): @@ -1615,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""" @@ -2137,14 +2187,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") @@ -2203,11 +2251,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 @@ -2344,6 +2392,13 @@ 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})