--- cdli/cdli_files.py 2006/02/02 19:19:24 1.4 +++ cdli/cdli_files.py 2006/02/28 15:17:52 1.8 @@ -251,6 +251,14 @@ class CDLIBasketContainer(OrderedFolder) meta_type="CDLIBasketContainer" + def getBasketIdfromName(self,basketname): + """get id from name""" + + for basket in self.ZopeFind(self,obj_metatypes=["CDLIBasket"]): + if basket[1].title==basketname: + return basket[0] + else: + None def uploadBasket_html(self,basketId='0'): """upload an atf file, html form""" basketId=str(basketId) @@ -353,16 +361,22 @@ class CDLIBasketContainer(OrderedFolder) self.last=last return last - def setActiveBasket(self,basketId): + def setActiveBasket(self,basketId,REQUEST=None): """store active basketId in a cookie""" self.REQUEST.RESPONSE.setCookie("CDLIActiveBasket",basketId,path="/") - + if REQUEST: + REQUEST.RESPONSE.redirect(REQUEST['URL1']) + def getActiveBasket(self): """get active basket from cookie""" id= self.REQUEST.cookies.get('CDLIActiveBasket',None) - obj=getattr(self,id,None) + if id: + obj=getattr(self,str(id),None) + else: + obj=None return obj + def getActualUserName(self): """get name of the actualuser""" return str(self.REQUEST['AUTHENTICATED_USER']) @@ -374,26 +388,35 @@ class CDLIBasketContainer(OrderedFolder) ob=manage_addCDLIBasket(self,newBasketName) return ob - def storeInBasket(self,ids,submit,newBasketName=None,RESPONSE=None,REQUEST=None): + def storeInBasket(self,submit,ids=None,newBasketName=None,fromFileList=None,RESPONSE=None,REQUEST=None): """store it""" - + if not ids: + ids=self.REQUEST.SESSION['fileIds'] + if type(ids) is not ListType: ids=[ids] - if submit=="store in new basket": + if (submit.lower()=="store in new basket") or (submit.lower()=="new basket"): basketRet=self.addBasket(newBasketName) self.setActiveBasket(basketRet.getId()) basket=getattr(self,basketRet.getId()) - elif submit=="store in active basket": + elif (submit.lower()=="store in active basket") or (submit.lower()=="active basket"): basket=self.getActiveBasket() - - basket.addObjects(ids) - back=self.REQUEST['HTTP_REFERER'] + + added=basket.addObjects(ids) + back=self.REQUEST['HTTP_REFERER'].split("?")[0]+"?basketName="+basket.title+"&numberOfObjects="+str(added) + + + if fromFileList: + return self.cdli_main.findObjectsFromList(list=self.REQUEST.SESSION['fileIds'],basketName=basket.title,numberOfObjects=added) + if RESPONSE: + RESPONSE.redirect(back) - + return True + def manage_addCDLIBasketContainerForm(self): """add the CDLIBasketContainer form""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIBasketContainer.zpt')).__of__(self) @@ -408,10 +431,11 @@ def manage_addCDLIBasketContainer(self,i if RESPONSE is not None: RESPONSE.redirect('manage_main') -class CDLIBasket(Folder): +class CDLIBasket(Folder,CatalogAware): """basket""" meta_type="CDLIBasket" + default_catalog="CDLIBasketCatalog" def getFile(self,obj): return obj[1] @@ -419,6 +443,11 @@ class CDLIBasket(Folder): def getFileLastVersion(self,obj): return obj[0] + def getFileNamesInLastVersion(self): + """get content of the last version as list""" + + return [x[1].getId() for x in self.getLastVersion().getContent()] + def isActual(self,obj): """teste ob im basket die aktuelle version ist""" actualNo=obj[1].getLastVersion().getVersionNumber() @@ -483,23 +512,23 @@ class CDLIBasket(Folder): oldContent=[] newContent=[] - + added=0 for id in ids: founds=self.CDLICatalog.search({'title':id}) - print id,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 user=self.getActualUserName() ob=manage_addCDLIBasketVersion(self,user,comment="",basketContent=content) - + return added def deleteObjects(self,ids,RESPONSE=None): """delete objects""" @@ -706,7 +735,32 @@ class CDLIFile(versionedFile,CatalogAwar meta_type="CDLI file" default_catalog='CDLICatalog' - + + + + def isContainedInBaskets(self,context=None): + """check is this file is part of any basket + @param context: (optional) necessessary if CDLIBasketCatalog is not an (inherited) attribute of self, context.CDLIBasketCatalog + has to exist. + """ + + if not context: + context=self + + return [x.getObject() for x in context.CDLIBasketCatalog.search({'getFileNamesInLastVersion':self.getId()})] + + + def addCDLIFileObjectForm(self): + """add a new version""" + + if str(self.REQUEST['AUTHENTICATED_USER']) in ["Anonymous User"]: + return "please login first" + if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''): + out=DTMLFile('dtml/fileAdd', globals(),Kind='CDLIFileObject',kind='CDLIFileObject',version=self.getVersion()).__of__(self) + return out() + else: + return "Sorry file is locked by somebody else" + def manage_addCDLIFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None): """add""" try: #TODO: der ganze vC unsinn muss ueberarbeitet werden @@ -785,6 +839,7 @@ def splitatf(fh,dir=None): #check if basket name is in the first line if line.find("#atf basket")>=0: ret=line.replace('#atf basket ','') + ret=ret.split('_')[0] else: if (len(line.lstrip())>0) and (line.lstrip()[0]=="&"): #newfile if nf: @@ -800,7 +855,7 @@ def splitatf(fh,dir=None): nf.close() fh.close() - return ret.split('_')[0],len(os.listdir(dir)) + return ret,len(os.listdir(dir)) class CDLIFileFolder(versionedFileFolder): """CDLI File Folder""" @@ -873,7 +928,7 @@ class CDLIFileFolder(versionedFileFolder return pt(changed=changed,errors=errors,dir=dir,newPs=newPs,basketLen=basketLen,numberOfFiles=numberOfFiles, basketNameFromId=basketNameFromId,basketNameFromFile=basketNameFromFile,basketId=basketId) - def uploadATFfinally(self,procedure,comment="",basketId='0',unlock=None,RESPONSE=None): + def uploadATFfinally(self,procedure,comment="",basketname='',unlock=None,RESPONSE=None): """upload the files""" if procedure=="uploadchanged": @@ -917,7 +972,9 @@ class CDLIFileFolder(versionedFileFolder founds[0].getObject().lockedBy="" - if not (basketId =='0'): + if not (basketname ==''): + basketId=self.basketFolder.getBasketIdfromName(basketname) + basket=getattr(self.basketFolder,basketId) ids=os.listdir(self.REQUEST.SESSION['tmpdir']) basket.addObjects(ids,deleteOld=True) @@ -926,20 +983,46 @@ class CDLIFileFolder(versionedFileFolder RESPONSE.redirect(self.aq_parent.absolute_url()) - def findObjectsFromList(self,upload,RESPONSE): + def findObjectsFromList(self,start=None,upload=None,list=None,basketName=None,numberOfObjects=None,RESPONSE=None): """findObjectsFromList (, TAB oder LINE separated)""" - txt=upload.read() - txt=txt.replace(",","\n") - txt=txt.replace("\t","\n") - idsTmp=txt.split("\n") - ids=[] - for id in idsTmp: # make sure that no empty lines - idTmp=id.lstrip().rstrip() - if len(idTmp)>0: - ids.append(idTmp) - #self.REQUEST.SESSION['ids']=" OR ".join(ids) + if upload: # list from file upload + txt=upload.read() + txt=txt.replace(",","\n") + txt=txt.replace("\t","\n") + idsTmp=txt.split("\n") + ids=[] + for id in idsTmp: # make sure that no empty lines + idTmp=id.lstrip().rstrip() + if len(idTmp)>0: + + ids.append(idTmp) + + #self.REQUEST.SESSION['ids']=" OR ".join(ids) + + pt=getattr(self,'filelist.html') + self.REQUEST.SESSION['searchList']=ids + return pt(search=ids) + + if basketName: + #TODO: get rid of one of these.. + + pt=getattr(self,'filelist.html') + return pt(basketName=basketName,numberOfObjects=numberOfObjects) + + if list: # got already a list + ret=[] + for fileId in list: + if len(fileId.split("."))==1: + fileId=fileId+".atf" + + ret+=self.CDLICatalog({'title':fileId}) + #TODO: get rid of one of these.. + self.REQUEST.SESSION['fileIds']=[x.getObject().getId() for x in ret]#store fieldIds in session for further usage + self.REQUEST.SESSION['searchList']=self.REQUEST.SESSION['fileIds'] + return ret - RESPONSE.redirect("filelist.html?path=%s"%" OR ".join(ids)) + if start: + RESPONSE.redirect("filelist.html?start:int="+str(start)) def createAllFilesAsSingleFile(self,RESPONSE=None): """download all files"""