--- 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="
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"""