--- cdli/cdli_files.py 2006/02/13 20:35:35 1.5 +++ cdli/cdli_files.py 2006/05/04 14:40:09 1.15 @@ -9,8 +9,8 @@ import urlparse from OFS.OrderedFolder import OrderedFolder from OFS.SimpleItem import SimpleItem import time - - +from OFS.Folder import manage_addFolder +import re class Basket_old(Folder): """shopping basket - alte fassung """ @@ -20,13 +20,13 @@ class Basket_old(Folder): def getObjUrl(self,objId): """getUrl""" - founds=self.CDLICatalog.search({'path':objId}) + founds=self.CDLICatalog.search({'title':objId}) if len(founds)>0: return founds[0].getObject().absolute_url() else: #assume version number splitted=objId.split("_") - founds=self.CDLICatalog.search({'path':splitted[1]}) + founds=self.CDLICatalog.search({'title':splitted[1]}) return founds[0].getObject().absolute_url()+'/'+objId def storeAllLink(self,results): @@ -142,7 +142,7 @@ class BasketObject_old(Folder): """addObjects""" for id in ids: - founds=self.CDLICatalog.search({'path':id}) + founds=self.CDLICatalog.search({'title':id}) for found in founds: if found.getObject() not in self.contents: tm=self.contents[0:] @@ -247,9 +247,35 @@ class CDLIBasketContainer(OrderedFolder) """contains the baskets""" - + security=ClassSecurityInfo() meta_type="CDLIBasketContainer" + def deleteBaskets(self,ids=None): + """delete baskets, i.e. move them into trash folder""" + + + found=self.ZopeFind(self,obj_ids=['trash']) + + if len(found)<1: + manage_addFolder(self, 'trash') + trash=self._getOb('trash') + else: + trash=found[0][1] + + if type(ids) is not ListType: + ids=[ids] + cut=self.manage_cutObjects(ids) + trash.manage_pasteObjects(cut) + + def manageBaskets(self,ids,submit,REQUEST=None,RESPONSE=None): + """manage baskets, delete or copy""" + if submit=="delete": + self.deleteBaskets(ids) + + + + if RESPONSE: + RESPONSE.redirect(self.absolute_url()) def getBasketIdfromName(self,basketname): """get id from name""" @@ -258,8 +284,13 @@ class CDLIBasketContainer(OrderedFolder) return basket[0] else: None + + security.declareProtected('manage','uploadBasket_html') + def uploadBasket_html(self,basketId='0'): """upload an atf file, html form""" + + basketId=str(basketId) if not basketId=='0': basketName=getattr(self.basketContainer,basketId).title @@ -273,6 +304,9 @@ class CDLIBasketContainer(OrderedFolder) def index_html(self): """stanadard ansicht""" + + + ext=self.ZopeFind(self,obj_ids=["index.html"]) if ext: return ext[0][1]() @@ -360,16 +394,23 @@ 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']+'?'+REQUEST['QUERY_STRING']) + 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']) @@ -381,26 +422,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) @@ -436,10 +486,15 @@ class CDLIBasket(Folder,CatalogAware): """teste ob im basket die aktuelle version ist""" actualNo=obj[1].getLastVersion().getVersionNumber() storedNo=obj[0].getVersionNumber() + + founds=self.CDLICatalog.search({'title':obj[0].getId()}) + if len(founds)>0 and founds[0].getObject().aq_parent.getId()==".trash": + return False, -1 + if actualNo==storedNo: - return True + return True , 0 else: - return False + return False, actualNo def history(self): """history""" @@ -496,27 +551,45 @@ class CDLIBasket(Folder,CatalogAware): 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): + def deleteObjects(self,ids,RESPONSE=None,REQUEST=None): """delete objects""" - #TODO: implement delete Objects + + if type(ids) is not ListType: + ids=[ids] + + lastVersion=self.getLastVersion() + oldContent=lastVersion.basketContent[0:] + newContent=[] + for obj in oldContent: + if obj[1].getId() not in ids: + newContent.append(obj) + + + user=self.getActualUserName() + + ob=manage_addCDLIBasketVersion(self,user,comment="",basketContent=newContent) + + if RESPONSE: + obj=self._getOb(ob.getId()) + RESPONSE.redirect(obj.absolute_url()) def manage_addCDLIBasketForm(self): """add the CDLIBasketContainer form""" @@ -642,12 +715,12 @@ class CDLIBasketVersion(SimpleItem): objId=result[1].getTitle() founds=self.CDLICatalog.search({'title':objId}) if len(founds)>0: - return founds[0].getObject().absolute_url() + return founds[0].getObject().getLastVersion().absolute_url() else: #assume version number splitted=objId.split("_") - founds=self.CDLICatalog.search({'path':splitted[1]}) - return founds[0].getObject().absolute_url()+'/'+objId + founds=self.CDLICatalog.search({'title':splitted[1]}) + return founds[0].getObject().getLastVersion().absolute_url()+'/'+objId def manage_addCDLIBasketVersion(self,user,comment="",basketContent=[],RESPONSE=None): """add a version""" @@ -674,12 +747,29 @@ class CDLIFileObject(versionedFileObject meta_type="CDLI File Object" - + security=ClassSecurityInfo() + def view(self): """view file""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','viewCDLIFile.zpt')).__of__(self) return pt() + security.declarePublic('getDesignation') + def getDesignation(self): + """get the designation out of the file""" + try: + txt=re.search("&[Pp](.*)= (.*)",self.data[0:]) + except: + print self.getId() + txt=self.data[0:] + print str(txt) + + return "ERROR" + try: + return txt.group(2) + except: + return "ERROR" + manage_addCDLIFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='CDLIFileObject',kind='CDLIFileObject', version='1') def manage_addCDLIFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='', @@ -720,10 +810,26 @@ class CDLIFile(versionedFile,CatalogAwar meta_type="CDLI file" default_catalog='CDLICatalog' - def isContainedInBaskets(self): - """check is this file is part of any basket""" - - return [x.getObject() for x in self.CDLIBasketCatalog.search({'getFileNamesInLastVersion':self.getId()})] + + + 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 + + ret=[] + for x in context.CDLIBasketCatalog.search({'getFileNamesInLastVersion':self.getId()}): + #if the basket x is deleted it seemes to be that x is sometimes still in the Catalog, why? + try: + ret.append(x.getObject()) + except: + pass + return ret + #return [x.getObject() for x in context.CDLIBasketCatalog.search({'getFileNamesInLastVersion':self.getId()})] def addCDLIFileObjectForm(self): @@ -744,7 +850,6 @@ class CDLIFile(versionedFile,CatalogAwar except: pass - author=self.REQUEST['author'] if changeName=="yes": filename=file.filename @@ -785,7 +890,7 @@ class CDLIFile(versionedFile,CatalogAwar return pt() else: - RESPONSE.redirect(self.REQUEST['URL2']) + RESPONSE.redirect(self.REQUEST['URL2']+'?uploaded=%s'%self.title) else: return self.ZopeFind(self,obj_ids=[id])[0][1] @@ -841,13 +946,29 @@ class CDLIFileFolder(versionedFileFolder folderMetaType=['CDLI Folder'] default_catalog='CDLICatalog' + def delete(self,ids): + """delete this file, i.e. move into a trash folder""" + + found=self.ZopeFind(self,obj_ids=['.trash']) + + if len(found)<1: + manage_addCDLIFileFolder(self, '.trash',title="Trash") + trash=self._getOb('.trash') + else: + trash=found[0][1] + + if type(ids) is not ListType: + ids=[ids] + cut=self.manage_cutObjects(ids) + trash.manage_pasteObjects(cut) + def getVersionNumbersFromIds(self,ids): """get the numbers of the current versions of documents described by their ids""" ret=[] searchStr=" OR ".join(ids) - founds=self.CDLICatalog.search({'path':searchStr}) + founds=self.CDLICatalog.search({'title':searchStr}) for found in founds: lastVersion=found.getObject().getLastVersion() @@ -855,7 +976,10 @@ class CDLIFileFolder(versionedFileFolder return ret - + def checkCatalog(self,fn): + """check if fn is in the catalog""" + + def uploadATF(self,upload,basketId=0,RESPONSE=None): """upload an atf file""" #TODO: add comments @@ -868,7 +992,14 @@ class CDLIFileFolder(versionedFileFolder changed=[] errors=[] newPs=[] + psNotInCatalog=[] basketNameFromFile, numberOfFiles=splitatf(upload,dir) + + if basketId == '0': + basketObj=self.basketContainer.getActiveBasket() + if basketObj: + basketId=basketObj.getId() + if basketId == '0': basketNameFromId="" basketLen=0 @@ -878,6 +1009,11 @@ class CDLIFileFolder(versionedFileFolder for fn in os.listdir(dir): + + if self.checkCatalog(fn): + psNotInCatalog.append(fn) + + founds=self.CDLICatalog.search({'title':fn}) if len(founds)==0: @@ -919,10 +1055,11 @@ class CDLIFileFolder(versionedFileFolder uploadFns=[] for fn in uploadFns: - founds=self.CDLICatalog.search({'path':fn}) + founds=self.CDLICatalog.search({'title':fn}) if len(founds)>0: - self.REQUEST['author']=str(self.REQUEST['AUTHENTICATED_USER']) - founds[0].getObject().manage_addCDLIFileObject('',comment,self.REQUEST['author'],file=file(os.path.join(self.REQUEST.SESSION['tmpdir'],fn))) + self.REQUEST.SESSION['author']=str(self.REQUEST['AUTHENTICATED_USER']) + + founds[0].getObject().manage_addCDLIFileObject('',comment,self.REQUEST.SESSION['author'],file=file(os.path.join(self.REQUEST.SESSION['tmpdir'],fn))) @@ -942,16 +1079,19 @@ class CDLIFileFolder(versionedFileFolder unlockFns.append(x) for fn in unlockFns: - founds=self.CDLICatalog.search({'path':fn}) + founds=self.CDLICatalog.search({'title':fn}) if len(founds)>0: - self.REQUEST['author']=str(self.REQUEST['AUTHENTICATED_USER']) + self.REQUEST.SESSION['author']=str(self.REQUEST['AUTHENTICATED_USER']) founds[0].getObject().lockedBy="" if not (basketname ==''): - basketId=self.basketFolder.getBasketIdfromName(basketname) + basketId=self.basketContainer.getBasketIdfromName(basketname) - basket=getattr(self.basketFolder,basketId) + if not basketId: # create new basket + ob=self.basketContainer.addBasket(basketname) + basketId=ob.getId() + basket=getattr(self.basketContainer,str(basketId)) ids=os.listdir(self.REQUEST.SESSION['tmpdir']) basket.addObjects(ids,deleteOld=True) @@ -959,21 +1099,52 @@ 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") + txt=txt.replace("\r","\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 is not None: # 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 + + if start: + RESPONSE.redirect("filelist.html?start:int="+str(start)) + + print "nothing" - RESPONSE.redirect("filelist.html?path=%s"%" OR ".join(ids)) - def createAllFilesAsSingleFile(self,RESPONSE=None): """download all files""" @@ -997,7 +1168,7 @@ class CDLIFileFolder(versionedFileFolder #os.write(tf,obj.getLastVersion().data) if RESPONSE: - RESPONSE.write(obj.getLastVersion().data) + RESPONSE.write(obj.getLastVersion().data[0:]) #os.close(tf) #RESPONSE.redirect(self.absolute_url()+"/downloadFile?fn="%tfilename) return True