Annotation of versionedFile/versionedFile.py, revision 1.21
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:
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:
56:
57:
58: if not hasattr(self,'index.html'):
59: zt=ZopePageTemplate('index.html')
60: self._setObject('index.html',zt)
61: default_content_fn = os.path.join(package_home(globals()),
62: 'zpt/versionFileFolderMain.zpt')
63: text = open(default_content_fn).read()
64: zt.pt_edit(text, 'text/html')
65:
66: else:
67: return "already exists!"
68:
69: if RESPONSE is not None:
70: RESPONSE.redirect('manage_main')
71:
1.6 dwinter 72:
73: def generateHistoryHTML(self,RESPONSE=None):
74: """lege standard index.html an"""
75:
1.5 dwinter 76:
1.6 dwinter 77:
78:
79: if not hasattr(self,'history_template.html'):
80: zt=ZopePageTemplate('history_template.html')
81: self._setObject('history_template.html',zt)
82: default_content_fn = os.path.join(package_home(globals()),
83: 'zpt/versionHistory.zpt')
84: text = open(default_content_fn).read()
85: zt.pt_edit(text, 'text/html')
86:
87: else:
88: return "already exists!"
89:
90: if RESPONSE is not None:
91: RESPONSE.redirect('manage_main')
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:
102: def sortAuthor(x,y):
1.13 dwinter 103:
104: return cmp(x[1].getLastVersion().lastEditor(),y[1].getLastVersion().lastEditor())
1.3 dwinter 105:
1.2 dwinter 106: versionedFiles=self.ZopeFind(self,obj_metatypes=['versionedFile'])
1.12 dwinter 107:
108: if sortField=='title':
109: versionedFiles.sort(sortName)
110: elif sortField=='date':
111: versionedFiles.sort(sortDate)
112: elif sortField=='author':
113: versionedFiles.sort(sortAuthor)
114:
1.1 dwinter 115: return versionedFiles
116:
1.4 dwinter 117:
118: def header_html(self):
119: """zusätzlicher header"""
120: ext=self.ZopeFind(self,obj_ids=["header.html"])
121: if ext:
122: return ext[0][1]()
123: else:
124: return ""
125:
1.1 dwinter 126: def index_html(self):
127: """main"""
1.4 dwinter 128: ext=self.ZopeFind(self,obj_ids=["index.html"])
129: if ext:
1.5 dwinter 130: return ext[0][1]()
1.4 dwinter 131:
1.19 dwinter 132: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionFileFolderMain')).__of__(self)
1.1 dwinter 133: return pt()
134:
135:
136: def addFileForm(self):
137: """add a file"""
1.21 ! dwinter 138: ext=self.ZopeFind(self,obj_ids=["addFileForm.dtml"])
! 139: if ext:
! 140: return ext[0][1]('',globals(),version='1',AUTHENTICATED_USER=self.REQUEST.AUTHENTICATED_USER)
! 141:
1.1 dwinter 142: out=DTMLFile('dtml/newFileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version='1').__of__(self)
143: return out()
144:
145:
1.11 dwinter 146: def addFile(self,vC,file,author,newName='',content_type='',RESPONSE=None):
1.1 dwinter 147: """ add a new file"""
1.11 dwinter 148: if newName=='':
149: id=file.filename
150: else:
151: id=newName
1.1 dwinter 152:
153: vC=self.REQUEST.form['vC']
154: manage_addVersionedFile(self,id,'','')
1.21 ! dwinter 155: #if (getattr(self,'commentNonEmpty',0)==1) and vC.strip()=="":
! 156:
! 157:
1.1 dwinter 158: ob=self._getOb(id)
159: ob.title=id
1.3 dwinter 160: file2=file
1.5 dwinter 161: ob.manage_addVersionedFileObject(id,vC,author,file2,content_type=content_type)
1.1 dwinter 162:
163: RESPONSE.redirect(self.REQUEST['URL1'])
164:
165:
166: manage_addVersionedFileFolderForm=DTMLFile('dtml/folderAdd', globals())
167:
168:
169: def manage_addVersionedFileFolder(self, id, title='',
170: createPublic=0,
171: createUserF=0,
172: REQUEST=None):
173: """Add a new Folder object with id *id*.
174:
175: If the 'createPublic' and 'createUserF' parameters are set to any true
176: value, an 'index_html' and a 'UserFolder' objects are created respectively
177: in the new folder.
178: """
179: ob=versionedFileFolder()
180: ob.id=str(id)
181: ob.title=title
182: self._setObject(id, ob)
183: ob=self._getOb(id)
184:
185: checkPermission=getSecurityManager().checkPermission
186:
187: if createUserF:
188: if not checkPermission('Add User Folders', ob):
189: raise Unauthorized, (
190: 'You are not authorized to add User Folders.'
191: )
192: ob.manage_addUserFolder()
193:
194:
195: if REQUEST is not None:
196: return self.manage_main(self, REQUEST, update_menu=1)
197:
198:
199:
200: class versionedFileObject(File):
201: """File Object im Folder"""
202:
203: meta_type = "versionedFileObject"
204:
205: manage_editForm =DTMLFile('dtml/fileEdit',globals(),
206: Kind='File',kind='file')
207: manage_editForm._setName('manage_editForm')
1.14 dwinter 208:
1.15 dwinter 209: def getTime(self):
210: """getTime"""
211: #return self.bobobase_modification_time().ISO()
212: if hasattr(self,'time'):
213: return time.strftime("%Y-%m-%d %H:%M:%S",self.time)
1.16 dwinter 214: elif hasattr(self,'timefixed'):
215: return self.timefixed
1.15 dwinter 216: else:
1.16 dwinter 217: setattr(self,'timefixed',self.bobobase_modification_time().ISO())
1.15 dwinter 218: return self.bobobase_modification_time().ISO()
219:
220:
221:
1.14 dwinter 222:
1.1 dwinter 223:
1.7 dwinter 224: def download(self):
225: """download and lock"""
226:
227:
1.10 dwinter 228: self.content_type="application/octet-stream"
1.7 dwinter 229: self.REQUEST.RESPONSE.redirect(self.absolute_url())
230:
231: def downloadLocked(self):
232: """download and lock"""
233:
234:
235: if self.REQUEST['AUTHENTICATED_USER']=='Anonymous User':
236: return "please login first"
237: if not self.aq_parent.lockedBy=="":
238: return "cannot be locked because is already locked by %s"%self.lockedBy
239: self.aq_parent.lockedBy=self.REQUEST['AUTHENTICATED_USER']
1.1 dwinter 240:
1.10 dwinter 241: self.content_type="application/octet-stream"
1.7 dwinter 242: self.REQUEST.RESPONSE.redirect(self.absolute_url())
243:
1.1 dwinter 244: def setVersionNumber(self,versionNumber):
245: """set version"""
246: self.versionNumber=versionNumber
247:
248: def getVersionNumber(self):
249: """get version"""
250: return self.versionNumber
251:
252: def lastEditor(self):
253: """last Editor"""
1.5 dwinter 254: if hasattr(self,'author'):
255: return self.author
256: else:
257: jar=self._p_jar
258: oid=self._p_oid
259:
260: if jar is None or oid is None: return None
261:
262: return jar.db().history(oid)[0]['user_name']
1.1 dwinter 263:
264:
265:
266:
267: manage_addVersionedFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject', version='1')
268:
1.5 dwinter 269: def manage_addVersionedFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='',
1.1 dwinter 270: REQUEST=None):
271: """Add a new File object.
272:
273: Creates a new File object 'id' with the contents of 'file'"""
1.5 dwinter 274:
1.1 dwinter 275: id=str(id)
276: title=str(title)
277: content_type=str(content_type)
278: precondition=str(precondition)
1.3 dwinter 279:
1.1 dwinter 280: id, title = cookId(id, title, file)
281:
282: self=self.this()
283:
284: # First, we create the file without data:
285: self._setObject(id, versionedFileObject(id,title,'',content_type, precondition))
286: self._getOb(id).versionComment=str(vC)
1.15 dwinter 287: self._getOb(id).time=time.localtime()
288:
1.5 dwinter 289: setattr(self._getOb(id),'author',author)
1.1 dwinter 290:
291: # Now we "upload" the data. By doing this in two steps, we
292: # can use a database trick to make the upload more efficient.
293: if file:
294: self._getOb(id).manage_upload(file)
295: if content_type:
296: self._getOb(id).content_type=content_type
297:
298: if REQUEST is not None:
299: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
300:
301:
302:
303:
304: class versionedFile(Folder):
305: """Versioniertes File"""
306:
1.5 dwinter 307: def __init__(self, id, title, lockedBy,author):
1.1 dwinter 308: """init"""
309: self.id=id
310: self.title=title
311: self.lockedBy=lockedBy
1.5 dwinter 312: self.author=author
1.15 dwinter 313:
1.1 dwinter 314:
315: meta_type="versionedFile"
316:
1.15 dwinter 317:
1.1 dwinter 318: def getLastVersion(self):
319: """Last Version"""
320: tmp=0
321: lastVersion=None
1.2 dwinter 322:
1.1 dwinter 323: for version in self.ZopeFind(self):
1.2 dwinter 324:
1.1 dwinter 325: if hasattr(version[1],'versionNumber'):
1.2 dwinter 326:
1.1 dwinter 327: if int(version[1].versionNumber) > tmp:
328: tmp=int(version[1].versionNumber,)
329: lastVersion=version[1]
330: return lastVersion
331:
332: def index_html(self):
333: """main view"""
334: lastVersion=self.getLastVersion()
335: #return "File:"+self.title+" Version:%i"%lastVersion.versionNumber," modified:",lastVersion.bobobase_modification_time()," size:",lastVersion.getSize(),"modified by:",lastVersion.lastEditor()
1.15 dwinter 336: 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 337:
338: def getVersion(self):
339: tmp=0
340: for version in self.ZopeFind(self):
1.2 dwinter 341:
1.1 dwinter 342: if hasattr(version[1],'versionNumber'):
1.2 dwinter 343:
1.1 dwinter 344: if int(version[1].versionNumber) > tmp:
345: tmp=int(version[1].versionNumber,)
346: return tmp+1
347:
348: security= ClassSecurityInfo()
349: security.declareProtected('AUTHENTICATED_USER','unlock')
350:
351: def history(self):
1.6 dwinter 352: """history"""
353:
354: ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"])
355: if ext:
356: return getattr(self,ext[0][1].getId())()
357:
1.19 dwinter 358: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionHistory')).__of__(self)
1.1 dwinter 359: return pt()
360:
361: def getVersions(self):
362: """get all versions"""
363: ret=[]
364: for version in self.ZopeFind(self):
365: if hasattr(version[1],'versionNumber'):
366: ret.append((version[1].versionNumber,version[1]))
367: ret.sort(sortv)
368: return ret
369:
1.8 dwinter 370: security.declareProtected('AUTHENTICATED_USER','unlock')
1.1 dwinter 371: def unlock(self,RESPONSE):
372: """unlock"""
1.2 dwinter 373: if str(self.lockedBy) in [str(self.REQUEST['AUTHENTICATED_USER'])]:
1.1 dwinter 374: self.lockedBy=''
375: RESPONSE.redirect(self.REQUEST['URL2'])
376: else:
377: return "Sorry, not locked by you! (%s,%s)"%(self.lockedBy,self.REQUEST['AUTHENTICATED_USER'])
378:
1.8 dwinter 379:
1.1 dwinter 380: security.declareProtected('AUTHENTICATED_USER','addVersionedFileObjectForm')
381:
382: def addVersionedFileObjectForm(self):
383: """add a new version"""
1.2 dwinter 384:
385: if str(self.REQUEST['AUTHENTICATED_USER']) in ["Anonymous User"]:
1.1 dwinter 386: return "please login first"
387: if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''):
388: out=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version=self.getVersion()).__of__(self)
389: return out()
390: else:
391: return "Sorry file is locked by somebody else"
392:
1.11 dwinter 393: def manage_addVersionedFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None):
1.1 dwinter 394: """add"""
395:
396: vC=self.REQUEST['vC']
1.5 dwinter 397: author=self.REQUEST['author']
1.6 dwinter 398:
399: if changeName=="yes":
400: self.title=file.filename[0:]
401:
1.11 dwinter 402: if not newName=='':
403: self.title=newName[0:]
1.6 dwinter 404:
1.1 dwinter 405: id="V%i"%self.getVersion()+"_"+self.title
1.5 dwinter 406: manage_addVersionedFileObject(self,id,vC,author,file,"V%i"%self.getVersion()+"_"+self.title,precondition, content_type)
1.1 dwinter 407: objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
408:
409: if RESPONSE:
410: RESPONSE.redirect(self.REQUEST['URL2'])
411:
412: security.declareProtected('AUTHENTICATED_USER','downloadLocked')
413:
1.7 dwinter 414: def download(self):
415: """download and lock"""
1.9 dwinter 416: self.getLastVersion().content_type="application/octet-stream"
1.7 dwinter 417: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
418:
1.1 dwinter 419: def downloadLocked(self):
420: """download and lock"""
421: if self.REQUEST['AUTHENTICATED_USER']=='Anonymous User':
422: return "please login first"
423: if not self.lockedBy=="":
424: return "cannot be locked because is already locked by %s"%self.lockedBy
425: self.lockedBy=self.REQUEST['AUTHENTICATED_USER']
1.9 dwinter 426: self.getLastVersion().content_type="application/octet-stream"
1.1 dwinter 427: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
428:
429: def manage_addVersionedFileForm(self):
430: """interface for adding the OSAS_root"""
1.19 dwinter 431: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVersionedFile.zpt')).__of__(self)
1.1 dwinter 432: return pt()
433:
1.5 dwinter 434: def manage_addVersionedFile(self,id,title,lockedBy, author=None, RESPONSE=None):
1.1 dwinter 435: """add the OSAS_root"""
1.5 dwinter 436: newObj=versionedFile(id,title,lockedBy,author)
1.1 dwinter 437: self._setObject(id,newObj)
1.5 dwinter 438:
1.1 dwinter 439: if RESPONSE is not None:
440: RESPONSE.redirect('manage_main')
441:
442:
443: InitializeClass(versionedFile)
444: InitializeClass(versionedFileFolder)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>