--- cdli/cdli_files.py 2007/03/21 19:29:23 1.71 +++ cdli/cdli_files.py 2007/03/22 19:56:22 1.72 @@ -506,12 +506,19 @@ class CDLIBasketContainer(OrderedFolder) trash.manage_pasteObjects(cut) security.declareProtected('manage','manageBaskets') - def manageBaskets(self,ids,submit,REQUEST=None,RESPONSE=None): + def manageBaskets(self,submit,ids=None,basket1="",basket2="",REQUEST=None,RESPONSE=None): """manage baskets, delete or copy""" if submit=="delete": self.deleteBaskets(ids) - + elif submit=="join": + flag,msg=self.joinBasket("joinedBasket", ids) + logging.info("joining %s %s"%(flag,msg)) + + elif submit=="subtract": + logging.info("BBBb %s %s"%(basket1,basket2)) + flag,msg=self.subtractBasket("subtractedBasket", basket1,basket2) + logging.info("subtract %s %s"%(flag,msg)) if RESPONSE: RESPONSE.redirect(self.absolute_url()) @@ -634,15 +641,83 @@ class CDLIBasketContainer(OrderedFolder) baskets.sort(sortComment) return baskets + + + def subtractBasket(self,newBasket,basket1,basket2): + """subtract basket2 from basket1 + (i.e. newbasket will contain alle elements of basket1 which are not in basket2), + if basket2 contains files which are not in basket1, then theses files fill be ignored + + @param newbasket: name of the new basket + @param basket1: basket where basket2 will be subtracted from + @param basket2: see above + + """ + logging.info("CCCCC %s %s"%(basket1,basket2)) + + try: + newB=self.addBasket(newBasket) + except: + return False, "cannot create the new basket" + + - def joinBasket(self,newbasket,oldbaskets,delete=False): + + + bas2= getattr(self,basket2) + bas2content=bas2.getContent() + bas2ids=[x[0] for x in bas2content] + + + + bas1= getattr(self,basket1) + bas1content=bas1.getContent() + + + newBasketContent={} + + for id,version in bas1content: + if not (id in bas2ids): + newBasketContent[id]=version + + username=self.getActualUserName() + + logging.info("sbc %s"%newBasketContent) + newB.addObjectsWithVersion(newBasketContent,username=username,catalog=self.CDLICatalog) + + return True, "" + + + def joinBasket(self,newBasket,oldBaskets): """join two baskets @param newbasket: name of the new basket @param oldbaskets: list of baskets to be joined - @param delete: (optional) delete the old baskets """ - - + 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: + return False, "cannot find basket: %s"%ob + + ids=x.getContent() # hole den Inhalt + + for id,version in ids: + if newBasketContent.has_key(id): # p number gibt's schon + newBasketContent[id]=max(newBasketContent[id],version) # speichere die groessere Versionsnumber + else: + newBasketContent[id]=version + username=self.getActualUserName() + + logging.info("nbc %s"%newBasketContent) + newB.addObjectsWithVersion(newBasketContent,username=username,catalog=self.CDLICatalog) + + return True, "" + def getNewId(self): """createIds""" last=getattr(self,'last',0) @@ -684,7 +759,7 @@ class CDLIBasketContainer(OrderedFolder) ob=manage_addCDLIBasket(self,newBasketName) return ob - + def storeInBasket(self,submit,ids=None,newBasketName=None,fromFileList=None,RESPONSE=None,REQUEST=None): """store it""" if not ids: @@ -786,7 +861,11 @@ class CDLIBasket(Folder,CatalogAware): self.shortDescription=shortDescription self.comment=comment - + def getActualUserName(self): + """get name of the actualuser""" + + return str(self.REQUEST['AUTHENTICATED_USER']) + def getLastVersion(self): """hole letzte version""" @@ -850,6 +929,56 @@ class CDLIBasket(Folder,CatalogAware): return obj + def addObjectsWithVersion(self,ids,deleteOld=None,username=None,catalog=None): + """generate a new version of the basket with objects added, + hier wird jedoch nicht die letzte Version jedes Files hinzugefuegt, s + ondern ids is ein Tupel mit der Id (d.h. der p-number) und der Versionsnummer. + """ + logging.info("add to basket (%s)"%(self.getId())) + lastVersion=self.getLastVersion() + + if not catalog: + catalog=self.CDLICatalog + + if lastVersion is None: + oldContent=[] + else: + oldContent=lastVersion.content.getContent() + + if deleteOld: + oldContent=[] + + newContent=[] + added=0 + + for id,version in ids.iteritems(): + logging.info("adding %s %s"%(id,version)) + id=id.split(".")[0] # title nur die pnumber ohne atf + + try: + founds=catalog.search({'title':id}) + except: + founds=[] + logging.info(" found %s "%(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().getVersions()[version-1][1],found.getObject())) + added+=1 + + content=oldContent+newContent + if not username: + logging.error("XXXXXXXXXXX %s"%repr(self)) + user=self.getActualUserName() + else: + user = username + + ob=manage_addCDLIBasketVersion(self,user,comment="",basketContent=content) + logging.info("add to basket (%s) done"%(self.getId())) + return added + + def addObjects(self,ids,deleteOld=None,username=None): """generate a new version of the basket with objects added""" logging.info("add to basket (%s)"%(self.getId())) @@ -889,7 +1018,17 @@ class CDLIBasket(Folder,CatalogAware): - + def getContent(self): + """print content""" + ret=[] + + lv=self.getLastVersion() + for obj in lv.content.getContent(): + logging.info("XXXXXXXXXX %s"%repr(obj)) + ret.append((obj[1].getId(),obj[0].versionNumber)) + + return ret + def getContentIds(self): """print basket content""" ret=[] @@ -976,6 +1115,21 @@ class CDLIBasketVersion(Implicit,Persist return True return False + def downloadListOfPnumbers(self): + """download pnumbers of the basket as list""" + + basket_name=self.aq_parent.title + + ids=self.getContent() # get the list of objects + logging.error(ids) + ret="\n".join([x[1].getId().split(".")[0] for x in ids]) + + self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s.txt" """%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) + security.declareProtected('View','downloadObjectsAsOneFile') def downloadObjectsAsOneFile(self,lock=None,procedure=None,REQUEST=None,check="yes",current="no"): """download all selected files in one file"""