1: from OFS.Folder import Folder
2: from OFS.Image import File
3: from OFS.Image import cookId
4: from OFS.DTMLDocument import DTMLDocument
5: from Globals import DTMLFile, InitializeClass,package_home
6: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
7: from AccessControl import getSecurityManager
8: from Products.PageTemplates.PageTemplate import PageTemplate
9: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
10: from AccessControl import ClassSecurityInfo
11: from difflib import Differ
12: from pprint import pprint
13: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
14:
15: try:
16: from Products.ImageArchive.ImageArchive import manage_AddImageZogiLib
17: except:
18: print "no images"
19:
20:
21: from threading import Thread
22: import shutil
23: import tempfile
24: import os.path
25: import urllib
26: import logging
27: import time
28: try:
29: from Products.ECHO_content.ECHO_collection import ECHO_basis
30: except:
31: print "ECHO Elements not imported"
32: class ECHO_basis:
33: """leer"""
34: manage_options=()
35:
36:
37: def sortv(x,y):
38: return cmp(x[0],y[0])
39:
40: tdir = "/tmp/downloadVersionedFiles"
41:
42: class generateDownloadZip:
43: """generateDownloadSet"""
44:
45: def __init__(self,folderObject,url):
46: """init downloadzip"""
47: self.folder=folderObject
48: self.done=None
49: self.response=""
50: self.url=url
51:
52: def __call__(self):
53: """call generate download zip"""
54: storeTempDir=tempfile.tempdir
55: tempfile.tempdir=tdir
56:
57: tmpPath=tempfile.mktemp()
58: tmpZip=tempfile.mktemp()+".gtz"
59: tmpFn=os.path.split(tmpZip)[1]
60:
61: if not os.path.exists(tempfile.tempdir):
62: os.mkdir(tempfile.tempdir)
63:
64: if not os.path.exists(tmpPath):
65: os.mkdir(tmpPath)
66:
67: tempfile.tempdir=storeTempDir
68: self.response="<h3>1. step: getting the files</h3>"
69:
70: for files in self.folder.ZopeFind(self.folder,obj_metatypes=['versionedFile']):
71: lastV=files[1].getLastVersion()
72: self.response+=str("<p>Get File: %s<br>\n"%lastV.title)
73:
74: savePath=os.path.join(tmpPath,lastV.title)
75: fh=file(savePath,"w")
76: logging.debug("writing file %1 data in %s"%(lastV.title,savePath))
77: # loop to get OFS.Image.File data
78: data=lastV.data
79: if isinstance(data, str):
80: fh.write(data)
81: else:
82: while data is not None:
83: fh.write(data.data)
84: data=data.next
85:
86: fh.close()
87:
88: self.response+="<h3>2. step: creating the downloadable file</h3>"
89: self.response+="<p>Create gtar<br>"
90: self.response+="<p>This can take a while....<br>\n"
91:
92: fh=os.popen2("tar zcvf %s %s/*"%(tmpZip,tmpPath),1)[1]
93: self.response+="<br>"
94: for c in fh.read():
95: self.response+=c
96: if c==")":
97: self.response+="<br>\n"
98:
99:
100:
101:
102: shutil.rmtree(tmpPath)
103:
104: self.response+="<p>finished<br>\n"
105:
106: len=os.stat(tmpZip)[6]
107: downloadUrl=self.url+"/downloadSet"
108: self.response+="""<h1><a href="downloadSet?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len)
109: self.response+="""<p>The file you receive is a tar (gnutar) compressed file, after unpacking you will find a new folder <emph>tmp</emph> where the files are stored in.</p>"""
110: self.response+="""<p>The file will be stored for a while, you can download it later, the URL is:</p>
111: <p><a href="downloadSet?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn)
112:
113: self.done=True
114:
115:
116: def getResult(self):
117: """get result"""
118: return self.response
119:
120: def isDone(self):
121: if self.done:
122: return True
123: else:
124: return False
125:
126:
127: class versionedFileFolder(Folder,ECHO_basis):
128: """Folder with versioned files"""
129:
130:
131: meta_type = "versionedFileFolder"
132:
133: security= ClassSecurityInfo()
134: security.declareProtected('AUTHENTICATED_USER','addFileForm')
135: filesMetaType=['versionedFile']
136: if ECHO_basis:
137: optTMP= Folder.manage_options+ECHO_basis.manage_options
138: else:
139: optTMP= Folder.manage_options
140:
141: manage_options =optTMP+(
142: {'label':'Generate Index.html','action':'generateIndexHTML'},
143: {'label':'Generate Image Index.html','action':'generateIndexHTML_image'},
144: {'label':'Generate history_template.html','action':'generateHistoryHTML'},
145: {'label':'Generate addFileForm','action':'generateAddFileForm'},
146: {'label':'Import Folder','action':'importFolderForm'},
147: {'label':'Export Folder','action':'exportFolder'},
148: {'label':'Position of version number','action':'changeHistoryFileNamesForm'},
149: )
150:
151:
152: def changeHistoryFileNamesForm(self):
153: """change position of version num"""
154: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeHistoryFileNamesForm.zpt')).__of__(self)
155: return pt()
156:
157:
158: def changeHistoryFileNames(self,positionVersionNum="front",RESPONSE=None):
159: """change position of version num"""
160:
161:
162:
163: versions=self.ZopeFind(self,obj_metatypes=['versionedFileObject'],search_sub=1)
164:
165: if not (getattr(self,'positionVersionNum','front')==positionVersionNum):
166:
167: for version in versions:
168:
169: if positionVersionNum=="front":
170:
171: titleTmp=os.path.splitext(version[1].title)
172: titleTmp2="_".join(titleTmp[0].split("_")[0:-1])
173: if len(titleTmp)>1:
174: id=titleTmp[0].split("_")[-1]+"_"+titleTmp2+"."+titleTmp[1]
175: else:
176: id=titleTmp[0].split("_")[-1]+"_"+titleTmp2
177:
178: else:
179: titleTmp="_".join(version[1].getId().split("_")[1:])
180: tmp=os.path.splitext(titleTmp)
181: if len(tmp)>1:
182: id=tmp[0]+"_"+version[1].getId().split("_")[0]+tmp[1]
183: else:
184: id=tmp[0]+"_"+version[1].getId().split("_")[0]
185:
186:
187:
188: version[1].aq_parent.manage_renameObjects(ids=[version[1].getId()],new_ids=[id])
189: version[1].title=id
190:
191:
192: self.positionVersionNum=positionVersionNum
193: if RESPONSE:
194: RESPONSE.redirect("manage_main")
195:
196:
197:
198: def importFolderForm(self):
199: """form fuer folder import"""
200: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','importFolderForm.zpt')).__of__(self)
201: return pt()
202:
203: def importFolder(self,path,comment="",author=None,lockedBy=None,RESPONSE=None):
204: """importiere inhalt eines folders"""
205:
206: for fileName in os.listdir(path):
207: if os.path.isfile(os.path.join(path,fileName)):
208: manage_addVersionedFile(self,fileName,'','')
209: id=fileName
210: ob=self._getOb(fileName)
211: ob.title=id
212: file2=file(os.path.join(path,fileName))
213:
214: obj=ob.manage_addVersionedFileObject(id,comment,author,file2,content_type='')
215:
216: if RESPONSE:
217: RESPONSE.redirect(self.REQUEST['URL1'])
218:
219: zipThreads={}
220: zipThreads2={}
221:
222: def refreshTxt(self):
223: """txt fuer refresh"""
224: tn=self.REQUEST.SESSION['threadName']
225: return """ 2;url=%s?repeat=%s """%(self.absolute_url()+"/exportFolder",tn)
226:
227: def exportFolder(self,repeat=None):
228: """exportiert alle akutellen files des folders"""
229: threadName=repeat
230:
231: downloadZip=generateDownloadZip(self,self.absolute_url())
232: downloadZip()
233: return downloadZip.getResult()
234: ## if not threadName or threadName=="":
235: ## threadStart=generateDownloadZip(self,self.absolute_url())
236: ## thread=Thread(target=threadStart)
237:
238: ## thread.start()
239:
240:
241: ## self.zipThreads[thread.getName()[0:]]=threadStart
242: ## self.zipThreads2[thread.getName()[0:]]=thread
243: ## self.REQUEST.SESSION['threadName']=thread.getName()[0:]
244: ## wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['zip_wait_template'])
245: ## if wait_template:
246: ## return wait_template[0][1]()
247: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self)
248: ## return pt()
249:
250: ## else:
251: ## self.REQUEST.SESSION['threadName']=threadName
252:
253: ## if (self.zipThreads[threadName].getResult()==None):
254:
255: ## wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
256: ## if wait_template:
257: ## return wait_template[0][1]()
258:
259: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait.zpt')).__of__(self)
260: ## return pt()
261: ## else:
262: ## if self.zipThreads[threadName].isDone():
263: ## self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult()
264: ## self.zipThreads2[threadName].join()
265: ## del(self.zipThreads2[threadName])
266: ## del(self.zipThreads[threadName])
267: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_result.zpt')).__of__(self)
268: ## return pt()
269:
270: ## else:
271: ## self.REQUEST.SESSION['result']=self.zipThreads[threadName].getResult()
272: ## self.REQUEST.SESSION['threadName']=threadName
273: ## pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','zip_wait_result.zpt')).__of__(self)
274: ## return pt()
275:
276: def downloadSet(self,fn):
277: """download prepared set"""
278: filename=os.path.join(tdir,fn)
279:
280:
281: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%"downloadFileFolder.tgz")
282: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
283: len=os.stat(filename)[6]
284: self.REQUEST.RESPONSE.setHeader("Content-Length",len)
285: images=file(filename).read()
286: self.REQUEST.RESPONSE.write(images)
287: self.REQUEST.RESPONSE.close()
288:
289:
290:
291: def helpDownload(self):
292: """download help"""
293:
294: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','helpDownload')).__of__(self)
295: return pt()
296:
297: def generateIndexHTML_image(self,RESPONSE=None):
298: """lege standard index.html an"""
299:
300:
301: if not self.ZopeFind(self,obj_ids=['index.html']):
302: zt=ZopePageTemplate('index.html')
303: self._setObject('index.html',zt)
304: default_content_fn = os.path.join(package_home(globals()),
305: 'zpt/versionFileFolderMain_image.zpt')
306: text = open(default_content_fn).read()
307: zt.pt_edit(text, 'text/html')
308:
309: else:
310: return "already exists!"
311:
312: if RESPONSE is not None:
313: RESPONSE.redirect('manage_main')
314:
315:
316: def generateAddFileForm(self,RESPONSE=None):
317: """lege standard addfileform an"""
318: #TODO: write generateaddfileform only a dummy at them moment
319:
320: if not self.ZopeFind(self,obj_ids=['addFileForm.html']):
321: zt=ZopePageTemplate('addFileForm.html')
322: self._setObject('addFileForm.html',zt)
323: default_content_fn = os.path.join(package_home(globals()),
324: 'zpt/fileAdd_template.zpt')
325: text = open(default_content_fn).read()
326: zt.pt_edit(text, 'text/html')
327:
328: else:
329: return "already exists!"
330:
331: if RESPONSE is not None:
332: RESPONSE.redirect('manage_main')
333:
334:
335: def generateIndexHTML(self,RESPONSE=None):
336: """lege standard index.html an"""
337:
338:
339: if not self.ZopeFind(self,obj_ids=['index.html']):
340: zt=ZopePageTemplate('index.html')
341: self._setObject('index.html',zt)
342: default_content_fn = os.path.join(package_home(globals()),
343: 'zpt/versionFileFolderMain.zpt')
344: text = open(default_content_fn).read()
345: zt.pt_edit(text, 'text/html')
346:
347: else:
348: return "already exists!"
349:
350: if RESPONSE is not None:
351: RESPONSE.redirect('manage_main')
352:
353:
354: def generateHistoryHTML(self,RESPONSE=None):
355: """lege standard index.html an"""
356:
357:
358:
359: if not self.ZopeFind(self,obj_ids=['history_template.html']):
360: zt=ZopePageTemplate('history_template.html')
361: self._setObject('history_template.html',zt)
362: default_content_fn = os.path.join(package_home(globals()),
363: 'zpt/versionHistory.zpt')
364: text = open(default_content_fn).read()
365: zt.pt_edit(text, 'text/html')
366:
367: else:
368: return "already exists!"
369:
370: if RESPONSE is not None:
371: RESPONSE.redirect('manage_main')
372:
373:
374:
375:
376: def getVersionedFiles(self,sortField='title'):
377: """get all versioned files"""
378:
379: def sortName(x,y):
380: return cmp(x[1].title.lower(),y[1].title.lower())
381:
382: def sortDate(x,y):
383: return cmp(y[1].getLastVersion().getTime(),x[1].getLastVersion().getTime())
384:
385:
386: def sortComment(x,y):
387:
388:
389:
390: try:
391: xc=getattr(x[1],'comment','ZZZZZZZZZZZZZ').lower()
392: except:
393: xc='ZZZZZZZZZZZZZ'.lower()
394: try:
395: yc=getattr(y[1],'comment','ZZZZZZZZZZZZZ').lower()
396: except:
397: yc='ZZZZZZZZZZZZZ'.lower()
398:
399:
400: if (xc=='') or (xc=='ZZZZZZZZZZZZZ'.lower()):
401:
402: try:
403: xc=x[1].getLastVersion().getVComment().lower()
404: except:
405: xc='ZZZZZZZZZZZZZ'.lower()
406:
407: if (yc=='') or (yc=='ZZZZZZZZZZZZZ'.lower()):
408: try:
409: yc=y[1].getLastVersion().getVComment().lower()
410: except:
411: yc='ZZZZZZZZZZZZZ'.lower()
412:
413:
414: return cmp(xc,yc)
415:
416: def sortAuthor(x,y):
417:
418: return cmp(x[1].getLastVersion().lastEditor().lower(),y[1].getLastVersion().lastEditor().lower())
419:
420: versionedFiles=self.ZopeFind(self,obj_metatypes=self.filesMetaType)
421:
422:
423: if sortField=='title':
424: versionedFiles.sort(sortName)
425: elif sortField=='date':
426: versionedFiles.sort(sortDate)
427: elif sortField=='author':
428: versionedFiles.sort(sortAuthor)
429: elif sortField=='comment':
430: versionedFiles.sort(sortComment)
431:
432: return versionedFiles
433:
434:
435: def header_html(self):
436: """zusaetzlicher header"""
437: ext=self.ZopeFind(self,obj_ids=["header.html"])
438: if ext:
439: return ext[0][1]()
440: else:
441: return ""
442:
443:
444: security.declareProtected('View','index_html')
445: def index_html(self):
446: """main"""
447: ext=self.ZopeFind(self,obj_ids=["index.html"])
448: if ext:
449: return ext[0][1]()
450:
451: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionFileFolderMain')).__of__(self)
452: return pt()
453:
454:
455:
456: def addFileForm(self):
457: """add a file"""
458: ext=getattr(self,'addFileForm.html',None)
459: logging.error("Found %s"%ext)
460: if ext:
461: out=ext
462: else:
463:
464: out=DTMLFile('dtml/newFileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version='1').__of__(self)
465: return out()
466:
467:
468: def addFile(self,vC,file,author,newName='',content_type='',RESPONSE=None):
469: """ add a new file"""
470: if newName=='':
471: filename=file.filename
472: id=filename[max(filename.rfind('/'),
473: filename.rfind('\\'),
474: filename.rfind(':'),
475: )+1:]
476:
477: else:
478: id=newName
479:
480: vC=self.REQUEST.form['vC']
481: manage_addVersionedFile(self,id,'','')
482: #if (getattr(self,'commentNonEmpty',0)==1) and vC.strip()=="":
483:
484:
485: ob=self._getOb(id)
486: ob.title=id
487: file2=file
488:
489: obj=ob.manage_addVersionedFileObject(id,vC,author,file2,content_type=content_type)
490: self.REQUEST.SESSION['objID']=ob.getId()
491: self.REQUEST.SESSION['objID_parent']=None
492:
493: if obj.getSize()==0:
494: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
495: return pt()
496:
497: RESPONSE.redirect(self.REQUEST['URL1'])
498:
499:
500: def deleteEmptyObject(self,submit,RESPONSE=None):
501: """deleteemptyobject"""
502: if submit=="delete it":
503: if self.REQUEST.SESSION['objID_parent']:
504: obj=getattr(self,self.REQUEST.SESSION['objID_parent'])
505:
506: else:
507: obj=self
508: obj.manage_delObjects([self.REQUEST.SESSION['objID']])
509:
510: RESPONSE.redirect(self.REQUEST['URL1'])
511:
512:
513: manage_addVersionedFileFolderForm=DTMLFile('dtml/folderAdd', globals())
514:
515:
516: def manage_addVersionedFileFolder(self, id, title='',
517: createPublic=0,
518: createUserF=0,
519: REQUEST=None):
520: """Add a new Folder object with id *id*.
521:
522: If the 'createPublic' and 'createUserF' parameters are set to any true
523: value, an 'index_html' and a 'UserFolder' objects are created respectively
524: in the new folder.
525: """
526: ob=versionedFileFolder()
527: ob.id=str(id)
528: ob.title=title
529: self._setObject(id, ob)
530: ob=self._getOb(id)
531:
532: checkPermission=getSecurityManager().checkPermission
533:
534: if createUserF:
535: if not checkPermission('Add User Folders', ob):
536: raise Unauthorized, (
537: 'You are not authorized to add User Folders.'
538: )
539: ob.manage_addUserFolder()
540:
541:
542: if REQUEST is not None:
543: return self.manage_main(self, REQUEST, update_menu=1)
544:
545:
546:
547: class versionedFileObject(File):
548: """File Object im Folder"""
549: security= ClassSecurityInfo()
550: meta_type = "versionedFileObject"
551:
552: manage_editForm =DTMLFile('dtml/fileEdit',globals(),
553: Kind='File',kind='file')
554: manage_editForm._setName('manage_editForm')
555:
556:
557:
558:
559: security.declarePublic('getTitle')
560:
561: def getTitle(self):
562: """get title"""
563: return self.title
564:
565: security.declarePublic('getVComment')
566: def getVComment(self):
567: """get the comment of this file"""
568: if not hasattr(self,'vComment') or (not self.vComment) or (self.vComment.lstrip()==""):
569: return "Add comment"
570:
571: else:
572: return self.vComment
573:
574: def manageVCommentForm(self):
575: """add a comment"""
576:
577: self.REQUEST.SESSION['refer']=self.REQUEST['HTTP_REFERER']
578:
579:
580:
581: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVComment')).__of__(self)
582: return pt()
583:
584: def manageVComment(self,text,comment_author,submit,REQUEST=None):
585: """manage comments"""
586: if submit =='change':
587: if text=='':
588: self.vComment=None
589: else:
590: self.vComment=text
591: self.vComment_author=comment_author
592:
593: self.vComment_date=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
594:
595: if self.REQUEST.SESSION.has_key('refer'):
596:
597: return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer'])
598: return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url()+"/history")
599:
600:
601: security.declarePublic('getVersionComment')
602: def getVersionComment(self):
603: """getversioncomment"""
604: return self.versionComment
605:
606: security.declarePublic('getTime')
607:
608: def getTime(self):
609: """getTime"""
610: #return self.bobobase_modification_time().ISO()
611: if hasattr(self,'time'):
612: return time.strftime("%Y-%m-%d %H:%M:%S",self.time)
613: elif hasattr(self,'timefixed'):
614: return self.timefixed
615: else:
616: setattr(self,'timefixed',self.bobobase_modification_time().ISO())
617: return self.bobobase_modification_time().ISO()
618:
619:
620:
621:
622:
623: def download(self,REQUEST=None,RESPONSE=None):
624: """download and lock"""
625:
626: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getId())
627: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
628: #try:
629: # txt=self.index_html()
630: #except:
631: # txt=self.index_html(REQUEST,RESPONSE)
632: #
633: #self.REQUEST.RESPONSE.setHeader("Content-Length","str(len(txt)+1000)")
634:
635: self.content_type="application/octet-stream"
636: self.REQUEST.RESPONSE.redirect(self.absolute_url())
637: #txt=urllib.urlopen(self.absolute_url()).read()
638: #self.REQUEST.RESPONSE.write(txt)
639:
640:
641: #self.REQUEST.close()
642:
643: security.declareProtected('AUTHENTICATED_USER','downloadLocked')
644: def downloadLocked(self):
645: """download and lock"""
646:
647:
648: if repr(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User':
649: return "please login first"
650: if not self.aq_parent.lockedBy=="":
651: return "cannot be locked because is already locked by %s"%self.lockedBy
652: self.aq_parent.lockedBy=self.REQUEST['AUTHENTICATED_USER']
653:
654: self.content_type="application/octet-stream"
655: self.REQUEST.RESPONSE.redirect(self.absolute_url())
656:
657: def setVersionNumber(self,versionNumber):
658: """set version"""
659: self.versionNumber=versionNumber
660:
661:
662: security.declarePublic('getVersionNumber')
663:
664: def getVersionNumber(self):
665: """get version"""
666: return self.versionNumber
667:
668:
669:
670:
671: security.declarePublic('lastEditor')
672:
673: def lastEditor(self):
674: """last Editor"""
675: if hasattr(self,'author'):
676: try:
677: ret=self.author.replace("-","\n")
678: except:#old version of versionded file sometimes stored the user object and not only the name the following corrects this
679: ret=str(self.author).replace("-","\n")
680: ret=ret.replace("\r","\n")
681: return ret.lstrip().rstrip()
682:
683: else:
684: jar=self._p_jar
685: oid=self._p_oid
686:
687: if jar is None or oid is None: return None
688:
689: return jar.db().history(oid)[0]['user_name']
690:
691:
692:
693:
694: manage_addVersionedFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject', version='1')
695:
696: def manage_addVersionedFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='',
697: REQUEST=None):
698: """Add a new File object.
699:
700: Creates a new File object 'id' with the contents of 'file'"""
701:
702: id=str(id)
703: title=str(title)
704: content_type=str(content_type)
705: precondition=str(precondition)
706:
707: id, title = cookId(id, title, file)
708:
709: self=self.this()
710:
711: # First, we create the file without data:
712: self._setObject(id, versionedFileObject(id,title,'',content_type, precondition))
713: self._getOb(id).versionComment=str(vC)
714: self._getOb(id).time=time.localtime()
715:
716: setattr(self._getOb(id),'author',author)
717:
718: # Now we "upload" the data. By doing this in two steps, we
719: # can use a database trick to make the upload more efficient.
720: if file:
721: self._getOb(id).manage_upload(file)
722: if content_type:
723: self._getOb(id).content_type=content_type
724:
725: if REQUEST is not None:
726: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
727:
728:
729:
730:
731: class versionedFile(CatalogAware,Folder):
732: """Versioniertes File"""
733:
734: default_catalog='fileCatalog'
735:
736: security= ClassSecurityInfo()
737:
738: security.declarePublic('getTitle')
739: def getTitle(self):
740: """get title"""
741: return self.title
742:
743: def PrincipiaSearchSource(self):
744: """Return cataloguable key for ourselves."""
745: return str(self)
746:
747: def __init__(self, id, title, lockedBy,author):
748: """init"""
749: self.id=id
750: self.title=title
751: self.lockedBy=lockedBy
752: self.author=author
753:
754: def manageImagesForm(self):
755: """manage Images attached to the file"""
756:
757: self.REQUEST.SESSION['refer']=self.REQUEST['HTTP_REFERER']
758:
759: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageImage')).__of__(self)
760: return pt()
761:
762: def manageImages(self,imageUrl=None,caption=None,REQUEST=None):
763: """manage URL"""
764: if imageUrl and (not imageUrl==""):
765: manage_AddImageZogiLib(self,libPath=imageUrl,caption=caption)
766:
767: if self.REQUEST.SESSION.has_key('refer'):
768:
769: return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer'])
770: return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url())
771:
772:
773:
774: def changeImages(self,caption=None,submit=None,id=None,REQUEST=None):
775: """manage URL"""
776: if submit=="change caption":
777: image=self.ZopeFind(self,obj_ids=[id])
778: if image:
779: image[0][1].caption=caption[0:]
780:
781: elif submit=="delete":
782: image=self.ZopeFind(self,obj_ids=[id])
783: if image:
784: self.manage_delObjects([image[0][1].getId()])
785:
786:
787: if self.REQUEST.SESSION.has_key('refer'):
788:
789: return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer'])
790: return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url())
791:
792:
793:
794:
795: def getImages(self):
796: """get Images"""
797: images=self.ZopeFind(self,obj_metatypes=["ImageZogiLib"])
798: if not images:
799: return None
800: else:
801: return images
802:
803: security.declarePublic('getComment')
804: def getComment(self):
805: """get the comment of this file"""
806: if not hasattr(self,'comment') or (not self.comment) or (self.comment.lstrip()==""):
807: return "Add comment"
808:
809: else:
810: return self.comment
811:
812:
813: meta_type="versionedFile"
814:
815: def manageCommentForm(self):
816: """add a comment"""
817: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addComment')).__of__(self)
818: return pt()
819:
820: def manageComment(self,text,comment_author,submit,REQUEST=None):
821: """manage comments"""
822: if submit =='change':
823: if text=='':
824: self.comment=None
825: else:
826: self.comment=text
827: self.comment_author=comment_author
828:
829: self.comment_date=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
830:
831: return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url())
832:
833: security.declarePublic('getLastChangeDate')
834:
835: def getLastChangeDate(self):
836: """get last change date"""
837: lv=self.getLastVersion()
838: time=lv.getTime()
839: return time
840:
841: def getLastEditor(self):
842: """get last change date"""
843: lv=self.getLastVersion()
844: le=lv.lastEditor()
845: return le
846:
847: def getLockedBy(self):
848: """get locked by"""
849: return str(self.lockedBy)
850:
851: security.declarePublic('getLastVersion')
852: def getLastVersion(self):
853: """Last Version"""
854: tmp=0
855: lastVersion=None
856:
857:
858: for version in self.ZopeFind(self):
859:
860: if hasattr(version[1],'versionNumber'):
861:
862: if int(version[1].versionNumber) > tmp:
863: tmp=int(version[1].versionNumber,)
864: lastVersion=version[1]
865: if lastVersion==None:
866: lastVersion=version[1]
867: lastVersion.versionNumber=1
868: return lastVersion
869:
870: def getVersionNr(self,nr):
871: """Last Version"""
872: tmp=0
873: lastVersion=None
874:
875:
876: for version in self.ZopeFind(self):
877:
878: if hasattr(version[1],'versionNumber'):
879:
880: if int(version[1].versionNumber) ==nr :
881: return version[1]
882:
883: return None
884: def diff(self,data):
885: """differenz between lastversion and data"""
886: d=Differ()
887: data=data.rstrip()
888: try:
889: tmp=self.getLastVersion().data.rstrip()
890: except:
891: tmp=str(self.getLastVersion().data).rstrip()
892: #print "XX",data,tmp
893:
894: try:
895: l=list(d.compare(data.splitlines(1),tmp.splitlines(1)))
896: except:
897: try:
898: l=list(d.compare(repr(data).splitlines(1),tmp.splitlines(1)))
899: except:
900: return 9999,[]
901:
902: plus=0
903: minus=0
904:
905: for a in l:
906: if a[0]=='+':
907: plus+=1
908: if a[0]=='-':
909: minus+=1
910:
911:
912: return max([plus,minus]),l
913: security.declarePublic('index_html')
914: def index_html(self):
915: """main view"""
916: lastVersion=self.getLastVersion()
917: #return "File:"+self.title+" Version:%i"%lastVersion.versionNumber," modified:",lastVersion.bobobase_modification_time()," size:",lastVersion.getSize(),"modified by:",lastVersion.lastEditor()
918: return "File: %s Version:%i modified:%s size:%s modified by:%s"%(self.title,lastVersion.versionNumber,lastVersion.getTime(),lastVersion.getSize(),lastVersion.lastEditor())
919:
920:
921:
922: security.declarePublic('getVersion')
923: def getVersion(self):
924: tmp=0
925: for version in self.ZopeFind(self):
926:
927: if hasattr(version[1],'versionNumber'):
928:
929: if int(version[1].versionNumber) > tmp:
930: tmp=int(version[1].versionNumber,)
931: return tmp+1
932:
933:
934: security.declareProtected('AUTHENTICATED_USER','unlock')
935:
936: def history(self):
937: """history"""
938:
939: ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"])
940: if ext:
941: return getattr(self,ext[0][1].getId())()
942:
943: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','versionHistory')).__of__(self)
944: return pt()
945:
946: def getVersions(self):
947: """get all versions"""
948: ret=[]
949: for version in self.ZopeFind(self):
950: if hasattr(version[1],'versionNumber'):
951: ret.append((version[1].versionNumber,version[1]))
952: ret.sort(sortv)
953: return ret
954:
955: security.declareProtected('AUTHENTICATED_USER','forceunlock')
956: def forceunlock(self,RESPONSE=None):
957: """unlock"""
958: #safe who had the lock
959: if self.lockedBy:
960: self.brokenLock=str(self.lockedBy)
961: else:
962: self.brokenLock=""
963: self.lockedBy=''
964: return self.brokenLock
965:
966: security.declareProtected('AUTHENTICATED_USER','unlock')
967: def unlock(self,RESPONSE):
968: """unlock"""
969: if str(self.lockedBy) in [str(self.REQUEST['AUTHENTICATED_USER'])]:
970: self.lockedBy=''
971: RESPONSE.redirect(self.REQUEST['HTTP_REFERER'])
972: else:
973: return "Sorry, not locked by you! (%s,%s)"%(self.lockedBy,self.REQUEST['AUTHENTICATED_USER'])
974:
975:
976:
977: security.declareProtected('AUTHENTICATED_USER','addVersionedFileObjectForm')
978:
979: def addVersionedFileObjectForm(self):
980: """add a new version"""
981:
982: if str(self.REQUEST['AUTHENTICATED_USER']) in ["Anonymous User"]:
983: return "please login first"
984: if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''):
985: ext=self.ZopeFind(self.aq_parent,obj_ids=["addNewVersion.dtml"])
986: if ext:
987: return ext[0][1]('',globals(),version=self.getVersion(),lastComment=self.getLastVersion().getVersionComment(),AUTHENTICATED_USER=self.REQUEST.AUTHENTICATED_USER)
988: else:
989: out=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version=self.getVersion()).__of__(self)
990: return out()
991: else:
992: return "Sorry file is locked by somebody else"
993:
994: def manage_addVersionedFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None):
995: """add"""
996: try: #der ganze vC unsinn muss ueberarbeitet werden
997: vC=self.REQUEST['vC']
998: except:
999: pass
1000:
1001: author=self.REQUEST['author']
1002:
1003: if changeName=="yes":
1004: filename=file.filename
1005: self.title=filename[max(filename.rfind('/'),
1006: filename.rfind('\\'),
1007: filename.rfind(':'),
1008: )+1:]
1009:
1010:
1011: if not newName=='':
1012: self.title=newName[0:]
1013:
1014:
1015:
1016:
1017:
1018: positionVersionNum=getattr(self,'positionVersionNum','front')
1019:
1020: if positionVersionNum=='front':
1021: id="V%i"%self.getVersion()+"_"+self.title
1022: else:
1023: tmp=os.path.splitext(self.title)
1024: if len(tmp)>1:
1025: id=tmp[0]+"_V%i"%self.getVersion()+tmp[1]
1026: else:
1027: id=tmp[0]+"_V%i"%self.getVersion()
1028:
1029:
1030: manage_addVersionedFileObject(self,id,vC,author,file,id,precondition, content_type)
1031: objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
1032: self.REQUEST.SESSION['objID_parent']=self.getId()
1033:
1034: if getattr(self,'defaultFileCatalog',None):
1035:
1036: self.reindex_object()
1037:
1038: if RESPONSE:
1039: obj=self.ZopeFind(self,obj_ids=[id])[0][1]
1040: if obj.getSize()==0:
1041: self.REQUEST.SESSION['objID']=obj.getId()
1042: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self)
1043: return pt()
1044:
1045: else:
1046: RESPONSE.redirect(self.REQUEST['URL2'])
1047:
1048: else:
1049: return self.ZopeFind(self,obj_ids=[id])[0][1]
1050:
1051: security.declareProtected('AUTHENTICATED_USER','downloadLocked')
1052:
1053: def download(self):
1054: """download and lock"""
1055:
1056: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getLastVersion().getId())
1057: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
1058:
1059: #try:
1060: # txt=self.getLastVersion.index_html()
1061: #except:
1062: # txt=self.getLastVersion.index_html(REQUEST,RESPONSE)
1063:
1064: #self.REQUEST.RESPONSE.setHeader("Content-Length","str(len(txt)+1000)")
1065:
1066: self.content_type="application/octet-stream"
1067: #self.REQUEST.RESPONSE.write("bl")
1068: #self.REQUEST.RESPONSE.write(txt)
1069: #self.REQUEST.close()
1070:
1071: #self.getLastVersion().content_type="application/octet-stream"
1072: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
1073:
1074: security.declareProtected('AUTHENTICATED_USER','downloadLocked')
1075: def downloadLocked(self):
1076: """download and lock"""
1077:
1078: if repr(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User':
1079: return "please login first"
1080: if not self.lockedBy=="":
1081: return "cannot be locked because is already locked by %s"%self.lockedBy
1082: self.lockedBy=self.REQUEST['AUTHENTICATED_USER']
1083: self.getLastVersion().content_type="application/octet-stream"
1084: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId())
1085:
1086: def manage_addVersionedFileForm(self):
1087: """interface for adding the OSAS_root"""
1088: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVersionedFile.zpt')).__of__(self)
1089: return pt()
1090:
1091: def manage_addVersionedFile(self,id,title,lockedBy, author=None, RESPONSE=None):
1092: """add the OSAS_root"""
1093: newObj=versionedFile(id,title,lockedBy,author)
1094: self._setObject(id,newObj)
1095:
1096: if RESPONSE is not None:
1097: RESPONSE.redirect('manage_main')
1098:
1099:
1100: InitializeClass(versionedFile)
1101: InitializeClass(versionedFileFolder)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>