Annotation of versionedFile/versionedFile.py, revision 1.69
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.54 dwinter 10: from difflib import Differ
11: from pprint import pprint
1.50 dwinter 12: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
1.51 dwinter 13:
1.43 dwinter 14: try:
15: from Products.ImageArchive.ImageArchive import manage_AddImageZogiLib
16: except:
17: print "no images"
1.51 dwinter 18:
1.35 dwinter 19:
20: from threading import Thread
21: import shutil
22: import tempfile
1.5 dwinter 23: import os.path
1.44 dwinter 24: import urllib
1.39 dwinter 25:
1.15 dwinter 26: import time
1.19 dwinter 27: try:
28: from Products.ECHO_content.ECHO_collection import ECHO_basis
29: except:
30: print "ECHO Elements not imported"
1.20 dwinter 31: class ECHO_basis:
1.69 ! dwinter 32: """leer"""
! 33: manage_options=()
1.1 dwinter 34:
1.69 ! dwinter 35:
1.1 dwinter 36: def sortv(x,y):
37: return cmp(x[0],y[0])
1.69 ! dwinter 38:
1.37 dwinter 39: tdir = "/tmp/downloadVersionedFiles"
1.35 dwinter 40:
41: class generateDownloadZip:
42: """generateDownloadSet"""
43:
44: def __init__(self,folderObject,url):
45: """init downloadzip"""
46: self.folder=folderObject
47: self.done=None
48: self.response=""
49: self.url=url
50:
51: def __call__(self):
52: """call generate download zip"""
53: storeTempDir=tempfile.tempdir
1.69 ! dwinter 54: tempfile.tempdir=tdir
1.35 dwinter 55:
56: tmpPath=tempfile.mktemp()
57: tmpZip=tempfile.mktemp()+".gtz"
58: tmpFn=os.path.split(tmpZip)[1]
59:
60: if not os.path.exists(tempfile.tempdir):
61: os.mkdir(tempfile.tempdir)
62:
63: if not os.path.exists(tmpPath):
1.69 ! dwinter 64: os.mkdir(tmpPath)
! 65:
! 66: tempfile.tempdir=storeTempDir
! 67: self.response="<h3>1. step: getting the files</h3>"
1.35 dwinter 68:
69: for files in self.folder.ZopeFind(self.folder,obj_metatypes=['versionedFile']):
70: lastV=files[1].getLastVersion()
71: self.response+=str("<p>Get File: %s<br>\n"%lastV.title)
72:
73: savePath=os.path.join(tmpPath,lastV.title)
74: fh=file(savePath,"w")
75: fh.write(lastV.data)
76: fh.close()
77:
78: self.response+="<h3>2. step: creating the downloadable file</h3>"
1.69 ! dwinter 79: self.response+="<p>Create gtar<br>"
1.35 dwinter 80: self.response+="<p>This can take a while....<br>\n"
81:
82: fh=os.popen2("tar zcvf %s %s/*"%(tmpZip,tmpPath),1)[1]
83: self.response+="<br>"
84: for c in fh.read():
85: self.response+=c
86: if c==")":
87: self.response+="<br>\n"
1.69 ! dwinter 88:
! 89:
1.35 dwinter 90:
91:
92: shutil.rmtree(tmpPath)
93:
94: self.response+="<p>finished<br>\n"
95:
96: len=os.stat(tmpZip)[6]
97: downloadUrl=self.url+"/downloadSet"
98: self.response+="""<h1><a href="downloadSet?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len)
1.36 dwinter 99: self.response+="""<p>The file you receive is a tar (gnutar) compressed file, after unpacking you will find a new folder <emph>tmp</emph> where the files are stored in.</p>"""
1.35 dwinter 100: self.response+="""<p>The file will be stored for a while, you can download it later, the URL is:</p>
1.69 ! dwinter 101: <p><a href="downloadSet?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn)
1.35 dwinter 102:
103: self.done=True
104:
1.1 dwinter 105:
1.35 dwinter 106: def getResult(self):
107: """get result"""
108: return self.response
109:
110: def isDone(self):
111: if self.done:
112: return True
113: else:
114: return False
115:
116:
1.19 dwinter 117: class versionedFileFolder(Folder,ECHO_basis):
1.1 dwinter 118: """Folder with versioned files"""
119:
1.14 dwinter 120:
1.1 dwinter 121: meta_type = "versionedFileFolder"
122:
123: security= ClassSecurityInfo()
124: security.declareProtected('AUTHENTICATED_USER','addFileForm')
1.50 dwinter 125: filesMetaType=['versionedFile']
1.19 dwinter 126: if ECHO_basis:
127: optTMP= Folder.manage_options+ECHO_basis.manage_options
128: else:
129: optTMP= Folder.manage_options
130:
131: manage_options =optTMP+(
1.69 ! dwinter 132: {'label':'Generate Index.html','action':'generateIndexHTML'},
1.39 dwinter 133: {'label':'Generate Image Index.html','action':'generateIndexHTML_image'},
1.6 dwinter 134: {'label':'Generate history_template.html','action':'generateHistoryHTML'},
1.69 ! dwinter 135: {'label':'Import Folder','action':'impor<olderForm'},
1.36 dwinter 136: {'label':'Export Folder','action':'exportFolder'},
1.51 dwinter 137: {'label':'Position of version number','action':'changeHistoryFileNamesForm'},
1.19 dwinter 138: )
1.5 dwinter 139:
1.68 dwinter 140:
1.51 dwinter 141: def changeHistoryFileNamesForm(self):
142: """change position of version num"""
143: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeHistoryFileNamesForm.zpt')).__of__(self)
144: return pt()
145:
146:
147: def changeHistoryFileNames(self,positionVersionNum="front",RESPONSE=None):
148: """change position of version num"""
149:
150:
151:
152: versions=self.ZopeFind(self,obj_metatypes=['versionedFileObject'],search_sub=1)
153:
154: if not (getattr(self,'positionVersionNum','front')==positionVersionNum):
155:
156: for version in versions:
157:
158: if positionVersionNum=="front":
159:
160: titleTmp=os.path.splitext(version[1].title)
161: titleTmp2="_".join(titleTmp[0].split("_")[0:-1])
162: if len(titleTmp)>1:
163: id=titleTmp[0].split("_")[-1]+"_"+titleTmp2+"."+titleTmp[1]
164: else:
165: id=titleTmp[0].split("_")[-1]+"_"+titleTmp2
166:
167: else:
168: titleTmp="_".join(version[1].getId().split("_")[1:])
169: tmp=os.path.splitext(titleTmp)
170: if len(tmp)>1:
171: id=tmp[0]+"_"+version[1].getId().split("_")[0]+tmp[1]
172: else:
173: id=tmp[0]+"_"+version[1].getId().split("_")[0]
174:
1.53 dwinter 175:
1.51 dwinter 176:
177: version[1].aq_parent.manage_renameObjects(ids=[version[1].getId()],new_ids=[id])
178: version[1].title=id
179:
180:
181: self.positionVersionNum=positionVersionNum
182: if RESPONSE:
183: RESPONSE.redirect("manage_main")
184:
185:
186:
1.35 dwinter 187: def importFolderForm(self):
188: """form fuer folder import"""
189: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','importFolderForm.zpt')).__of__(self)
190: return pt()
191:
192: def importFolder(self,path,comment="",author=None,lockedBy=None,RESPONSE=None):
193: """importiere inhalt eines folders"""
194:
195: for fileName in os.listdir(path):
196: if os.path.isfile(os.path.join(path,fileName)):
197: manage_addVersionedFile(self,fileName,'','')
198: id=fileName
199: ob=self._getOb(fileName)
200: ob.title=id
201: file2=file(os.path.join(path,fileName))
202:
203: obj=ob.manage_addVersionedFileObject(id,comment,author,file2,content_type='')
204:
205: if RESPONSE:
206: RESPONSE.redirect(self.REQUEST['URL1'])
207:
208: zipThreads={}
209: zipThreads2={}
210:
211: def refreshTxt(self):
212: """txt fuer refresh"""
213: tn=self.REQUEST.SESSION['threadName']
214: return """ 2;url=%s?repeat=%s """%(self.absolute_url()+"/exportFolder",tn)
215:
216: def exportFolder(self,repeat=None):
217: """exportiert alle akutellen files des folders"""
218: threadName=repeat
219:
1.37 dwinter 220: downloadZip=generateDownloadZip(self,self.absolute_url())
221: downloadZip()
222: return downloadZip.getResult()
223: ## if not threadName or threadName=="":
224: ## threadStart=generateDownloadZip(self,self.absolute_url())
225: ## thread=Thread(target=threadStart)
1.35 dwinter 226:
1.37 dwinter 227: ## thread.start()
1.35 dwinter 228:
229:
1.37 dwinter 230: ## self.zipThreads[thread.getName()[0:]]=threadStart
231: ## self.zipThreads2[thread.getName()[0:]]=thread
232: ## self.REQUEST.SESSION['threadName']=thread.getName()[0:]
233: ## wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['zip_wait_template'])
234: ## if wait_template:
235: ## return wait_template[0][1]()
236: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self)
237: ## return pt()
1.35 dwinter 238:
1.37 dwinter 239: ## else:
240: ## self.REQUEST.SESSION['threadName']=threadName
1.35 dwinter 241:
1.37 dwinter 242: ## if (self.zipThreads[threadName].getResult()==None):
1.35 dwinter 243:
1.37 dwinter 244: ## wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
245: ## if wait_template:
246: ## return wait_template[0][1]()
247:
248: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self)
249: ## return pt()
250: ## else:
251: ## if self.zipThreads[threadName].isDone():
252: ## self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult()
253: ## self.zipThreads2[threadName].join()
254: ## del(self.zipThreads2[threadName])
255: ## del(self.zipThreads[threadName])
256: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_result.zpt')).__of__(self)
257: ## return pt()
258:
259: ## else:
260: ## self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult()
261: ## self.REQUEST.SESSION['threadName']=threadName
262: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait_result.zpt')).__of__(self)
263: ## return pt()
1.35 dwinter 264:
265: def downloadSet(self,fn):
1.69 ! dwinter 266: """download prepared set"""
! 267: filename=os.path.join(tdir,fn)
1.35 dwinter 268:
1.69 ! dwinter 269:
! 270: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%"downloadFileFolder.tgz")
! 271: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
! 272: len=os.stat(filename)[6]
! 273: self.REQUEST.RESPONSE.setHeader("Content-Length",len)
! 274: images=file(filename).read()
! 275: self.REQUEST.RESPONSE.write(images)
! 276: self.REQUEST.RESPONSE.close()
1.35 dwinter 277:
1.69 ! dwinter 278:
1.35 dwinter 279:
1.14 dwinter 280: def helpDownload(self):
281: """download help"""
282:
1.19 dwinter 283: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','helpDownload')).__of__(self)
1.14 dwinter 284: return pt()
285:
1.39 dwinter 286: def generateIndexHTML_image(self,RESPONSE=None):
287: """lege standard index.html an"""
288:
289:
290: if not self.ZopeFind(self,obj_ids=['index.html']):
291: zt=ZopePageTemplate('index.html')
292: self._setObject('index.html',zt)
293: default_content_fn = os.path.join(package_home(globals()),
294: 'zpt/versionFileFolderMain_image.zpt')
295: text = open(default_content_fn).read()
296: zt.pt_edit(text, 'text/html')
297:
298: else:
299: return "already exists!"
300:
301: if RESPONSE is not None:
302: RESPONSE.redirect('manage_main')
303:
1.58 dwinter 304:
305: def generateAddFileForm(self,RESPONSE=None):
306: """lege standard addfileform an"""
307: #TODO: write generateaddfileform only a dummy at them moment
308:
309: if not self.ZopeFind(self,obj_ids=['addFileForm.dtml']):
310: zt=ZopePageTemplate('index.html')
311: self._setObject('index.html',zt)
312: default_content_fn = os.path.join(package_home(globals()),
313: 'zpt/versionFileFolderMain.zpt')
314: text = open(default_content_fn).read()
315: zt.pt_edit(text, 'text/html')
316:
317: else:
318: return "already exists!"
319:
320: if RESPONSE is not None:
321: RESPONSE.redirect('manage_main')
322:
323:
1.5 dwinter 324: def generateIndexHTML(self,RESPONSE=None):
325: """lege standard index.html an"""
326:
327:
1.22 dwinter 328: if not self.ZopeFind(self,obj_ids=['index.html']):
1.5 dwinter 329: zt=ZopePageTemplate('index.html')
330: self._setObject('index.html',zt)
331: default_content_fn = os.path.join(package_home(globals()),
332: 'zpt/versionFileFolderMain.zpt')
333: text = open(default_content_fn).read()
334: zt.pt_edit(text, 'text/html')
335:
336: else:
337: return "already exists!"
338:
339: if RESPONSE is not None:
340: RESPONSE.redirect('manage_main')
341:
1.6 dwinter 342:
343: def generateHistoryHTML(self,RESPONSE=None):
344: """lege standard index.html an"""
345:
1.5 dwinter 346:
1.6 dwinter 347:
1.22 dwinter 348: if not self.ZopeFind(self,obj_ids=['history_template.html']):
1.6 dwinter 349: zt=ZopePageTemplate('history_template.html')
350: self._setObject('history_template.html',zt)
351: default_content_fn = os.path.join(package_home(globals()),
352: 'zpt/versionHistory.zpt')
353: text = open(default_content_fn).read()
354: zt.pt_edit(text, 'text/html')
355:
356: else:
357: return "already exists!"
358:
359: if RESPONSE is not None:
360: RESPONSE.redirect('manage_main')
361:
1.32 dwinter 362:
363:
364:
1.12 dwinter 365: def getVersionedFiles(self,sortField='title'):
1.1 dwinter 366: """get all versioned files"""
1.12 dwinter 367:
368: def sortName(x,y):
1.18 dwinter 369: return cmp(x[1].title.lower(),y[1].title.lower())
1.12 dwinter 370:
371: def sortDate(x,y):
1.17 dwinter 372: return cmp(y[1].getLastVersion().getTime(),x[1].getLastVersion().getTime())
1.12 dwinter 373:
1.32 dwinter 374:
1.30 dwinter 375: def sortComment(x,y):
1.34 dwinter 376:
377:
378:
1.69 ! dwinter 379: try:
! 380: xc=getattr(x[1],'comment','ZZZZZZZZZZZZZ').lower()
! 381: except:
! 382: xc='ZZZZZZZZZZZZZ'.lower()
! 383: try:
! 384: yc=getattr(y[1],'comment','ZZZZZZZZZZZZZ').lower()
1.31 dwinter 385: except:
1.34 dwinter 386: yc='ZZZZZZZZZZZZZ'.lower()
387:
388:
389: if (xc=='') or (xc=='ZZZZZZZZZZZZZ'.lower()):
390:
391: try:
392: xc=x[1].getLastVersion().getVComment().lower()
393: except:
394: xc='ZZZZZZZZZZZZZ'.lower()
395:
396: if (yc=='') or (yc=='ZZZZZZZZZZZZZ'.lower()):
397: try:
398: yc=y[1].getLastVersion().getVComment().lower()
399: except:
400: yc='ZZZZZZZZZZZZZ'.lower()
401:
402:
403: return cmp(xc,yc)
1.31 dwinter 404:
1.12 dwinter 405: def sortAuthor(x,y):
1.13 dwinter 406:
1.30 dwinter 407: return cmp(x[1].getLastVersion().lastEditor().lower(),y[1].getLastVersion().lastEditor().lower())
1.3 dwinter 408:
1.50 dwinter 409: versionedFiles=self.ZopeFind(self,obj_metatypes=self.filesMetaType)
410:
411:
1.12 dwinter 412: if sortField=='title':
413: versionedFiles.sort(sortName)
414: elif sortField=='date':
415: versionedFiles.sort(sortDate)
416: elif sortField=='author':
417: versionedFiles.sort(sortAuthor)
1.30 dwinter 418: elif sortField=='comment':
419: versionedFiles.sort(sortComment)
1.12 dwinter 420:
1.1 dwinter 421: return versionedFiles
422:
1.4 dwinter 423:
424: def header_html(self):
425: """zusätzlicher header"""
426: ext=self.ZopeFind(self,obj_ids=["header.html"])
427: if ext:
428: return ext[0][1]()
429: else:
430: return ""
1.41 dwinter 431:
432:
433: security.declareProtected('View','index_html')
1.1 dwinter 434: def index_html(self):
435: """main"""
1.4 dwinter 436: ext=self.ZopeFind(self,obj_ids=["index.html"])
437: if ext:
1.5 dwinter 438: return ext[0][1]()
1.4 dwinter 439:
1.19 dwinter 440: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionFileFolderMain')).__of__(self)
1.1 dwinter 441: return pt()
442:
443:
1.58 dwinter 444:
1.1 dwinter 445: def addFileForm(self):
446: """add a file"""
1.21 dwinter 447: ext=self.ZopeFind(self,obj_ids=["addFileForm.dtml"])
448: if ext:
449: return ext[0][1]('',globals(),version='1',AUTHENTICATED_USER=self.REQUEST.AUTHENTICATED_USER)
450:
1.1 dwinter 451: out=DTMLFile('dtml/newFileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version='1').__of__(self)
452: return out()
453:
454:
1.11 dwinter 455: def addFile(self,vC,file,author,newName='',content_type='',RESPONSE=None):
1.1 dwinter 456: """ add a new file"""
1.11 dwinter 457: if newName=='':
1.24 dwinter 458: filename=file.filename
459: id=filename[max(filename.rfind('/'),
460: filename.rfind('\\'),
461: filename.rfind(':'),
462: )+1:]
1.25 dwinter 463:
1.11 dwinter 464: else:
465: id=newName
1.1 dwinter 466:
467: vC=self.REQUEST.form['vC']
468: manage_addVersionedFile(self,id,'','')
1.21 dwinter 469: #if (getattr(self,'commentNonEmpty',0)==1) and vC.strip()=="":
470:
471:
1.1 dwinter 472: ob=self._getOb(id)
473: ob.title=id
1.3 dwinter 474: file2=file
1.23 dwinter 475:
476: obj=ob.manage_addVersionedFileObject(id,vC,author,file2,content_type=content_type)
1.27 dwinter 477: self.REQUEST.SESSION['objID']=ob.getId()
478: self.REQUEST.SESSION['objID_parent']=None
1.1 dwinter 479:
1.23 dwinter 480: if obj.getSize()==0:
481: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
482: return pt()
483:
1.1 dwinter 484: RESPONSE.redirect(self.REQUEST['URL1'])
485:
1.27 dwinter 486:
487: def deleteEmptyObject(self,submit,RESPONSE=None):
488: """deleteemptyobject"""
489: if submit=="delete it":
490: if self.REQUEST.SESSION['objID_parent']:
491: obj=getattr(self,self.REQUEST.SESSION['objID_parent'])
492:
493: else:
494: obj=self
495: obj.manage_delObjects([self.REQUEST.SESSION['objID']])
496:
497: RESPONSE.redirect(self.REQUEST['URL1'])
498:
1.1 dwinter 499:
500: manage_addVersionedFileFolderForm=DTMLFile('dtml/folderAdd', globals())
501:
502:
503: def manage_addVersionedFileFolder(self, id, title='',
504: createPublic=0,
505: createUserF=0,
506: REQUEST=None):
507: """Add a new Folder object with id *id*.
508:
509: If the 'createPublic' and 'createUserF' parameters are set to any true
510: value, an 'index_html' and a 'UserFolder' objects are created respectively
511: in the new folder.
512: """
513: ob=versionedFileFolder()
514: ob.id=str(id)
515: ob.title=title
516: self._setObject(id, ob)
517: ob=self._getOb(id)
518:
519: checkPermission=getSecurityManager().checkPermission
520:
521: if createUserF:
522: if not checkPermission('Add User Folders', ob):
523: raise Unauthorized, (
524: 'You are not authorized to add User Folders.'
525: )
526: ob.manage_addUserFolder()
527:
528:
529: if REQUEST is not None:
530: return self.manage_main(self, REQUEST, update_menu=1)
531:
532:
533:
534: class versionedFileObject(File):
535: """File Object im Folder"""
1.50 dwinter 536: security= ClassSecurityInfo()
1.1 dwinter 537: meta_type = "versionedFileObject"
538:
539: manage_editForm =DTMLFile('dtml/fileEdit',globals(),
540: Kind='File',kind='file')
541: manage_editForm._setName('manage_editForm')
1.51 dwinter 542:
1.50 dwinter 543:
1.62 dwinter 544:
545:
1.56 dwinter 546: security.declarePublic('getTitle')
547:
548: def getTitle(self):
549: """get title"""
550: return self.title
551:
1.50 dwinter 552: security.declarePublic('getVComment')
1.32 dwinter 553: def getVComment(self):
554: """get the comment of this file"""
555: if not hasattr(self,'vComment') or (not self.vComment) or (self.vComment.lstrip()==""):
556: return "Add comment"
557:
558: else:
559: return self.vComment
560:
561: def manageVCommentForm(self):
562: """add a comment"""
1.34 dwinter 563:
564: self.REQUEST.SESSION['refer']=self.REQUEST['HTTP_REFERER']
565:
566:
567:
1.32 dwinter 568: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVComment')).__of__(self)
569: return pt()
570:
571: def manageVComment(self,text,comment_author,submit,REQUEST=None):
572: """manage comments"""
573: if submit =='change':
574: if text=='':
575: self.vComment=None
576: else:
577: self.vComment=text
578: self.vComment_author=comment_author
579:
580: self.vComment_date=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
581:
1.34 dwinter 582: if self.REQUEST.SESSION.has_key('refer'):
583:
584: return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer'])
1.32 dwinter 585: return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url()+"/history")
586:
1.51 dwinter 587:
1.50 dwinter 588: security.declarePublic('getVersionComment')
589: def getVersionComment(self):
590: """getversioncomment"""
591: return self.versionComment
592:
593: security.declarePublic('getTime')
1.51 dwinter 594:
1.15 dwinter 595: def getTime(self):
596: """getTime"""
597: #return self.bobobase_modification_time().ISO()
598: if hasattr(self,'time'):
599: return time.strftime("%Y-%m-%d %H:%M:%S",self.time)
1.56 dwinter 600: elif hasattr(self,'timefixed'):
1.69 ! dwinter 601: return self.timefixed
1.15 dwinter 602: else:
1.56 dwinter 603: setattr(self,'timefixed',self.bobobase_modification_time().ISO())
1.15 dwinter 604: return self.bobobase_modification_time().ISO()
605:
606:
607:
1.14 dwinter 608:
1.1 dwinter 609:
1.48 dwinter 610: def download(self,REQUEST=None,RESPONSE=None):
1.7 dwinter 611: """download and lock"""
612:
1.33 dwinter 613: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getId())
1.47 dwinter 614: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
1.69 ! dwinter 615: #try:
! 616: # txt=self.index_html()
! 617: #except:
! 618: # txt=self.index_html(REQUEST,RESPONSE)
! 619: #
! 620: #self.REQUEST.RESPONSE.setHeader("Content-Length","str(len(txt)+1000)")
! 621:
1.10 dwinter 622: self.content_type="application/octet-stream"
1.49 dwinter 623: self.REQUEST.RESPONSE.redirect(self.absolute_url())
1.45 dwinter 624: #txt=urllib.urlopen(self.absolute_url()).read()
1.47 dwinter 625: #self.REQUEST.RESPONSE.write(txt)
1.69 ! dwinter 626:
1.47 dwinter 627:
1.49 dwinter 628: #self.REQUEST.close()
1.7 dwinter 629:
1.57 dwinter 630: security.declareProtected('AUTHENTICATED_USER','downloadLocked')
1.7 dwinter 631: def downloadLocked(self):
632: """download and lock"""
633:
634:
1.57 dwinter 635: if repr(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User':
1.7 dwinter 636: return "please login first"
637: if not self.aq_parent.lockedBy=="":
638: return "cannot be locked because is already locked by %s"%self.lockedBy
639: self.aq_parent.lockedBy=self.REQUEST['AUTHENTICATED_USER']
1.1 dwinter 640:
1.10 dwinter 641: self.content_type="application/octet-stream"
1.7 dwinter 642: self.REQUEST.RESPONSE.redirect(self.absolute_url())
643:
1.1 dwinter 644: def setVersionNumber(self,versionNumber):
645: """set version"""
646: self.versionNumber=versionNumber
647:
1.50 dwinter 648:
1.42 dwinter 649: security.declarePublic('getVersionNumber')
1.51 dwinter 650:
1.1 dwinter 651: def getVersionNumber(self):
652: """get version"""
653: return self.versionNumber
654:
1.42 dwinter 655: security.declarePublic('getVersionComment')
656: def getVersionComment(self):
657: """get version"""
658: return self.versionComment
659:
1.32 dwinter 660:
1.51 dwinter 661:
1.69 ! dwinter 662: security.declarePublic('lastEditor')
1.51 dwinter 663:
1.1 dwinter 664: def lastEditor(self):
665: """last Editor"""
1.5 dwinter 666: if hasattr(self,'author'):
1.55 dwinter 667: try:
668: ret=self.author.replace("-","\n")
669: except:#old version of versionded file sometimes stored the user object and not only the name the following corrects this
670: ret=str(self.author).replace("-","\n")
1.32 dwinter 671: ret=ret.replace("\r","\n")
1.62 dwinter 672: return ret.lstrip().rstrip()
1.32 dwinter 673:
1.5 dwinter 674: else:
675: jar=self._p_jar
676: oid=self._p_oid
677:
678: if jar is None or oid is None: return None
679:
680: return jar.db().history(oid)[0]['user_name']
1.1 dwinter 681:
682:
683:
684:
685: manage_addVersionedFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject', version='1')
686:
1.5 dwinter 687: def manage_addVersionedFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='',
1.1 dwinter 688: REQUEST=None):
689: """Add a new File object.
690:
691: Creates a new File object 'id' with the contents of 'file'"""
1.5 dwinter 692:
1.1 dwinter 693: id=str(id)
694: title=str(title)
695: content_type=str(content_type)
696: precondition=str(precondition)
1.3 dwinter 697:
1.1 dwinter 698: id, title = cookId(id, title, file)
699:
700: self=self.this()
701:
702: # First, we create the file without data:
703: self._setObject(id, versionedFileObject(id,title,'',content_type, precondition))
704: self._getOb(id).versionComment=str(vC)
1.15 dwinter 705: self._getOb(id).time=time.localtime()
706:
1.5 dwinter 707: setattr(self._getOb(id),'author',author)
1.1 dwinter 708:
709: # Now we "upload" the data. By doing this in two steps, we
710: # can use a database trick to make the upload more efficient.
711: if file:
712: self._getOb(id).manage_upload(file)
713: if content_type:
714: self._getOb(id).content_type=content_type
715:
716: if REQUEST is not None:
717: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
718:
719:
720:
721:
1.50 dwinter 722: class versionedFile(CatalogAware,Folder):
1.1 dwinter 723: """Versioniertes File"""
724:
1.50 dwinter 725: default_catalog='fileCatalog'
726:
1.60 dwinter 727: security= ClassSecurityInfo()
728:
729: security.declarePublic('getTitle')
1.56 dwinter 730: def getTitle(self):
731: """get title"""
732: return self.title
733:
1.50 dwinter 734: def PrincipiaSearchSource(self):
735: """Return cataloguable key for ourselves."""
736: return str(self)
737:
1.5 dwinter 738: def __init__(self, id, title, lockedBy,author):
1.1 dwinter 739: """init"""
740: self.id=id
741: self.title=title
742: self.lockedBy=lockedBy
1.5 dwinter 743: self.author=author
1.32 dwinter 744:
1.39 dwinter 745: def manageImagesForm(self):
746: """manage Images attached to the file"""
1.40 dwinter 747:
748: self.REQUEST.SESSION['refer']=self.REQUEST['HTTP_REFERER']
749:
1.39 dwinter 750: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageImage')).__of__(self)
751: return pt()
752:
1.40 dwinter 753: def manageImages(self,imageUrl=None,caption=None,REQUEST=None):
1.39 dwinter 754: """manage URL"""
755: if imageUrl and (not imageUrl==""):
756: manage_AddImageZogiLib(self,libPath=imageUrl,caption=caption)
757:
1.40 dwinter 758: if self.REQUEST.SESSION.has_key('refer'):
759:
760: return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer'])
761: return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url())
762:
763:
764:
765: def changeImages(self,caption=None,submit=None,id=None,REQUEST=None):
1.39 dwinter 766: """manage URL"""
767: if submit=="change caption":
768: image=self.ZopeFind(self,obj_ids=[id])
769: if image:
770: image[0][1].caption=caption[0:]
771:
772: elif submit=="delete":
773: image=self.ZopeFind(self,obj_ids=[id])
774: if image:
775: self.manage_delObjects([image[0][1].getId()])
1.40 dwinter 776:
777:
778: if self.REQUEST.SESSION.has_key('refer'):
779:
780: return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer'])
781: return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url())
782:
783:
1.39 dwinter 784:
785:
786: def getImages(self):
787: """get Images"""
788: images=self.ZopeFind(self,obj_metatypes=["ImageZogiLib"])
789: if not images:
790: return None
791: else:
792: return images
793:
1.60 dwinter 794: security.declarePublic('getComment')
1.32 dwinter 795: def getComment(self):
796: """get the comment of this file"""
797: if not hasattr(self,'comment') or (not self.comment) or (self.comment.lstrip()==""):
798: return "Add comment"
799:
800: else:
801: return self.comment
802:
1.1 dwinter 803:
804: meta_type="versionedFile"
805:
1.26 dwinter 806: def manageCommentForm(self):
807: """add a comment"""
808: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addComment')).__of__(self)
809: return pt()
810:
811: def manageComment(self,text,comment_author,submit,REQUEST=None):
812: """manage comments"""
813: if submit =='change':
814: if text=='':
815: self.comment=None
816: else:
817: self.comment=text
818: self.comment_author=comment_author
819:
820: self.comment_date=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
821:
822: return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url())
1.61 dwinter 823:
824: security.declarePublic('getLastChangeDate')
825:
826: def getLastChangeDate(self):
827: """get last change date"""
828: lv=self.getLastVersion()
829: time=lv.getTime()
830: return time
831:
832: def getLastEditor(self):
833: """get last change date"""
834: lv=self.getLastVersion()
835: le=lv.lastEditor()
836: return le
837:
1.63 dwinter 838: def getLockedBy(self):
839: """get locked by"""
840: return str(self.lockedBy)
1.61 dwinter 841:
1.60 dwinter 842: security.declarePublic('getLastVersion')
1.1 dwinter 843: def getLastVersion(self):
844: """Last Version"""
845: tmp=0
846: lastVersion=None
1.2 dwinter 847:
1.50 dwinter 848:
1.1 dwinter 849: for version in self.ZopeFind(self):
1.2 dwinter 850:
1.1 dwinter 851: if hasattr(version[1],'versionNumber'):
1.2 dwinter 852:
1.1 dwinter 853: if int(version[1].versionNumber) > tmp:
854: tmp=int(version[1].versionNumber,)
855: lastVersion=version[1]
1.50 dwinter 856: if lastVersion==None:
857: lastVersion=version[1]
858: lastVersion.versionNumber=1
1.1 dwinter 859: return lastVersion
860:
1.54 dwinter 861:
862: def diff(self,data):
863: """differenz between lastversion and data"""
864: d=Differ()
1.66 dwinter 865: data=data.rstrip()
1.69 ! dwinter 866: try:
! 867: tmp=self.getLastVersion().data.rstrip()
! 868: except:
! 869: tmp=str(self.getLastVersion().data).rstrip()
1.54 dwinter 870: #print "XX",data,tmp
1.65 dwinter 871:
1.69 ! dwinter 872: try:
! 873: l=list(d.compare(data.splitlines(1),tmp.splitlines(1)))
1.64 dwinter 874: except:
1.69 ! dwinter 875: try:
! 876: l=list(d.compare(repr(data).splitlines(1),tmp.splitlines(1)))
! 877: except:
! 878: return 9999,[]
1.65 dwinter 879:
1.54 dwinter 880: plus=0
881: minus=0
1.67 dwinter 882:
1.54 dwinter 883: for a in l:
884: if a[0]=='+':
885: plus+=1
886: if a[0]=='-':
887: minus+=1
888:
889:
890: return max([plus,minus]),l
1.60 dwinter 891: security.declarePublic('index_html')
1.1 dwinter 892: def index_html(self):
893: """main view"""
894: lastVersion=self.getLastVersion()
895: #return "File:"+self.title+" Version:%i"%lastVersion.versionNumber," modified:",lastVersion.bobobase_modification_time()," size:",lastVersion.getSize(),"modified by:",lastVersion.lastEditor()
1.15 dwinter 896: return "File: %s Version:%i modified:%s size:%s modified by:%s"%(self.title,lastVersion.versionNumber,lastVersion.getTime(),lastVersion.getSize(),lastVersion.lastEditor())
1.60 dwinter 897:
1.56 dwinter 898:
899:
1.42 dwinter 900: security.declarePublic('getVersion')
1.1 dwinter 901: def getVersion(self):
902: tmp=0
903: for version in self.ZopeFind(self):
1.2 dwinter 904:
1.1 dwinter 905: if hasattr(version[1],'versionNumber'):
1.2 dwinter 906:
1.1 dwinter 907: if int(version[1].versionNumber) > tmp:
908: tmp=int(version[1].versionNumber,)
909: return tmp+1
910:
1.42 dwinter 911:
1.1 dwinter 912: security.declareProtected('AUTHENTICATED_USER','unlock')
913:
914: def history(self):
1.6 dwinter 915: """history"""
916:
917: ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"])
918: if ext:
919: return getattr(self,ext[0][1].getId())()
920:
1.19 dwinter 921: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionHistory')).__of__(self)
1.1 dwinter 922: return pt()
923:
924: def getVersions(self):
925: """get all versions"""
926: ret=[]
927: for version in self.ZopeFind(self):
928: if hasattr(version[1],'versionNumber'):
929: ret.append((version[1].versionNumber,version[1]))
930: ret.sort(sortv)
931: return ret
932:
1.28 dwinter 933: security.declareProtected('AUTHENTICATED_USER','forceunlock')
1.62 dwinter 934: def forceunlock(self,RESPONSE=None):
1.1 dwinter 935: """unlock"""
1.62 dwinter 936: #safe who had the lock
937: if self.lockedBy:
938: self.brokenLock=str(self.lockedBy)
939: else:
940: self.brokenLock=""
1.28 dwinter 941: self.lockedBy=''
1.62 dwinter 942: return self.brokenLock
1.29 dwinter 943:
944: security.declareProtected('AUTHENTICATED_USER','unlock')
945: def unlock(self,RESPONSE):
946: """unlock"""
947: if str(self.lockedBy) in [str(self.REQUEST['AUTHENTICATED_USER'])]:
948: self.lockedBy=''
1.57 dwinter 949: RESPONSE.redirect(self.REQUEST['HTTP_REFERER'])
1.29 dwinter 950: else:
951: return "Sorry, not locked by you! (%s,%s)"%(self.lockedBy,self.REQUEST['AUTHENTICATED_USER'])
952:
953:
1.8 dwinter 954:
1.1 dwinter 955: security.declareProtected('AUTHENTICATED_USER','addVersionedFileObjectForm')
956:
957: def addVersionedFileObjectForm(self):
958: """add a new version"""
1.2 dwinter 959:
960: if str(self.REQUEST['AUTHENTICATED_USER']) in ["Anonymous User"]:
1.1 dwinter 961: return "please login first"
962: if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''):
1.59 dwinter 963: ext=self.ZopeFind(self.aq_parent,obj_ids=["addNewVersion.dtml"])
1.58 dwinter 964: if ext:
1.59 dwinter 965: return ext[0][1]('',globals(),version=self.getVersion(),lastComment=self.getLastVersion().getVersionComment(),AUTHENTICATED_USER=self.REQUEST.AUTHENTICATED_USER)
1.58 dwinter 966: else:
967: out=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version=self.getVersion()).__of__(self)
968: return out()
1.1 dwinter 969: else:
970: return "Sorry file is locked by somebody else"
971:
1.11 dwinter 972: def manage_addVersionedFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None):
1.1 dwinter 973: """add"""
1.35 dwinter 974: try: #der ganze vC unsinn muss ueberarbeitet werden
975: vC=self.REQUEST['vC']
976: except:
977: pass
1.1 dwinter 978:
1.5 dwinter 979: author=self.REQUEST['author']
1.6 dwinter 980:
981: if changeName=="yes":
1.24 dwinter 982: filename=file.filename
983: self.title=filename[max(filename.rfind('/'),
984: filename.rfind('\\'),
985: filename.rfind(':'),
986: )+1:]
987:
1.6 dwinter 988:
1.11 dwinter 989: if not newName=='':
990: self.title=newName[0:]
1.35 dwinter 991:
1.23 dwinter 992:
1.51 dwinter 993:
994:
995:
996: positionVersionNum=getattr(self,'positionVersionNum','front')
997:
998: if positionVersionNum=='front':
999: id="V%i"%self.getVersion()+"_"+self.title
1000: else:
1001: tmp=os.path.splitext(self.title)
1002: if len(tmp)>1:
1003: id=tmp[0]+"_V%i"%self.getVersion()+tmp[1]
1004: else:
1005: id=tmp[0]+"_V%i"%self.getVersion()
1006:
1007:
1008: manage_addVersionedFileObject(self,id,vC,author,file,id,precondition, content_type)
1.1 dwinter 1009: objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
1.27 dwinter 1010: self.REQUEST.SESSION['objID_parent']=self.getId()
1.23 dwinter 1011:
1.61 dwinter 1012: if getattr(self,'defaultFileCatalog',None):
1013:
1014: self.reindex_object()
1015:
1.1 dwinter 1016: if RESPONSE:
1.27 dwinter 1017: obj=self.ZopeFind(self,obj_ids=[id])[0][1]
1018: if obj.getSize()==0:
1019: self.REQUEST.SESSION['objID']=obj.getId()
1.23 dwinter 1020: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
1021: return pt()
1022:
1023: else:
1024: RESPONSE.redirect(self.REQUEST['URL2'])
1.1 dwinter 1025:
1.23 dwinter 1026: else:
1027: return self.ZopeFind(self,obj_ids=[id])[0][1]
1028:
1.1 dwinter 1029: security.declareProtected('AUTHENTICATED_USER','downloadLocked')
1030:
1.7 dwinter 1031: def download(self):
1032: """download and lock"""
1.33 dwinter 1033:
1034: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getLastVersion().getId())
1.47 dwinter 1035: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
1.33 dwinter 1036:
1.69 ! dwinter 1037: #try:
! 1038: # txt=self.getLastVersion.index_html()
! 1039: #except:
! 1040: # txt=self.getLastVersion.index_html(REQUEST,RESPONSE)
1.49 dwinter 1041:
1.69 ! dwinter 1042: #self.REQUEST.RESPONSE.setHeader("Content-Length","str(len(txt)+1000)")
! 1043:
1.33 dwinter 1044: self.content_type="application/octet-stream"
1045: #self.REQUEST.RESPONSE.write("bl")
1.49 dwinter 1046: #self.REQUEST.RESPONSE.write(txt)
1047: #self.REQUEST.close()
1.33 dwinter 1048:
1049: #self.getLastVersion().content_type="application/octet-stream"
1.49 dwinter 1050: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
1.7 dwinter 1051:
1.57 dwinter 1052: security.declareProtected('AUTHENTICATED_USER','downloadLocked')
1.1 dwinter 1053: def downloadLocked(self):
1054: """download and lock"""
1.57 dwinter 1055:
1056: if repr(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User':
1.1 dwinter 1057: return "please login first"
1058: if not self.lockedBy=="":
1059: return "cannot be locked because is already locked by %s"%self.lockedBy
1060: self.lockedBy=self.REQUEST['AUTHENTICATED_USER']
1.9 dwinter 1061: self.getLastVersion().content_type="application/octet-stream"
1.1 dwinter 1062: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
1063:
1064: def manage_addVersionedFileForm(self):
1065: """interface for adding the OSAS_root"""
1.19 dwinter 1066: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVersionedFile.zpt')).__of__(self)
1.1 dwinter 1067: return pt()
1068:
1.5 dwinter 1069: def manage_addVersionedFile(self,id,title,lockedBy, author=None, RESPONSE=None):
1.1 dwinter 1070: """add the OSAS_root"""
1.5 dwinter 1071: newObj=versionedFile(id,title,lockedBy,author)
1.1 dwinter 1072: self._setObject(id,newObj)
1.5 dwinter 1073:
1.1 dwinter 1074: if RESPONSE is not None:
1075: RESPONSE.redirect('manage_main')
1076:
1077:
1078: InitializeClass(versionedFile)
1.69 ! dwinter 1079: InitializeClass(versionedFileFolder)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>