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