Annotation of externalVersionedFile/externalVersionedFile.py, revision 1.1

1.1     ! dwinter     1: from Products.ExternalFile.FileUtils import copy_file
        !             2: from Products.ExternalFile.ExternalFile import ExternalFile
        !             3: from OFS.Folder import Folder
        !             4: from OFS.Image import File
        !             5: from OFS.Image import cookId
        !             6: from Globals import DTMLFile, InitializeClass,package_home
        !             7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
        !             8: from AccessControl import getSecurityManager
        !             9: from Products.PageTemplates.PageTemplate import PageTemplate
        !            10: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
        !            11: from AccessControl import ClassSecurityInfo
        !            12: import os.path
        !            13: import time
        !            14: 
        !            15: def sortv(x,y):
        !            16:     return cmp(x[0],y[0])
        !            17:  
        !            18: class externalVersionedFileFolder(Folder):
        !            19:     """Folder with externalVersioned files"""
        !            20: 
        !            21:     
        !            22:     meta_type = "externalVersionedFileFolder"
        !            23: 
        !            24:     security= ClassSecurityInfo()
        !            25:     security.declareProtected('AUTHENTICATED_USER','addFileForm')
        !            26:     
        !            27:     manage_options = Folder.manage_options+(
        !            28:        {'label':'Generate Index.html','action':'generateIndexHTML'},
        !            29:                 {'label':'Generate history_template.html','action':'generateHistoryHTML'},
        !            30:                 {'label':'Change Path to Folder','action':'changePathForm'},
        !            31:        )
        !            32: 
        !            33:     def changePathForm(self):
        !            34:         """change the path form"""
        !            35:         pt=PageTemplateFile('Products/externalVersionedFile/zpt/changePath').__of__(self)
        !            36:         return pt()
        !            37: 
        !            38:     def changePath(self,baseFolderPath,RESPONSE=None):
        !            39:         """change the path"""
        !            40:         self.baseFolderPath=baseFolderPath
        !            41:         if RESPONSE is not None:
        !            42:             return self.manage_main(self, RESPONSE)
        !            43: 
        !            44: 
        !            45:         
        !            46:     def helpDownload(self):
        !            47:         """download help"""
        !            48:         
        !            49:         pt=PageTemplateFile('Products/externalVersionedFile/zpt/helpDownload').__of__(self)
        !            50:         return pt()
        !            51: 
        !            52:   
        !            53:     def generateIndexHTML(self,RESPONSE=None):
        !            54:         """lege standard index.html an"""
        !            55: 
        !            56:         
        !            57: 
        !            58:   
        !            59:         if not hasattr(self,'index.html'):
        !            60:             zt=ZopePageTemplate('index.html')
        !            61:             self._setObject('index.html',zt)
        !            62:             default_content_fn = os.path.join(package_home(globals()),
        !            63:                                                'zpt/versionFileFolderMain.zpt')
        !            64:             text = open(default_content_fn).read()
        !            65:             zt.pt_edit(text, 'text/html')
        !            66: 
        !            67:         else:
        !            68:             return "already exists!"
        !            69:         
        !            70:         if RESPONSE is not None:
        !            71:             RESPONSE.redirect('manage_main')
        !            72: 
        !            73: 
        !            74:     def generateHistoryHTML(self,RESPONSE=None):
        !            75:         """lege standard index.html an"""
        !            76: 
        !            77:         
        !            78: 
        !            79:         
        !            80:         if not hasattr(self,'history_template.html'):
        !            81:             zt=ZopePageTemplate('history_template.html')
        !            82:             self._setObject('history_template.html',zt)
        !            83:             default_content_fn = os.path.join(package_home(globals()),
        !            84:                                                'zpt/versionHistory.zpt')
        !            85:             text = open(default_content_fn).read()
        !            86:             zt.pt_edit(text, 'text/html')
        !            87: 
        !            88:         else:
        !            89:             return "already exists!"
        !            90:         
        !            91:         if RESPONSE is not None:
        !            92:             RESPONSE.redirect('manage_main')
        !            93: 
        !            94:     def getVersionedFiles(self,sortField='title'):
        !            95:         """get all versioned files"""
        !            96: 
        !            97:         def sortName(x,y):
        !            98:             return cmp(x[1].title,y[1].title)
        !            99: 
        !           100:         def sortDate(x,y):
        !           101:             return cmp(x[1].getLastVersion().getTime(),y[1].getLastVersion().getTime)
        !           102: 
        !           103: 
        !           104:         def sortAuthor(x,y):
        !           105:             
        !           106:             return cmp(x[1].getLastVersion().lastEditor(),y[1].getLastVersion().lastEditor())
        !           107:         
        !           108:    externalVersionedFiles=self.ZopeFind(self,obj_metatypes=['externalVersionedFile'])
        !           109: 
        !           110:         if sortField=='title':
        !           111:             externalVersionedFiles.sort(sortName)
        !           112:         elif sortField=='date':
        !           113:             externalVersionedFiles.sort(sortDate)
        !           114:         elif sortField=='author':
        !           115:             externalVersionedFiles.sort(sortAuthor)
        !           116: 
        !           117:         return externalVersionedFiles
        !           118: 
        !           119: 
        !           120:     def header_html(self):
        !           121:         """zusätzlicher header"""
        !           122:         ext=self.ZopeFind(self,obj_ids=["header.html"])
        !           123:         if ext:
        !           124:             return ext[0][1]()
        !           125:         else:
        !           126:             return ""
        !           127: 
        !           128: #    security.declareProtected('index_html')
        !           129:     def index_html(self):
        !           130:         """main"""
        !           131:         ext=self.ZopeFind(self,obj_ids=["index.html"])
        !           132:         if ext:
        !           133:             return ext[0][1]()
        !           134:         
        !           135:         pt=PageTemplateFile('Products/externalVersionedFile/zpt/versionFileFolderMain').__of__(self)
        !           136:         return pt()
        !           137: 
        !           138: 
        !           139:     def addFileForm(self):
        !           140:         """add a file"""
        !           141:         out=DTMLFile('dtml/newFileAdd', globals(),Kind='ExternalVersionedFileObject',kind='externalVersionedFileObject',version='1').__of__(self)
        !           142:         return out()
        !           143: 
        !           144: 
        !           145:     def addFile(self,vC,file,author,newName='',content_type='',RESPONSE=None):
        !           146:         """ add a new file"""
        !           147:         if newName=='':
        !           148:             id=file.filename
        !           149:         else:
        !           150:             id=newName
        !           151:         
        !           152:         vC=self.REQUEST.form['vC']
        !           153:         manage_addExternalVersionedFile(self,id,'','')
        !           154:         ob=self._getOb(id)
        !           155:         ob.title=id
        !           156:         file2=file
        !           157:         ob.manage_addExternalVersionedFileObject(id,vC,author,file2,content_type=content_type)
        !           158: 
        !           159:         RESPONSE.redirect(self.REQUEST['URL1'])
        !           160: 
        !           161:         
        !           162: manage_addExternalVersionedFileFolderForm=DTMLFile('dtml/folderAdd', globals())
        !           163: 
        !           164: 
        !           165: def manage_addExternalVersionedFileFolder(self, id, baseFolderPath,title='',
        !           166:                      createPublic=0,
        !           167:                      createUserF=0,
        !           168:                      REQUEST=None):
        !           169:     """Add a new Folder object with id *id*.
        !           170: 
        !           171:     If the 'createPublic' and 'createUserF' parameters are set to any true
        !           172:     value, an 'index_html' and a 'UserFolder' objects are created respectively
        !           173:     in the new folder.
        !           174:     """
        !           175:     ob=externalVersionedFileFolder()
        !           176:     ob.id=str(id)
        !           177:     ob.title=title
        !           178:     self._setObject(id, ob)
        !           179:     ob=self._getOb(id)
        !           180:     setattr(ob,'baseFolderPath',baseFolderPath)
        !           181:     checkPermission=getSecurityManager().checkPermission
        !           182: 
        !           183:     if createUserF:
        !           184:         if not checkPermission('Add User Folders', ob):
        !           185:             raise Unauthorized, (
        !           186:                   'You are not authorized to add User Folders.'
        !           187:                   )
        !           188:         ob.manage_addUserFolder()
        !           189: 
        !           190:   
        !           191:     if REQUEST is not None:
        !           192:         return self.manage_main(self, REQUEST, update_menu=1)
        !           193: 
        !           194: 
        !           195: 
        !           196: class externalVersionedFileObject(ExternalFile):
        !           197:     """File Object im Folder"""
        !           198:     
        !           199:     meta_type = "externalVersionedFileObject"
        !           200:     
        !           201:     manage_editForm  =DTMLFile('dtml/fileEdit',globals(),
        !           202:                                Kind='File',kind='file')
        !           203:     manage_editForm._setName('manage_editForm')
        !           204: 
        !           205:     def getTime(self):
        !           206:         """getTime"""
        !           207:         #return self.bobobase_modification_time().ISO()
        !           208:         if hasattr(self,'time'):
        !           209:             return time.strftime("%Y-%m-%d %H:%M:%S",self.time)
        !           210:         else:
        !           211:             return self.bobobase_modification_time().ISO()
        !           212: 
        !           213:     def download(self):
        !           214:         """download and lock"""
        !           215:         
        !           216:         
        !           217:         self.content_type="application/octet-stream"
        !           218:         self.REQUEST.RESPONSE.redirect(self.absolute_url())
        !           219:     
        !           220:     def downloadLocked(self):
        !           221:         """download and lock"""
        !           222:         
        !           223:         
        !           224:         if self.REQUEST['AUTHENTICATED_USER']=='Anonymous User':
        !           225:             return "please login first"
        !           226:         if not self.aq_parent.lockedBy=="":
        !           227:             return "cannot be locked because is already locked by %s"%self.lockedBy
        !           228:         self.aq_parent.lockedBy=self.REQUEST['AUTHENTICATED_USER']
        !           229: 
        !           230:         self.content_type="application/octet-stream"
        !           231:         self.REQUEST.RESPONSE.redirect(self.absolute_url())
        !           232:     
        !           233:     def setVersionNumber(self,versionNumber):
        !           234:         """set version"""
        !           235:         self.versionNumber=versionNumber
        !           236: 
        !           237:     def getVersionNumber(self):
        !           238:         """get version"""
        !           239:         return self.versionNumber
        !           240: 
        !           241:     def lastEditor(self):
        !           242:         """last Editor"""
        !           243:         if hasattr(self,'author'):
        !           244:             return self.author            
        !           245:         else:
        !           246:             jar=self._p_jar
        !           247:             oid=self._p_oid
        !           248: 
        !           249:             if jar is None or oid is None: return None
        !           250: 
        !           251:             return jar.db().history(oid)[0]['user_name']
        !           252: 
        !           253:     
        !           254:     
        !           255:         
        !           256: manage_addExternalVersionedFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='ExternalVersionedFileObject',kind='externalVersionedFileObject', version='1')
        !           257: 
        !           258: def manage_addExternalVersionedFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='',
        !           259:                    REQUEST=None):
        !           260:     """
        !           261: 
        !           262:     Factory method to actually create an instance of ExternalFile.
        !           263:     ExternalFile.  This method assumes all parameters are correct (it
        !           264:     does no error checking).  It is called from CreationDialog.py once
        !           265:     all of the confirmation and error checking steps have been taken.
        !           266:     
        !           267:     You should call this method directly if you are creating an
        !           268:     instance of ExternalFile programmatically and have 'vetted' all of
        !           269:     your parameters for correctness.
        !           270: 
        !           271:     """
        !           272:     target_filepath=os.path.join(self.baseFolderPath,id)
        !           273:     basedir=''
        !           274:     if not id:
        !           275:         raise Exception('Required fields must not be blank')
        !           276: 
        !           277:     fully_resolved_target_filepath = os.path.join(basedir,target_filepath)    
        !           278:     if file:
        !           279:         copy_file(file, fully_resolved_target_filepath)        
        !           280:     
        !           281:     self._setObject(id, externalVersionedFileObject(id, title, str(vC),
        !           282:                                      fully_resolved_target_filepath))
        !           283:     self._getOb(id).reindex_object()
        !           284: 
        !           285:     self._getOb(id).versionComment=str(vC)
        !           286:     setattr(self._getOb(id),'author',author)
        !           287:     
        !           288:     if REQUEST is not None:
        !           289:         REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
        !           290: 
        !           291: def manage_addExternalVersionedFileObject_old(self,id,vC='',author='', file='',title='',precondition='', content_type='',
        !           292:                    REQUEST=None):
        !           293:     """Add a new File object.
        !           294: 
        !           295:     Creates a new File object 'id' with the contents of 'file'"""
        !           296: 
        !           297:     id=str(id)
        !           298:     title=str(title)
        !           299:     content_type=str(content_type)
        !           300:     precondition=str(precondition)
        !           301:     
        !           302:     id, title = cookId(id, title, file)
        !           303: 
        !           304:     self=self.this()
        !           305: 
        !           306:     # First, we create the file without data:
        !           307:     self._setObject(id, externalVersionedFileObject(id,title,'',content_type, precondition))
        !           308:     self._getOb(id).versionComment=str(vC)
        !           309:     self._getOb(id).time=time.localtime()
        !           310:     setattr(self._getOb(id),'author',author)
        !           311:     
        !           312:     # Now we "upload" the data.  By doing this in two steps, we
        !           313:     # can use a database trick to make the upload more efficient.
        !           314:     if file:
        !           315:         self._getOb(id).manage_upload(file)
        !           316:     if content_type:
        !           317:         self._getOb(id).content_type=content_type
        !           318: 
        !           319:     if REQUEST is not None:
        !           320:         REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
        !           321: 
        !           322: 
        !           323: 
        !           324: 
        !           325: class externalVersionedFile(Folder):
        !           326:     """Versioniertes File"""
        !           327: 
        !           328:     
        !           329: 
        !           330:     def showDiffsForm(self):
        !           331:         """showdiffs"""
        !           332:         pt=PageTemplateFile('Products/externalVersionedFile/zpt/selectDiff').__of__(self)
        !           333:         return pt()
        !           334: 
        !           335:     def showDiffs(self,fileList):
        !           336:         """show"""
        !           337:         self.REQUEST.SESSION['fileList']=fileList
        !           338:         pt=PageTemplateFile('Products/externalVersionedFile/zpt/showDiffs').__of__(self)
        !           339:         return pt()
        !           340: 
        !           341:     def formatDiffs(self,fileList):
        !           342:         """generate diffs"""
        !           343:         from difflib import context_diff
        !           344:         import re
        !           345:         
        !           346:         v1=getattr(self,fileList[0])()
        !           347:         v1=re.sub("\r","\n",v1)
        !           348:         v1s=v1.split("\n")
        !           349: 
        !           350:         v2=getattr(self,fileList[1])()
        !           351:         #print v2
        !           352:         v2=re.sub("\r","\n",v2)
        !           353:         v2s=v2.split("\n")
        !           354: 
        !           355:         #print v1s
        !           356:         xx=context_diff(v1s,v2s)
        !           357:         #for x in xx:
        !           358:         #    print x
        !           359: 
        !           360:         list=[]
        !           361:         counter=-1
        !           362:         toggle=0
        !           363:         
        !           364:         for x in xx:
        !           365:            
        !           366:             if x[0:2]=="**":
        !           367:                 counter+=1
        !           368:                 toggle=0
        !           369:                 list.append(['',''])
        !           370:             elif x[0:2]=="--":
        !           371:                 toggle=1
        !           372:             else:
        !           373:                 try:
        !           374:                     x=re.sub(">",">",x)
        !           375:                     x=re.sub("<","&lt;",x)
        !           376:                     if x[0]=="!":
        !           377:                         x="""<span style="color:brown;">%s</span>"""%x[1:]
        !           378:                     if x[0]=="+":
        !           379:                         x="""<span style="color:red;">%s</span>"""%x[1:]
        !           380:                     if x[0]=="-":
        !           381:                         x="""<span style="color:green;">%s</span>"""%x[1:]
        !           382:                     list[counter][toggle]+=x+"<br>"
        !           383:                 except:
        !           384:                     """none"""
        !           385:         return list
        !           386:     
        !           387:     def __init__(self, id, title, lockedBy,author):
        !           388:         """init"""
        !           389:         self.id=id
        !           390:         self.title=title
        !           391:         self.lockedBy=lockedBy
        !           392:         self.author=author
        !           393:         
        !           394:     security= ClassSecurityInfo()    
        !           395:     meta_type="externalVersionedFile"
        !           396: 
        !           397:     def getLastVersion(self):
        !           398:         """Last Version"""
        !           399:         tmp=0
        !           400:         lastVersion=None
        !           401:         
        !           402:         for version in self.ZopeFind(self):
        !           403:             
        !           404:             if hasattr(version[1],'versionNumber'):
        !           405:                 
        !           406:                 if int(version[1].versionNumber) > tmp:
        !           407:                     tmp=int(version[1].versionNumber,)
        !           408:                     lastVersion=version[1]
        !           409:         return lastVersion
        !           410:     
        !           411:     def index_html(self):
        !           412:         """main view"""
        !           413:         lastVersion=self.getLastVersion()
        !           414:         #return "File:"+self.title+"  Version:%i"%lastVersion.versionNumber," modified:",lastVersion.bobobase_modification_time()," size:",lastVersion.getSize(),"modified by:",lastVersion.lastEditor()
        !           415:         return "File: %s Version:%i modified:%s size:%s modified by:%s"%(self.title,lastVersion.versionNumber,lastVersion.bobobase_modification_time(),lastVersion.getSize(),lastVersion.lastEditor())
        !           416:                                                                          
        !           417:     def getVersion(self):
        !           418:         tmp=0
        !           419:         for version in self.ZopeFind(self):
        !           420:             
        !           421:             if hasattr(version[1],'versionNumber'):
        !           422:                 
        !           423:                 if int(version[1].versionNumber) > tmp:
        !           424:                     tmp=int(version[1].versionNumber,)
        !           425:         return tmp+1
        !           426: 
        !           427:     
        !           428:     security.declareProtected('AUTHENTICATED_USER','unlock')
        !           429: 
        !           430:     def history(self):
        !           431:         """history"""  
        !           432: 
        !           433:         ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"])
        !           434:         if ext:
        !           435:             return getattr(self,ext[0][1].getId())()
        !           436:         
        !           437:         pt=PageTemplateFile('Products/externalVersionedFile/zpt/versionHistory').__of__(self)
        !           438:         return pt()
        !           439: 
        !           440:     def getVersions(self):
        !           441:         """get all versions"""
        !           442:         ret=[]
        !           443:         for version in self.ZopeFind(self):
        !           444:             if hasattr(version[1],'versionNumber'):
        !           445:                 ret.append((version[1].versionNumber,version[1]))
        !           446:         ret.sort(sortv)
        !           447:         return ret
        !           448: 
        !           449:     security.declareProtected('AUTHENTICATED_USER','unlock')   
        !           450:     def unlock(self,RESPONSE):
        !           451:         """unlock"""
        !           452:         if str(self.lockedBy) in [str(self.REQUEST['AUTHENTICATED_USER'])]:
        !           453:             self.lockedBy=''
        !           454:             RESPONSE.redirect(self.REQUEST['URL2'])
        !           455:         else:
        !           456:             return "Sorry, not locked by you! (%s,%s)"%(self.lockedBy,self.REQUEST['AUTHENTICATED_USER'])
        !           457:         
        !           458:     
        !           459:     security.declareProtected('AUTHENTICATED_USER','addExternalVersionedFileObjectForm')
        !           460: 
        !           461:     def addExternalVersionedFileObjectForm(self):
        !           462:         """add a new version"""
        !           463:         
        !           464:         if str(self.REQUEST['AUTHENTICATED_USER']) in ["Anonymous User"]:
        !           465:             return "please login first"
        !           466:         if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''):
        !           467:             out=DTMLFile('dtml/fileAdd', globals(),Kind='ExternalVersionedFileObject',kind='externalVersionedFileObject',version=self.getVersion()).__of__(self)
        !           468:             return out()
        !           469:         else:
        !           470:             return "Sorry file is locked by somebody else"
        !           471:         
        !           472:     def manage_addExternalVersionedFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None):
        !           473:         """add"""
        !           474:         
        !           475:         vC=self.REQUEST['vC']
        !           476:         author=self.REQUEST['author']
        !           477:         
        !           478:         if changeName=="yes":
        !           479:             self.title=file.filename[0:]
        !           480: 
        !           481:         if not newName=='':
        !           482:             self.title=newName[0:]
        !           483: 
        !           484:         id="V%i"%self.getVersion()+"_"+self.title
        !           485:         manage_addExternalVersionedFileObject(self,id,vC,author,file,"V%i"%self.getVersion()+"_"+self.title,precondition, content_type)
        !           486:         print self.ZopeFind(self,obj_ids=[id])[0]
        !           487:         objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
        !           488: 
        !           489:         if RESPONSE:
        !           490:             RESPONSE.redirect(self.REQUEST['URL2'])
        !           491: 
        !           492:     security.declareProtected('AUTHENTICATED_USER','downloadLocked')
        !           493: 
        !           494:     def download(self):
        !           495:         """download and lock"""
        !           496:         self.getLastVersion().content_type="application/octet-stream"
        !           497:         self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
        !           498:     
        !           499:     def downloadLocked(self):
        !           500:         """download and lock"""
        !           501:         if self.REQUEST['AUTHENTICATED_USER']=='Anonymous User':
        !           502:             return "please login first"
        !           503:         if not self.lockedBy=="":
        !           504:             return "cannot be locked because is already locked by %s"%self.lockedBy
        !           505:         self.lockedBy=self.REQUEST['AUTHENTICATED_USER']
        !           506:         self.getLastVersion().content_type="application/octet-stream"
        !           507:         self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
        !           508:     
        !           509: def manage_addExternalVersionedFileForm(self):
        !           510:     """interface for adding the OSAS_root"""
        !           511:     pt=PageTemplateFile('Products/externalVersionedFile/zpt/addExternalVersionedFile.zpt').__of__(self)
        !           512:     return pt()
        !           513: 
        !           514: def manage_addExternalVersionedFile(self,id,title,lockedBy, author=None, RESPONSE=None):
        !           515:     """add the OSAS_root"""
        !           516:     newObj=externalVersionedFile(id,title,lockedBy,author)
        !           517:     self._setObject(id,newObj)
        !           518:    
        !           519:     if RESPONSE is not None:
        !           520:         RESPONSE.redirect('manage_main')
        !           521: 
        !           522: 
        !           523: InitializeClass(externalVersionedFile)
        !           524: InitializeClass(externalVersionedFileFolder)

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