Annotation of versionedFile/versionedFile.py, revision 1.70
1.1 dwinter 1: from OFS.Folder import Folder
2: from OFS.Image import File
3: from OFS.Image import cookId
1.70 ! dwinter 4: from OFS.DTMLDocument import DTMLDocument
1.5 dwinter 5: from Globals import DTMLFile, InitializeClass,package_home
1.1 dwinter 6: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
7: from AccessControl import getSecurityManager
8: from Products.PageTemplates.PageTemplate import PageTemplate
1.5 dwinter 9: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
1.1 dwinter 10: from AccessControl import ClassSecurityInfo
1.54 dwinter 11: from difflib import Differ
12: from pprint import pprint
1.50 dwinter 13: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
1.51 dwinter 14:
1.43 dwinter 15: try:
16: from Products.ImageArchive.ImageArchive import manage_AddImageZogiLib
17: except:
18: print "no images"
1.51 dwinter 19:
1.35 dwinter 20:
21: from threading import Thread
22: import shutil
23: import tempfile
1.5 dwinter 24: import os.path
1.44 dwinter 25: import urllib
1.70 ! dwinter 26: import logging
1.15 dwinter 27: import time
1.19 dwinter 28: try:
29: from Products.ECHO_content.ECHO_collection import ECHO_basis
30: except:
31: print "ECHO Elements not imported"
1.20 dwinter 32: class ECHO_basis:
1.69 dwinter 33: """leer"""
34: manage_options=()
1.1 dwinter 35:
1.69 dwinter 36:
1.1 dwinter 37: def sortv(x,y):
38: return cmp(x[0],y[0])
1.69 dwinter 39:
1.37 dwinter 40: tdir = "/tmp/downloadVersionedFiles"
1.35 dwinter 41:
42: class generateDownloadZip:
43: """generateDownloadSet"""
44:
45: def __init__(self,folderObject,url):
46: """init downloadzip"""
47: self.folder=folderObject
48: self.done=None
49: self.response=""
50: self.url=url
51:
52: def __call__(self):
53: """call generate download zip"""
54: storeTempDir=tempfile.tempdir
1.69 dwinter 55: tempfile.tempdir=tdir
1.35 dwinter 56:
57: tmpPath=tempfile.mktemp()
58: tmpZip=tempfile.mktemp()+".gtz"
59: tmpFn=os.path.split(tmpZip)[1]
60:
61: if not os.path.exists(tempfile.tempdir):
62: os.mkdir(tempfile.tempdir)
63:
64: if not os.path.exists(tmpPath):
1.69 dwinter 65: os.mkdir(tmpPath)
66:
67: tempfile.tempdir=storeTempDir
68: self.response="<h3>1. step: getting the files</h3>"
1.35 dwinter 69:
70: for files in self.folder.ZopeFind(self.folder,obj_metatypes=['versionedFile']):
71: lastV=files[1].getLastVersion()
72: self.response+=str("<p>Get File: %s<br>\n"%lastV.title)
73:
74: savePath=os.path.join(tmpPath,lastV.title)
75: fh=file(savePath,"w")
76: fh.write(lastV.data)
77: fh.close()
78:
79: self.response+="<h3>2. step: creating the downloadable file</h3>"
1.69 dwinter 80: self.response+="<p>Create gtar<br>"
1.35 dwinter 81: self.response+="<p>This can take a while....<br>\n"
82:
83: fh=os.popen2("tar zcvf %s %s/*"%(tmpZip,tmpPath),1)[1]
84: self.response+="<br>"
85: for c in fh.read():
86: self.response+=c
87: if c==")":
88: self.response+="<br>\n"
1.69 dwinter 89:
90:
1.35 dwinter 91:
92:
93: shutil.rmtree(tmpPath)
94:
95: self.response+="<p>finished<br>\n"
96:
97: len=os.stat(tmpZip)[6]
98: downloadUrl=self.url+"/downloadSet"
99: self.response+="""<h1><a href="downloadSet?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len)
1.36 dwinter 100: 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 101: self.response+="""<p>The file will be stored for a while, you can download it later, the URL is:</p>
1.69 dwinter 102: <p><a href="downloadSet?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn)
1.35 dwinter 103:
104: self.done=True
105:
1.1 dwinter 106:
1.35 dwinter 107: def getResult(self):
108: """get result"""
109: return self.response
110:
111: def isDone(self):
112: if self.done:
113: return True
114: else:
115: return False
116:
117:
1.19 dwinter 118: class versionedFileFolder(Folder,ECHO_basis):
1.1 dwinter 119: """Folder with versioned files"""
120:
1.14 dwinter 121:
1.1 dwinter 122: meta_type = "versionedFileFolder"
123:
124: security= ClassSecurityInfo()
125: security.declareProtected('AUTHENTICATED_USER','addFileForm')
1.50 dwinter 126: filesMetaType=['versionedFile']
1.19 dwinter 127: if ECHO_basis:
128: optTMP= Folder.manage_options+ECHO_basis.manage_options
129: else:
130: optTMP= Folder.manage_options
131:
132: manage_options =optTMP+(
1.69 dwinter 133: {'label':'Generate Index.html','action':'generateIndexHTML'},
1.39 dwinter 134: {'label':'Generate Image Index.html','action':'generateIndexHTML_image'},
1.6 dwinter 135: {'label':'Generate history_template.html','action':'generateHistoryHTML'},
1.70 ! dwinter 136: {'label':'Generate addFileForm','action':'generateAddFileForm'},
! 137: {'label':'Import Folder','action':'importFolderForm'},
1.36 dwinter 138: {'label':'Export Folder','action':'exportFolder'},
1.51 dwinter 139: {'label':'Position of version number','action':'changeHistoryFileNamesForm'},
1.19 dwinter 140: )
1.5 dwinter 141:
1.68 dwinter 142:
1.51 dwinter 143: def changeHistoryFileNamesForm(self):
144: """change position of version num"""
145: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeHistoryFileNamesForm.zpt')).__of__(self)
146: return pt()
147:
148:
149: def changeHistoryFileNames(self,positionVersionNum="front",RESPONSE=None):
150: """change position of version num"""
151:
152:
153:
154: versions=self.ZopeFind(self,obj_metatypes=['versionedFileObject'],search_sub=1)
155:
156: if not (getattr(self,'positionVersionNum','front')==positionVersionNum):
157:
158: for version in versions:
159:
160: if positionVersionNum=="front":
161:
162: titleTmp=os.path.splitext(version[1].title)
163: titleTmp2="_".join(titleTmp[0].split("_")[0:-1])
164: if len(titleTmp)>1:
165: id=titleTmp[0].split("_")[-1]+"_"+titleTmp2+"."+titleTmp[1]
166: else:
167: id=titleTmp[0].split("_")[-1]+"_"+titleTmp2
168:
169: else:
170: titleTmp="_".join(version[1].getId().split("_")[1:])
171: tmp=os.path.splitext(titleTmp)
172: if len(tmp)>1:
173: id=tmp[0]+"_"+version[1].getId().split("_")[0]+tmp[1]
174: else:
175: id=tmp[0]+"_"+version[1].getId().split("_")[0]
176:
1.53 dwinter 177:
1.51 dwinter 178:
179: version[1].aq_parent.manage_renameObjects(ids=[version[1].getId()],new_ids=[id])
180: version[1].title=id
181:
182:
183: self.positionVersionNum=positionVersionNum
184: if RESPONSE:
185: RESPONSE.redirect("manage_main")
186:
187:
188:
1.35 dwinter 189: def importFolderForm(self):
190: """form fuer folder import"""
191: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','importFolderForm.zpt')).__of__(self)
192: return pt()
193:
194: def importFolder(self,path,comment="",author=None,lockedBy=None,RESPONSE=None):
195: """importiere inhalt eines folders"""
196:
197: for fileName in os.listdir(path):
198: if os.path.isfile(os.path.join(path,fileName)):
199: manage_addVersionedFile(self,fileName,'','')
200: id=fileName
201: ob=self._getOb(fileName)
202: ob.title=id
203: file2=file(os.path.join(path,fileName))
204:
205: obj=ob.manage_addVersionedFileObject(id,comment,author,file2,content_type='')
206:
207: if RESPONSE:
208: RESPONSE.redirect(self.REQUEST['URL1'])
209:
210: zipThreads={}
211: zipThreads2={}
212:
213: def refreshTxt(self):
214: """txt fuer refresh"""
215: tn=self.REQUEST.SESSION['threadName']
216: return """ 2;url=%s?repeat=%s """%(self.absolute_url()+"/exportFolder",tn)
217:
218: def exportFolder(self,repeat=None):
219: """exportiert alle akutellen files des folders"""
220: threadName=repeat
221:
1.37 dwinter 222: downloadZip=generateDownloadZip(self,self.absolute_url())
223: downloadZip()
224: return downloadZip.getResult()
225: ## if not threadName or threadName=="":
226: ## threadStart=generateDownloadZip(self,self.absolute_url())
227: ## thread=Thread(target=threadStart)
1.35 dwinter 228:
1.37 dwinter 229: ## thread.start()
1.35 dwinter 230:
231:
1.37 dwinter 232: ## self.zipThreads[thread.getName()[0:]]=threadStart
233: ## self.zipThreads2[thread.getName()[0:]]=thread
234: ## self.REQUEST.SESSION['threadName']=thread.getName()[0:]
235: ## wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['zip_wait_template'])
236: ## if wait_template:
237: ## return wait_template[0][1]()
238: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self)
239: ## return pt()
1.35 dwinter 240:
1.37 dwinter 241: ## else:
242: ## self.REQUEST.SESSION['threadName']=threadName
1.35 dwinter 243:
1.37 dwinter 244: ## if (self.zipThreads[threadName].getResult()==None):
1.35 dwinter 245:
1.37 dwinter 246: ## wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
247: ## if wait_template:
248: ## return wait_template[0][1]()
249:
250: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self)
251: ## return pt()
252: ## else:
253: ## if self.zipThreads[threadName].isDone():
254: ## self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult()
255: ## self.zipThreads2[threadName].join()
256: ## del(self.zipThreads2[threadName])
257: ## del(self.zipThreads[threadName])
258: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_result.zpt')).__of__(self)
259: ## return pt()
260:
261: ## else:
262: ## self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult()
263: ## self.REQUEST.SESSION['threadName']=threadName
264: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait_result.zpt')).__of__(self)
265: ## return pt()
1.35 dwinter 266:
267: def downloadSet(self,fn):
1.69 dwinter 268: """download prepared set"""
269: filename=os.path.join(tdir,fn)
1.35 dwinter 270:
1.69 dwinter 271:
272: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%"downloadFileFolder.tgz")
273: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
274: len=os.stat(filename)[6]
275: self.REQUEST.RESPONSE.setHeader("Content-Length",len)
276: images=file(filename).read()
277: self.REQUEST.RESPONSE.write(images)
278: self.REQUEST.RESPONSE.close()
1.35 dwinter 279:
1.69 dwinter 280:
1.35 dwinter 281:
1.14 dwinter 282: def helpDownload(self):
283: """download help"""
284:
1.19 dwinter 285: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','helpDownload')).__of__(self)
1.14 dwinter 286: return pt()
287:
1.39 dwinter 288: def generateIndexHTML_image(self,RESPONSE=None):
289: """lege standard index.html an"""
290:
291:
292: if not self.ZopeFind(self,obj_ids=['index.html']):
293: zt=ZopePageTemplate('index.html')
294: self._setObject('index.html',zt)
295: default_content_fn = os.path.join(package_home(globals()),
296: 'zpt/versionFileFolderMain_image.zpt')
297: text = open(default_content_fn).read()
298: zt.pt_edit(text, 'text/html')
299:
300: else:
301: return "already exists!"
302:
303: if RESPONSE is not None:
304: RESPONSE.redirect('manage_main')
305:
1.58 dwinter 306:
307: def generateAddFileForm(self,RESPONSE=None):
308: """lege standard addfileform an"""
309: #TODO: write generateaddfileform only a dummy at them moment
310:
1.70 ! dwinter 311: if not self.ZopeFind(self,obj_ids=['addFileForm.html']):
! 312: zt=ZopePageTemplate('addFileForm.html')
! 313: self._setObject('addFileForm.html',zt)
1.58 dwinter 314: default_content_fn = os.path.join(package_home(globals()),
1.70 ! dwinter 315: 'zpt/fileAdd_template.zpt')
1.58 dwinter 316: text = open(default_content_fn).read()
317: zt.pt_edit(text, 'text/html')
318:
319: else:
320: return "already exists!"
321:
322: if RESPONSE is not None:
323: RESPONSE.redirect('manage_main')
324:
325:
1.5 dwinter 326: def generateIndexHTML(self,RESPONSE=None):
327: """lege standard index.html an"""
328:
329:
1.22 dwinter 330: if not self.ZopeFind(self,obj_ids=['index.html']):
1.5 dwinter 331: zt=ZopePageTemplate('index.html')
332: self._setObject('index.html',zt)
333: default_content_fn = os.path.join(package_home(globals()),
334: 'zpt/versionFileFolderMain.zpt')
335: text = open(default_content_fn).read()
336: zt.pt_edit(text, 'text/html')
337:
338: else:
339: return "already exists!"
340:
341: if RESPONSE is not None:
342: RESPONSE.redirect('manage_main')
343:
1.6 dwinter 344:
345: def generateHistoryHTML(self,RESPONSE=None):
346: """lege standard index.html an"""
347:
1.5 dwinter 348:
1.6 dwinter 349:
1.22 dwinter 350: if not self.ZopeFind(self,obj_ids=['history_template.html']):
1.6 dwinter 351: zt=ZopePageTemplate('history_template.html')
352: self._setObject('history_template.html',zt)
353: default_content_fn = os.path.join(package_home(globals()),
354: 'zpt/versionHistory.zpt')
355: text = open(default_content_fn).read()
356: zt.pt_edit(text, 'text/html')
357:
358: else:
359: return "already exists!"
360:
361: if RESPONSE is not None:
362: RESPONSE.redirect('manage_main')
363:
1.32 dwinter 364:
365:
366:
1.12 dwinter 367: def getVersionedFiles(self,sortField='title'):
1.1 dwinter 368: """get all versioned files"""
1.12 dwinter 369:
370: def sortName(x,y):
1.18 dwinter 371: return cmp(x[1].title.lower(),y[1].title.lower())
1.12 dwinter 372:
373: def sortDate(x,y):
1.17 dwinter 374: return cmp(y[1].getLastVersion().getTime(),x[1].getLastVersion().getTime())
1.12 dwinter 375:
1.32 dwinter 376:
1.30 dwinter 377: def sortComment(x,y):
1.34 dwinter 378:
379:
380:
1.69 dwinter 381: try:
382: xc=getattr(x[1],'comment','ZZZZZZZZZZZZZ').lower()
383: except:
384: xc='ZZZZZZZZZZZZZ'.lower()
385: try:
386: yc=getattr(y[1],'comment','ZZZZZZZZZZZZZ').lower()
1.31 dwinter 387: except:
1.34 dwinter 388: yc='ZZZZZZZZZZZZZ'.lower()
389:
390:
391: if (xc=='') or (xc=='ZZZZZZZZZZZZZ'.lower()):
392:
393: try:
394: xc=x[1].getLastVersion().getVComment().lower()
395: except:
396: xc='ZZZZZZZZZZZZZ'.lower()
397:
398: if (yc=='') or (yc=='ZZZZZZZZZZZZZ'.lower()):
399: try:
400: yc=y[1].getLastVersion().getVComment().lower()
401: except:
402: yc='ZZZZZZZZZZZZZ'.lower()
403:
404:
405: return cmp(xc,yc)
1.31 dwinter 406:
1.12 dwinter 407: def sortAuthor(x,y):
1.13 dwinter 408:
1.30 dwinter 409: return cmp(x[1].getLastVersion().lastEditor().lower(),y[1].getLastVersion().lastEditor().lower())
1.3 dwinter 410:
1.50 dwinter 411: versionedFiles=self.ZopeFind(self,obj_metatypes=self.filesMetaType)
412:
413:
1.12 dwinter 414: if sortField=='title':
415: versionedFiles.sort(sortName)
416: elif sortField=='date':
417: versionedFiles.sort(sortDate)
418: elif sortField=='author':
419: versionedFiles.sort(sortAuthor)
1.30 dwinter 420: elif sortField=='comment':
421: versionedFiles.sort(sortComment)
1.12 dwinter 422:
1.1 dwinter 423: return versionedFiles
424:
1.4 dwinter 425:
426: def header_html(self):
427: """zusätzlicher header"""
428: ext=self.ZopeFind(self,obj_ids=["header.html"])
429: if ext:
430: return ext[0][1]()
431: else:
432: return ""
1.41 dwinter 433:
434:
435: security.declareProtected('View','index_html')
1.1 dwinter 436: def index_html(self):
437: """main"""
1.4 dwinter 438: ext=self.ZopeFind(self,obj_ids=["index.html"])
439: if ext:
1.5 dwinter 440: return ext[0][1]()
1.4 dwinter 441:
1.19 dwinter 442: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionFileFolderMain')).__of__(self)
1.1 dwinter 443: return pt()
444:
445:
1.58 dwinter 446:
1.1 dwinter 447: def addFileForm(self):
448: """add a file"""
1.70 ! dwinter 449: ext=getattr(self,'addFileForm.html',None)
! 450: logging.error("Found %s"%ext)
1.21 dwinter 451: if ext:
1.70 ! dwinter 452: out=ext
! 453: else:
1.21 dwinter 454:
1.70 ! dwinter 455: out=DTMLFile('dtml/newFileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version='1').__of__(self)
1.1 dwinter 456: return out()
457:
458:
1.11 dwinter 459: def addFile(self,vC,file,author,newName='',content_type='',RESPONSE=None):
1.1 dwinter 460: """ add a new file"""
1.11 dwinter 461: if newName=='':
1.24 dwinter 462: filename=file.filename
463: id=filename[max(filename.rfind('/'),
464: filename.rfind('\\'),
465: filename.rfind(':'),
466: )+1:]
1.25 dwinter 467:
1.11 dwinter 468: else:
469: id=newName
1.1 dwinter 470:
471: vC=self.REQUEST.form['vC']
472: manage_addVersionedFile(self,id,'','')
1.21 dwinter 473: #if (getattr(self,'commentNonEmpty',0)==1) and vC.strip()=="":
474:
475:
1.1 dwinter 476: ob=self._getOb(id)
477: ob.title=id
1.3 dwinter 478: file2=file
1.23 dwinter 479:
480: obj=ob.manage_addVersionedFileObject(id,vC,author,file2,content_type=content_type)
1.27 dwinter 481: self.REQUEST.SESSION['objID']=ob.getId()
482: self.REQUEST.SESSION['objID_parent']=None
1.1 dwinter 483:
1.23 dwinter 484: if obj.getSize()==0:
485: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
486: return pt()
487:
1.1 dwinter 488: RESPONSE.redirect(self.REQUEST['URL1'])
489:
1.27 dwinter 490:
491: def deleteEmptyObject(self,submit,RESPONSE=None):
492: """deleteemptyobject"""
493: if submit=="delete it":
494: if self.REQUEST.SESSION['objID_parent']:
495: obj=getattr(self,self.REQUEST.SESSION['objID_parent'])
496:
497: else:
498: obj=self
499: obj.manage_delObjects([self.REQUEST.SESSION['objID']])
500:
501: RESPONSE.redirect(self.REQUEST['URL1'])
502:
1.1 dwinter 503:
504: manage_addVersionedFileFolderForm=DTMLFile('dtml/folderAdd', globals())
505:
506:
507: def manage_addVersionedFileFolder(self, id, title='',
508: createPublic=0,
509: createUserF=0,
510: REQUEST=None):
511: """Add a new Folder object with id *id*.
512:
513: If the 'createPublic' and 'createUserF' parameters are set to any true
514: value, an 'index_html' and a 'UserFolder' objects are created respectively
515: in the new folder.
516: """
517: ob=versionedFileFolder()
518: ob.id=str(id)
519: ob.title=title
520: self._setObject(id, ob)
521: ob=self._getOb(id)
522:
523: checkPermission=getSecurityManager().checkPermission
524:
525: if createUserF:
526: if not checkPermission('Add User Folders', ob):
527: raise Unauthorized, (
528: 'You are not authorized to add User Folders.'
529: )
530: ob.manage_addUserFolder()
531:
532:
533: if REQUEST is not None:
534: return self.manage_main(self, REQUEST, update_menu=1)
535:
536:
537:
538: class versionedFileObject(File):
539: """File Object im Folder"""
1.50 dwinter 540: security= ClassSecurityInfo()
1.1 dwinter 541: meta_type = "versionedFileObject"
542:
543: manage_editForm =DTMLFile('dtml/fileEdit',globals(),
544: Kind='File',kind='file')
545: manage_editForm._setName('manage_editForm')
1.51 dwinter 546:
1.50 dwinter 547:
1.62 dwinter 548:
549:
1.56 dwinter 550: security.declarePublic('getTitle')
551:
552: def getTitle(self):
553: """get title"""
554: return self.title
555:
1.50 dwinter 556: security.declarePublic('getVComment')
1.32 dwinter 557: def getVComment(self):
558: """get the comment of this file"""
559: if not hasattr(self,'vComment') or (not self.vComment) or (self.vComment.lstrip()==""):
560: return "Add comment"
561:
562: else:
563: return self.vComment
564:
565: def manageVCommentForm(self):
566: """add a comment"""
1.34 dwinter 567:
568: self.REQUEST.SESSION['refer']=self.REQUEST['HTTP_REFERER']
569:
570:
571:
1.32 dwinter 572: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVComment')).__of__(self)
573: return pt()
574:
575: def manageVComment(self,text,comment_author,submit,REQUEST=None):
576: """manage comments"""
577: if submit =='change':
578: if text=='':
579: self.vComment=None
580: else:
581: self.vComment=text
582: self.vComment_author=comment_author
583:
584: self.vComment_date=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
585:
1.34 dwinter 586: if self.REQUEST.SESSION.has_key('refer'):
587:
588: return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer'])
1.32 dwinter 589: return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url()+"/history")
590:
1.70 ! dwinter 591:
1.50 dwinter 592: security.declarePublic('getVersionComment')
593: def getVersionComment(self):
594: """getversioncomment"""
595: return self.versionComment
596:
597: security.declarePublic('getTime')
1.51 dwinter 598:
1.15 dwinter 599: def getTime(self):
600: """getTime"""
601: #return self.bobobase_modification_time().ISO()
602: if hasattr(self,'time'):
603: return time.strftime("%Y-%m-%d %H:%M:%S",self.time)
1.56 dwinter 604: elif hasattr(self,'timefixed'):
1.69 dwinter 605: return self.timefixed
1.15 dwinter 606: else:
1.56 dwinter 607: setattr(self,'timefixed',self.bobobase_modification_time().ISO())
1.15 dwinter 608: return self.bobobase_modification_time().ISO()
609:
610:
611:
1.14 dwinter 612:
1.1 dwinter 613:
1.48 dwinter 614: def download(self,REQUEST=None,RESPONSE=None):
1.7 dwinter 615: """download and lock"""
616:
1.33 dwinter 617: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getId())
1.47 dwinter 618: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
1.69 dwinter 619: #try:
620: # txt=self.index_html()
621: #except:
622: # txt=self.index_html(REQUEST,RESPONSE)
623: #
624: #self.REQUEST.RESPONSE.setHeader("Content-Length","str(len(txt)+1000)")
625:
1.10 dwinter 626: self.content_type="application/octet-stream"
1.49 dwinter 627: self.REQUEST.RESPONSE.redirect(self.absolute_url())
1.45 dwinter 628: #txt=urllib.urlopen(self.absolute_url()).read()
1.47 dwinter 629: #self.REQUEST.RESPONSE.write(txt)
1.69 dwinter 630:
1.47 dwinter 631:
1.49 dwinter 632: #self.REQUEST.close()
1.7 dwinter 633:
1.57 dwinter 634: security.declareProtected('AUTHENTICATED_USER','downloadLocked')
1.7 dwinter 635: def downloadLocked(self):
636: """download and lock"""
637:
638:
1.57 dwinter 639: if repr(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User':
1.7 dwinter 640: return "please login first"
641: if not self.aq_parent.lockedBy=="":
642: return "cannot be locked because is already locked by %s"%self.lockedBy
643: self.aq_parent.lockedBy=self.REQUEST['AUTHENTICATED_USER']
1.1 dwinter 644:
1.10 dwinter 645: self.content_type="application/octet-stream"
1.7 dwinter 646: self.REQUEST.RESPONSE.redirect(self.absolute_url())
647:
1.1 dwinter 648: def setVersionNumber(self,versionNumber):
649: """set version"""
650: self.versionNumber=versionNumber
651:
1.50 dwinter 652:
1.42 dwinter 653: security.declarePublic('getVersionNumber')
1.51 dwinter 654:
1.1 dwinter 655: def getVersionNumber(self):
656: """get version"""
657: return self.versionNumber
658:
1.42 dwinter 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>