--- cdli/cdli_files.py 2008/10/07 06:53:57 1.93 +++ 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,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:] - - def getContent(self): - """get content""" + 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=[] + + 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""" @@ -616,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] @@ -635,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') @@ -659,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']) @@ -670,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) @@ -821,6 +873,7 @@ class CDLIBasketContainer(OrderedFolder) @param basket2: see above """ + logging.info("CCCCC %s %s"%(basket1,basket2)) try: @@ -861,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: @@ -1029,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)) @@ -1197,6 +1272,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() @@ -1225,16 +1301,17 @@ 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"): - 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: @@ -1254,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""" @@ -1342,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 @@ -1396,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() @@ -1428,14 +1505,30 @@ class CDLIBasketVersion(Implicit,Persist self._v_downloadBasket[threadName]=thread logging.debug("dwonloadfinally:"+repr(self)) - basketID=self.aq_parent.aq_parent.getId() - versionNumber=self.aq_parent.getId() - + + 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(): - 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 @@ -1510,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: @@ -1543,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=[]): @@ -1566,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""" @@ -2088,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") @@ -2154,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 @@ -2295,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}) @@ -2354,7 +2458,7 @@ class CDLIRoot(Folder): def getFileObjectLastVersion(self,fileId): """get an object""" x=self.v_files_lastVersion.get(fileId) - l#ogging.debug("lastVersion: "+repr(x)) + #logging.debug("lastVersion: "+repr(x)) return x def showFileIds(self):