Annotation of cdli/tools/uploadATFAsyncFinally.py, revision 1.1
1.1 ! dwinter 1: from ZODB import DB
! 2: from ZEO import ClientStorage
! 3: from ZPublisher.HTTPResponse import HTTPResponse
! 4: from ZPublisher.HTTPRequest import HTTPRequest
! 5: from ZPublisher.BaseRequest import RequestContainer
! 6:
! 7: from ZCatalog import ZCatalog
! 8: import pickle
! 9: import logging
! 10: from Products.cdli.cdli_files import CDLIRoot
! 11: import sys
! 12: import os
! 13: import os.path
! 14:
! 15: class uploadATFfinallyThread:
! 16: """class for adding uploaded filed (temporarily stored in the staging area at /tmp"""
! 17:
! 18: def __init__(self):
! 19: """init for uploadATFfinallyThread"""
! 20: logging.getLogger().setLevel(logging.DEBUG)
! 21:
! 22: def set(self,procedure,uploadId,comment="",basketname='',unlock=None,username=None,serverport="8080"):
! 23: """set start values for the thread"""
! 24:
! 25: self.result=file("/tmp/"+str(basketname)+".out","w")
! 26: self.procedure=procedure
! 27: self.comment=comment
! 28: self.basketname=basketname
! 29: self.unlock=unlock
! 30: self.username=username
! 31: self.serverport=serverport
! 32: self.uploadId=uploadId
! 33:
! 34: def __call__(self):
! 35: """call of the thread (equals run)"""
! 36: self.run()
! 37: return True
! 38:
! 39: def getContext(self, app,serverport="8080"):
! 40: """get the context within the ZODB"""
! 41:
! 42: resp = HTTPResponse(stdout=None)
! 43: env = {
! 44: 'SERVER_NAME':'localhost',
! 45: 'SERVER_PORT':serverport,
! 46: 'REQUEST_METHOD':'GET'
! 47: }
! 48: req = HTTPRequest(None, env, resp)
! 49: return app.__of__(RequestContainer(REQUEST = req))
! 50:
! 51:
! 52: def run(self):
! 53: """run"""
! 54: from App.config import getConfiguration
! 55: print getConfiguration()
! 56:
! 57: #find context within ZODB
! 58: #find context within ZODB
! 59: storage=ClientStorage.ClientStorage(("localhost",8100));
! 60: db = DB(storage)
! 61: conn = db.open()
! 62:
! 63: root = conn.root()
! 64: app = root['Application']
! 65: ctx = self.getContext(app,serverport=self.serverport)
! 66:
! 67: #add the files
! 68: self.uploadATFfinallyThread(ctx,self.procedure,comment=self.comment,basketname=self.basketname,unlock=self.unlock,username=self.username)
! 69: #commit the transactions
! 70:
! 71: db.close()
! 72: return True
! 73:
! 74: def __del__(self):
! 75: """delete"""
! 76:
! 77:
! 78:
! 79: def getResult(self):
! 80: """method for accessing result"""
! 81: ret=""
! 82: for x in self.result.readlines():
! 83: ret+=x
! 84:
! 85: return ret
! 86:
! 87: def uploadATFfinallyThread(self,ctx,procedure,comment="",basketname='',unlock=None,username=None):
! 88: """upload the files"""
! 89: #TODO: make this configurable, at the moment, rootFolder for cdli has to be cdliRoot
! 90: logging.debug(ctx)
! 91: ctx2a=ctx.cdliRoot
! 92: ctx2 = self.getContext(ctx2a,serverport=self.serverport)
! 93:
! 94:
! 95: self.result.write("<h2>Start processing</h2>\n")
! 96:
! 97: tmp = pickle.load(file("/tmp/"+str(self.uploadId)+".result"))
! 98: errorFn = [x[0] for x in tmp['errors']]
! 99: #shall I only upload the changed files?
! 100: logging.debug("uploadATFfinally procedure: %s"%procedure)
! 101: if procedure=="uploadchanged":
! 102: changedTmp=[x[0] for x in tmp.get('changed',[])]
! 103: uploadFns=[]
! 104:
! 105: uploadFnsTmp=changedTmp+tmp.get('newPs',[])
! 106: for x in uploadFnsTmp:
! 107: if (not x in tmp['lockerrors']) and ( not x in errorFn):
! 108: uploadFns.append(x)
! 109: #or all
! 110: elif procedure=="uploadAll":
! 111: uploadFns=[]
! 112: for x in os.listdir(tmp['tmpdir']):
! 113: if (not x in tmp['lockerrors']) and ( not x in errorFn):
! 114: uploadFns.append(x)
! 115:
! 116: #or maybe nothing
! 117: elif procedure=="noupload":
! 118: return True
! 119: else:
! 120: uploadFns=[]
! 121:
! 122: #do first the changed files
! 123: i=0
! 124: for fn in uploadFns:
! 125: logging.debug("uploadATFfinally uploadFn=%s"%fn)
! 126: i+=1
! 127: logging.debug(ctx2)
! 128: catalog = ctx2['CDLICatalog']
! 129: print catalog
! 130:
! 131: founds=catalog.search({'title':fn})
! 132: if len(founds)>0:
! 133: tmp['author']=str(username)
! 134: self.result.write("<p>Changing : %s\n"%fn)
! 135: logging.debug("uploadatffinallythread changing:%s"%fn)
! 136: founds[0].getObject().manage_addCDLIFileObject('',comment,tmp['author'],file=os.path.join(tmp['tmpdir'],fn),from_tmp=True)
! 137: if i%200==0:
! 138: #transaction.get().commit()
! 139: #logging.debug("uploadatffinallythread changing: do commit")
! 140: self.result.flush()
! 141:
! 142:
! 143: #now add the new files
! 144: newPs=tmp['newPs']
! 145: if len(newPs)>0:
! 146: tmpDir=tmp['tmpdir']
! 147: logging.debug("uploadatffinallythread adding start")
! 148: self.result.write("<p>Adding files</p>\n")
! 149: #TODO: make this configurable, at the moment base folder for the files has to be cdli_main
! 150: print ctx2
! 151: ctx2.importFiles(comment=comment,author=str(username) ,folderName=tmpDir, files=newPs,ext=self)
! 152: logging.debug("uploadatffinallythread adding finished")
! 153:
! 154: #unlock locked files?
! 155: if unlock:
! 156: logging.debug("uploadatffinallythread unlocking start")
! 157: self.result.write("<p>Unlock files</p>\n")
! 158: unlockFns=[]
! 159: for x in os.listdir(tmp['tmpdir']):
! 160: if not x in errorFn:
! 161: unlockFns.append(x)
! 162:
! 163: logging.debug("unlocking have now what to unlock")
! 164:
! 165: for fn in unlockFns:
! 166: #logging.info("will unlock: %s"%fn)
! 167: founds=ctx2.CDLICatalog.search({'title':fn})
! 168: #logging.info("found it: %s"%repr(founds))
! 169: if len(founds)>0:
! 170: #logging.info("unlock: %s"%founds[0].getObject().getId())
! 171: tmp['author']=str(username)
! 172: founds[0].getObject().lockedBy=""
! 173:
! 174: logging.debug("uploadatffinallythread unlocking done")
! 175:
! 176: #if a basketname is given, add files to the basket
! 177: if not (basketname ==''):
! 178: logging.debug("uploadatffinallythread add to basket %s"%basketname)
! 179: self.result.write("<p>Add to basket</p>\n")
! 180: basketId=ctx2.basketContainer.getBasketIdfromName(basketname)
! 181:
! 182: if not basketId: # create new basket
! 183: logging.debug("uploadatffinallythread create basket %s"%basketname)
! 184: self.result.write("<p>Create a new basket</p>\n")
! 185: ob=ctx2.basketContainer.addBasket(basketname)
! 186: basketId=ob.getId()
! 187: basket=getattr(ctx2.basketContainer,str(basketId))
! 188:
! 189: #workaround fuer memory fehler in listdir
! 190: #http://stackoverflow.com/questions/4098831/workaround-oserror-with-os-listdir
! 191: dirTmp=tmp['tmpdir']
! 192: ids = os.popen4('find %s' % dirTmp)[1].read().rstrip().split('\n')
! 193: ids.remove(dirTmp)
! 194: n = len(dirTmp)
! 195: if dirTmp[-1] != os.path.sep:
! 196: n += 1
! 197: ids = [f[n:] for f in ids] # remove dir prefix
! 198: #ids=os.listdir(tmp['tmpdir'])
! 199: #logging.debug("should add:"+repr(ids))
! 200: addIds=[]
! 201: for id in ids:
! 202: if not (id in errorFn):
! 203: addIds.append(id)
! 204:
! 205: basket.addObjects(addIds,deleteOld=True,username=str(username))
! 206:
! 207: logging.debug("uploadatffinallythread uploadfinally done")
! 208:
! 209:
! 210: return True
! 211:
! 212: if __name__ == "__main__":
! 213: if len(sys.argv)<7:
! 214: print """Usage: procedure uploadId comment basketName unlock username
! 215:
! 216: procedure: can be either uploadchanged or uploadall
! 217: uploadId: Ticket ID von uploadATF
! 218: comment: will be added to all docs
! 219: basketName: name of the basket
! 220: unlock: unlock or keeplock
! 221: """
! 222:
! 223:
! 224: #set(self,procedure,uploadId,comment="",basketname='',unlock=None,username=None,serverport="8080"):
! 225: upload = uploadATFfinallyThread()
! 226: x=sys.argv;
! 227: if sys.argv[5]=="unlock":
! 228: unlock=True
! 229: else:
! 230: unlock=False
! 231:
! 232: upload.set(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4],unlock=[5],username=sys.argv[6])
! 233: upload.run();
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>