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