--- cdli/cdli_files.py 2007/01/24 18:08:15 1.59 +++ cdli/cdli_files.py 2007/02/05 16:20:38 1.64 @@ -24,6 +24,7 @@ import threading from BTrees.OOBTree import OOBTree import logging import transaction +import copy def unique(s): """Return a list of the elements in s, but without duplicates. @@ -135,6 +136,7 @@ class uploadATFfinallyThread(Thread): self.SESSION=SESSION self.username=username self.serverport=serverport + def __call__(self): """call of the thread (equals run)""" @@ -172,7 +174,7 @@ class uploadATFfinallyThread(Thread): conn.close() #set flag for end of this method self.end=True - print "ended" + logging.info("ended") return True def __del__(self): @@ -194,8 +196,8 @@ class uploadATFfinallyThread(Thread): #shall I only upload the changed files? if procedure=="uploadchanged": - - uploadFns=SESSION.get('changed',[])+SESSION.get('newPs',[]) + changed=[x[0] for x in SESSION.get('changed',[])] + uploadFns=changed+SESSION.get('newPs',[]) #or all elif procedure=="uploadAll": @@ -211,19 +213,26 @@ class uploadATFfinallyThread(Thread): uploadFns=[] #do first the changed files + i=0 for fn in uploadFns: + i+=1 founds=ctx2.CDLICatalog.search({'title':fn}) if len(founds)>0: SESSION['author']=str(username) - self.result+="

Changing : %s"%fn + self.result="

Changing : %s"%fn+self.result founds[0].getObject().manage_addCDLIFileObject('',comment,SESSION['author'],file=os.path.join(SESSION['tmpdir'],fn),from_tmp=True) - - + if i==200: + i=0 + transaction.get().commit() + logging.info("changing: do commit") + transaction.get().commit() + logging.info("changing: last commit") + #now add the new files newPs=SESSION['newPs'] if len(newPs)>0: tmpDir=SESSION['tmpdir'] - self.result+="

Adding files

" + self.result="

Adding files

"+self.result #TODO: make this configurable, at the moment base folder for the files has to be cdli_main ctx2.importFiles(comment=comment,author=str(username) ,folderName=tmpDir, files=newPs,ext=self) @@ -232,7 +241,7 @@ class uploadATFfinallyThread(Thread): #unlock locked files? if unlock: - self.result+="

Unlock files

" + self.result="

Unlock files

"+self.result unlockFns=[] for x in os.listdir(SESSION['tmpdir']): if not x in SESSION['errors']: @@ -247,7 +256,7 @@ class uploadATFfinallyThread(Thread): #if a basketname is give, add files to the basket if not (basketname ==''): - self.result+="

Add basket

" + self.result="

Add basket

"+self.result basketId=ctx2.basketContainer.getBasketIdfromName(basketname) if not basketId: # create new basket @@ -263,7 +272,15 @@ class uploadATFfinallyThread(Thread): return True + +class tmpStore(SimpleItem): + """simple item""" + meta_type="cdli_upload" + def __init__(self,id): + """init tmp""" + self.id=id + class uploadATFThread(Thread): """class for checking the files befor uploading""" @@ -276,13 +293,14 @@ class uploadATFThread(Thread): Thread.__init__(self) - def set(self,upload,basketId,username,serverport="8080"): + def set(self,upload,basketId,username,idTmp,serverport="8080"): """set start values for the thread""" self.result="" self.upload=upload self.basketId=basketId self.username=username self.serverport=serverport + self.idTmp=idTmp def __call__(self): """call method """ @@ -301,7 +319,7 @@ class uploadATFThread(Thread): return app.__of__(RequestContainer(REQUEST = req)) def run(self): - + idTmp=self.idTmp self.result="" #find context within ZODB from Zope import DB @@ -309,14 +327,19 @@ class uploadATFThread(Thread): root = conn.root() app = root['Application'] ctx = self.getContext(app,serverport=self.serverport) - self.uploadATFThread(ctx,self.upload,self.basketId) + logging.info("run intern") + try: + ctx.temp_folder._setObject(idTmp,tmpStore(idTmp)) + except: + logging.error("thread upload: %s %s"%sys.exc_info()[0:2]) + + logging.info("call thread intern") + self.uploadATFThread(ctx,self.upload,idTmp,self.basketId) #ctx.cdliRoot.cdli_main.tmpStore2[self.getName()[0:]]=self.returnValue - + transaction.get().commit() - while self.continueVar: - pass conn.close() @@ -325,10 +348,13 @@ class uploadATFThread(Thread): """method for accessing result""" return self.result - def uploadATFThread(self,ctx,upload,basketId=0): + def uploadATFThread(self,ctx,upload,idTmp,basketId=0): """upload an atf file""" #TODO: add comments #TODO: finish uploadATF + + stObj=getattr(ctx.temp_folder,idTmp) + logging.info("start, upload thread") self.result="

I got your file, start now to split it into single atf-files!

" #make sure that id is a string and not an integer @@ -367,14 +393,14 @@ class uploadATFThread(Thread): basketNameFromId=getattr(ctx2.basketContainer,basketId).title basketLen=getattr(ctx2.basketContainer,basketId).getLastVersion().numberOfItems() - + logging.info("got the file, upload thread") self.result+="""

I got the files

< p>I am computing the differences to the exisiting files

""" #start to check the files for fn in os.listdir(dir): - self.result+="

process:%s

"%fn + self.result="

process:%s

"%fn+self.result # check if file is in the catalog #TODO: checkCatalog is not implemented yet @@ -402,7 +428,7 @@ class uploadATFThread(Thread): obj=found.getObject() if (not (str(obj.lockedBy))=='') and (not (str(obj.lockedBy)==str(self.username))): - lockerrors.append(fn) + lockerrors.append((fn,str(obj.lockedBy))) else: diffs=obj.diff(data) @@ -412,266 +438,26 @@ class uploadATFThread(Thread): #ready, set the returnValues self.result+="

Done

" - self.returnValue={} - self.returnValue['changed']=changed - self.returnValue['errors']=errors - self.returnValue['lockerrors']=lockerrors - self.returnValue['newPs']=newPs - self.returnValue['tmpdir']=dir - self.returnValue['basketLen']=basketLen - self.returnValue['numberOfFiles']=numberOfFiles - self.returnValue['basketNameFromId']=basketNameFromId - self.returnValue['basketNameFromFile']=basketNameFromFile - self.returnValue['basketId']=basketId - self.returnValue['dir']=dir + stObj.returnValue={} + stObj.returnValue['errors']=errors + + stObj.returnValue['newPs']=newPs + stObj.returnValue['tmpdir']=dir + stObj.returnValue['basketLen']=basketLen + stObj.returnValue['numberOfFiles']=numberOfFiles + stObj.returnValue['basketNameFromId']=basketNameFromId + stObj.returnValue['basketNameFromFile']=basketNameFromFile + stObj.returnValue['basketId']=basketId + stObj.returnValue['dir']=dir + #stObj.returnValue['changed']=copy.copy(changed) + stObj.returnValue['changed']=[(x[0].getId(),x[1][0]) for x in changed] + #stObj.returnValue['lockerrors']=[x[0].getId() for x in lockerrors] + stObj.returnValue['lockerrors']=[x for x in lockerrors] + self.returnValue=True #ctx2.cdli_main.setTemp('v_uploadATF_returnValue',True) - -class Basket_old(Folder): - """shopping basket - alte fassung """ - - meta_type="Basket" - _v_stack={} - - def getObjUrl(self,objId): - """getUrl""" - 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({'title':splitted[1]}) - return founds[0].getObject().absolute_url()+'/'+objId - - def storeAllLink(self,results): - """erzeuge link zum speicher aller results""" - nr=self.REQUEST['_ZopeId'] - - if results: - self._v_stack[nr]=[x.getObject().getId() for x in results] - - return self.absolute_url()+"/storeAll?id="+nr - - def storeAll(self,id): - """store all""" - try: - results=self._v_stack[id] - except: - #TODO: write expired page - return "expired" - - return self.storeInBasketForm(results) - - def storeInBasketForm(self,ids): - """ store an object form""" - - if type(ids) is not ListType: - ids=[ids] - self.REQUEST.SESSION['ids']=ids[0:] - - self.REQUEST.SESSION['BACKLINK']=self.REQUEST['HTTP_REFERER'] - - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','storeBasketObject.zpt')).__of__(self) - return pt() - - def storeInBasket(self,username,ids=None,RESPONSE=None,REQUEST=None): - """store it""" - - if not ids: - ids=REQUEST.SESSION['ids'] - - self.REQUEST.SESSION['basketUser']=username - - baskets=self.ZopeFind(self,obj_ids=[username]) - if len(baskets)>0: - basket=baskets[0][1] - else: - manage_addBasketObject(self,username) - basket=self._getOb(username) - - - basket.addObjects(ids) - back=self.REQUEST.SESSION.get('BACKLINK', None) - - if RESPONSE: - RESPONSE.redirect(back) - - - - def showBasket(self,user=None,set=None,RESPONSE=None): - """show the basket""" - - if user: - self.REQUEST.SESSION['basketUser']=user - - if not user and not set: - user=self.REQUEST.SESSION.get('basketUser',None) - - if not user: - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','orizeBasketUser.zpt')).__of__(self) - return pt() - else: - baskets=self.ZopeFind(self,obj_ids=[user]) - - - if len(baskets)>0: - RESPONSE.redirect(baskets[0][1].absolute_url()) - return True - else: - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','emptyBasket.zpt')).__of__(self) - return pt() - - -def manage_addBasket_oldForm(self): - """add the basket form""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasket.zpt')).__of__(self) - return pt() - -def manage_addBasket_old(self,id,title,RESPONSE=None): - """add the basket""" - ob=Basket() - - ob.id=str(id) - ob.title=title - self._setObject(id, ob) - ob=self._getOb(id) - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - -class BasketObject_old(Folder): - """Basket Object - alte fassung""" - - meta_type="basketObject" - def __init__(self): - """init basket object""" - self.contents=[] - - def numberOfItems(self): - """return anzahl der elemente im basket""" - num=len(self.contents) - - return num - - def addObjects(self,ids): - """addObjects""" - - for id in ids: - founds=self.CDLICatalog.search({'title':id}) - for found in founds: - if found.getObject() not in self.contents: - tm=self.contents[0:] - tm.append(found.getObject()) - self.contents=tm[0:] - - 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() - - def deleteObjects(self,ids,RESPONSE=None): - """delete objects""" - list = self.contents[0:] - for content in list: - - if content.getId() in ids: - self.contents.remove(content) - - - if RESPONSE: - RESPONSE.redirect(self.absolute_url()) - - - def unlockTest(self): - """unlock all files of the testuser for debuggin""" - for object in self.contents: - - if str(object.lockedBy)=="test": - object.lockedBy="" - - def downloadObjectsAsOneFile(self,lock=None,procedure=None,REQUEST=None): - """download all selected files in one file""" - - ret="" - lockedObjects={} - - if self.temp_folder.downloadCounter > 10: - return """I am sorry, currently the server has to many requests for downloads, please come back later!""" - - - if lock: - - if str(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User': - - return "please login first" - - #check if a locked object exist in the basket. - lockedObjects={} - for object in self.contents: - - if not object.lockedBy=="": - lockedObjects[object.title]=repr(object.lockedBy) - - - keys=lockedObjects.keys() - - - if len(keys)>0 and (not procedure): - self.REQUEST.SESSION['lockedObjects']=lockedObjects - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','lockedObjects.zpt')).__of__(self) - return pt() - - elif not procedure: #keine fails gesperrt dann alle donwloaden - procedure="downloadAll" - - self.temp_folder.downloadCounter+=1 - self._p_changed=1 - - transaction.get().commit() - - for object in self.contents: - - if (procedure=="downloadAll") or (object.lockedBy=='') or (object.lockedBy==self.REQUEST['AUTHENTICATED_USER']): - ret+=object.getLastVersion().getData() - - if lock and object.lockedBy=='': - object.lockedBy=self.REQUEST['AUTHENTICATED_USER'] - - - self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="basket_%s.atf" """%self.getId()) - self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream") - length=len(ret) - self.REQUEST.RESPONSE.setHeader("Content-Length",length) - self.REQUEST.RESPONSE.write(ret) - self.temp_folder.downloadCounter-=1 - self._p_changed=1 - transaction.get().commit() - - - -def manage_addBasket_oldObjectForm(self): - """add form""" - pass - -def manage_addBasket_oldObject(self,id,title='',RESPONSE=None): - """add""" - - ob=BasketObject() - - ob.id=str(id) - ob.title=title - self._setObject(id, ob) - ob=self._getOb(id) - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - + class CDLIBasketContainer(OrderedFolder): """contains the baskets""" @@ -1211,7 +997,7 @@ class CDLIBasketVersion(Implicit,Persist lockedObjects={} for object in self.content.getContent(): - if not object[1].lockedBy=="": + if (not str(object[1].lockedBy)=="") and (not (str(object[1].lockedBy)==str(self.REQUEST['AUTHENTICATED_USER']))): lockedObjects[object[1].title]=repr(object[1].lockedBy) @@ -1371,7 +1157,7 @@ class CDLIFileObject(CatalogAware,extVer newversion=parent.manage_addCDLIFileObject('',comment,author) - newversion.data=self.data[0:] + newversion.manage_upload(self.getData()) if RESPONSE is not None: RESPONSE.redirect(self.aq_parent.absolute_url()+'/history') @@ -1677,10 +1463,14 @@ def splitatf(fh,dir=None,ext=None): if dir: filename=os.path.join(dir,filename) nf=file(filename,"w") + logging.info("open %s"%filename) if nf: nf.write(line.replace("\n","")+"\n") - nf.close() + try: + nf.close() + except: + pass fh.close() return ret,len(os.listdir(dir)) @@ -2126,6 +1916,18 @@ class CDLIRoot(Folder): if un and un !="": ret.append((f[0],un)) + return ret + + def forceDahl(self): + "break all locks" + ret=[] + for f in self.ZopeFind(self,obj_metatypes="CDLI file",search_sub=1): + if str(f[1].lockedBy)=="dahl": + un=f[1].forceunlock() + + if un and un !="": + ret.append((f[0],un)) + return ret def getChangesByAuthor(self,author,n=100): @@ -2193,7 +1995,14 @@ class CDLIRoot(Folder): def uploadATF(self,repeat=None,upload=None,basketId=0,RESPONSE=None): """standard ausgabe""" #self._v_uploadATF.returnValue=None + 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) + threadName=repeat if not threadName or threadName=="": tmpVar=False @@ -2206,9 +2015,10 @@ class CDLIRoot(Folder): self._v_uploadATF[threadName]=thread #self._xmltrans.start() #thread=Thread(target=self._v_uploadATF) - - self._v_uploadATF[threadName].set(upload,basketId,self.REQUEST['AUTHENTICATED_USER'],serverport=self.REQUEST['SERVER_PORT']) + logging.info("set thread. extern") + self._v_uploadATF[threadName].set(upload,basketId,self.REQUEST['AUTHENTICATED_USER'],idTmp,serverport=self.REQUEST['SERVER_PORT']) #thread.start() + logging.info("start thread. extern") self._v_uploadATF[threadName].start() @@ -2230,7 +2040,7 @@ class CDLIRoot(Folder): if threadName == thread.getName(): self._v_uploadATF[threadName]=thread - if not self._v_uploadATF[threadName].returnValue: + if self._v_uploadATF.get(threadName,None) and (not self._v_uploadATF[threadName].returnValue): wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template']) @@ -2253,15 +2063,12 @@ class CDLIRoot(Folder): # # # #tmp=self.cdli_main.tmpStore2[threadName] - tmp=self._v_uploadATF[threadName].returnValue - self._v_uploadATF[threadName].continueVar=False + tmp=getattr(self.temp_folder,idTmp).returnValue + + - self.REQUEST.SESSION['changed']=[x[0].getId() for x in tmp['changed']] - self.REQUEST.SESSION['lockerrors']=[x[0].getId() for x in tmp['lockerrors']] - self.REQUEST.SESSION['errors']=tmp['errors'] - self.REQUEST.SESSION['newPs']=tmp['newPs'] - self.REQUEST.SESSION['tmpdir']=tmp['dir'] + #del(self.cdli_main.tmpStore2[threadName]) @@ -2293,8 +2100,9 @@ class CDLIRoot(Folder): self._v_uploadATF[threadName]=thread - - self._v_uploadATF[threadName].set(procedure,comment=comment,basketname=basketname,unlock=unlock,SESSION=self.REQUEST.SESSION,username=self.REQUEST['AUTHENTICATED_USER'],serverport=self.REQUEST['SERVER_PORT']) + idTmp=self.REQUEST.SESSION['idTmp'] + stObj=getattr(self.temp_folder,idTmp) + self._v_uploadATF[threadName].set(procedure,comment=comment,basketname=basketname,unlock=unlock,SESSION=stObj.returnValue,username=self.REQUEST['AUTHENTICATED_USER'],serverport=self.REQUEST['SERVER_PORT']) self._v_uploadATF[threadName].start() @@ -2327,7 +2135,7 @@ class CDLIRoot(Folder): pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadATFWait.zpt')).__of__(self) return pt(txt='/uploadATFfinally',threadName=threadName) else: - + self.REQUEST.SESSION['idTmp']=None if RESPONSE is not None: RESPONSE.redirect(self.absolute_url()) @@ -2398,7 +2206,10 @@ def manage_addCDLIRoot(self, id, title=' ob=CDLIRoot() ob.id=str(id) ob.title=title - self._setObject(id, ob) + try: + self._setObject(id, ob) + except: + pass ob=self._getOb(id) checkPermission=getSecurityManager().checkPermission