Annotation of versionedFile/versionedFile.py, revision 1.35

1.1       dwinter     1: from OFS.Folder import Folder
                      2: from OFS.Image import File
                      3: from OFS.Image import cookId
1.5       dwinter     4: from Globals import DTMLFile, InitializeClass,package_home
1.1       dwinter     5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
                      6: from AccessControl import getSecurityManager
                      7: from Products.PageTemplates.PageTemplate import PageTemplate
1.5       dwinter     8: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
1.1       dwinter     9: from AccessControl import ClassSecurityInfo
1.35    ! dwinter    10: 
        !            11: from threading import Thread
        !            12: import shutil
        !            13: import tempfile
1.5       dwinter    14: import os.path
1.19      dwinter    15: 
1.15      dwinter    16: import time
1.19      dwinter    17: try:
                     18:     from Products.ECHO_content.ECHO_collection import ECHO_basis
                     19: except:
                     20:     print "ECHO Elements not imported"
1.20      dwinter    21:     class ECHO_basis:
1.31      dwinter    22:         """leer"""
                     23:             manage_options=()
1.1       dwinter    24: 
1.19      dwinter    25:    
1.1       dwinter    26: def sortv(x,y):
                     27:     return cmp(x[0],y[0])
1.35    ! dwinter    28: tdir = "/tmp/testia"
        !            29: 
        !            30: class generateDownloadZip:
        !            31:     """generateDownloadSet"""
        !            32: 
        !            33:     def __init__(self,folderObject,url):
        !            34:         """init downloadzip"""
        !            35:         self.folder=folderObject
        !            36:         self.done=None
        !            37:         self.response=""
        !            38:         self.url=url
        !            39:         
        !            40:     def __call__(self):
        !            41:         """call generate download zip"""
        !            42:         storeTempDir=tempfile.tempdir
        !            43:    tempfile.tempdir=tdir
        !            44: 
        !            45:         tmpPath=tempfile.mktemp()
        !            46:         tmpZip=tempfile.mktemp()+".gtz"
        !            47:         tmpFn=os.path.split(tmpZip)[1]
        !            48:         
        !            49:         if not os.path.exists(tempfile.tempdir):
        !            50:             os.mkdir(tempfile.tempdir) 
        !            51: 
        !            52:         if not os.path.exists(tmpPath):
        !            53:            os.mkdir(tmpPath) 
        !            54:        
        !            55:    self.response="<h3>1. step: gettung the files</h3>"
        !            56: 
        !            57:         for files in self.folder.ZopeFind(self.folder,obj_metatypes=['versionedFile']):
        !            58:             lastV=files[1].getLastVersion()
        !            59:             self.response+=str("<p>Get File: %s<br>\n"%lastV.title)
        !            60: 
        !            61:             savePath=os.path.join(tmpPath,lastV.title)
        !            62:             fh=file(savePath,"w")
        !            63:             fh.write(lastV.data)
        !            64:             fh.close()
        !            65: 
        !            66:         self.response+="<h3>2. step: creating the downloadable file</h3>"
        !            67:    self.response+="<p>Create gtar<br>"
        !            68:         self.response+="<p>This can take a while....<br>\n"
        !            69: 
        !            70:         fh=os.popen2("tar zcvf %s %s/*"%(tmpZip,tmpPath),1)[1]
        !            71:         self.response+="<br>"
        !            72:         for c in fh.read():
        !            73:             self.response+=c
        !            74:             if c==")":
        !            75:                 self.response+="<br>\n"
        !            76:            
        !            77:                
        !            78: 
        !            79:         
        !            80:         shutil.rmtree(tmpPath)
        !            81: 
        !            82:         self.response+="<p>finished<br>\n"
        !            83: 
        !            84:         len=os.stat(tmpZip)[6]
        !            85:         downloadUrl=self.url+"/downloadSet"
        !            86:         self.response+="""<h1><a href="downloadSet?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len)
        !            87:         self.response+="""<p>The file will be stored for a while, you can download it later, the URL is:</p>
        !            88:            <p><a href="downloadSet?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn)
        !            89: 
        !            90:         self.done=True
        !            91: 
1.1       dwinter    92:  
1.35    ! dwinter    93:     def getResult(self):
        !            94:         """get result"""
        !            95:         return self.response
        !            96: 
        !            97:     def isDone(self):
        !            98:         if self.done:
        !            99:             return True
        !           100:         else:
        !           101:             return False
        !           102:         
        !           103: 
1.19      dwinter   104: class versionedFileFolder(Folder,ECHO_basis):
1.1       dwinter   105:     """Folder with versioned files"""
                    106: 
1.14      dwinter   107:     
1.1       dwinter   108:     meta_type = "versionedFileFolder"
                    109: 
                    110:     security= ClassSecurityInfo()
                    111:     security.declareProtected('AUTHENTICATED_USER','addFileForm')
1.19      dwinter   112: 
                    113:     if ECHO_basis:
                    114:         optTMP= Folder.manage_options+ECHO_basis.manage_options
                    115:     else:
                    116:         optTMP= Folder.manage_options
                    117: 
                    118:     manage_options =optTMP+(
1.5       dwinter   119:        {'label':'Generate Index.html','action':'generateIndexHTML'},
1.6       dwinter   120:                 {'label':'Generate history_template.html','action':'generateHistoryHTML'},
1.35    ! dwinter   121:                 {'label':'Import Folder','action':'importFolderForm'},
1.19      dwinter   122:                 )
1.5       dwinter   123: 
1.35    ! dwinter   124:     def importFolderForm(self):
        !           125:         """form fuer folder import"""
        !           126:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','importFolderForm.zpt')).__of__(self)
        !           127:         return pt()
        !           128:         
        !           129:     def importFolder(self,path,comment="",author=None,lockedBy=None,RESPONSE=None):
        !           130:         """importiere inhalt eines folders"""
        !           131: 
        !           132:         for fileName in os.listdir(path):
        !           133:             if os.path.isfile(os.path.join(path,fileName)):
        !           134:                 manage_addVersionedFile(self,fileName,'','')
        !           135:                 id=fileName
        !           136:                 ob=self._getOb(fileName)
        !           137:                 ob.title=id
        !           138:                 file2=file(os.path.join(path,fileName))
        !           139:         
        !           140:                 obj=ob.manage_addVersionedFileObject(id,comment,author,file2,content_type='')
        !           141: 
        !           142:         if RESPONSE:
        !           143:             RESPONSE.redirect(self.REQUEST['URL1'])
        !           144: 
        !           145:     zipThreads={}
        !           146:     zipThreads2={}
        !           147: 
        !           148:     def refreshTxt(self):
        !           149:         """txt fuer refresh"""
        !           150:         tn=self.REQUEST.SESSION['threadName']
        !           151:         return """ 2;url=%s?repeat=%s """%(self.absolute_url()+"/exportFolder",tn)
        !           152: 
        !           153:     def exportFolder(self,repeat=None):
        !           154:         """exportiert alle akutellen files des folders"""
        !           155:         threadName=repeat
        !           156:         
        !           157:                        
        !           158:         if not threadName or threadName=="":
        !           159:             threadStart=generateDownloadZip(self,self.absolute_url())
        !           160:             thread=Thread(target=threadStart)
        !           161:             
        !           162:             thread.start()
        !           163: 
        !           164:                     
        !           165:             self.zipThreads[thread.getName()[0:]]=threadStart
        !           166:             self.zipThreads2[thread.getName()[0:]]=thread
        !           167:             self.REQUEST.SESSION['threadName']=thread.getName()[0:]
        !           168:             wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['zip_wait_template'])
        !           169:             if wait_template:
        !           170:                 return wait_template[0][1]()
        !           171:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self)
        !           172:             return pt()
        !           173:                 
        !           174:         else:
        !           175:             self.REQUEST.SESSION['threadName']=threadName
        !           176: 
        !           177:             if (self.zipThreads[threadName].getResult()==None):
        !           178: 
        !           179:                 wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
        !           180:                 if wait_template:
        !           181:                     return wait_template[0][1]()
        !           182: 
        !           183:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self)
        !           184:                 return pt()
        !           185:             else:
        !           186:                 if self.zipThreads[threadName].isDone():
        !           187:                     self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult()
        !           188:                     self.zipThreads2[threadName].join()
        !           189:                     del(self.zipThreads2[threadName])
        !           190:                     del(self.zipThreads[threadName])
        !           191:                     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_result.zpt')).__of__(self)
        !           192:                     return pt()
        !           193: 
        !           194:                 else:
        !           195:                     self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult()
        !           196:                     self.REQUEST.SESSION['threadName']=threadName
        !           197:                     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait_result.zpt')).__of__(self)
        !           198:                     return pt()
        !           199: 
        !           200:     def downloadSet(self,fn):
        !           201:        """download prepared set"""
        !           202:        filename=os.path.join(tdir,fn)
        !           203: 
        !           204:        
        !           205:        self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%"donloadFileFolder.tgz")
        !           206:        self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
        !           207:        len=os.stat(filename)[6]
        !           208:        self.REQUEST.RESPONSE.setHeader("Content-Length",len)
        !           209:        images=file(filename).read()
        !           210:        self.REQUEST.RESPONSE.write(images)
        !           211:        self.REQUEST.RESPONSE.close()
        !           212: 
        !           213:    
        !           214: 
1.14      dwinter   215:     def helpDownload(self):
                    216:         """download help"""
                    217:         
1.19      dwinter   218:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','helpDownload')).__of__(self)
1.14      dwinter   219:         return pt()
                    220:     
1.5       dwinter   221:     def generateIndexHTML(self,RESPONSE=None):
                    222:         """lege standard index.html an"""
                    223: 
                    224: 
1.22      dwinter   225:         if not self.ZopeFind(self,obj_ids=['index.html']):
1.5       dwinter   226:             zt=ZopePageTemplate('index.html')
                    227:             self._setObject('index.html',zt)
                    228:             default_content_fn = os.path.join(package_home(globals()),
                    229:                                                'zpt/versionFileFolderMain.zpt')
                    230:             text = open(default_content_fn).read()
                    231:             zt.pt_edit(text, 'text/html')
                    232: 
                    233:         else:
                    234:             return "already exists!"
                    235:         
                    236:         if RESPONSE is not None:
                    237:             RESPONSE.redirect('manage_main')
                    238: 
1.6       dwinter   239: 
                    240:     def generateHistoryHTML(self,RESPONSE=None):
                    241:         """lege standard index.html an"""
                    242: 
1.5       dwinter   243:         
1.6       dwinter   244: 
1.22      dwinter   245:         if not self.ZopeFind(self,obj_ids=['history_template.html']):
1.6       dwinter   246:             zt=ZopePageTemplate('history_template.html')
                    247:             self._setObject('history_template.html',zt)
                    248:             default_content_fn = os.path.join(package_home(globals()),
                    249:                                                'zpt/versionHistory.zpt')
                    250:             text = open(default_content_fn).read()
                    251:             zt.pt_edit(text, 'text/html')
                    252: 
                    253:         else:
                    254:             return "already exists!"
                    255:         
                    256:         if RESPONSE is not None:
                    257:             RESPONSE.redirect('manage_main')
                    258: 
1.32      dwinter   259:     
                    260:        
                    261: 
1.12      dwinter   262:     def getVersionedFiles(self,sortField='title'):
1.1       dwinter   263:         """get all versioned files"""
1.12      dwinter   264: 
                    265:         def sortName(x,y):
1.18      dwinter   266:             return cmp(x[1].title.lower(),y[1].title.lower())
1.12      dwinter   267: 
                    268:         def sortDate(x,y):
1.17      dwinter   269:             return cmp(y[1].getLastVersion().getTime(),x[1].getLastVersion().getTime())
1.12      dwinter   270: 
1.32      dwinter   271:         
1.30      dwinter   272:         def sortComment(x,y):
1.34      dwinter   273: 
                    274:         
                    275:             
1.31      dwinter   276:     try:
1.34      dwinter   277:        xc=getattr(x[1],'comment','ZZZZZZZZZZZZZ').lower()
1.31      dwinter   278:     except:
1.34      dwinter   279:        xc='ZZZZZZZZZZZZZ'.lower()
1.31      dwinter   280:     try:
1.34      dwinter   281:        yc=getattr(y[1],'comment','ZZZZZZZZZZZZZ').lower()
1.31      dwinter   282:          except:
1.34      dwinter   283:             yc='ZZZZZZZZZZZZZ'.lower()
                    284: 
                    285: 
                    286:          if (xc=='') or (xc=='ZZZZZZZZZZZZZ'.lower()):
                    287:              
                    288:              try:
                    289:                  xc=x[1].getLastVersion().getVComment().lower()
                    290:              except:
                    291:                  xc='ZZZZZZZZZZZZZ'.lower()
                    292:                  
                    293:          if (yc=='') or (yc=='ZZZZZZZZZZZZZ'.lower()):
                    294:              try:
                    295:                  yc=y[1].getLastVersion().getVComment().lower()
                    296:              except:
                    297:                  yc='ZZZZZZZZZZZZZ'.lower()
                    298: 
                    299:          
                    300:          return cmp(xc,yc)
1.31      dwinter   301: 
1.12      dwinter   302:         def sortAuthor(x,y):
1.13      dwinter   303:             
1.30      dwinter   304:             return cmp(x[1].getLastVersion().lastEditor().lower(),y[1].getLastVersion().lastEditor().lower())
1.3       dwinter   305:         
1.2       dwinter   306:    versionedFiles=self.ZopeFind(self,obj_metatypes=['versionedFile'])
1.12      dwinter   307: 
                    308:         if sortField=='title':
                    309:             versionedFiles.sort(sortName)
                    310:         elif sortField=='date':
                    311:             versionedFiles.sort(sortDate)
                    312:         elif sortField=='author':
                    313:             versionedFiles.sort(sortAuthor)
1.30      dwinter   314:         elif sortField=='comment':
                    315:             versionedFiles.sort(sortComment)
1.12      dwinter   316: 
1.1       dwinter   317:         return versionedFiles
                    318: 
1.4       dwinter   319: 
                    320:     def header_html(self):
                    321:         """zusätzlicher header"""
                    322:         ext=self.ZopeFind(self,obj_ids=["header.html"])
                    323:         if ext:
                    324:             return ext[0][1]()
                    325:         else:
                    326:             return ""
                    327:         
1.1       dwinter   328:     def index_html(self):
                    329:         """main"""
1.4       dwinter   330:         ext=self.ZopeFind(self,obj_ids=["index.html"])
                    331:         if ext:
1.5       dwinter   332:             return ext[0][1]()
1.4       dwinter   333:         
1.19      dwinter   334:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionFileFolderMain')).__of__(self)
1.1       dwinter   335:         return pt()
                    336: 
                    337: 
                    338:     def addFileForm(self):
                    339:         """add a file"""
1.21      dwinter   340:         ext=self.ZopeFind(self,obj_ids=["addFileForm.dtml"])
                    341:         if ext:
                    342:             return ext[0][1]('',globals(),version='1',AUTHENTICATED_USER=self.REQUEST.AUTHENTICATED_USER)
                    343:         
1.1       dwinter   344:         out=DTMLFile('dtml/newFileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version='1').__of__(self)
                    345:         return out()
                    346: 
                    347: 
1.11      dwinter   348:     def addFile(self,vC,file,author,newName='',content_type='',RESPONSE=None):
1.1       dwinter   349:         """ add a new file"""
1.11      dwinter   350:         if newName=='':
1.24      dwinter   351:             filename=file.filename
                    352:             id=filename[max(filename.rfind('/'),
                    353:                                     filename.rfind('\\'),
                    354:                                     filename.rfind(':'),
                    355:                                     )+1:]
1.25      dwinter   356: 
1.11      dwinter   357:         else:
                    358:             id=newName
1.1       dwinter   359:         
                    360:         vC=self.REQUEST.form['vC']
                    361:         manage_addVersionedFile(self,id,'','')
1.21      dwinter   362:         #if (getattr(self,'commentNonEmpty',0)==1) and vC.strip()=="":
                    363:             
                    364:             
1.1       dwinter   365:         ob=self._getOb(id)
                    366:         ob.title=id
1.3       dwinter   367:         file2=file
1.23      dwinter   368:         
                    369:         obj=ob.manage_addVersionedFileObject(id,vC,author,file2,content_type=content_type)
1.27      dwinter   370:         self.REQUEST.SESSION['objID']=ob.getId()
                    371:         self.REQUEST.SESSION['objID_parent']=None
1.1       dwinter   372: 
1.23      dwinter   373:         if obj.getSize()==0:
                    374:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
                    375:             return pt()
                    376:         
1.1       dwinter   377:         RESPONSE.redirect(self.REQUEST['URL1'])
                    378: 
1.27      dwinter   379: 
                    380:     def deleteEmptyObject(self,submit,RESPONSE=None):
                    381:         """deleteemptyobject"""
                    382:         if submit=="delete it":
                    383:             if self.REQUEST.SESSION['objID_parent']:
                    384:                 obj=getattr(self,self.REQUEST.SESSION['objID_parent'])
                    385: 
                    386:             else:
                    387:                 obj=self
                    388:             obj.manage_delObjects([self.REQUEST.SESSION['objID']])
                    389: 
                    390:         RESPONSE.redirect(self.REQUEST['URL1'])
                    391:         
1.1       dwinter   392:         
                    393: manage_addVersionedFileFolderForm=DTMLFile('dtml/folderAdd', globals())
                    394: 
                    395: 
                    396: def manage_addVersionedFileFolder(self, id, title='',
                    397:                      createPublic=0,
                    398:                      createUserF=0,
                    399:                      REQUEST=None):
                    400:     """Add a new Folder object with id *id*.
                    401: 
                    402:     If the 'createPublic' and 'createUserF' parameters are set to any true
                    403:     value, an 'index_html' and a 'UserFolder' objects are created respectively
                    404:     in the new folder.
                    405:     """
                    406:     ob=versionedFileFolder()
                    407:     ob.id=str(id)
                    408:     ob.title=title
                    409:     self._setObject(id, ob)
                    410:     ob=self._getOb(id)
                    411: 
                    412:     checkPermission=getSecurityManager().checkPermission
                    413: 
                    414:     if createUserF:
                    415:         if not checkPermission('Add User Folders', ob):
                    416:             raise Unauthorized, (
                    417:                   'You are not authorized to add User Folders.'
                    418:                   )
                    419:         ob.manage_addUserFolder()
                    420: 
                    421:   
                    422:     if REQUEST is not None:
                    423:         return self.manage_main(self, REQUEST, update_menu=1)
                    424: 
                    425: 
                    426: 
                    427: class versionedFileObject(File):
                    428:     """File Object im Folder"""
                    429:     
                    430:     meta_type = "versionedFileObject"
                    431:     
                    432:     manage_editForm  =DTMLFile('dtml/fileEdit',globals(),
                    433:                                Kind='File',kind='file')
                    434:     manage_editForm._setName('manage_editForm')
1.14      dwinter   435: 
1.32      dwinter   436:     def getVComment(self):
                    437:         """get the comment of this file"""
                    438:         if not hasattr(self,'vComment') or (not self.vComment) or (self.vComment.lstrip()==""):
                    439:             return "Add comment"
                    440: 
                    441:         else:
                    442:             return self.vComment
                    443:             
                    444:     def manageVCommentForm(self):
                    445:         """add a comment"""
1.34      dwinter   446: 
                    447:         self.REQUEST.SESSION['refer']=self.REQUEST['HTTP_REFERER']
                    448: 
                    449: 
                    450:         
1.32      dwinter   451:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVComment')).__of__(self)
                    452:         return pt()
                    453: 
                    454:     def manageVComment(self,text,comment_author,submit,REQUEST=None):
                    455:         """manage comments"""
                    456:         if submit =='change':
                    457:             if text=='':
                    458:                 self.vComment=None
                    459:             else:
                    460:                 self.vComment=text
                    461:                 self.vComment_author=comment_author
                    462: 
                    463:                 self.vComment_date=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
                    464: 
1.34      dwinter   465:         if self.REQUEST.SESSION.has_key('refer'):
                    466: 
                    467:             return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer'])
1.32      dwinter   468:         return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url()+"/history")
                    469:     
                    470: 
1.15      dwinter   471:     def getTime(self):
                    472:         """getTime"""
                    473:         #return self.bobobase_modification_time().ISO()
                    474:         if hasattr(self,'time'):
                    475:             return time.strftime("%Y-%m-%d %H:%M:%S",self.time)
1.16      dwinter   476:    elif hasattr(self,'timefixed'):
                    477:        return self.timefixed
1.15      dwinter   478:         else:
1.16      dwinter   479:        setattr(self,'timefixed',self.bobobase_modification_time().ISO())
1.15      dwinter   480:             return self.bobobase_modification_time().ISO()
                    481: 
                    482: 
                    483: 
1.14      dwinter   484:     
1.1       dwinter   485: 
1.7       dwinter   486:     def download(self):
                    487:         """download and lock"""
                    488:         
1.33      dwinter   489:         self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getId())
                    490:    self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
                    491:       
1.10      dwinter   492:         self.content_type="application/octet-stream"
1.33      dwinter   493:         #self.REQUEST.RESPONSE.redirect(self.absolute_url())
                    494:         self.REQUEST.RESPONSE.write(self.index_html())
                    495:         #self.REQUEST.RESPONSE.write("bl")
                    496:         self.REQUEST.close()
1.7       dwinter   497:     
                    498:     def downloadLocked(self):
                    499:         """download and lock"""
                    500:         
                    501:         
                    502:         if self.REQUEST['AUTHENTICATED_USER']=='Anonymous User':
                    503:             return "please login first"
                    504:         if not self.aq_parent.lockedBy=="":
                    505:             return "cannot be locked because is already locked by %s"%self.lockedBy
                    506:         self.aq_parent.lockedBy=self.REQUEST['AUTHENTICATED_USER']
1.1       dwinter   507: 
1.10      dwinter   508:         self.content_type="application/octet-stream"
1.7       dwinter   509:         self.REQUEST.RESPONSE.redirect(self.absolute_url())
                    510:     
1.1       dwinter   511:     def setVersionNumber(self,versionNumber):
                    512:         """set version"""
                    513:         self.versionNumber=versionNumber
                    514: 
                    515:     def getVersionNumber(self):
                    516:         """get version"""
                    517:         return self.versionNumber
                    518: 
1.32      dwinter   519:    
                    520:             
1.1       dwinter   521:     def lastEditor(self):
                    522:         """last Editor"""
1.5       dwinter   523:         if hasattr(self,'author'):
1.32      dwinter   524:             ret=self.author.replace("-","\n")
                    525:             ret=ret.replace("\r","\n")
                    526:             return ret
                    527: 
1.5       dwinter   528:         else:
                    529:             jar=self._p_jar
                    530:             oid=self._p_oid
                    531: 
                    532:             if jar is None or oid is None: return None
                    533: 
                    534:             return jar.db().history(oid)[0]['user_name']
1.1       dwinter   535: 
                    536:     
                    537:     
                    538:         
                    539: manage_addVersionedFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject', version='1')
                    540: 
1.5       dwinter   541: def manage_addVersionedFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='',
1.1       dwinter   542:                    REQUEST=None):
                    543:     """Add a new File object.
                    544: 
                    545:     Creates a new File object 'id' with the contents of 'file'"""
1.5       dwinter   546: 
1.1       dwinter   547:     id=str(id)
                    548:     title=str(title)
                    549:     content_type=str(content_type)
                    550:     precondition=str(precondition)
1.3       dwinter   551:     
1.1       dwinter   552:     id, title = cookId(id, title, file)
                    553: 
                    554:     self=self.this()
                    555: 
                    556:     # First, we create the file without data:
                    557:     self._setObject(id, versionedFileObject(id,title,'',content_type, precondition))
                    558:     self._getOb(id).versionComment=str(vC)
1.15      dwinter   559:     self._getOb(id).time=time.localtime()
                    560:     
1.5       dwinter   561:     setattr(self._getOb(id),'author',author)
1.1       dwinter   562:     
                    563:     # Now we "upload" the data.  By doing this in two steps, we
                    564:     # can use a database trick to make the upload more efficient.
                    565:     if file:
                    566:         self._getOb(id).manage_upload(file)
                    567:     if content_type:
                    568:         self._getOb(id).content_type=content_type
                    569: 
                    570:     if REQUEST is not None:
                    571:         REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
                    572: 
                    573: 
                    574: 
                    575: 
                    576: class versionedFile(Folder):
                    577:     """Versioniertes File"""
                    578: 
1.5       dwinter   579:     def __init__(self, id, title, lockedBy,author):
1.1       dwinter   580:         """init"""
                    581:         self.id=id
                    582:         self.title=title
                    583:         self.lockedBy=lockedBy
1.5       dwinter   584:         self.author=author
1.32      dwinter   585: 
                    586:     def getComment(self):
                    587:         """get the comment of this file"""
                    588:         if not hasattr(self,'comment') or (not self.comment) or (self.comment.lstrip()==""):
                    589:             return "Add comment"
                    590: 
                    591:         else:
                    592:             return self.comment
                    593:             
1.1       dwinter   594:         
                    595:     meta_type="versionedFile"
                    596: 
1.26      dwinter   597:     def manageCommentForm(self):
                    598:         """add a comment"""
                    599:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addComment')).__of__(self)
                    600:         return pt()
                    601: 
                    602:     def manageComment(self,text,comment_author,submit,REQUEST=None):
                    603:         """manage comments"""
                    604:         if submit =='change':
                    605:             if text=='':
                    606:                 self.comment=None
                    607:             else:
                    608:                 self.comment=text
                    609:                 self.comment_author=comment_author
                    610: 
                    611:                 self.comment_date=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
                    612: 
                    613:         return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url())
                    614:     
1.1       dwinter   615:     def getLastVersion(self):
                    616:         """Last Version"""
                    617:         tmp=0
                    618:         lastVersion=None
1.2       dwinter   619:         
1.1       dwinter   620:         for version in self.ZopeFind(self):
1.2       dwinter   621:             
1.1       dwinter   622:             if hasattr(version[1],'versionNumber'):
1.2       dwinter   623:                 
1.1       dwinter   624:                 if int(version[1].versionNumber) > tmp:
                    625:                     tmp=int(version[1].versionNumber,)
                    626:                     lastVersion=version[1]
                    627:         return lastVersion
                    628:     
                    629:     def index_html(self):
                    630:         """main view"""
                    631:         lastVersion=self.getLastVersion()
                    632:         #return "File:"+self.title+"  Version:%i"%lastVersion.versionNumber," modified:",lastVersion.bobobase_modification_time()," size:",lastVersion.getSize(),"modified by:",lastVersion.lastEditor()
1.15      dwinter   633:         return "File: %s Version:%i modified:%s size:%s modified by:%s"%(self.title,lastVersion.versionNumber,lastVersion.getTime(),lastVersion.getSize(),lastVersion.lastEditor())
1.1       dwinter   634:                                                                          
                    635:     def getVersion(self):
                    636:         tmp=0
                    637:         for version in self.ZopeFind(self):
1.2       dwinter   638:             
1.1       dwinter   639:             if hasattr(version[1],'versionNumber'):
1.2       dwinter   640:                 
1.1       dwinter   641:                 if int(version[1].versionNumber) > tmp:
                    642:                     tmp=int(version[1].versionNumber,)
                    643:         return tmp+1
                    644: 
                    645:     security= ClassSecurityInfo()
                    646:     security.declareProtected('AUTHENTICATED_USER','unlock')
                    647: 
                    648:     def history(self):
1.6       dwinter   649:         """history"""  
                    650: 
                    651:         ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"])
                    652:         if ext:
                    653:             return getattr(self,ext[0][1].getId())()
                    654:         
1.19      dwinter   655:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionHistory')).__of__(self)
1.1       dwinter   656:         return pt()
                    657: 
                    658:     def getVersions(self):
                    659:         """get all versions"""
                    660:         ret=[]
                    661:         for version in self.ZopeFind(self):
                    662:             if hasattr(version[1],'versionNumber'):
                    663:                 ret.append((version[1].versionNumber,version[1]))
                    664:         ret.sort(sortv)
                    665:         return ret
                    666: 
1.28      dwinter   667:     security.declareProtected('AUTHENTICATED_USER','forceunlock')   
                    668:     def forceunlock(self,RESPONSE):
1.1       dwinter   669:         """unlock"""
1.28      dwinter   670:         self.lockedBy=''
1.29      dwinter   671: 
                    672:     security.declareProtected('AUTHENTICATED_USER','unlock')   
                    673:     def unlock(self,RESPONSE):
                    674:         """unlock"""
                    675:         if str(self.lockedBy) in [str(self.REQUEST['AUTHENTICATED_USER'])]:
                    676:             self.lockedBy=''
                    677:             RESPONSE.redirect(self.REQUEST['URL2'])
                    678:         else:
                    679:             return "Sorry, not locked by you! (%s,%s)"%(self.lockedBy,self.REQUEST['AUTHENTICATED_USER'])
                    680:         
                    681: 
1.8       dwinter   682:     
1.1       dwinter   683:     security.declareProtected('AUTHENTICATED_USER','addVersionedFileObjectForm')
                    684: 
                    685:     def addVersionedFileObjectForm(self):
                    686:         """add a new version"""
1.2       dwinter   687:         
                    688:         if str(self.REQUEST['AUTHENTICATED_USER']) in ["Anonymous User"]:
1.1       dwinter   689:             return "please login first"
                    690:         if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''):
                    691:             out=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version=self.getVersion()).__of__(self)
                    692:             return out()
                    693:         else:
                    694:             return "Sorry file is locked by somebody else"
                    695:         
1.11      dwinter   696:     def manage_addVersionedFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None):
1.1       dwinter   697:         """add"""
1.35    ! dwinter   698:         try: #der ganze vC unsinn muss ueberarbeitet werden
        !           699:             vC=self.REQUEST['vC']
        !           700:         except:
        !           701:             pass
1.1       dwinter   702:         
1.5       dwinter   703:         author=self.REQUEST['author']
1.6       dwinter   704:         
                    705:         if changeName=="yes":
1.24      dwinter   706:             filename=file.filename
                    707:             self.title=filename[max(filename.rfind('/'),
                    708:                         filename.rfind('\\'),
                    709:                         filename.rfind(':'),
                    710:                         )+1:]
                    711: 
1.6       dwinter   712: 
1.11      dwinter   713:         if not newName=='':
                    714:             self.title=newName[0:]
1.35    ! dwinter   715:         print self.title
        !           716:         
1.1       dwinter   717:         id="V%i"%self.getVersion()+"_"+self.title
1.23      dwinter   718:         
1.5       dwinter   719:         manage_addVersionedFileObject(self,id,vC,author,file,"V%i"%self.getVersion()+"_"+self.title,precondition, content_type)
1.1       dwinter   720:         objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
1.27      dwinter   721:         self.REQUEST.SESSION['objID_parent']=self.getId()
1.23      dwinter   722: 
1.1       dwinter   723:         if RESPONSE:
1.27      dwinter   724:             obj=self.ZopeFind(self,obj_ids=[id])[0][1]
                    725:             if obj.getSize()==0:
                    726:                 self.REQUEST.SESSION['objID']=obj.getId()
1.23      dwinter   727:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
                    728:                 return pt()
                    729: 
                    730:             else:
                    731:                 RESPONSE.redirect(self.REQUEST['URL2'])
1.1       dwinter   732: 
1.23      dwinter   733:         else:
                    734:             return self.ZopeFind(self,obj_ids=[id])[0][1]
                    735:         
1.1       dwinter   736:     security.declareProtected('AUTHENTICATED_USER','downloadLocked')
                    737: 
1.7       dwinter   738:     def download(self):
                    739:         """download and lock"""
1.33      dwinter   740: 
                    741:         self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getLastVersion().getId())
                    742:    self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
                    743:       
                    744:         self.content_type="application/octet-stream"
                    745:         #self.REQUEST.RESPONSE.write("bl")
                    746:         self.REQUEST.RESPONSE.write(self.getLastVersion().index_html())
                    747:         self.REQUEST.close()
                    748: 
                    749:         #self.getLastVersion().content_type="application/octet-stream"
                    750:         #self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
1.7       dwinter   751:     
1.1       dwinter   752:     def downloadLocked(self):
                    753:         """download and lock"""
                    754:         if self.REQUEST['AUTHENTICATED_USER']=='Anonymous User':
                    755:             return "please login first"
                    756:         if not self.lockedBy=="":
                    757:             return "cannot be locked because is already locked by %s"%self.lockedBy
                    758:         self.lockedBy=self.REQUEST['AUTHENTICATED_USER']
1.9       dwinter   759:         self.getLastVersion().content_type="application/octet-stream"
1.1       dwinter   760:         self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
                    761:     
                    762: def manage_addVersionedFileForm(self):
                    763:     """interface for adding the OSAS_root"""
1.19      dwinter   764:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVersionedFile.zpt')).__of__(self)
1.1       dwinter   765:     return pt()
                    766: 
1.5       dwinter   767: def manage_addVersionedFile(self,id,title,lockedBy, author=None, RESPONSE=None):
1.1       dwinter   768:     """add the OSAS_root"""
1.5       dwinter   769:     newObj=versionedFile(id,title,lockedBy,author)
1.1       dwinter   770:     self._setObject(id,newObj)
1.5       dwinter   771:    
1.1       dwinter   772:     if RESPONSE is not None:
                    773:         RESPONSE.redirect('manage_main')
                    774: 
                    775: 
                    776: InitializeClass(versionedFile)
                    777: InitializeClass(versionedFileFolder)

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