File:  [Repository] / versionedFile / versionedFile.py
Revision 1.34: download - view: text, annotated - select for diffs - revision graph
Thu Mar 31 16:44:23 2005 UTC (19 years, 3 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
sorting comments changed

    1: from OFS.Folder import Folder
    2: from OFS.Image import File
    3: from OFS.Image import cookId
    4: from Globals import DTMLFile, InitializeClass,package_home
    5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    6: from AccessControl import getSecurityManager
    7: from Products.PageTemplates.PageTemplate import PageTemplate
    8: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
    9: from AccessControl import ClassSecurityInfo
   10: import os.path
   11: 
   12: import time
   13: try:
   14:     from Products.ECHO_content.ECHO_collection import ECHO_basis
   15: except:
   16:     print "ECHO Elements not imported"
   17:     class ECHO_basis:
   18: 	     """leer"""
   19:     	     manage_options=()
   20: 
   21: 	
   22: def sortv(x,y):
   23:     return cmp(x[0],y[0])
   24:  
   25: class versionedFileFolder(Folder,ECHO_basis):
   26:     """Folder with versioned files"""
   27: 
   28:     
   29:     meta_type = "versionedFileFolder"
   30: 
   31:     security= ClassSecurityInfo()
   32:     security.declareProtected('AUTHENTICATED_USER','addFileForm')
   33: 
   34:     if ECHO_basis:
   35:         optTMP= Folder.manage_options+ECHO_basis.manage_options
   36:     else:
   37:         optTMP= Folder.manage_options
   38: 
   39:     manage_options =optTMP+(
   40: 		{'label':'Generate Index.html','action':'generateIndexHTML'},
   41:                 {'label':'Generate history_template.html','action':'generateHistoryHTML'},
   42:                 )
   43: 
   44:   
   45:     
   46:     def helpDownload(self):
   47:         """download help"""
   48:         
   49:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','helpDownload')).__of__(self)
   50:         return pt()
   51:     
   52:     def generateIndexHTML(self,RESPONSE=None):
   53:         """lege standard index.html an"""
   54: 
   55: 
   56:         if not self.ZopeFind(self,obj_ids=['index.html']):
   57:             zt=ZopePageTemplate('index.html')
   58:             self._setObject('index.html',zt)
   59:             default_content_fn = os.path.join(package_home(globals()),
   60:                                                'zpt/versionFileFolderMain.zpt')
   61:             text = open(default_content_fn).read()
   62:             zt.pt_edit(text, 'text/html')
   63: 
   64:         else:
   65:             return "already exists!"
   66:         
   67:         if RESPONSE is not None:
   68:             RESPONSE.redirect('manage_main')
   69: 
   70: 
   71:     def generateHistoryHTML(self,RESPONSE=None):
   72:         """lege standard index.html an"""
   73: 
   74:         
   75: 
   76:         if not self.ZopeFind(self,obj_ids=['history_template.html']):
   77:             zt=ZopePageTemplate('history_template.html')
   78:             self._setObject('history_template.html',zt)
   79:             default_content_fn = os.path.join(package_home(globals()),
   80:                                                'zpt/versionHistory.zpt')
   81:             text = open(default_content_fn).read()
   82:             zt.pt_edit(text, 'text/html')
   83: 
   84:         else:
   85:             return "already exists!"
   86:         
   87:         if RESPONSE is not None:
   88:             RESPONSE.redirect('manage_main')
   89: 
   90:     
   91:        
   92: 
   93:     def getVersionedFiles(self,sortField='title'):
   94:         """get all versioned files"""
   95: 
   96:         def sortName(x,y):
   97:             return cmp(x[1].title.lower(),y[1].title.lower())
   98: 
   99:         def sortDate(x,y):
  100:             return cmp(y[1].getLastVersion().getTime(),x[1].getLastVersion().getTime())
  101: 
  102:         
  103:         def sortComment(x,y):
  104: 
  105:         
  106:             
  107: 	 try:
  108: 	    xc=getattr(x[1],'comment','ZZZZZZZZZZZZZ').lower()
  109: 	 except:
  110: 	    xc='ZZZZZZZZZZZZZ'.lower()
  111: 	 try:
  112: 	    yc=getattr(y[1],'comment','ZZZZZZZZZZZZZ').lower()
  113:          except:
  114:             yc='ZZZZZZZZZZZZZ'.lower()
  115: 
  116: 
  117:          if (xc=='') or (xc=='ZZZZZZZZZZZZZ'.lower()):
  118:              
  119:              try:
  120:                  xc=x[1].getLastVersion().getVComment().lower()
  121:              except:
  122:                  xc='ZZZZZZZZZZZZZ'.lower()
  123:                  
  124:          if (yc=='') or (yc=='ZZZZZZZZZZZZZ'.lower()):
  125:              try:
  126:                  yc=y[1].getLastVersion().getVComment().lower()
  127:              except:
  128:                  yc='ZZZZZZZZZZZZZ'.lower()
  129: 
  130:          
  131:          return cmp(xc,yc)
  132: 
  133:         def sortAuthor(x,y):
  134:             
  135:             return cmp(x[1].getLastVersion().lastEditor().lower(),y[1].getLastVersion().lastEditor().lower())
  136:         
  137: 	versionedFiles=self.ZopeFind(self,obj_metatypes=['versionedFile'])
  138: 
  139:         if sortField=='title':
  140:             versionedFiles.sort(sortName)
  141:         elif sortField=='date':
  142:             versionedFiles.sort(sortDate)
  143:         elif sortField=='author':
  144:             versionedFiles.sort(sortAuthor)
  145:         elif sortField=='comment':
  146:             versionedFiles.sort(sortComment)
  147: 
  148:         return versionedFiles
  149: 
  150: 
  151:     def header_html(self):
  152:         """zusätzlicher header"""
  153:         ext=self.ZopeFind(self,obj_ids=["header.html"])
  154:         if ext:
  155:             return ext[0][1]()
  156:         else:
  157:             return ""
  158:         
  159:     def index_html(self):
  160:         """main"""
  161:         ext=self.ZopeFind(self,obj_ids=["index.html"])
  162:         if ext:
  163:             return ext[0][1]()
  164:         
  165:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionFileFolderMain')).__of__(self)
  166:         return pt()
  167: 
  168: 
  169:     def addFileForm(self):
  170:         """add a file"""
  171:         ext=self.ZopeFind(self,obj_ids=["addFileForm.dtml"])
  172:         if ext:
  173:             return ext[0][1]('',globals(),version='1',AUTHENTICATED_USER=self.REQUEST.AUTHENTICATED_USER)
  174:         
  175:         out=DTMLFile('dtml/newFileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version='1').__of__(self)
  176:         return out()
  177: 
  178: 
  179:     def addFile(self,vC,file,author,newName='',content_type='',RESPONSE=None):
  180:         """ add a new file"""
  181:         if newName=='':
  182:             filename=file.filename
  183:             id=filename[max(filename.rfind('/'),
  184:                                     filename.rfind('\\'),
  185:                                     filename.rfind(':'),
  186:                                     )+1:]
  187: 
  188:         else:
  189:             id=newName
  190:         
  191:         vC=self.REQUEST.form['vC']
  192:         manage_addVersionedFile(self,id,'','')
  193:         #if (getattr(self,'commentNonEmpty',0)==1) and vC.strip()=="":
  194:             
  195:             
  196:         ob=self._getOb(id)
  197:         ob.title=id
  198:         file2=file
  199:         
  200:         obj=ob.manage_addVersionedFileObject(id,vC,author,file2,content_type=content_type)
  201:         self.REQUEST.SESSION['objID']=ob.getId()
  202:         self.REQUEST.SESSION['objID_parent']=None
  203: 
  204:         if obj.getSize()==0:
  205:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
  206:             return pt()
  207:         
  208:         RESPONSE.redirect(self.REQUEST['URL1'])
  209: 
  210: 
  211:     def deleteEmptyObject(self,submit,RESPONSE=None):
  212:         """deleteemptyobject"""
  213:         if submit=="delete it":
  214:             if self.REQUEST.SESSION['objID_parent']:
  215:                 obj=getattr(self,self.REQUEST.SESSION['objID_parent'])
  216: 
  217:             else:
  218:                 obj=self
  219:             obj.manage_delObjects([self.REQUEST.SESSION['objID']])
  220: 
  221:         RESPONSE.redirect(self.REQUEST['URL1'])
  222:         
  223:         
  224: manage_addVersionedFileFolderForm=DTMLFile('dtml/folderAdd', globals())
  225: 
  226: 
  227: def manage_addVersionedFileFolder(self, id, title='',
  228:                      createPublic=0,
  229:                      createUserF=0,
  230:                      REQUEST=None):
  231:     """Add a new Folder object with id *id*.
  232: 
  233:     If the 'createPublic' and 'createUserF' parameters are set to any true
  234:     value, an 'index_html' and a 'UserFolder' objects are created respectively
  235:     in the new folder.
  236:     """
  237:     ob=versionedFileFolder()
  238:     ob.id=str(id)
  239:     ob.title=title
  240:     self._setObject(id, ob)
  241:     ob=self._getOb(id)
  242: 
  243:     checkPermission=getSecurityManager().checkPermission
  244: 
  245:     if createUserF:
  246:         if not checkPermission('Add User Folders', ob):
  247:             raise Unauthorized, (
  248:                   'You are not authorized to add User Folders.'
  249:                   )
  250:         ob.manage_addUserFolder()
  251: 
  252:   
  253:     if REQUEST is not None:
  254:         return self.manage_main(self, REQUEST, update_menu=1)
  255: 
  256: 
  257: 
  258: class versionedFileObject(File):
  259:     """File Object im Folder"""
  260:     
  261:     meta_type = "versionedFileObject"
  262:     
  263:     manage_editForm  =DTMLFile('dtml/fileEdit',globals(),
  264:                                Kind='File',kind='file')
  265:     manage_editForm._setName('manage_editForm')
  266: 
  267:     def getVComment(self):
  268:         """get the comment of this file"""
  269:         if not hasattr(self,'vComment') or (not self.vComment) or (self.vComment.lstrip()==""):
  270:             return "Add comment"
  271: 
  272:         else:
  273:             return self.vComment
  274:             
  275:     def manageVCommentForm(self):
  276:         """add a comment"""
  277: 
  278:         self.REQUEST.SESSION['refer']=self.REQUEST['HTTP_REFERER']
  279: 
  280: 
  281:         
  282:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVComment')).__of__(self)
  283:         return pt()
  284: 
  285:     def manageVComment(self,text,comment_author,submit,REQUEST=None):
  286:         """manage comments"""
  287:         if submit =='change':
  288:             if text=='':
  289:                 self.vComment=None
  290:             else:
  291:                 self.vComment=text
  292:                 self.vComment_author=comment_author
  293: 
  294:                 self.vComment_date=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
  295: 
  296:         if self.REQUEST.SESSION.has_key('refer'):
  297: 
  298:             return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer'])
  299:         return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url()+"/history")
  300:     
  301: 
  302:     def getTime(self):
  303:         """getTime"""
  304:         #return self.bobobase_modification_time().ISO()
  305:         if hasattr(self,'time'):
  306:             return time.strftime("%Y-%m-%d %H:%M:%S",self.time)
  307: 	elif hasattr(self,'timefixed'):
  308: 	    return self.timefixed
  309:         else:
  310: 	    setattr(self,'timefixed',self.bobobase_modification_time().ISO())
  311:             return self.bobobase_modification_time().ISO()
  312: 
  313: 
  314: 
  315:     
  316: 
  317:     def download(self):
  318:         """download and lock"""
  319:         
  320:         self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getId())
  321: 	self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
  322:       
  323:         self.content_type="application/octet-stream"
  324:         #self.REQUEST.RESPONSE.redirect(self.absolute_url())
  325:         self.REQUEST.RESPONSE.write(self.index_html())
  326:         #self.REQUEST.RESPONSE.write("bl")
  327:         self.REQUEST.close()
  328:     
  329:     def downloadLocked(self):
  330:         """download and lock"""
  331:         
  332:         
  333:         if self.REQUEST['AUTHENTICATED_USER']=='Anonymous User':
  334:             return "please login first"
  335:         if not self.aq_parent.lockedBy=="":
  336:             return "cannot be locked because is already locked by %s"%self.lockedBy
  337:         self.aq_parent.lockedBy=self.REQUEST['AUTHENTICATED_USER']
  338: 
  339:         self.content_type="application/octet-stream"
  340:         self.REQUEST.RESPONSE.redirect(self.absolute_url())
  341:     
  342:     def setVersionNumber(self,versionNumber):
  343:         """set version"""
  344:         self.versionNumber=versionNumber
  345: 
  346:     def getVersionNumber(self):
  347:         """get version"""
  348:         return self.versionNumber
  349: 
  350:    
  351:             
  352:     def lastEditor(self):
  353:         """last Editor"""
  354:         if hasattr(self,'author'):
  355:             ret=self.author.replace("-","\n")
  356:             ret=ret.replace("\r","\n")
  357:             return ret
  358: 
  359:         else:
  360:             jar=self._p_jar
  361:             oid=self._p_oid
  362: 
  363:             if jar is None or oid is None: return None
  364: 
  365:             return jar.db().history(oid)[0]['user_name']
  366: 
  367:     
  368:     
  369:         
  370: manage_addVersionedFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject', version='1')
  371: 
  372: def manage_addVersionedFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='',
  373:                    REQUEST=None):
  374:     """Add a new File object.
  375: 
  376:     Creates a new File object 'id' with the contents of 'file'"""
  377: 
  378:     id=str(id)
  379:     title=str(title)
  380:     content_type=str(content_type)
  381:     precondition=str(precondition)
  382:     
  383:     id, title = cookId(id, title, file)
  384: 
  385:     self=self.this()
  386: 
  387:     # First, we create the file without data:
  388:     self._setObject(id, versionedFileObject(id,title,'',content_type, precondition))
  389:     self._getOb(id).versionComment=str(vC)
  390:     self._getOb(id).time=time.localtime()
  391:     
  392:     setattr(self._getOb(id),'author',author)
  393:     
  394:     # Now we "upload" the data.  By doing this in two steps, we
  395:     # can use a database trick to make the upload more efficient.
  396:     if file:
  397:         self._getOb(id).manage_upload(file)
  398:     if content_type:
  399:         self._getOb(id).content_type=content_type
  400: 
  401:     if REQUEST is not None:
  402:         REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
  403: 
  404: 
  405: 
  406: 
  407: class versionedFile(Folder):
  408:     """Versioniertes File"""
  409: 
  410:     def __init__(self, id, title, lockedBy,author):
  411:         """init"""
  412:         self.id=id
  413:         self.title=title
  414:         self.lockedBy=lockedBy
  415:         self.author=author
  416: 
  417:     def getComment(self):
  418:         """get the comment of this file"""
  419:         if not hasattr(self,'comment') or (not self.comment) or (self.comment.lstrip()==""):
  420:             return "Add comment"
  421: 
  422:         else:
  423:             return self.comment
  424:             
  425:         
  426:     meta_type="versionedFile"
  427: 
  428:     def manageCommentForm(self):
  429:         """add a comment"""
  430:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addComment')).__of__(self)
  431:         return pt()
  432: 
  433:     def manageComment(self,text,comment_author,submit,REQUEST=None):
  434:         """manage comments"""
  435:         if submit =='change':
  436:             if text=='':
  437:                 self.comment=None
  438:             else:
  439:                 self.comment=text
  440:                 self.comment_author=comment_author
  441: 
  442:                 self.comment_date=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
  443: 
  444:         return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url())
  445:     
  446:     def getLastVersion(self):
  447:         """Last Version"""
  448:         tmp=0
  449:         lastVersion=None
  450:         
  451:         for version in self.ZopeFind(self):
  452:             
  453:             if hasattr(version[1],'versionNumber'):
  454:                 
  455:                 if int(version[1].versionNumber) > tmp:
  456:                     tmp=int(version[1].versionNumber,)
  457:                     lastVersion=version[1]
  458:         return lastVersion
  459:     
  460:     def index_html(self):
  461:         """main view"""
  462:         lastVersion=self.getLastVersion()
  463:         #return "File:"+self.title+"  Version:%i"%lastVersion.versionNumber," modified:",lastVersion.bobobase_modification_time()," size:",lastVersion.getSize(),"modified by:",lastVersion.lastEditor()
  464:         return "File: %s Version:%i modified:%s size:%s modified by:%s"%(self.title,lastVersion.versionNumber,lastVersion.getTime(),lastVersion.getSize(),lastVersion.lastEditor())
  465:                                                                          
  466:     def getVersion(self):
  467:         tmp=0
  468:         for version in self.ZopeFind(self):
  469:             
  470:             if hasattr(version[1],'versionNumber'):
  471:                 
  472:                 if int(version[1].versionNumber) > tmp:
  473:                     tmp=int(version[1].versionNumber,)
  474:         return tmp+1
  475: 
  476:     security= ClassSecurityInfo()
  477:     security.declareProtected('AUTHENTICATED_USER','unlock')
  478: 
  479:     def history(self):
  480:         """history"""  
  481: 
  482:         ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"])
  483:         if ext:
  484:             return getattr(self,ext[0][1].getId())()
  485:         
  486:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionHistory')).__of__(self)
  487:         return pt()
  488: 
  489:     def getVersions(self):
  490:         """get all versions"""
  491:         ret=[]
  492:         for version in self.ZopeFind(self):
  493:             if hasattr(version[1],'versionNumber'):
  494:                 ret.append((version[1].versionNumber,version[1]))
  495:         ret.sort(sortv)
  496:         return ret
  497: 
  498:     security.declareProtected('AUTHENTICATED_USER','forceunlock')   
  499:     def forceunlock(self,RESPONSE):
  500:         """unlock"""
  501:         self.lockedBy=''
  502: 
  503:     security.declareProtected('AUTHENTICATED_USER','unlock')   
  504:     def unlock(self,RESPONSE):
  505:         """unlock"""
  506:         if str(self.lockedBy) in [str(self.REQUEST['AUTHENTICATED_USER'])]:
  507:             self.lockedBy=''
  508:             RESPONSE.redirect(self.REQUEST['URL2'])
  509:         else:
  510:             return "Sorry, not locked by you! (%s,%s)"%(self.lockedBy,self.REQUEST['AUTHENTICATED_USER'])
  511:         
  512: 
  513:     
  514:     security.declareProtected('AUTHENTICATED_USER','addVersionedFileObjectForm')
  515: 
  516:     def addVersionedFileObjectForm(self):
  517:         """add a new version"""
  518:         
  519:         if str(self.REQUEST['AUTHENTICATED_USER']) in ["Anonymous User"]:
  520:             return "please login first"
  521:         if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''):
  522:             out=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version=self.getVersion()).__of__(self)
  523:             return out()
  524:         else:
  525:             return "Sorry file is locked by somebody else"
  526:         
  527:     def manage_addVersionedFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None):
  528:         """add"""
  529:         
  530:         vC=self.REQUEST['vC']
  531:         author=self.REQUEST['author']
  532:         
  533:         if changeName=="yes":
  534:             filename=file.filename
  535:             self.title=filename[max(filename.rfind('/'),
  536:                         filename.rfind('\\'),
  537:                         filename.rfind(':'),
  538:                         )+1:]
  539: 
  540: 
  541:         if not newName=='':
  542:             self.title=newName[0:]
  543: 
  544:         id="V%i"%self.getVersion()+"_"+self.title
  545:         
  546:         manage_addVersionedFileObject(self,id,vC,author,file,"V%i"%self.getVersion()+"_"+self.title,precondition, content_type)
  547:         objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
  548:         self.REQUEST.SESSION['objID_parent']=self.getId()
  549: 
  550:         if RESPONSE:
  551:             obj=self.ZopeFind(self,obj_ids=[id])[0][1]
  552:             if obj.getSize()==0:
  553:                 self.REQUEST.SESSION['objID']=obj.getId()
  554:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
  555:                 return pt()
  556: 
  557:             else:
  558:                 RESPONSE.redirect(self.REQUEST['URL2'])
  559: 
  560:         else:
  561:             return self.ZopeFind(self,obj_ids=[id])[0][1]
  562:         
  563:     security.declareProtected('AUTHENTICATED_USER','downloadLocked')
  564: 
  565:     def download(self):
  566:         """download and lock"""
  567: 
  568:         self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getLastVersion().getId())
  569: 	self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
  570:       
  571:         self.content_type="application/octet-stream"
  572:         #self.REQUEST.RESPONSE.write("bl")
  573:         self.REQUEST.RESPONSE.write(self.getLastVersion().index_html())
  574:         self.REQUEST.close()
  575: 
  576:         #self.getLastVersion().content_type="application/octet-stream"
  577:         #self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
  578:     
  579:     def downloadLocked(self):
  580:         """download and lock"""
  581:         if self.REQUEST['AUTHENTICATED_USER']=='Anonymous User':
  582:             return "please login first"
  583:         if not self.lockedBy=="":
  584:             return "cannot be locked because is already locked by %s"%self.lockedBy
  585:         self.lockedBy=self.REQUEST['AUTHENTICATED_USER']
  586:         self.getLastVersion().content_type="application/octet-stream"
  587:         self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
  588:     
  589: def manage_addVersionedFileForm(self):
  590:     """interface for adding the OSAS_root"""
  591:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVersionedFile.zpt')).__of__(self)
  592:     return pt()
  593: 
  594: def manage_addVersionedFile(self,id,title,lockedBy, author=None, RESPONSE=None):
  595:     """add the OSAS_root"""
  596:     newObj=versionedFile(id,title,lockedBy,author)
  597:     self._setObject(id,newObj)
  598:    
  599:     if RESPONSE is not None:
  600:         RESPONSE.redirect('manage_main')
  601: 
  602: 
  603: InitializeClass(versionedFile)
  604: InitializeClass(versionedFileFolder)

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