--- cdli/cdli_files.py 2007/03/22 19:56:22 1.72 +++ cdli/cdli_files.py 2007/03/23 13:58:10 1.73 @@ -27,6 +27,39 @@ import transaction import copy import codecs +def generateXMLReturn(hash): + """erzeugt das xml file als returnwert fuer uploadATFRPC""" + + ret="" + + ret+="" + for error in hash['errors']: + ret+="""%s"""%error + + ret+="" + + ret+="" + for changed in hash['changed']: + ret+="""%s"""%changed + ret+="" + + ret+="" + for new in hash['newPs']: + ret+=""""""%new + ret+="" + + ret+="" + return ret + + + + + + + + + + def unique(s): """Return a list of the elements in s, but without duplicates. @@ -196,6 +229,7 @@ class uploadATFfinallyThread(Thread): self.result+="

Start processing

" #shall I only upload the changed files? + logging.info("uploadATFfinally procedure: %s"%procedure) if procedure=="uploadchanged": changed=[x[0] for x in SESSION.get('changed',[])] uploadFns=changed+SESSION.get('newPs',[]) @@ -341,6 +375,7 @@ class uploadATFThread(Thread): ctx = self.getContext(app,serverport=self.serverport) logging.info("run intern") try: + logging.info("created: %s"%idTmp) ctx.temp_folder._setObject(idTmp,tmpStore(idTmp)) except: logging.error("thread upload: %s %s"%sys.exc_info()[0:2]) @@ -355,6 +390,7 @@ class uploadATFThread(Thread): conn.close() + return getattr(ctx.temp_folder,idTmp) def getResult(self): """method for accessing result""" @@ -479,6 +515,44 @@ class CDLIBasketContainer(OrderedFolder) security=ClassSecurityInfo() meta_type="CDLIBasketContainer" + def getPNumbersOfBasket(self,basketName): + """get all pnumbers of a basket as a list, returns an empty list if basket not found + @param basketName: name of the basket + """ + ret=[] + basketId=self.getBasketIdfromName(basketName) + if not basketId: + return [] + + ob=getattr(self,basketId).getContent() + + ret=[x[0].split(".")[0] for x in ob] + + return ret + + def getBasketAsOneFile(self,basketName,current="no"): + """returns all files of the basket combined in one file + @param basketName: Name of the basket + @param current: (optional) if current is set to "yes" then the most current version of + all files are downloaded and not the versions of the files as stored in the basket + """ + ret="" + basketId=self.getBasketIdfromName(basketName) + if not basketId: + return "" + + ob=getattr(self,basketId).getLastVersion() + for object in ob.getContent(): + if current=="no": #version as they are in the basket + ret+=str(object[0].getData())+"\n" + elif current=="yes": + #search current object + logging.info("crrent: %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" + return ret + def upDateBaskets(self): """update content in to objects""" @@ -506,18 +580,18 @@ class CDLIBasketContainer(OrderedFolder) trash.manage_pasteObjects(cut) security.declareProtected('manage','manageBaskets') - def manageBaskets(self,submit,ids=None,basket1="",basket2="",REQUEST=None,RESPONSE=None): + 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) elif submit=="join": - flag,msg=self.joinBasket("joinedBasket", ids) + flag,msg=self.joinBasket(joinBasket, 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) + flag,msg=self.subtractBasket(subtractBasket, basket1,basket2) logging.info("subtract %s %s"%(flag,msg)) if RESPONSE: @@ -1202,7 +1276,7 @@ class CDLIBasketVersion(Implicit,Persist ret+=str(object[0].getData())+"\n" elif current=="yes": #search current object - founds=self.CDLICatalog.search({'title':object[0].getId()}) + founds=self.CDLICatalog.search({'title':object[1].getId().split(".")[0]}) if len(founds)>0: ret+=str(founds[0].getObject().getLastVersion().getData())+"\n" @@ -1613,7 +1687,12 @@ def splitatf(fh,dir=None,ext=None): nf=None i=0 - for lineTmp in fh.readlines(): + if (type(fh) is StringType) or (type(fh) is UnicodeType): + iter=fh.split("\n") + else: + iter=fh.readlines() + + for lineTmp in iter: lineTmp=lineTmp.replace(codecs.BOM_UTF8,'') # make sure that all BOM are removed.. for line in lineTmp.split("\r"): #logging.log("Deal with: %s"%line) @@ -1650,7 +1729,9 @@ def splitatf(fh,dir=None,ext=None): nf.close() except: pass - fh.close() + + if not((type(fh) is StringType) or (type(fh) is UnicodeType)): + fh.close() return ret,len(os.listdir(dir)) @@ -1705,7 +1786,7 @@ class CDLIFileFolder(extVersionedFileFol """get the content of the file fn""" founds=self.CDLICatalog.search({'title':fn}) if not founds: - return [] + return "" else: obj=founds[0].getObject().getLastVersion() @@ -1921,6 +2002,30 @@ class CDLIRoot(Folder): meta_type="CDLIRoot" downloadCounterBaskets=0# counts the current basket downloads if counter > 10 no downloads are possible + def deleteFiles(self,ids): + """delete files (resp. move into .trash folder)""" + # find or generete trash folder + + found=self.ZopeFind(self,obj_ids=['.trash']) + + if len(found)<1: + manage_addCDLIFileFolder(self, '.trash',title="Trash") + trash=self._getOb('.trash') + else: + logging.info(found) + trash=found[0][1] + + + for id in ids: + founds=self.CDLICatalog.search({'title':id.split(".")[0]}) + if founds: + logging.info(founds) + folder=founds[0].getObject().aq_parent #get the parent folder of the object + logging.info(folder) + cut=folder.manage_cutObjects([founds[0].getId]) #cut it out + trash.manage_pasteObjects(cut) #paste it in the trash + + def findWordRegExp(self,indexName,searchTerm): """find all words in index which match regexp in SearchTerm @param indexName: name of the index to be searched in @@ -2210,7 +2315,35 @@ class CDLIRoot(Folder): return ret - + def uploadATFRPC(self,data,username): + """upload an atffile via xml-rpc""" + uploader=uploadATFThread() + + #generate an random id for the upload object + from random import randint + if (not self.REQUEST.SESSION.get('idTmp',None)): + + idTmp=str(randint(0,1000000000)) + self.REQUEST.SESSION['idTmp']=idTmp + else: + idTmp=self.REQUEST.SESSION.get('idTmp',None) + + + uploader.set(data,0,username,idTmp) + + stObj=uploader.run() + + processor=uploadATFfinallyThread() + + basketname=stObj.returnValue['basketNameFromFile'] + + processor.set("uploadchanged",basketname=basketname,SESSION=stObj.returnValue,username=username,serverport=self.REQUEST['SERVER_PORT']) + + processor.run() + + + return generateXMLReturn(stObj.returnValue) + def uploadATF(self,repeat=None,upload=None,basketId=0,RESPONSE=None): """upload an atf file / basket file""" #self._v_uploadATF.returnValue=None