--- cdli/cdli_files.py 2006/02/17 12:10:39 1.7 +++ cdli/cdli_files.py 2006/05/10 15:44:07 1.17 @@ -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): @@ -131,8 +131,8 @@ class BasketObject_old(Folder): meta_type="basketObject" def __init__(self): - """init basket object""" - self.contents=[] + """init basket object""" + self.contents=[] def numberOfItems(self): """return anzahl der elemente im basket""" @@ -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:] @@ -152,9 +152,9 @@ class BasketObject_old(Folder): return True def index_html(self): - """view the basket""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','basketObject_index_html.zpt')).__of__(self) - return pt() + """view the basket""" + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','basketObject_index_html.zpt')).__of__(self) + return pt() def deleteObjects(self,ids,RESPONSE=None): """delete objects""" @@ -166,7 +166,7 @@ class BasketObject_old(Folder): if RESPONSE: - RESPONSE.redirect(self.absolute_url()) + RESPONSE.redirect(self.absolute_url()) def unlockTest(self): @@ -208,7 +208,7 @@ class BasketObject_old(Folder): elif not procedure: #keine fails gesperrt dann alle donwloaden procedure="downloadAll" - print procedure + for object in self.contents: if (procedure=="downloadAll") or (object.lockedBy=='') or (object.lockedBy==self.REQUEST['AUTHENTICATED_USER']): @@ -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]() @@ -363,8 +397,9 @@ class CDLIBasketContainer(OrderedFolder) 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.RESPONSE.redirect(REQUEST['URL1']+'?'+REQUEST['QUERY_STRING']) def getActiveBasket(self): """get active basket from cookie""" @@ -451,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""" @@ -529,9 +569,27 @@ class CDLIBasket(Folder,CatalogAware): 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""" @@ -657,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""" @@ -689,12 +747,27 @@ 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](.*)= (.+[^\n\r])",self.data[0:]) + except: + txt=self.data[0:] + + 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='', @@ -735,10 +808,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): @@ -759,7 +848,6 @@ class CDLIFile(versionedFile,CatalogAwar except: pass - author=self.REQUEST['author'] if changeName=="yes": filename=file.filename @@ -800,7 +888,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] @@ -856,13 +944,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() @@ -870,7 +974,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 @@ -883,7 +990,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 @@ -893,6 +1007,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: @@ -923,21 +1042,29 @@ class CDLIFileFolder(versionedFileFolder """upload the files""" if procedure=="uploadchanged": - uploadFns=self.REQUEST.SESSION['changed']+self.REQUEST.SESSION['newPs'] + + uploadFns=self.REQUEST.SESSION.get('changed',[])+self.REQUEST.SESSION.get('newPs',[]) elif procedure=="uploadAll": uploadFns=[] for x in os.listdir(self.REQUEST.SESSION['tmpdir']): if not x in self.REQUEST.SESSION['errors']: uploadFns.append(x) + elif procedure=="noupload": + if RESPONSE is not None: + RESPONSE.redirect(self.aq_parent.absolute_url()) + return "" + else: + return "" else: 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))) @@ -957,16 +1084,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) @@ -976,10 +1106,13 @@ class CDLIFileFolder(versionedFileFolder def findObjectsFromList(self,start=None,upload=None,list=None,basketName=None,numberOfObjects=None,RESPONSE=None): """findObjectsFromList (, TAB oder LINE separated)""" + + 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 @@ -989,7 +1122,7 @@ class CDLIFileFolder(versionedFileFolder ids.append(idTmp) #self.REQUEST.SESSION['ids']=" OR ".join(ids) - + pt=getattr(self,'filelist.html') self.REQUEST.SESSION['searchList']=ids return pt(search=ids) @@ -1000,12 +1133,12 @@ class CDLIFileFolder(versionedFileFolder pt=getattr(self,'filelist.html') return pt(basketName=basketName,numberOfObjects=numberOfObjects) - if list: # got already a list + 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 @@ -1014,7 +1147,9 @@ class CDLIFileFolder(versionedFileFolder if start: RESPONSE.redirect("filelist.html?start:int="+str(start)) - + + print "nothing" + def createAllFilesAsSingleFile(self,RESPONSE=None): """download all files""" @@ -1038,7 +1173,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 @@ -1164,4 +1299,3 @@ def manage_addCDLIFileFolder(self, id, t if REQUEST is not None: return self.manage_main(self, REQUEST, update_menu=1) -