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