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