File:  [Repository] / cdli / cdli_files.py
Revision 1.19: download - view: text, annotated - select for diffs - revision graph
Tue Jun 13 18:34:10 2006 UTC (18 years ago) by dwinter
Branches: MAIN
CVS tags: HEAD
threaded file upload

    1: """CDLI extensions of the filearchive"""
    2: from Products.versionedFile.versionedFile import *
    3: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
    4: from tempfile import mkstemp,mkdtemp
    5: import os.path
    6: import os
    7: from types import *
    8: import urlparse
    9: from OFS.OrderedFolder import OrderedFolder
   10: from OFS.SimpleItem import SimpleItem
   11: import time
   12: from OFS.Folder import manage_addFolder
   13: import re
   14: from AccessControl import ClassSecurityInfo
   15: from Acquisition import Implicit
   16: from threading import Thread
   17: from ZPublisher.HTTPRequest import HTTPRequest
   18: from ZPublisher.HTTPResponse import HTTPResponse
   19: from ZPublisher.BaseRequest import RequestContainer
   20: 
   21: global tmpVar
   22: 
   23: class uploadATFfinallyThread(Thread):
   24:  
   25:     def __init__(self):
   26:         self.continueVar=True
   27:         self.returnValue=None
   28:         self.end=False
   29:         Thread.__init__(self)
   30:            
   31:     def set(self,procedure,comment="",basketname='',unlock=None,SESSION=None,username=None,serverport="8080"):
   32:         """set values"""
   33:         self.procedure=procedure
   34:         self.comment=comment
   35:         self.basketname=basketname
   36:         self.unlock=unlock
   37:         self.SESSION=SESSION
   38:         self.username=username
   39:         self.serverport=serverport
   40:         
   41:     def __call__(self):
   42:         """wait"""
   43:         self.run()
   44:         return True
   45:     
   46:     def getContext(self, app,serverport="8080"):
   47:         resp = HTTPResponse(stdout=None)
   48:         env = {
   49:             'SERVER_NAME':'localhost',
   50:             'SERVER_PORT':serverport,
   51:             'REQUEST_METHOD':'GET'
   52:             }
   53:         req = HTTPRequest(None, env, resp)
   54:         return app.__of__(RequestContainer(REQUEST = req))
   55:           
   56:     
   57:     def run(self):
   58: 
   59:         self.result=""
   60:         from Zope import DB
   61:         conn = DB.open()
   62:         root = conn.root()
   63:         app  = root['Application']
   64:         ctx = self.getContext(app,serverport=self.serverport)
   65: 
   66:         self.uploadATFfinallyThread(ctx,self.procedure,comment=self.comment,basketname=self.basketname,unlock=self.unlock,SESSION=self.SESSION,username=self.username)
   67:         get_transaction().commit()
   68:         conn.close()
   69:         self.end=True
   70:         return True
   71:     
   72:     def getResult(self):
   73:         return self.result
   74:      
   75:     def uploadATFfinallyThread(self,ctx,procedure,comment="",basketname='',unlock=None,RESPONSE=None,SESSION=None,username=None):
   76:         """upload the files"""
   77:         ctx2=ctx.cdliRoot
   78:    
   79:         self.result+="<h2>Start processing</h2>"
   80:         if procedure=="uploadchanged":
   81:       
   82:             uploadFns=SESSION.get('changed',[])+SESSION.get('newPs',[])
   83:         
   84:         elif procedure=="uploadAll":
   85:             uploadFns=[]
   86:             for x in os.listdir(SESSION['tmpdir']):
   87:                 if not x in SESSION['errors']:
   88:                     uploadFns.append(x)
   89:         elif procedure=="noupload":
   90:                         return True
   91:         else:
   92:             uploadFns=[]
   93:             
   94:         for fn in uploadFns:
   95:             founds=ctx2.CDLICatalog.search({'title':fn})
   96:             if len(founds)>0:
   97:                 SESSION['author']=str(username)
   98:                 self.result+="<p>Changing : %s"%fn
   99:                 founds[0].getObject().manage_addCDLIFileObject('',comment,SESSION['author'],file=file(os.path.join(SESSION['tmpdir'],fn)))
  100:             
  101:         
  102:                 
  103:         newPs=SESSION['newPs']
  104:         if len(newPs)>0:
  105:             tmpDir=SESSION['tmpdir']
  106:             self.result+="<p>Adding files</p>"
  107:             ctx2.cdli_main.importFiles(comment=comment,author=str(username) ,folderName=tmpDir, files=newPs,ext=self)
  108:                 
  109:         
  110:         
  111:         #unlock
  112:         if unlock:
  113:             self.result+="<p>Unlock files</p>"
  114:             unlockFns=[]
  115:             for x in os.listdir(SESSION['tmpdir']):
  116:                     if not x in SESSION['errors']:
  117:                         unlockFns.append(x)
  118:             
  119:             for fn in unlockFns:
  120:                 founds=ctx2.CDLICatalog.search({'title':fn})
  121:                 if len(founds)>0:
  122:                     SESSION['author']=str(username)
  123:                    
  124:                     founds[0].getObject().lockedBy=""
  125:                     
  126:         if not (basketname ==''):
  127:             self.result+="<p>Add basket</p>"
  128:             basketId=ctx2.basketContainer.getBasketIdfromName(basketname)
  129:             
  130:             if not basketId: # create new basket
  131:                 ob=ctx2.basketContainer.addBasket(basketname)
  132:                 basketId=ob.getId()
  133:             basket=getattr(ctx2.basketContainer,str(basketId))
  134:             ids=os.listdir(SESSION['tmpdir'])
  135:             basket.addObjects(ids,deleteOld=True,username=str(username))    
  136:                
  137:         if RESPONSE is not None:
  138:             RESPONSE.redirect(self.aq_parent.absolute_url())
  139:         
  140: 
  141:        
  142:         return True
  143:     
  144: class uploadATFThread(Thread):
  145:     
  146:     def __init__(self):
  147:         self.continueVar=True
  148:         self.returnValue=None
  149:         
  150:         Thread.__init__(self)
  151:         
  152:         
  153:     def set(self,upload,basketId,username,serverport="8080"):
  154:         self.result=""
  155:         self.upload=upload
  156:         self.basketId=basketId
  157:         self.username=username
  158:         self.serverport=serverport
  159:         
  160:     def __call__(self):
  161:         """wait"""
  162:         self.run()
  163:         return True
  164:     
  165:     def getContext(self, app,serverport="8080"):
  166:         resp = HTTPResponse(stdout=None)
  167:         env = {
  168:             'SERVER_NAME':'localhost',
  169:             'SERVER_PORT':serverport,
  170:             'REQUEST_METHOD':'GET'
  171:             }
  172:         req = HTTPRequest(None, env, resp)
  173:         return app.__of__(RequestContainer(REQUEST = req))
  174:         
  175:     def run(self):
  176:      
  177:         self.result=""
  178:         from Zope import DB
  179:         conn = DB.open()
  180:         root = conn.root()
  181:         app  = root['Application']
  182:         ctx = self.getContext(app,serverport=self.serverport)
  183:         self.uploadATFThread(ctx,self.upload,self.basketId)
  184:         
  185:         while self.continueVar:
  186:             pass
  187:         get_transaction().abort()
  188:         conn.close()
  189: 
  190:         
  191:     def getResult(self):
  192:         return self.result
  193:     
  194:     def uploadATFThread(self,ctx,upload,basketId=0):
  195:         """upload an atf file"""
  196:         #TODO: add comments
  197:         #TODO: finish uploadATF
  198:         self.result="<html><body><h2>I am loading your file...</h2>"
  199:         basketId=str(basketId)
  200:         
  201:         
  202:         ctx2=ctx.cdliRoot
  203:         dir=mkdtemp()
  204:         changed=[]
  205:         errors=[]
  206:         newPs=[]
  207:         psNotInCatalog=[]
  208:         basketNameFromFile, numberOfFiles=splitatf(upload,dir)
  209:         
  210:         if basketId == '0':
  211:             basketObj=ctx2.basketContainer.getActiveBasket()
  212:             if basketObj:
  213:                 basketId=basketObj.getId()
  214:                 
  215:         if basketId == '0':
  216:             basketNameFromId=""
  217:             basketLen=0
  218:         else:
  219:             basketNameFromId=getattr(ctx2.basketContainer,basketId).title
  220:             basketLen=getattr(ctx2.basketContainer,basketId).getLastVersion().numberOfItems()
  221:             
  222:         
  223:         self.result+="<html><body><h2>I got the files</h2><p>I am checking now the files</p>"
  224:                                        
  225:         for fn in os.listdir(dir):
  226:             
  227:             self.result+="<p>check:%s</p>"%fn
  228:             
  229:             if ctx2.cdli_main.checkCatalog(fn):
  230:                 psNotInCatalog.append(fn)
  231:                 
  232:                 
  233:             founds=ctx2.CDLICatalog.search({'title':fn})    
  234:       
  235:             if len(founds)==0:
  236:                 newPs.append(fn)
  237:                 
  238:             for found in founds:
  239:                 obj=found.getObject()
  240:        
  241:                 if (not obj.lockedBy=='') and (not obj.lockedBy==self.username):
  242:                     errors.append(obj)
  243:                 else:
  244:                     data=file(os.path.join(dir,fn)).read()
  245:                     diffs=obj.diff(data)
  246:                     if diffs[0]>0:
  247:                         changed.append((obj,diffs))
  248:                         #hochladen
  249:         
  250:       
  251:         self.result+="<h3>Done</h3></body></html>"
  252:         
  253:         self.returnValue={}
  254:         self.returnValue['changed']=changed
  255:         self.returnValue['errors']=errors
  256:         self.returnValue['newPs']=newPs
  257:         self.returnValue['tmpdir']=dir
  258:         self.returnValue['basketLen']=basketLen
  259:         self.returnValue['numberOfFiles']=numberOfFiles
  260:         self.returnValue['basketNameFromId']=basketNameFromId
  261:         self.returnValue['basketNameFromFile']=basketNameFromFile
  262:         self.returnValue['basketId']=basketId
  263:         self.returnValue['dir']=dir
  264:         
  265:         #ctx2.cdli_main.setTemp('v_uploadATF_returnValue',True)
  266:     
  267:         
  268: class Basket_old(Folder):
  269:     """shopping basket - alte fassung """
  270:     
  271:     meta_type="Basket"
  272:     _v_stack={}
  273: 
  274:     def getObjUrl(self,objId):
  275:         """getUrl"""
  276:         founds=self.CDLICatalog.search({'title':objId})
  277:         if len(founds)>0:
  278:              return founds[0].getObject().absolute_url()
  279:          
  280:         else: #assume version number
  281:             splitted=objId.split("_")
  282:             founds=self.CDLICatalog.search({'title':splitted[1]})        
  283:             return founds[0].getObject().absolute_url()+'/'+objId
  284:         
  285:     def storeAllLink(self,results):
  286:         """erzeuge link zum speicher aller results"""
  287:         nr=self.REQUEST['_ZopeId']
  288:         
  289:         if results:
  290:             self._v_stack[nr]=[x.getObject().getId() for x in results]
  291:         
  292:         return self.absolute_url()+"/storeAll?id="+nr
  293:     
  294:     def storeAll(self,id):
  295:         """store all"""
  296:         try:
  297:             results=self._v_stack[id]
  298:         except:
  299:             #TODO: write expired page
  300:             return "expired"
  301:         
  302:         return self.storeInBasketForm(results)
  303:         
  304:     def storeInBasketForm(self,ids):
  305:         """ store an object form"""
  306:         
  307:         if type(ids) is not ListType:
  308:             ids=[ids]
  309:         self.REQUEST.SESSION['ids']=ids[0:]
  310:         
  311:         self.REQUEST.SESSION['BACKLINK']=self.REQUEST['HTTP_REFERER']
  312: 
  313:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','storeBasketObject.zpt')).__of__(self)
  314:         return pt()
  315:         
  316:     def storeInBasket(self,username,ids=None,RESPONSE=None,REQUEST=None):
  317:         """store it"""
  318:         
  319:         if not ids:
  320:             ids=REQUEST.SESSION['ids']
  321:             
  322:         self.REQUEST.SESSION['basketUser']=username
  323:         
  324:         baskets=self.ZopeFind(self,obj_ids=[username])
  325:         if len(baskets)>0:
  326:             basket=baskets[0][1]
  327:         else:
  328:             manage_addBasketObject(self,username)
  329:             basket=self._getOb(username)
  330:         
  331:         
  332:         basket.addObjects(ids)
  333:         back=self.REQUEST.SESSION.get('BACKLINK', None)
  334: 
  335:         if RESPONSE:
  336:             RESPONSE.redirect(back)
  337:             
  338: 
  339:     
  340:     def showBasket(self,user=None,set=None,RESPONSE=None):
  341:         """show the basket"""
  342:         
  343:         if user:
  344:             self.REQUEST.SESSION['basketUser']=user
  345:         
  346:         if not user and not set:
  347:             user=self.REQUEST.SESSION.get('basketUser',None)
  348:         
  349:         if not user:
  350:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','orizeBasketUser.zpt')).__of__(self)
  351:             return pt()
  352:         else:
  353:             baskets=self.ZopeFind(self,obj_ids=[user])
  354:         
  355: 
  356:         if len(baskets)>0:
  357:             RESPONSE.redirect(baskets[0][1].absolute_url())
  358:             return True 
  359:         else:
  360:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','emptyBasket.zpt')).__of__(self)
  361:             return pt()
  362:         
  363: 
  364: def manage_addBasket_oldForm(self):
  365:     """add the basket form"""
  366:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addBasket.zpt')).__of__(self)
  367:     return pt()
  368: 
  369: def manage_addBasket_old(self,id,title,RESPONSE=None):
  370:     """add the basket"""
  371:     ob=Basket()
  372:     
  373:     ob.id=str(id)
  374:     ob.title=title
  375:     self._setObject(id, ob)
  376:     ob=self._getOb(id)
  377:     
  378:     if RESPONSE is not None:
  379:         RESPONSE.redirect('manage_main')
  380: 
  381:     
  382: class BasketObject_old(Folder):
  383:     """Basket Object - alte fassung"""
  384:     
  385:     meta_type="basketObject"
  386:     def __init__(self):
  387:                 """init basket object"""
  388:                 self.contents=[]
  389: 
  390:     def numberOfItems(self):
  391:         """return anzahl der elemente im basket"""
  392:         return len(self.contents)
  393:     
  394:     def addObjects(self,ids):
  395:         """addObjects"""
  396:         
  397:         for id in ids:
  398:             founds=self.CDLICatalog.search({'title':id})
  399:             for found in founds:
  400:                 if found.getObject() not in self.contents:
  401:                     tm=self.contents[0:]
  402:                     tm.append(found.getObject())
  403:                     self.contents=tm[0:]
  404:     
  405:         return True
  406: 
  407:     def index_html(self):
  408:                 """view the basket"""
  409:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','basketObject_index_html.zpt')).__of__(self)
  410:                 return pt()
  411: 
  412:     def deleteObjects(self,ids,RESPONSE=None):
  413:         """delete objects"""
  414:         list = self.contents[0:]
  415:         for content in list:
  416:                
  417:                 if content.getId() in ids:
  418:                     self.contents.remove(content)
  419:         
  420: 
  421:         if RESPONSE:
  422:                     RESPONSE.redirect(self.absolute_url())
  423: 
  424: 
  425:     def unlockTest(self):
  426:         """unlock all files of the testuser for debuggin"""
  427:         for object in self.contents:
  428: 
  429:                 if str(object.lockedBy)=="test":
  430:                     object.lockedBy=""
  431:             
  432:     def downloadObjectsAsOneFile(self,lock=None,procedure=None,REQUEST=None):
  433:         """download all selected files in one file"""
  434:         
  435:         ret=""
  436:         lockedObjects={}
  437:         
  438: 
  439:         if lock:
  440:             
  441:             if str(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User':
  442:                 
  443:                 return "please login first"
  444: 
  445:             #check if a locked object exist in the basket.
  446:             lockedObjects={}
  447:             for object in self.contents:
  448: 
  449:                 if not object.lockedBy=="":
  450:                     lockedObjects[object.title]=repr(object.lockedBy)
  451:                    
  452:                     
  453:             keys=lockedObjects.keys()
  454:             
  455:             
  456:             if len(keys)>0 and (not procedure):
  457:                 self.REQUEST.SESSION['lockedObjects']=lockedObjects
  458:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','lockedObjects.zpt')).__of__(self)
  459:                 return pt()
  460:          
  461:             elif not procedure: #keine fails gesperrt dann alle donwloaden
  462:                 procedure="downloadAll" 
  463:         
  464: 
  465:         for object in self.contents:
  466:             
  467:                 if (procedure=="downloadAll") or (object.lockedBy=='') or (object.lockedBy==self.REQUEST['AUTHENTICATED_USER']):
  468:                     ret+=object.getLastVersion().data
  469:                 
  470:                 if lock and object.lockedBy=='':
  471:                     object.lockedBy=self.REQUEST['AUTHENTICATED_USER']
  472: 
  473: 
  474:         self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="basket_%s.atf" """%self.getId())
  475:         self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
  476:         length=len(ret)
  477:         self.REQUEST.RESPONSE.setHeader("Content-Length",length)
  478:         self.REQUEST.RESPONSE.write(ret)    
  479:         
  480:         
  481: def manage_addBasket_oldObjectForm(self):
  482:     """add form"""
  483:     pass
  484: 
  485: def manage_addBasket_oldObject(self,id,title='',RESPONSE=None):
  486:     """add"""
  487:     
  488:     ob=BasketObject()
  489:     
  490:     ob.id=str(id)
  491:     ob.title=title
  492:     self._setObject(id, ob)
  493:     ob=self._getOb(id)
  494:     
  495:     if RESPONSE is not None:
  496:         RESPONSE.redirect('manage_main')
  497: 
  498: 
  499: class CDLIBasketContainer(OrderedFolder):
  500:     """contains the baskets"""
  501:     
  502: 
  503:     security=ClassSecurityInfo()
  504:     meta_type="CDLIBasketContainer"
  505:     
  506:     def deleteBaskets(self,ids=None):
  507:         """delete baskets, i.e. move them into trash folder"""
  508:         
  509:         
  510:         found=self.ZopeFind(self,obj_ids=['trash'])
  511:         
  512:         if len(found)<1:
  513:             manage_addFolder(self, 'trash')
  514:             trash=self._getOb('trash')
  515:         else:
  516:             trash=found[0][1]
  517:         
  518:         if type(ids) is not ListType:
  519:             ids=[ids]
  520:         cut=self.manage_cutObjects(ids)
  521:         trash.manage_pasteObjects(cut)
  522:         
  523:     def manageBaskets(self,ids,submit,REQUEST=None,RESPONSE=None):
  524:         """manage baskets, delete or copy"""
  525:         if submit=="delete":
  526:             self.deleteBaskets(ids)
  527:         
  528:        
  529:             
  530:         if RESPONSE:
  531:             RESPONSE.redirect(self.absolute_url())
  532:     def getBasketIdfromName(self,basketname):
  533:         """get id from name"""
  534: 
  535:         for basket in self.ZopeFind(self,obj_metatypes=["CDLIBasket"]):
  536:             if basket[1].title==basketname:
  537:                 return basket[0]
  538:         else:
  539:             None
  540:     
  541:     security.declareProtected('manage','uploadBasket_html')        
  542:             
  543:     def uploadBasket_html(self,basketId='0'):
  544:         """upload an atf file, html form"""
  545:         
  546: 
  547:         basketId=str(basketId)
  548:         if not basketId=='0':
  549:             basketName=getattr(self.basketContainer,basketId).title
  550:         else:
  551:             basketName=""
  552:             
  553:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadBasket_html.zpt')).__of__(self)
  554:         return pt(basketId=basketId,basketName=basketName)
  555:    
  556: 
  557:         
  558:     def index_html(self):
  559:         """stanadard ansicht"""
  560:         
  561: 
  562: 
  563:         ext=self.ZopeFind(self,obj_ids=["index.html"])
  564:         if ext:
  565:             return ext[0][1]()
  566:         
  567:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketContainerMain')).__of__(self)
  568:         return pt()
  569:     
  570:     def getStorageFolderRoot(self):
  571:         """root des storage folders"""
  572:         return self.cdli_main
  573:     
  574:     def __init__(self,id,title):
  575:         """ init basket container"""
  576:         self.id=id
  577:         self.title=title
  578:      
  579:      
  580:     def getBaskets(self,sortField='title'):
  581:         """get all baskets files"""
  582: 
  583:         def sortName(x,y):
  584:             return cmp(x[1].title.lower(),y[1].title.lower())
  585: 
  586:         def sortDate(x,y):
  587:             return cmp(y[1].getLastVersion().getTime(),x[1].getLastVersion().getTime())
  588: 
  589:         
  590:         def sortComment(x,y):
  591: 
  592:         
  593:             
  594:              try:
  595:                 xc=getattr(x[1],'comment','ZZZZZZZZZZZZZ').lower()
  596:              except:
  597:                 xc='ZZZZZZZZZZZZZ'.lower()
  598:              try:
  599:                 yc=getattr(y[1],'comment','ZZZZZZZZZZZZZ').lower()
  600:              except:
  601:                 yc='ZZZZZZZZZZZZZ'.lower()
  602:     
  603:     
  604:              if (xc=='') or (xc=='ZZZZZZZZZZZZZ'.lower()):
  605:                  
  606:                  try:
  607:                      xc=x[1].getLastVersion().getComment().lower()
  608:                  except:
  609:                      xc='ZZZZZZZZZZZZZ'.lower()
  610:                      
  611:              if (yc=='') or (yc=='ZZZZZZZZZZZZZ'.lower()):
  612:                  try:
  613:                      yc=y[1].getLastVersion().getComment().lower()
  614:                  except:
  615:                      yc='ZZZZZZZZZZZZZ'.lower()
  616:     
  617:              
  618:                  return cmp(xc,yc)
  619:         
  620:         def sortAuthor(x,y):
  621:             
  622:             return cmp(x[1].getLastVersion().getUser().lower(),y[1].getLastVersion().getUser().lower())
  623:         
  624:         baskets=self.ZopeFind(self,obj_metatypes=['CDLIBasket'])
  625:         
  626:         
  627:         if sortField=='title':
  628:             baskets.sort(sortName)
  629:         elif sortField=='date':
  630:             baskets.sort(sortDate)
  631:         elif sortField=='author':
  632:             baskets.sort(sortAuthor)
  633:         elif sortField=='comment':
  634:             baskets.sort(sortComment)
  635: 
  636:         return baskets
  637: 
  638: 
  639:                        
  640:     def getNewId(self):
  641:         """createIds"""
  642:         last=getattr(self,'last',0)
  643:         last +=1
  644:         while len(self.ZopeFind(self,obj_ids=[str(last)]))>0:
  645:             last+=1
  646:     
  647:         self.last=last
  648:         return last
  649:     
  650:     def setActiveBasket(self,basketId,REQUEST=None):
  651:         """store active basketId in a cookie"""
  652:         self.REQUEST.RESPONSE.setCookie("CDLIActiveBasket",basketId,path="/")
  653:         
  654:         if REQUEST:
  655:             REQUEST.RESPONSE.redirect(REQUEST['URL1']+'?'+REQUEST['QUERY_STRING'])
  656:             
  657:     def getActiveBasket(self):
  658:         """get active basket from cookie"""
  659:         
  660:         id= self.REQUEST.cookies.get('CDLIActiveBasket',None)
  661:         if id:
  662:             obj=getattr(self,str(id),None)
  663:         else:
  664:             obj=None
  665:         return obj
  666:     
  667:     def getActualUserName(self):
  668:         """get name of the actualuser"""
  669:         return str(self.REQUEST['AUTHENTICATED_USER'])
  670:     
  671:     
  672:     def addBasket(self,newBasketName):
  673:         """add a new basket"""
  674:         
  675:         ob=manage_addCDLIBasket(self,newBasketName)
  676:         return ob
  677:     
  678:     def storeInBasket(self,submit,ids=None,newBasketName=None,fromFileList=None,RESPONSE=None,REQUEST=None):
  679:         """store it"""
  680:         if not ids:
  681:             ids=self.REQUEST.SESSION['fileIds']
  682:             
  683:         if type(ids) is not ListType:
  684:             ids=[ids]
  685:         
  686:         if (submit.lower()=="store in new basket") or (submit.lower()=="new basket"):
  687:             basketRet=self.addBasket(newBasketName)
  688:             self.setActiveBasket(basketRet.getId())
  689:             basket=getattr(self,basketRet.getId())
  690:         elif (submit.lower()=="store in active basket") or (submit.lower()=="active basket"):
  691:             basket=self.getActiveBasket()
  692:         
  693:         added=basket.addObjects(ids)
  694:         back=self.REQUEST['HTTP_REFERER'].split("?")[0]+"?basketName="+basket.title+"&numberOfObjects="+str(added)
  695:         
  696:         
  697:         if fromFileList:
  698: 
  699:             return self.cdli_main.findObjectsFromList(list=self.REQUEST.SESSION['fileIds'],basketName=basket.title,numberOfObjects=added)
  700:        
  701:         if RESPONSE:
  702:             
  703:             RESPONSE.redirect(back)
  704:             
  705:         return True
  706:     
  707: def manage_addCDLIBasketContainerForm(self):
  708:     """add the CDLIBasketContainer form"""
  709:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIBasketContainer.zpt')).__of__(self)
  710:     return pt()
  711: 
  712: def manage_addCDLIBasketContainer(self,id,title,RESPONSE=None):
  713:     """add the basket"""
  714:     ob=CDLIBasketContainer(id,title)
  715:     
  716:     self._setObject(id, ob)
  717:     
  718:     if RESPONSE is not None:
  719:         RESPONSE.redirect('manage_main')
  720: 
  721: class CDLIBasket(Folder,CatalogAware):
  722:     """basket"""
  723:     
  724:     meta_type="CDLIBasket"
  725:     default_catalog="CDLIBasketCatalog"
  726:     
  727:     def getFile(self,obj):
  728:         return obj[1]
  729:     
  730:     def getFileLastVersion(self,obj):
  731:         return obj[0]
  732:     
  733:     def getFileNamesInLastVersion(self):
  734:         """get content of the last version as list"""
  735:         
  736:         return [x[1].getId() for x in self.getLastVersion().getContent()]
  737:     
  738:     def isActual(self,obj):
  739:         """teste ob im basket die aktuelle version ist"""
  740:         actualNo=obj[1].getLastVersion().getVersionNumber()
  741:         storedNo=obj[0].getVersionNumber()
  742:         
  743:         founds=self.CDLICatalog.search({'title':obj[0].getId()})
  744:         if len(founds)>0 and founds[0].getObject().aq_parent.getId()==".trash":
  745:             return False, -1
  746:         
  747:         if actualNo==storedNo:
  748:             return True , 0
  749:         else:
  750:             return False, actualNo
  751:         
  752:     def history(self):
  753:         """history"""  
  754: 
  755:         ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"])
  756:         if ext:
  757:             return getattr(self,ext[0][1].getId())()
  758:         
  759:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketHistory')).__of__(self)
  760:         return pt()
  761:     
  762:     def getStorageFolderRoot(self):
  763:         """root des storage folders"""
  764:         return self.aq_parent.cdli_main
  765:     
  766:     def __init__(self,id,title,shortDescription="",comment=""):
  767:         """init a CDLIBasket"""
  768:         
  769:         self.id=id
  770:         self.title=title
  771:         self.shortDescription=shortDescription
  772:         self.comment=comment
  773:  
  774:    
  775:            
  776:     def getLastVersion(self):
  777:         """hole letzte version"""
  778:         ids=[int(x[0]) for x in self.ZopeFind(self,obj_metatypes=["CDLIBasketVersion"])]
  779:         ids.sort()
  780:         if len(ids)==0:
  781:             return None
  782:         else:    
  783:             ob=getattr(self,str(ids[-1]))
  784:             return ob
  785:    
  786:     def getVersions(self):
  787:         """get versions"""
  788:         versions=self.ZopeFind(self,obj_metatypes=["CDLIBasketVersion"])
  789:         return versions
  790: 
  791:    
  792:     
  793:     def addObjects(self,ids,deleteOld=None,username=None):
  794:         """generate a new version of the basket with objects added"""
  795:        
  796:         lastVersion=self.getLastVersion()
  797:         
  798:         if lastVersion is None:
  799:             oldContent=[]
  800:         else:
  801:             oldContent=lastVersion.basketContent[0:]
  802: 
  803:         if deleteOld:
  804:             oldContent=[]
  805: 
  806:         newContent=[]
  807:         added=0
  808:         for id in ids:
  809:             founds=self.CDLICatalog.search({'title':id})
  810: 
  811:             for found in founds:
  812:                 if found.getObject() not in oldContent:
  813:                     #TODO: was passiert wenn, man eine Object dazufŸgt, das schon da ist aber eine neuere version
  814:                     newContent.append((found.getObject().getLastVersion(),found.getObject()))
  815:                     added+=1
  816: 
  817:         content=oldContent+newContent
  818:         if not username:
  819:             user=self.getActualUserName()
  820:         else:
  821:             user = username
  822:             
  823:         ob=manage_addCDLIBasketVersion(self,user,comment="",basketContent=content)
  824:     
  825:         return added
  826:     
  827:     def deleteObjects(self,ids,RESPONSE=None,REQUEST=None):
  828:         """delete objects"""
  829:         
  830:         if type(ids) is not ListType:
  831:             ids=[ids]
  832:        
  833:         lastVersion=self.getLastVersion() 
  834:         oldContent=lastVersion.basketContent[0:]
  835:         newContent=[]
  836:         for obj in oldContent:
  837:             if obj[1].getId() not in ids:
  838:                 newContent.append(obj)
  839:         
  840:                 
  841:         user=self.getActualUserName()
  842:         
  843:         ob=manage_addCDLIBasketVersion(self,user,comment="",basketContent=newContent)
  844:         
  845:         if RESPONSE:
  846:             obj=self._getOb(ob.getId())
  847:             RESPONSE.redirect(obj.absolute_url())
  848:         
  849: def manage_addCDLIBasketForm(self):
  850:     """add the CDLIBasketContainer form"""
  851:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIBasket.zpt')).__of__(self)
  852:     return pt()
  853: 
  854: def manage_addCDLIBasket(self,title,shortDescription="",comment="",RESPONSE=None):
  855:     """add the basket"""
  856:     
  857:     id=str(self.getNewId())
  858:     
  859:     ob=CDLIBasket(id,title,shortDescription,comment)
  860:     
  861:     self._setObject(id, ob)
  862:     
  863:     if RESPONSE is not None:
  864:         RESPONSE.redirect('manage_main')
  865:     else:
  866:         return ob
  867: 
  868: class CDLIBasketVersion(SimpleItem):
  869:     """version of a basket"""
  870:     
  871:     meta_type="CDLIBasketVersion"
  872:     
  873:     def downloadObjectsAsOneFile(self,lock=None,procedure=None,REQUEST=None):
  874:         """download all selected files in one file"""
  875:         
  876:         ret=""
  877:         lockedObjects={}
  878:         
  879: 
  880:         if lock:
  881:             
  882:             if str(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User':
  883:                 
  884:                 return "please login first"
  885: 
  886:             #check if a locked object exist in the basket.
  887:             lockedObjects={}
  888:             for object in self.basketContent:
  889: 
  890:                 if not object[1].lockedBy=="":
  891:                     lockedObjects[object[1].title]=repr(object[1].lockedBy)
  892:                    
  893:                     
  894:             keys=lockedObjects.keys()
  895:             
  896:             
  897:             if len(keys)>0 and (not procedure):
  898:                 self.REQUEST.SESSION['lockedObjects']=lockedObjects
  899:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','lockedObjects.zpt')).__of__(self)
  900:                 return pt()
  901:          
  902:             elif not procedure: #keine fails gesperrt dann alle donwloaden
  903:                 procedure="downloadAll" 
  904:         
  905: 
  906:         for object in self.basketContent:
  907:             
  908:                 if (procedure=="downloadAll") or (object[1].lockedBy=='') or (object[1].lockedBy==self.REQUEST['AUTHENTICATED_USER']):
  909:                     ret+=object[0].data
  910:                 
  911:                 if lock and object[1].lockedBy=='':
  912:                     object[1].lockedBy=self.REQUEST['AUTHENTICATED_USER']
  913: 
  914:         basket_name=self.aq_parent.title+"_V"+self.getId()
  915:         
  916:         #write basketname to header of atf file
  917:         ret="#atf basket %s\n"%basket_name+ret
  918:         
  919:         self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s.atf" """%basket_name)
  920:         self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
  921:         length=len(ret)
  922:         self.REQUEST.RESPONSE.setHeader("Content-Length",length)
  923:         self.REQUEST.RESPONSE.write(ret)    
  924:         
  925:  
  926:     def numberOfItems(self):
  927:         """return anzahl der elemente im basket"""
  928:         return len(self.basketContent)
  929:     
  930:     def getTime(self):
  931:         """getTime"""
  932:         #return self.bobobase_modification_time().ISO()
  933:       
  934:         if hasattr(self,'time'):
  935:             return time.strftime("%Y-%m-%d %H:%M:%S",self.time)
  936:         elif hasattr(self,'timefixed'):
  937:             return self.timefixed
  938:         else:
  939:             setattr(self,'timefixed',self.bobobase_modification_time().ISO())
  940:             return self.bobobase_modification_time().ISO()
  941:     
  942:     def getContent(self):
  943:         """get Basket Content"""
  944:         return self.basketContent
  945: 
  946:     
  947:     def __init__(self,id,user,comment="",basketContent=[]):
  948:         """ init a basket version"""
  949:         self.id=id
  950:         self.coment=comment
  951:         self.basketContent=basketContent[0:]
  952:         self.user=user
  953:         self.time=time.localtime()
  954:         
  955:     def getUser(self):
  956:         """get user"""
  957:         return self.user
  958:     
  959:     def getComment(self):
  960:         """get Comment"""
  961:         return self.comment
  962:  
  963:     def index_html(self):
  964:             """view the basket"""
  965:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','BasketVersionMain.zpt')).__of__(self)
  966:             return pt()
  967:      
  968:     def getObjUrl(self,result):
  969:         """getUrl of the version of the object"""
  970:         objId=result[1].getTitle()
  971:         founds=self.CDLICatalog.search({'title':objId})
  972:         if len(founds)>0:
  973:              return founds[0].getObject().getLastVersion().absolute_url()
  974:          
  975:         else: #assume version number
  976:             splitted=objId.split("_")
  977:             founds=self.CDLICatalog.search({'title':splitted[1]})        
  978:             return founds[0].getObject().getLastVersion().absolute_url()+'/'+objId
  979:    
  980: def manage_addCDLIBasketVersion(self,user,comment="",basketContent=[],RESPONSE=None):
  981:     """add a version"""
  982:     
  983:     #check for already existing versions
  984:  
  985:     lastVersion=self.getLastVersion()
  986:     if lastVersion is None:
  987:         newId=str(1)
  988:     else:
  989:         newId=str(int(lastVersion.getId())+1)
  990:     
  991:     ob=CDLIBasketVersion(newId,user,comment,basketContent)
  992:     
  993:     self._setObject(newId, ob)
  994:     
  995:     if RESPONSE is not None:
  996:         RESPONSE.redirect('manage_main')
  997:     else:
  998:         return ob
  999:     
 1000: class CDLIFileObject(versionedFileObject):
 1001:     """CDLI file object"""
 1002:     
 1003:     meta_type="CDLI File Object"
 1004:     
 1005:     security=ClassSecurityInfo()
 1006:     
 1007:     def view(self):
 1008:         """view file"""
 1009:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','viewCDLIFile.zpt')).__of__(self)
 1010:         return pt()
 1011:     
 1012:     security.declarePublic('getDesignation')
 1013:     def getDesignation(self):
 1014:         """get the designation out of the file"""
 1015:         try:
 1016:                 txt=re.match("&[Pp](\d*)\s*=([^\r\n]*)",self.data[0:])
 1017:         except:
 1018:                 txt=self.data[0:]
 1019:                 
 1020:                 return "ERROR"
 1021:         try:
 1022:             return txt.group(2)
 1023:         except:
 1024:             return "ERROR"
 1025:         
 1026: manage_addCDLIFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='CDLIFileObject',kind='CDLIFileObject', version='1')
 1027: 
 1028: def manage_addCDLIFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='',
 1029:                    REQUEST=None):
 1030:     """Add a new File object.
 1031: 
 1032:     Creates a new File object 'id' with the contents of 'file'"""
 1033: 
 1034:     id=str(id)
 1035:     title=str(title)
 1036:     content_type=str(content_type)
 1037:     precondition=str(precondition)
 1038:     
 1039:     id, title = cookId(id, title, file)
 1040: 
 1041:     self=self.this()
 1042: 
 1043:     # First, we create the file without data:
 1044:     self._setObject(id, CDLIFileObject(id,title,'',content_type, precondition))
 1045:     self._getOb(id).versionComment=str(vC)
 1046:     self._getOb(id).time=time.localtime()
 1047:     
 1048:     setattr(self._getOb(id),'author',author)
 1049:     
 1050:     # Now we "upload" the data.  By doing this in two steps, we
 1051:     # can use a database trick to make the upload more efficient.
 1052:     if file:
 1053:         self._getOb(id).manage_upload(file)
 1054:     if content_type:
 1055:         self._getOb(id).content_type=content_type
 1056: 
 1057:     if REQUEST is not None:
 1058:         REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
 1059:     
 1060: class CDLIFile(versionedFile,CatalogAware):
 1061:     """CDLI file"""
 1062:     
 1063:     meta_type="CDLI file"
 1064:     default_catalog='CDLICatalog'
 1065:     
 1066:     
 1067:  
 1068:     def isContainedInBaskets(self,context=None):
 1069:         """check is this file is part of any basket
 1070:         @param context: (optional) necessessary if CDLIBasketCatalog is not an (inherited) attribute of self, context.CDLIBasketCatalog
 1071:                         has to exist.
 1072:         """
 1073: 
 1074:         if not context:
 1075:             context=self
 1076:         
 1077:         ret=[]
 1078:         for x in context.CDLIBasketCatalog.search({'getFileNamesInLastVersion':self.getId()}):
 1079:             #if the basket x is deleted it seemes to be that x is sometimes still in the Catalog, why?
 1080:             try:
 1081:                 ret.append(x.getObject())
 1082:             except:
 1083:                 pass
 1084:         return ret
 1085:         #return [x.getObject() for x in context.CDLIBasketCatalog.search({'getFileNamesInLastVersion':self.getId()})]
 1086:         
 1087:         
 1088:     def addCDLIFileObjectForm(self):
 1089:         """add a new version"""
 1090:         
 1091:         if str(self.REQUEST['AUTHENTICATED_USER']) in ["Anonymous User"]:
 1092:             return "please login first"
 1093:         if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''):
 1094:             out=DTMLFile('dtml/fileAdd', globals(),Kind='CDLIFileObject',kind='CDLIFileObject',version=self.getVersion()).__of__(self)
 1095:             return out()
 1096:         else:
 1097:             return "Sorry file is locked by somebody else"
 1098:         
 1099:     def manage_addCDLIFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None):
 1100:         """add"""
 1101:         try: #TODO: der ganze vC unsinn muss ueberarbeitet werden
 1102:             vC=self.REQUEST['vC']
 1103:         except:
 1104:             pass
 1105:         
 1106:         
 1107:         if changeName=="yes":
 1108:             filename=file.filename
 1109:             self.title=filename[max(filename.rfind('/'),
 1110:                         filename.rfind('\\'),
 1111:                         filename.rfind(':'),
 1112:                         )+1:]
 1113: 
 1114: 
 1115:         if not newName=='':
 1116:             self.title=newName[0:]
 1117:         
 1118:         
 1119: 
 1120:         
 1121:         
 1122:         positionVersionNum=getattr(self,'positionVersionNum','front')
 1123:         
 1124:         if positionVersionNum=='front':
 1125:             id="V%i"%self.getVersion()+"_"+self.title
 1126:         else:
 1127:             tmp=os.path.splitext(self.title)
 1128:             if len(tmp)>1:
 1129:                 id=tmp[0]+"_V%i"%self.getVersion()+tmp[1]
 1130:             else:
 1131:                 id=tmp[0]+"_V%i"%self.getVersion()
 1132:             
 1133:         
 1134:         manage_addCDLIFileObject(self,id,vC,author,file,id,precondition, content_type)
 1135:         objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
 1136:         self.REQUEST.SESSION['objID_parent']=self.getId()
 1137: 
 1138:         if RESPONSE:
 1139:             obj=self.ZopeFind(self,obj_ids=[id])[0][1]
 1140:             if obj.getSize()==0:
 1141:                 self.REQUEST.SESSION['objID']=obj.getId()
 1142:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
 1143:                 return pt()
 1144: 
 1145:             else:
 1146:                 RESPONSE.redirect(self.REQUEST['URL2']+'?uploaded=%s'%self.title)
 1147: 
 1148:         else:
 1149:             return self.ZopeFind(self,obj_ids=[id])[0][1]
 1150:         
 1151:         
 1152: def manage_addCDLIFileForm(self):
 1153:     """interface for adding the OSAS_root"""
 1154:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIFile.zpt')).__of__(self)
 1155:     return pt()
 1156: 
 1157: def manage_addCDLIFile(self,id,title,lockedBy, author=None, RESPONSE=None):
 1158:     """add the OSAS_root"""
 1159:     newObj=CDLIFile(id,title,lockedBy,author)
 1160:     self._setObject(id,newObj)
 1161:    
 1162:     if RESPONSE is not None:
 1163:         RESPONSE.redirect('manage_main')
 1164: 
 1165: 
 1166: 
 1167: 
 1168: def splitatf(fh,dir=None):
 1169:     """split it"""
 1170:     ret=None
 1171:     nf=None
 1172:     for line in fh.readlines():
 1173:         #check if basket name is in the first line
 1174:         if line.find("#atf basket")>=0:
 1175:             ret=line.replace('#atf basket ','')
 1176:             ret=ret.split('_')[0]
 1177:         else:
 1178:             if (len(line.lstrip())>0) and (line.lstrip()[0]=="&"): #newfile
 1179:                 if nf:
 1180:                     nf.close() #close last file
 1181:             
 1182:                 
 1183:                 filename=line[1:].split("=")[0].rstrip()+".atf"
 1184:                 if dir:
 1185:                     filename=os.path.join(dir,filename)
 1186:                 nf=file(filename,"w")
 1187:             if nf:    
 1188:                 nf.write(line)
 1189:         
 1190:     nf.close()
 1191:     fh.close()
 1192:     return ret,len(os.listdir(dir))
 1193: 
 1194: 
 1195: class CDLIFileFolder(versionedFileFolder):
 1196:     """CDLI File Folder"""
 1197:     
 1198:     security=ClassSecurityInfo()
 1199:     meta_type="CDLI Folder"
 1200:     filesMetaType=['CDLI file']
 1201:     folderMetaType=['CDLI Folder']
 1202:     default_catalog='CDLICatalog'
 1203:     
 1204:     def setTemp(self,name,value):
 1205:         """set tmp"""
 1206: 
 1207:         setattr(self,name,value)
 1208:                                         
 1209:                                        
 1210:     def delete(self,ids):
 1211:         """delete this file, i.e. move into a trash folder"""
 1212:              
 1213:         found=self.ZopeFind(self,obj_ids=['.trash'])
 1214:         
 1215:         if len(found)<1:
 1216:             manage_addCDLIFileFolder(self, '.trash',title="Trash")
 1217:             trash=self._getOb('.trash')
 1218:         else:
 1219:             trash=found[0][1]
 1220:         
 1221:         if type(ids) is not ListType:
 1222:             ids=[ids]
 1223:         cut=self.manage_cutObjects(ids)
 1224:         trash.manage_pasteObjects(cut)
 1225:         
 1226:     def getVersionNumbersFromIds(self,ids):
 1227:         """get the numbers of the current versions of documents described by their ids"""
 1228:         
 1229:         ret=[]
 1230:         searchStr=" OR ".join(ids)
 1231:         
 1232:         founds=self.CDLICatalog.search({'title':searchStr})
 1233:         
 1234:         for found in founds:
 1235:             lastVersion=found.getObject().getLastVersion()
 1236:             ret.append((found.getId,lastVersion))
 1237:         
 1238:         return ret
 1239:     
 1240:     def checkCatalog(self,fn):
 1241:         """check if fn is in the catalog"""
 1242:         #TODO add checkCatalog
 1243:          
 1244:     def refreshTxt(self,txt=""):
 1245:         """txt fuer refresh"""
 1246:   
 1247:         return """ 2;url=%s?repeat=%s """%(self.absolute_url()+txt,self.threadName)
 1248: 
 1249:     
 1250:     def getResult(self):
 1251:        """result of thread"""
 1252:        try:
 1253:         return self._v_uploadATF.getResult()
 1254:        except:
 1255:         return "One moment, please"
 1256:     
 1257:     def uploadATF(self,repeat=None,upload=None,basketId=0,RESPONSE=None):
 1258:         """standard ausgabe"""
 1259:         #self._v_uploadATF.returnValue=None
 1260: 
 1261:         threadName=repeat
 1262:         if not threadName or threadName=="":
 1263:             tmpVar=False
 1264: 
 1265:             self._v_uploadATF=uploadATFThread()
 1266:            
 1267:             #self._xmltrans.start()
 1268:             #thread=Thread(target=self._v_uploadATF)
 1269:             
 1270:             self._v_uploadATF.set(upload,basketId,self.REQUEST['AUTHENTICATED_USER'],serverport=self.REQUEST['SERVER_PORT'])
 1271:             #thread.start()
 1272:             self._v_uploadATF.start()
 1273: 
 1274:             
 1275:             self.threadName=self._v_uploadATF.getName()[0:]
 1276:             wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
 1277: 
 1278:             if wait_template:
 1279:                 return wait_template[0][1]()
 1280:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadATFWait.zpt')).__of__(self)
 1281:             return pt(txt='/uploadATF')
 1282:             #_v_xmltrans.run()
 1283:             
 1284:         else:
 1285: 
 1286:             if not self._v_uploadATF.returnValue:
 1287:         
 1288: 
 1289:                 wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
 1290:                 if wait_template:
 1291:                         return wait_template[0][1]()
 1292:                 
 1293:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadATFWait.zpt')).__of__(self)
 1294: 
 1295:                 return pt(txt='/uploadATF')
 1296:                 
 1297:             else:
 1298: 
 1299:                 tmp=self._v_uploadATF.returnValue
 1300:                 self._v_uploadATF.continueVar=False
 1301:                 
 1302:                 self.REQUEST.SESSION['changed']=[x[0].getId() for x in tmp['changed']]
 1303:                 self.REQUEST.SESSION['errors']=[x.getId() for x in tmp['errors']]
 1304:                 self.REQUEST.SESSION['newPs']=tmp['newPs']
 1305:                 self.REQUEST.SESSION['tmpdir']=tmp['dir']
 1306:       
 1307:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadCheck.zpt')).__of__(self)
 1308:                 return pt(changed=tmp['changed'],errors=tmp['errors'],dir=tmp['dir'],newPs=tmp['newPs'],basketLen=tmp['basketLen'],numberOfFiles=tmp['numberOfFiles'],
 1309:                   basketNameFromId=tmp['basketNameFromId'],basketNameFromFile=tmp['basketNameFromFile'],basketId=tmp['basketId'])
 1310:                                        
 1311:     def uploadATFfinally(self,procedure='',comment="",basketname='',unlock=None,repeat=None,RESPONSE=None):
 1312:         """nowupload the files"""
 1313:        
 1314:        
 1315:        
 1316:         threadName=repeat
 1317:         if not threadName or threadName=="":
 1318:             
 1319:            
 1320:             self._v_uploadATF=uploadATFfinallyThread()
 1321: 
 1322:         
 1323:             self._v_uploadATF.set(procedure,comment=comment,basketname=basketname,unlock=unlock,SESSION=self.REQUEST.SESSION,username=self.REQUEST['AUTHENTICATED_USER'],serverport=self.REQUEST['SERVER_PORT'])
 1324: 
 1325:             self._v_uploadATF.start()
 1326: 
 1327:             
 1328:             self.threadName=self._v_uploadATF.getName()[0:]
 1329:             wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
 1330: 
 1331:             if wait_template:
 1332:                 return wait_template[0][1]()
 1333:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadATFWait.zpt')).__of__(self)
 1334: 
 1335:             return pt(txt='/uploadATFfinally')
 1336:             #_v_xmltrans.run()
 1337:         
 1338:         else:
 1339:             
 1340:             if hasattr(self,'_v_uploadATF') and (self._v_uploadATF is not None) and (not self._v_uploadATF.end) :
 1341: 
 1342:                 wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
 1343:                 if wait_template:
 1344:                         return wait_template[0][1]()
 1345:                 
 1346:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadATFWait.zpt')).__of__(self)
 1347:                 return pt(txt='/uploadATFfinally')
 1348:             else:
 1349: 
 1350:               if RESPONSE is not None:
 1351:                   RESPONSE.redirect(self.aq_parent.absolute_url())
 1352:                 
 1353:                                    
 1354: 
 1355: 
 1356:     def findObjectsFromList(self,start=None,upload=None,list=None,basketName=None,numberOfObjects=None,RESPONSE=None):
 1357:         """findObjectsFromList (, TAB oder LINE separated)"""
 1358:                                        
 1359:         
 1360:         if upload: # list from file upload
 1361:             txt=upload.read()
 1362:             txt=txt.replace(",","\n")
 1363:             txt=txt.replace("\t","\n")
 1364:             txt=txt.replace("\r","\n")
 1365:             idsTmp=txt.split("\n")
 1366:             ids=[]
 1367:             for id in idsTmp: # make sure that no empty lines
 1368:                 idTmp=id.lstrip().rstrip()
 1369:                 if len(idTmp)>0:
 1370:                     
 1371:                     ids.append(idTmp)
 1372:                     
 1373:             #self.REQUEST.SESSION['ids']=" OR ".join(ids)
 1374: 
 1375:             pt=getattr(self,'filelist.html')
 1376:             self.REQUEST.SESSION['searchList']=ids
 1377:             return pt(search=ids)
 1378:         
 1379:         if basketName:
 1380:             #TODO: get rid of one of these..
 1381:             
 1382:             pt=getattr(self,'filelist.html')
 1383:             return pt(basketName=basketName,numberOfObjects=numberOfObjects)
 1384:         
 1385:         if list is not None: # got already a list
 1386:             ret=[]
 1387:             for fileId in list:
 1388:                 if len(fileId.split("."))==1:
 1389:                         fileId=fileId+".atf"
 1390: 
 1391:                 ret+=self.CDLICatalog({'title':fileId})
 1392:             #TODO: get rid of one of these..
 1393:             self.REQUEST.SESSION['fileIds']=[x.getObject().getId() for x in ret]#store fieldIds in session for further usage
 1394:             self.REQUEST.SESSION['searchList']=self.REQUEST.SESSION['fileIds']
 1395:             return ret
 1396:         
 1397:         if start:
 1398:             RESPONSE.redirect("filelist.html?start:int="+str(start))
 1399:                                        
 1400: 
 1401: 
 1402:     security.declareProtected('Manage','createAllFilesAsSingleFile')
 1403:     def createAllFilesAsSingleFile(self,RESPONSE=None):
 1404:         """download all files"""
 1405:         
 1406:         def sortF(x,y):
 1407:             return cmp(x[0],y[0])
 1408:         
 1409:         catalog=getattr(self,self.default_catalog)
 1410:         #tf,tfilename=mkstemp()
 1411:         
 1412:         
 1413:         list=[(x.getId,x) for x in catalog()]
 1414:         list.sort(sortF)
 1415:         
 1416:         RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%"all.atf")
 1417:         RESPONSE.setHeader("Content-Type","application/octet-stream")
 1418:        
 1419:         for l in list:
 1420:             obj=l[1].getObject()
 1421:             
 1422:             if obj.meta_type=="CDLI file":
 1423:                 
 1424:                 #os.write(tf,obj.getLastVersion().data)
 1425:                 if RESPONSE:
 1426:                     RESPONSE.write(obj.getLastVersion().data[0:])
 1427:         #os.close(tf)
 1428:         #RESPONSE.redirect(self.absolute_url()+"/downloadFile?fn="%tfilename)
 1429:         return True
 1430:     
 1431:     def downloadFile(self,fn):
 1432:         """download fn - not used yet"""
 1433:         self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getLastVersion().getId())
 1434:         self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
 1435:         self.REQUEST.RESPONSE.write(file(fn).read())
 1436:         
 1437:       
 1438:                 
 1439:     def hasParent(self):
 1440:         """returns true falls subfolder"""
 1441:       
 1442:         if self.aq_parent.meta_type in self.folderMetaType:
 1443:             return True
 1444:         else:
 1445:             return False
 1446:         
 1447:     def getFolders(self):
 1448:         """get all subfolders"""
 1449:         ret=[]
 1450:         folders=self.ZopeFind(self,obj_metatypes=self.folderMetaType)
 1451:         for folder in folders:
 1452:             ret.append((folder[1],
 1453:                         len(self.ZopeFind(folder[1],obj_metatypes=self.folderMetaType)),
 1454:                         len(self.ZopeFind(folder[1],obj_metatypes=self.filesMetaType))
 1455:                         ))
 1456:         return ret
 1457:     
 1458:             
 1459:     def getFolders_OLD(self):
 1460:         """get all subfolders"""
 1461:         ret=[]
 1462:         folders=self.ZopeFind(self,obj_metatypes=self.folderMetaType)
 1463:         for folder in folders:
 1464:             ret.append((folder[1],
 1465:                         len(self.ZopeFind(folder[1],obj_metatypes=self.folderMetaType)),
 1466:                         len(getattr(self,self.default_catalog)({'path':folder[0]}))
 1467:                         ))
 1468:         return ret
 1469:     
 1470:     def index_html(self):
 1471:         """main"""
 1472:         ext=self.ZopeFind(self,obj_ids=["index.html"])
 1473:         if ext:
 1474:             return ext[0][1]()
 1475:         
 1476:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','CDLIFileFolderMain')).__of__(self)
 1477:         return pt()
 1478:     
 1479:     def importFiles(self,comment="",author="" ,folderName="/Users/dwinter/Documents/workspace/cdli/atf", files=None,ext=None):
 1480:         """import files"""
 1481:         
 1482:         if not files:
 1483:             files=os.listdir(folderName)
 1484:             
 1485:         for f in files:
 1486:             folder=f[0:3]
 1487:             f2=f[0:5]
 1488:             obj=self.ZopeFind(self,obj_ids=[folder])
 1489:             if ext:
 1490:   
 1491:                 ext.result+="<p>Adding: %s </p>"%f
 1492:             if not obj:
 1493:                 manage_addCDLIFileFolder(self,folder,folder)
 1494:                 fobj=getattr(self,folder)
 1495:         
 1496:             else:
 1497:                 fobj=obj[0][1]
 1498:             
 1499:             obj2=fobj.ZopeFind(fobj,obj_ids=[f2])
 1500:         
 1501:             if not obj2:
 1502:                 manage_addCDLIFileFolder(fobj,f2,f2)
 1503:                 fobj2=getattr(fobj,f2)
 1504:         
 1505:             else:
 1506:                 fobj2=obj2[0][1]
 1507:               
 1508:             file2=file(os.path.join(folderName,f))   
 1509:             id=f
 1510:             manage_addCDLIFile(fobj2,f,'','')
 1511:             id=f
 1512:             ob=fobj2._getOb(f)
 1513:             ob.title=id
 1514:             
 1515:             manage_addCDLIFileObject(ob,id,comment,author,file2,content_type='')
 1516:             self.CDLICatalog.catalog_object(ob)
 1517:             #self.CDLICatalog.manage_catalogFoundItems(obj_ids=[id],search_sub=1)
 1518:             #self.CDLICatalog.manage_catalogObject(self.REQUEST, self.REQUEST.RESPONSE, 'CDLICatalog', urlparse.urlparse(ob.absolute_url())[1])
 1519:             
 1520:         return "ok"
 1521:     
 1522: manage_addCDLIFileFolderForm=DTMLFile('dtml/folderAdd', globals())
 1523: 
 1524:     
 1525: def manage_addCDLIFileFolder(self, id, title='',
 1526:                      createPublic=0,
 1527:                      createUserF=0,
 1528:                      REQUEST=None):
 1529:     """Add a new Folder object with id *id*.
 1530: 
 1531:     If the 'createPublic' and 'createUserF' parameters are set to any true
 1532:     value, an 'index_html' and a 'UserFolder' objects are created respectively
 1533:     in the new folder.
 1534:     """
 1535:     ob=CDLIFileFolder()
 1536:     ob.id=str(id)
 1537:     ob.title=title
 1538:     self._setObject(id, ob)
 1539:     ob=self._getOb(id)
 1540: 
 1541:     checkPermission=getSecurityManager().checkPermission
 1542: 
 1543:     if createUserF:
 1544:         if not checkPermission('Add User Folders', ob):
 1545:             raise Unauthorized, (
 1546:                   'You are not authorized to add User Folders.'
 1547:                   )
 1548:         ob.manage_addUserFolder()
 1549: 
 1550:   
 1551:     if REQUEST is not None:
 1552:         return self.manage_main(self, REQUEST, update_menu=1)
 1553: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>