File:  [Repository] / cdli / tools / uploadATFAsyncFinally.py
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Jul 19 12:43:26 2011 UTC (12 years, 11 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
added command linetools for uploading atf files

    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>