--- versionedFile/extVersionedFile.py 2007/08/31 13:31:20 1.6 +++ versionedFile/extVersionedFile.py 2007/09/10 16:34:16 1.7 @@ -41,6 +41,7 @@ except: def sortv(x,y): return cmp(x[0],y[0]) + tdir = "/tmp/downloadVersionedFiles" class generateDownloadZip: @@ -71,7 +72,7 @@ class generateDownloadZip: self.response="

1. step: getting the files

" for files in self.folder.ZopeFind(self.folder,obj_metatypes=['extVersionedFile']): - lastV=files[1].getLastVersion() + lastV=files[1].getContentObject() self.response+=str("

Get File: %s
\n"%lastV.title) savePath=os.path.join(tmpPath,lastV.title) @@ -122,7 +123,7 @@ class extVersionedFileFolder(Folder,ECHO security= ClassSecurityInfo() security.declareProtected('AUTHENTICATED_USER','addFileForm') - filesMetaType=['extVersionedFile'] + file_meta_type=['extVersionedFile'] if ECHO_basis: optTMP= Folder.manage_options+ECHO_basis.manage_options @@ -357,7 +358,7 @@ class extVersionedFileFolder(Folder,ECHO return cmp(x[1].title.lower(),y[1].title.lower()) def sortDate(x,y): - return cmp(y[1].getLastVersion().getTime(),x[1].getLastVersion().getTime()) + return cmp(y[1].getContentObject().getTime(),x[1].getContentObject().getTime()) def sortComment(x,y): try: @@ -372,13 +373,13 @@ class extVersionedFileFolder(Folder,ECHO if (xc=='') or (xc=='ZZZZZZZZZZZZZ'.lower()): try: - xc=x[1].getLastVersion().getVComment().lower() + xc=x[1].getContentObject().getVComment().lower() except: xc='ZZZZZZZZZZZZZ'.lower() if (yc=='') or (yc=='ZZZZZZZZZZZZZ'.lower()): try: - yc=y[1].getLastVersion().getVComment().lower() + yc=y[1].getContentObject().getVComment().lower() except: yc='ZZZZZZZZZZZZZ'.lower() @@ -386,9 +387,10 @@ class extVersionedFileFolder(Folder,ECHO def sortAuthor(x,y): - return cmp(x[1].getLastVersion().lastEditor().lower(),y[1].getLastVersion().lastEditor().lower()) + return cmp(x[1].getContentObject().lastEditor().lower(),y[1].getContentObject().lastEditor().lower()) - versionedFiles=self.ZopeFind(self,obj_metatypes=self.filesMetaType) + versionedFiles=self.objectItems(self.file_meta_type) + logging.debug("versionedfiles: %s of type %s"%(repr(versionedFiles),repr(self.file_meta_type))) if sortField=='title': versionedFiles.sort(sortName) @@ -449,7 +451,6 @@ class extVersionedFileFolder(Folder,ECHO manage_addextVersionedFile(self,id,'','') #if (getattr(self,'commentNonEmpty',0)==1) and vC.strip()=="": - ob=self._getOb(id) ob.title=id file2=file @@ -478,6 +479,12 @@ class extVersionedFileFolder(Folder,ECHO RESPONSE.redirect(self.REQUEST['URL1']) + + security.declareProtected('AUTHENTICATED_USER','fixVersionNumbers') + def fixVersionNumbers(self): + """fix last version number of all files""" + for (id,vf) in self.getVersionedFiles(): + vf.fixVersionNumbers() manage_addextVersionedFileFolderForm=DTMLFile('dtml/extfolderAdd', globals()) @@ -518,10 +525,19 @@ class extVersionedFileObject(ExtFile): security= ClassSecurityInfo() meta_type = "extVersionedFileObject" - manage_editForm =DTMLFile('dtml/fileEdit',globals(), + manage_editForm=DTMLFile('dtml/fileEdit',globals(), Kind='File',kind='file') manage_editForm._setName('manage_editForm') + def __init__(self, id, title='', versionNumber=0, versionComment=None, time=None, author=None): + """Initialize a new instance of extVersionedFileObject (taken from ExtFile)""" + ExtFile.__init__(self,id,title) + self.versionNumber = versionNumber + self.versionComment= versionComment + self.time = time + self.author = author + + security.declarePublic('getTitle') def getTitle(self): """get title""" @@ -542,7 +558,6 @@ class extVersionedFileObject(ExtFile): def manageVCommentForm(self): """add a comment""" - self.REQUEST.SESSION['refer']=self.REQUEST['HTTP_REFERER'] pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addVComment')).__of__(self) return pt() @@ -570,7 +585,6 @@ class extVersionedFileObject(ExtFile): return self.versionComment security.declarePublic('getTime') - def getTime(self): """getTime""" #return self.bobobase_modification_time().ISO() @@ -582,10 +596,6 @@ class extVersionedFileObject(ExtFile): setattr(self,'timefixed',self.bobobase_modification_time().ISO()) return self.bobobase_modification_time().ISO() - - - - def download(self,REQUEST=None,RESPONSE=None): """download and lock""" @@ -620,11 +630,6 @@ class extVersionedFileObject(ExtFile): self.content_type="application/octet-stream" self.REQUEST.RESPONSE.redirect(self.absolute_url()) - def setVersionNumber(self,versionNumber): - """set version""" - self.versionNumber=versionNumber - - security.declarePublic('getVersionNumber') def getVersionNumber(self): """get version""" @@ -635,8 +640,6 @@ class extVersionedFileObject(ExtFile): """get version""" return self.versionComment - - security.declarePublic('lastEditor') def lastEditor(self): """last Editor""" @@ -659,8 +662,8 @@ class extVersionedFileObject(ExtFile): manage_addextVersionedFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='extVersionedFileObject',kind='extVersionedFileObject', version='1') -def manage_addextVersionedFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='', - REQUEST=None): +def manage_addextVersionedFileObject(self,id,vC='',author='', file='',title='',versionNumber=0, + precondition='', content_type='', REQUEST=None): """Add a new File object. Creates a new File object 'id' with the contents of 'file'""" @@ -675,32 +678,40 @@ def manage_addextVersionedFileObject(sel self=self.this() # First, we create the file without data: - self._setObject(id, extVersionedFileObject(id,title,'',content_type, precondition)) - self._getOb(id).versionComment=str(vC) - self._getOb(id).time=time.localtime() - - setattr(self._getOb(id),'author',author) + self._setObject(id, extVersionedFileObject(id,title,versionNumber=versionNumber,versionComment=str(vC),author=author)) + fob = self._getOb(id) # Now we "upload" the data. By doing this in two steps, we # can use a database trick to make the upload more efficient. if file: - self._getOb(id).manage_upload(file) + fob.manage_upload(file) if content_type: - self._getOb(id).content_type=content_type + fob.content_type=content_type if REQUEST is not None: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main') - class extVersionedFile(CatalogAware,Folder): """Versioniertes File""" - default_catalog='fileCatalog' + meta_type = 'extVersionedFile' + # meta_type of contained objects + content_meta_type = ['extVersionedFileObject'] + default_catalog = 'fileCatalog' - security= ClassSecurityInfo() + security=ClassSecurityInfo() + def __init__(self, id, title, lockedBy,author): + """init""" + self.id=id + self.title=title + self.lockedBy=lockedBy + self.author=author + self.lastVersionNumber=0 + self.lastVersionId=None + security.declarePublic('getTitle') def getTitle(self): """get title""" @@ -709,13 +720,6 @@ class extVersionedFile(CatalogAware,Fold def PrincipiaSearchSource(self): """Return cataloguable key for ourselves.""" return str(self) - - def __init__(self, id, title, lockedBy,author): - """init""" - self.id=id - self.title=title - self.lockedBy=lockedBy - self.author=author def manageImagesForm(self): """manage Images attached to the file""" @@ -735,8 +739,6 @@ class extVersionedFile(CatalogAware,Fold return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer']) return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url()) - - def changeImages(self,caption=None,submit=None,id=None,REQUEST=None): """manage URL""" if submit=="change caption": @@ -749,14 +751,10 @@ class extVersionedFile(CatalogAware,Fold if image: self.manage_delObjects([image[0][1].getId()]) - if self.REQUEST.SESSION.has_key('refer'): - return REQUEST.RESPONSE.redirect(self.REQUEST.SESSION['refer']) - return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url()) - - + return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url()) def getImages(self): """get Images""" @@ -771,12 +769,8 @@ class extVersionedFile(CatalogAware,Fold """get the comment of this file""" if not hasattr(self,'comment') or (not self.comment) or (self.comment.lstrip()==""): return "Add comment" - else: return self.comment - - - meta_type="extVersionedFile" def manageCommentForm(self): """add a comment""" @@ -797,16 +791,15 @@ class extVersionedFile(CatalogAware,Fold return REQUEST.RESPONSE.redirect(self.aq_parent.absolute_url()) security.declarePublic('getLastChangeDate') - def getLastChangeDate(self): """get last change date""" - lv=self.getLastVersion() + lv=self.getContentObject() time=lv.getTime() return time def getLastEditor(self): """get last change date""" - lv=self.getLastVersion() + lv=self.getContentObject() le=lv.lastEditor() return le @@ -814,29 +807,68 @@ class extVersionedFile(CatalogAware,Fold """get locked by""" return str(self.lockedBy) + def getLastVersionNumber(self): + """returns the highest version number of all included objects""" + lv = self.findLastVersion() + if lv: + return lv.getVersionNumber() + else: + return 0 + + def findLastVersion(self): + """finds and returns the object with the highest version number""" + lvn=0 + lv=None + + for v in self.objectValues(self.content_meta_type): + logging.debug("findlastversion: check %s"%v.getId()) + if v.getVersionNumber() > lvn: + lvn=v.getVersionNumber() + lv=v + + if lv: + logging.debug("findlastversion: got %s"%lv.getId()) + return lv + security.declarePublic('getLastVersion') def getLastVersion(self): - """Last Version""" + """Last Version (old)""" tmp=0 - lastVersion=None + lv=None - for version in self.ZopeFind(self): + for v in self.objectValues(self.content_meta_type): + logging.debug("getlastversion: check %s"%v.getId()) + if v.getVersionNumber() > tmp: + tmp=v.getVersionNumber() + lv=v + + logging.debug("getlastversion: got %s"%lv.getId()) + return lv + + def getContentObject(self): + """returns the last version object""" + if not self.lastVersionId: + lv = self.findLastVersion() + if lv is None: + return None + self.lastVersionNumber = lv.getVersionNumber() + self.lastVersionId = lv.getId() - if hasattr(version[1],'versionNumber'): - - if int(version[1].versionNumber) > tmp: - tmp=int(version[1].versionNumber,) - lastVersion=version[1] - if lastVersion==None: - lastVersion=version[1] - lastVersion.versionNumber=1 - return lastVersion - + return getattr(self, self.lastVersionId) + + security.declarePublic('getData') + def getData(self): + """Returns the content of the last version""" + ob = self.getContentObject() + if ob is not None: + return ob.getData() + else: + return None def diff(self,data): """differenz between lastversion and data""" d=Differ() - tmp=self.getLastVersion().getData() + tmp=self.getData() #print "XX",data,tmp try: l=list(d.compare(data.splitlines(1),tmp.splitlines(1))) @@ -856,7 +888,7 @@ class extVersionedFile(CatalogAware,Fold security.declarePublic('index_html') def index_html(self): """main view""" - #lastVersion=self.getLastVersion() + #lastVersion=self.getContentObject() #return "File:"+self.title+" Version:%i"%lastVersion.versionNumber," modified:",lastVersion.bobobase_modification_time()," size:",lastVersion.getSize(),"modified by:",lastVersion.lastEditor() #return "File: %s Version:%i modified:%s size:%s modified by:%s"%(self.title,lastVersion.versionNumber,lastVersion.getTime(),lastVersion.getSize(),lastVersion.lastEditor()) return self.history() @@ -864,6 +896,7 @@ class extVersionedFile(CatalogAware,Fold security.declarePublic('getVersion') def getVersion(self): + # TODO: this is ugly and it returns the next version number tmp=0 for version in self.ZopeFind(self): @@ -871,12 +904,10 @@ class extVersionedFile(CatalogAware,Fold if int(version[1].versionNumber) > tmp: tmp=int(version[1].versionNumber,) - return tmp+1 - + return tmp+1 def history(self): """history""" - ext=self.ZopeFind(self.aq_parent,obj_ids=["history_template.html"]) if ext: return getattr(self,ext[0][1].getId())() @@ -913,7 +944,67 @@ class extVersionedFile(CatalogAware,Fold else: return "Sorry, not locked by you! (%s,%s)"%(self.lockedBy,self.REQUEST['AUTHENTICATED_USER']) + + def _newContentObject(self, id, title='', versionNumber=0, versionComment=None, time=None, author=None): + """factory for content objects. to be overridden in derived classes.""" + return extVersionedFileObject(id,title,versionNumber=versionNumber,versionComment=versionComment,time=time,author=author) + + + def addContentObject(self,id,vC,author=None,file=None,title='',changeName='no',newName='',from_tmp=False, + precondition='', content_type=''): + """add""" + + if changeName=="yes": + filename=file.filename + self.title=filename[max(filename.rfind('/'), + filename.rfind('\\'), + filename.rfind(':'), + )+1:] + + if not newName=='': + self.title=newName[0:] + + posVersNum=getattr(self,'positionVersionNum','front') + + versNum = self.getLastVersionNumber() + 1 + + if posVersNum=='front': + id="V%i_%s"%(versNum,self.title) + else: + fn=os.path.splitext(self.title) + if len(fn)>1: + id=fn[0]+"_V%i%s"%(versNum,fn[1]) + else: + id=fn[0]+"_V%i"%versNum + # what does this do? + id, title = cookId(id, title, file) + self=self.this() + + # First, we create the file without data: + self._setObject(id, self._newContentObject(id,title,versionNumber=versNum,versionComment=str(vC), + time=time.localtime(),author=author)) + fob = self._getOb(id) + + # Now we "upload" the data. By doing this in two steps, we + # can use a database trick to make the upload more efficient. + if file and not from_tmp: + fob.manage_upload(file) + elif file and from_tmp: + fob.manage_file_upload(file) # manage_upload_from_tmp doesn't exist in ExtFile2 + # fob.manage_upload_from_tmp(file) # manage_upload_from_tmp doesn't exist in ExtFile2 + fob.content_type=content_type + + self.lastVersionNumber = versNum + self.lastVersionId = id + + logging.debug("addcontentobject: lastversion=%s"%self.getData()) + logging.debug("reindex1: %s in %s"%(repr(self),repr(self.default_catalog))) + self.reindex_object() + logging.debug("addcontentobject: fob_data=%s"%fob.getData()) + + return fob + security.declareProtected('AUTHENTICATED_USER','addVersionedFileObjectForm') def addVersionedFileObjectForm(self): @@ -924,14 +1015,15 @@ class extVersionedFile(CatalogAware,Fold if (self.lockedBy==self.REQUEST['AUTHENTICATED_USER']) or (self.lockedBy==''): ext=self.ZopeFind(self.aq_parent,obj_ids=["addNewVersion.dtml"]) if ext: - return ext[0][1]('',globals(),version=self.getVersion(),lastComment=self.getLastVersion().getVersionComment(),AUTHENTICATED_USER=self.REQUEST.AUTHENTICATED_USER) + return ext[0][1]('',globals(),version=self.getVersion(),lastComment=self.getContentObject().getVersionComment(),AUTHENTICATED_USER=self.REQUEST.AUTHENTICATED_USER) else: out=DTMLFile('dtml/fileAdd', globals(),Kind='VersionedFileObject',kind='versionedFileObject',version=self.getVersion()).__of__(self) return out() else: return "Sorry file is locked by somebody else" + - def manage_addVersionedFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None): + def manage_addVersionedFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', from_tmp=False, RESPONSE=None): """add""" try: #der ganze vC unsinn muss ueberarbeitet werden vC=self.REQUEST['vC'] @@ -939,56 +1031,30 @@ class extVersionedFile(CatalogAware,Fold pass author=self.REQUEST['author'] - - if changeName=="yes": - filename=file.filename - self.title=filename[max(filename.rfind('/'), - filename.rfind('\\'), - filename.rfind(':'), - )+1:] - if not newName=='': - self.title=newName[0:] - - positionVersionNum=getattr(self,'positionVersionNum','front') - - if positionVersionNum=='front': - id="V%i"%self.getVersion()+"_"+self.title - else: - tmp=os.path.splitext(self.title) - if len(tmp)>1: - id=tmp[0]+"_V%i"%self.getVersion()+tmp[1] - else: - id=tmp[0]+"_V%i"%self.getVersion() - - manage_addextVersionedFileObject(self,id,vC,author,file,id,precondition, content_type) - objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion())) + ob = self.addContentObject(id, vC, author, file, title, changeName=changeName, newName=newName, from_tmp=from_tmp, + precondition=precondition, content_type=content_type) + self.REQUEST.SESSION['objID_parent']=self.getId() - if getattr(self,'defaultFileCatalog',None): - - self.reindex_object() - if RESPONSE: - obj=self.ZopeFind(self,obj_ids=[id])[0][1] - if obj.getSize()==0: - self.REQUEST.SESSION['objID']=obj.getId() + if ob.getSize()==0: + self.REQUEST.SESSION['objID']=ob.getId() pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','errorUploadFile')).__of__(self) return pt() else: RESPONSE.redirect(self.REQUEST['URL2']) - else: - return self.ZopeFind(self,obj_ids=[id])[0][1] + return ob def download(self): """download and lock""" - self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getLastVersion().getId()) + self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%self.getContentObject().getId()) self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream") self.content_type="application/octet-stream" - self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId()) + self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getContentObject().getId()) security.declareProtected('AUTHENTICATED_USER','downloadLocked') def downloadLocked(self): @@ -999,8 +1065,30 @@ class extVersionedFile(CatalogAware,Fold if not self.lockedBy=="": return "cannot be locked because is already locked by %s"%self.lockedBy self.lockedBy=self.REQUEST['AUTHENTICATED_USER'] - self.getLastVersion().content_type="application/octet-stream" - self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getLastVersion().getId()) + self.getContentObject().content_type="application/octet-stream" + self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'/'+self.getId()+'/'+self.getContentObject().getId()) + + + security.declareProtected('AUTHENTICATED_USER','fixVersionNumbers') + def fixVersionNumbers(self): + """check last version number and id""" + if not hasattr(self, 'lastVersionId'): + self.lastVersionNumber = 0 + self.lastVersionId = None + + lv = self.getContentObject() + if lv is not None: + lvn = lv.getVersionNumber() + if lvn == 0: + lvn = 1 + lv.versionNumber = 1 + self.lastVersionNumber = lvn + self.lastVersionId = lv.getId() + else: + self.lastVersionNumber = 0 + self.lastVersionId = None + logging.debug("fixing last version number of %s to %s (%s)"%(self.getId(),self.lastVersionNumber,self.lastVersionId)) + def manage_addextVersionedFileForm(self): """interface for adding the OSAS_root"""