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