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