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