--- cdli/cdli_files.py 2006/10/04 07:33:22 1.46 +++ cdli/cdli_files.py 2006/11/14 17:02:59 1.51 @@ -1,11 +1,13 @@ """CDLI extensions of the filearchive""" -from Products.versionedFile.versionedFile import * +from Products.versionedFile.extVersionedFile import * from Products.ZCatalog.CatalogPathAwareness import CatalogAware from tempfile import mkstemp,mkdtemp import os.path import os from types import * import urlparse +import urllib +import cgi from OFS.OrderedFolder import OrderedFolder from OFS.SimpleItem import SimpleItem import time @@ -98,7 +100,8 @@ class uploadATFfinallyThread(Thread): conn.close() #set flag for end of this method self.end=True - return True + print "ended" + return True def __del__(self): """delete""" @@ -141,7 +144,7 @@ class uploadATFfinallyThread(Thread): if len(founds)>0: SESSION['author']=str(username) self.result+="
Changing : %s"%fn
- founds[0].getObject().manage_addCDLIFileObject('',comment,SESSION['author'],file=file(os.path.join(SESSION['tmpdir'],fn)))
+ founds[0].getObject().manage_addCDLIFileObject('',comment,SESSION['author'],file=os.path.join(SESSION['tmpdir'],fn),from_tmp=True)
#now add the new files
@@ -239,10 +242,10 @@ class uploadATFThread(Thread):
#ctx.cdliRoot.cdli_main.tmpStore2[self.getName()[0:]]=self.returnValue
get_transaction().commit()
-
+
while self.continueVar:
pass
-
+
conn.close()
@@ -312,8 +315,9 @@ class uploadATFThread(Thread):
#if not than add filename to the list of newfiles
data=file(os.path.join(dir,fn)).read()
- status,msg=checkFile(fn,data,dir)
-
+ #status,msg=checkFile(fn,data,dir)
+ status=True
+ msg=""
if not status: # error
errors.append((fn,msg))
else:
@@ -523,7 +527,7 @@ class BasketObject_old(Folder):
ret=""
lockedObjects={}
- print "x",self.temp_folder.downloadCounter
+
if self.temp_folder.downloadCounter > 10:
return """I am sorry, currently the server has to many requests for downloads, please come back later!"""
@@ -687,7 +691,19 @@ class CDLIBasketContainer(OrderedFolder)
self.id=id
self.title=title
-
+
+ def getBasketsId(self):
+ """get all baskets als klartext"""
+
+ ret=""
+ baskets=self.ZopeFind(self,obj_metatypes=['CDLIBasket'])
+ for basket in baskets:
+ com,user,time,values = basket[1].getContentIds()
+ ret+= "BASKET:"+com+"\t"+user+"\t"+time+"\n"
+ for x in values:
+ ret+= x[0]+"\t"+x[1]+"\n"
+ return ret
+
def getBaskets(self,sortField='title'):
"""get all baskets files"""
@@ -761,9 +777,13 @@ class CDLIBasketContainer(OrderedFolder)
def setActiveBasket(self,basketId,REQUEST=None):
"""store active basketId in a cookie"""
self.REQUEST.RESPONSE.setCookie("CDLIActiveBasket",basketId,path="/")
-
+ try:
+ qs=cgi.parse_qs(REQUEST['QUERY_STRING'])
+ del(qs['basketId'])
+ except:
+ qs={}
if REQUEST:
- REQUEST.RESPONSE.redirect(REQUEST['URL1']+'?'+REQUEST['QUERY_STRING'])
+ REQUEST.RESPONSE.redirect(REQUEST['URL1']+'?'+urllib.urlencode(qs))
def getActiveBasket(self):
"""get active basket from cookie"""
@@ -967,8 +987,10 @@ class CDLIBasket(Folder,CatalogAware):
newContent=[]
added=0
for id in ids:
- founds=self.CDLICatalog.search({'title':id})
-
+ try:
+ founds=self.CDLICatalog.search({'title':id})
+ except:
+ founds=[]
for found in founds:
if found.getObject() not in oldContent:
#TODO: was passiert wenn, man eine Object dazufgt, das schon da ist aber eine neuere version
@@ -985,6 +1007,19 @@ class CDLIBasket(Folder,CatalogAware):
return added
+
+
+
+ def getContentIds(self):
+ """print basket content"""
+ ret=[]
+ lv=self.getLastVersion()
+ for obj in lv.content.getContent():
+ ret.append((obj[0].getId(),obj[1].getId()))
+
+
+ return lv.getComment(),lv.getUser(),lv.getTime(),ret
+
def changeBasket(self,ids,submit,RESPONSE=None,REQUEST=None):
"""change a basket"""
if submit=="update":
@@ -1130,12 +1165,12 @@ class CDLIBasketVersion(Implicit,Persist
if (procedure=="downloadAll") or (object[1].lockedBy=='') or (object[1].lockedBy==self.REQUEST['AUTHENTICATED_USER']):
if current=="no": #version as they are in the basket
- ret+=str(object[0].data)+"\n"
+ ret+=str(object[0].getData())+"\n"
elif current=="yes":
#search current object
founds=self.CDLICatalog.search({'title':object[0].getId()})
if len(founds)>0:
- ret+=str(founds[0].getObject().getLastVersion().data)+"\n"
+ ret+=str(founds[0].getObject().getLastVersion().getData())+"\n"
if lock and object[1].lockedBy=='':
object[1].lockedBy=self.REQUEST['AUTHENTICATED_USER']
@@ -1282,9 +1317,9 @@ class CDLIFileObject(CatalogAware,extVer
def getPNumber(self):
"""get the pnumber"""
try:
- txt=re.match("&[Pp](\d*)\s*=([^\r\n]*)",self.data[0:])
+ txt=re.match("&[Pp](\d*)\s*=([^\r\n]*)",self.getData()[0:])
except:
- txt=self.data[0:]
+ txt=self.getData()[0:]
return "ERROR"
try:
@@ -1309,11 +1344,11 @@ class CDLIFileObject(CatalogAware,extVer
manage_addCDLIFileObjectForm=DTMLFile('dtml/fileAdd', globals(),Kind='CDLIFileObject',kind='CDLIFileObject', version='1')
def manage_addCDLIFileObject(self,id,vC='',author='', file='',title='',precondition='', content_type='',
- REQUEST=None):
+ from_tmp=False,REQUEST=None):
"""Add a new File object.
Creates a new File object 'id' with the contents of 'file'"""
-
+
id=str(id)
title=str(title)
content_type=str(content_type)
@@ -1333,12 +1368,17 @@ def manage_addCDLIFileObject(self,id,vC=
# 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:
+
+ if file and not from_tmp:
self._getOb(id).manage_upload(file)
+ elif file and from_tmp:
+ self._getOb(id).manage_upload_from_tmp(file)
if content_type:
self._getOb(id).content_type=content_type
self.reindex_object()
+ self._getOb(id).reindex_object()
+
if REQUEST is not None:
REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
@@ -1349,6 +1389,13 @@ class CDLIFile(extVersionedFile,CatalogA
default_catalog='CDLICatalog'
#security.declarePublic('history')
+ def getLastVersionData(self):
+ """get last version data"""
+ return self.getLastVersion().getData()
+
+ #security.declarePublic('history')
+
+
def history(self):
"""history"""
@@ -1409,8 +1456,10 @@ class CDLIFile(extVersionedFile,CatalogA
precondition='',
content_type='',
changeName='no',newName='',
- come_from=None,RESPONSE=None):
+ come_from=None,
+ from_tmp=False,RESPONSE=None):
"""add"""
+
try: #TODO: der ganze vC unsinn muss ueberarbeitet werden
vC=self.REQUEST['vC']
except:
@@ -1443,8 +1492,9 @@ class CDLIFile(extVersionedFile,CatalogA
id=tmp[0]+"_V%i"%self.getVersion()
- manage_addCDLIFileObject(self,id,vC,author,file,id,precondition, content_type)
- objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
+ manage_addCDLIFileObject(self,id,vC,author,file,id,precondition, content_type,from_tmp=from_tmp)
+ #objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion()))
+ objs=getattr(self,id).setVersionNumber(int(self.getVersion()))
try:
#FIXME: wozu ist das gut?
self.REQUEST.SESSION['objID_parent']=self.getId()
@@ -1495,7 +1545,7 @@ def checkFile(filename,data,folder):
"""check the files"""
# first check the file name
fn=filename.split(".") # no extension
- print "_____",fn
+
if not fn[0][0]=="P":
return False,"P missing in the filename"
elif len(fn[0])!=7:
@@ -1507,7 +1557,7 @@ def checkFile(filename,data,folder):
ret= out.close()
if value:
- print "ERRR"
+
return False,"atf checker error: %s"%value
else:
return True,""
@@ -1517,35 +1567,37 @@ def splitatf(fh,dir=None,ext=None):
ret=None
nf=None
i=0
- for line in fh.readlines():
- if ext:
- i+=1
- if (i%100)==0:
- ext.result+="."
- if i==10000:
- i=0
- ext.result+="
"
- #check if basket name is in the first line
- if line.find("#atf basket")>=0: #old convention
- ret=line.replace('#atf basket ','')
- ret=ret.split('_')[0]
- elif line.find("#basket:")>=0: #new convention
- ret=line.replace('#basket: ','')
- ret=ret.split('_')[0]
-
- else:
- if (len(line.lstrip())>0) and (line.lstrip()[0]=="&"): #newfile
- if nf:
- nf.close() #close last file
-
-
- filename=line[1:].split("=")[0].rstrip()+".atf"
- if dir:
- filename=os.path.join(dir,filename)
- nf=file(filename,"w")
- if nf:
- nf.write(line)
-
+
+ for lineTmp in fh.readlines():
+ for line in lineTmp.split("\r"):
+ if ext:
+ i+=1
+ if (i%100)==0:
+ ext.result+="."
+ if i==10000:
+ i=0
+ ext.result+="
"
+ #check if basket name is in the first line
+ if line.find("#atf basket")>=0: #old convention
+ ret=line.replace('#atf basket ','')
+ ret=ret.split('_')[0]
+ elif line.find("#basket:")>=0: #new convention
+ ret=line.replace('#basket: ','')
+ ret=ret.split('_')[0]
+
+ else:
+ if (len(line.lstrip())>0) and (line.lstrip()[0]=="&"): #newfile
+ if nf:
+ nf.close() #close last file
+
+
+ filename=line[1:].split("=")[0].rstrip()+".atf"
+ if dir:
+ filename=os.path.join(dir,filename)
+ nf=file(filename,"w")
+ if nf:
+ nf.write(line.replace("\n","")+"\n")
+
nf.close()
fh.close()
return ret,len(os.listdir(dir))
@@ -1691,8 +1743,10 @@ class CDLIFileFolder(extVersionedFileFol
catalog=getattr(self,self.default_catalog)
#tf,tfilename=mkstemp()
- print self.temp_folder.downloadCounter
- if self.temp_folder.downloadCounter > 5:
+ if not hasattr(self.temp_folder,'downloadCounter'):
+ self.temp_folder.downloadCounter=0
+
+ if getattr(self.temp_folder,'downloadCounter',0) > 5:
return """I am sorry, currently the server has to many requests for downloads, please come back later!"""
self.temp_folder.downloadCounter+=1
@@ -1714,7 +1768,7 @@ class CDLIFileFolder(extVersionedFileFol
#os.write(tf,obj.getLastVersion().data)
if RESPONSE:
- RESPONSE.write(obj.getLastVersion().data[0:])
+ RESPONSE.write(obj.getLastVersion().getData()[0:])
self.temp_folder.downloadCounter-=1
self._p_changed=1
get_transaction().commit()
@@ -1798,6 +1852,16 @@ class CDLIRoot(Folder):
meta_type="CDLIRoot"
downloadCounterBaskets=0# counts the current basket downloads if counter > 10 no downloads are possible
+
+
+ def showFile(self,fileId):
+ """show a file"""
+ f=self.CDLICatalog({'title':fileId})
+ if not f:
+ return ""
+
+ return f[0].getObject().getLastVersionData()
+
def URLquote(self,str):
"""quote url"""
return urllib.quote(str)
@@ -1945,7 +2009,7 @@ class CDLIRoot(Folder):
#tmp=self.cdli_main.tmpStore2[threadName]
tmp=self._v_uploadATF[threadName].returnValue
- #self._v_uploadATF[threadName].continueVar=False
+ self._v_uploadATF[threadName].continueVar=False
self.REQUEST.SESSION['changed']=[x[0].getId() for x in tmp['changed']]
self.REQUEST.SESSION['lockerrors']=[x[0].getId() for x in tmp['lockerrors']]
@@ -1957,7 +2021,7 @@ class CDLIRoot(Folder):
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadCheck.zpt')).__of__(self)
- return pt(changed=tmp['changed'],errors=tmp['errors'],dir=tmp['dir'],newPs=tmp['newPs'],basketLen=tmp['basketLen'],numberOfFiles=tmp['numberOfFiles'],
+ return pt(changed=tmp['changed'],lockerrors=tmp['lockerrors'],errors=tmp['errors'],dir=tmp['dir'],newPs=tmp['newPs'],basketLen=tmp['basketLen'],numberOfFiles=tmp['numberOfFiles'],
basketNameFromId=tmp['basketNameFromId'],basketNameFromFile=tmp['basketNameFromFile'],basketId=tmp['basketId'])
def redoUpload(self,threadName):
@@ -2021,10 +2085,10 @@ class CDLIRoot(Folder):
if RESPONSE is not None:
RESPONSE.redirect(self.absolute_url())
- def importFiles(self,comment="",author="" ,folderName="/Users/dwinter/Documents/workspace/cdli/atf", files=None,ext=None):
+ def importFiles(self,comment="",author="" ,folderName="/Users/dwinter/atf", files=None,ext=None):
"""import files"""
root=self.cdli_main
-
+ count=0
if not files:
files=os.listdir(folderName)
@@ -2051,18 +2115,24 @@ class CDLIRoot(Folder):
else:
fobj2=obj2[0][1]
- file2=file(os.path.join(folderName,f))
+ file2=os.path.join(folderName,f)
id=f
manage_addCDLIFile(fobj2,f,'','')
id=f
ob=fobj2._getOb(f)
ob.title=id
- manage_addCDLIFileObject(ob,id,comment,author,file2,content_type='')
+ manage_addCDLIFileObject(ob,id,comment,author,file2,content_type='',from_tmp=True)
self.CDLICatalog.catalog_object(ob)
#self.CDLICatalog.manage_catalogFoundItems(obj_ids=[id],search_sub=1)
#self.CDLICatalog.manage_catalogObject(self.REQUEST, self.REQUEST.RESPONSE, 'CDLICatalog', urlparse.urlparse(ob.absolute_url())[1])
-
+ count+=1
+
+ if count > 1000:
+ print "committing"
+ get_transaction().commit()
+ count=0
+ get_transaction().commit()
return "ok"