version 1.72, 2007/03/22 19:56:22
|
version 1.75, 2007/03/23 17:15:36
|
Line 27 import transaction
|
Line 27 import transaction
|
import copy |
import copy |
import codecs |
import codecs |
|
|
|
def generateXMLReturn(hash): |
|
"""erzeugt das xml file als returnwert fuer uploadATFRPC""" |
|
|
|
ret="<return>" |
|
|
|
ret+="<errors>" |
|
for error in hash['errors']: |
|
ret+="""<error atf="%s">%s</error>"""%error |
|
|
|
ret+="</errors>" |
|
|
|
ret+="<changes>" |
|
for changed in hash['changed']: |
|
ret+="""<change atf="%s">%s</change>"""%changed |
|
ret+="</changes>" |
|
|
|
ret+="<newPs>" |
|
for new in hash['newPs']: |
|
ret+="""<new atf="%s"/>"""%new |
|
ret+="</newPs>" |
|
|
|
ret+="</return>" |
|
return ret |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def unique(s): |
def unique(s): |
"""Return a list of the elements in s, but without duplicates. |
"""Return a list of the elements in s, but without duplicates. |
|
|
Line 196 class uploadATFfinallyThread(Thread):
|
Line 229 class uploadATFfinallyThread(Thread):
|
self.result+="<h2>Start processing</h2>" |
self.result+="<h2>Start processing</h2>" |
|
|
#shall I only upload the changed files? |
#shall I only upload the changed files? |
|
logging.info("uploadATFfinally procedure: %s"%procedure) |
if procedure=="uploadchanged": |
if procedure=="uploadchanged": |
changed=[x[0] for x in SESSION.get('changed',[])] |
changed=[x[0] for x in SESSION.get('changed',[])] |
uploadFns=changed+SESSION.get('newPs',[]) |
uploadFns=changed+SESSION.get('newPs',[]) |
Line 341 class uploadATFThread(Thread):
|
Line 375 class uploadATFThread(Thread):
|
ctx = self.getContext(app,serverport=self.serverport) |
ctx = self.getContext(app,serverport=self.serverport) |
logging.info("run intern") |
logging.info("run intern") |
try: |
try: |
|
logging.info("created: %s"%idTmp) |
ctx.temp_folder._setObject(idTmp,tmpStore(idTmp)) |
ctx.temp_folder._setObject(idTmp,tmpStore(idTmp)) |
except: |
except: |
logging.error("thread upload: %s %s"%sys.exc_info()[0:2]) |
logging.error("thread upload: %s %s"%sys.exc_info()[0:2]) |
Line 355 class uploadATFThread(Thread):
|
Line 390 class uploadATFThread(Thread):
|
|
|
conn.close() |
conn.close() |
|
|
|
return getattr(ctx.temp_folder,idTmp) |
|
|
def getResult(self): |
def getResult(self): |
"""method for accessing result""" |
"""method for accessing result""" |
Line 479 class CDLIBasketContainer(OrderedFolder)
|
Line 515 class CDLIBasketContainer(OrderedFolder)
|
security=ClassSecurityInfo() |
security=ClassSecurityInfo() |
meta_type="CDLIBasketContainer" |
meta_type="CDLIBasketContainer" |
|
|
|
def getPNumbersOfBasket(self,basketName): |
|
"""get all pnumbers of a basket as a list, returns an empty list if basket not found |
|
@param basketName: name of the basket |
|
""" |
|
ret=[] |
|
basketId=self.getBasketIdfromName(basketName) |
|
if not basketId: |
|
return [] |
|
|
|
ob=getattr(self,basketId).getContent() |
|
|
|
ret=[x[0].split(".")[0] for x in ob] |
|
|
|
return ret |
|
|
|
def getBasketAsOneFile(self,basketName,current="no"): |
|
"""returns all files of the basket combined in one file |
|
@param basketName: Name of the basket |
|
@param current: (optional) if current is set to "yes" then the most current version of |
|
all files are downloaded and not the versions of the files as stored in the basket |
|
""" |
|
ret="" |
|
basketId=self.getBasketIdfromName(basketName) |
|
if not basketId: |
|
return "" |
|
|
|
ob=getattr(self,basketId).getLastVersion() |
|
for object in ob.getContent(): |
|
if current=="no": #version as they are in the basket |
|
ret+=str(object[0].getData())+"\n" |
|
elif current=="yes": |
|
#search current object |
|
logging.info("crrent: %s"%object[1].getId().split(".")[0]) |
|
founds=self.CDLICatalog.search({'title':object[1].getId().split(".")[0]}) |
|
if len(founds)>0: |
|
ret+=str(founds[0].getObject().getLastVersion().getData())+"\n" |
|
return ret |
|
|
def upDateBaskets(self): |
def upDateBaskets(self): |
"""update content in to objects""" |
"""update content in to objects""" |
|
|
Line 506 class CDLIBasketContainer(OrderedFolder)
|
Line 580 class CDLIBasketContainer(OrderedFolder)
|
trash.manage_pasteObjects(cut) |
trash.manage_pasteObjects(cut) |
|
|
security.declareProtected('manage','manageBaskets') |
security.declareProtected('manage','manageBaskets') |
def manageBaskets(self,submit,ids=None,basket1="",basket2="",REQUEST=None,RESPONSE=None): |
def manageBaskets(self,submit,ids=None,basket1="",basket2="",joinBasket="",subtractBasket="",REQUEST=None,RESPONSE=None): |
"""manage baskets, delete or copy""" |
"""manage baskets, delete or copy""" |
if submit=="delete": |
if submit=="delete": |
self.deleteBaskets(ids) |
self.deleteBaskets(ids) |
|
|
elif submit=="join": |
elif submit=="join": |
flag,msg=self.joinBasket("joinedBasket", ids) |
flag,msg=self.joinBasket(joinBasket, ids) |
logging.info("joining %s %s"%(flag,msg)) |
logging.info("joining %s %s"%(flag,msg)) |
|
|
elif submit=="subtract": |
elif submit=="subtract": |
logging.info("BBBb %s %s"%(basket1,basket2)) |
logging.info("BBBb %s %s"%(basket1,basket2)) |
flag,msg=self.subtractBasket("subtractedBasket", basket1,basket2) |
flag,msg=self.subtractBasket(subtractBasket, basket1,basket2) |
logging.info("subtract %s %s"%(flag,msg)) |
logging.info("subtract %s %s"%(flag,msg)) |
|
|
if RESPONSE: |
if RESPONSE: |
Line 809 class CDLIBasket(Folder,CatalogAware):
|
Line 883 class CDLIBasket(Folder,CatalogAware):
|
meta_type="CDLIBasket" |
meta_type="CDLIBasket" |
default_catalog="CDLIBasketCatalog" |
default_catalog="CDLIBasketCatalog" |
|
|
|
def searchInBasket(self,indexName,searchStr,regExp=False): |
|
"""searchInBasket""" |
|
|
|
lst=self.searchInLineIndexDocs(indexName,searchStr,uniq=True,regExp=False) |
|
ret={} |
|
|
|
lv=self.getLastVersion() |
|
logging.info("searching") |
|
for obj in lv.content.getContent(): |
|
id=obj[1].getId().split(".")[0] |
|
if id in lst: |
|
|
|
ret[id]=self.showWordInFile(id,searchStr,lineList=self.getLinesFromIndex(indexName,searchStr,id,regExp=regExp),regExp=regExp,indexName=indexName) |
|
|
|
|
|
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','searchResultsInBasket')).__of__(self) |
|
return pt(result=ret,indexName=indexName,regExp=regExp,word=searchStr) |
|
|
|
|
|
|
|
|
|
def searchInBasket_v1(self,searchStr): |
|
"""search occurences of searchStr in files im basket""" |
|
ret=[] |
|
lv=self.getLastVersion() |
|
logging.info("searching") |
|
for obj in lv.content.getContent(): |
|
txt=obj[0].getData() |
|
for x in txt.split("\n"): |
|
logging.info("search %s"%x) |
|
if re.match(searchStr,x): |
|
ret.append(x) |
|
|
|
return "\n".join(ret) |
|
|
|
|
def getFile(self,obj): |
def getFile(self,obj): |
return obj[1] |
return obj[1] |
Line 1202 class CDLIBasketVersion(Implicit,Persist
|
Line 1311 class CDLIBasketVersion(Implicit,Persist
|
ret+=str(object[0].getData())+"\n" |
ret+=str(object[0].getData())+"\n" |
elif current=="yes": |
elif current=="yes": |
#search current object |
#search current object |
founds=self.CDLICatalog.search({'title':object[0].getId()}) |
founds=self.CDLICatalog.search({'title':object[1].getId().split(".")[0]}) |
if len(founds)>0: |
if len(founds)>0: |
ret+=str(founds[0].getObject().getLastVersion().getData())+"\n" |
ret+=str(founds[0].getObject().getLastVersion().getData())+"\n" |
|
|
Line 1248 class CDLIBasketVersion(Implicit,Persist
|
Line 1357 class CDLIBasketVersion(Implicit,Persist
|
def __init__(self,id,user,comment="",basketContent=[]): |
def __init__(self,id,user,comment="",basketContent=[]): |
""" init a basket version""" |
""" init a basket version""" |
self.id=id |
self.id=id |
self.coment=comment |
self.comment=comment |
self._setObject('content',BasketContent(basketContent)) |
self._setObject('content',BasketContent(basketContent)) |
#self.basketContent=basketContent[0:]a |
#self.basketContent=basketContent[0:]a |
self.user=user |
self.user=user |
Line 1613 def splitatf(fh,dir=None,ext=None):
|
Line 1722 def splitatf(fh,dir=None,ext=None):
|
nf=None |
nf=None |
i=0 |
i=0 |
|
|
for lineTmp in fh.readlines(): |
if (type(fh) is StringType) or (type(fh) is UnicodeType): |
|
iter=fh.split("\n") |
|
else: |
|
iter=fh.readlines() |
|
|
|
for lineTmp in iter: |
lineTmp=lineTmp.replace(codecs.BOM_UTF8,'') # make sure that all BOM are removed.. |
lineTmp=lineTmp.replace(codecs.BOM_UTF8,'') # make sure that all BOM are removed.. |
for line in lineTmp.split("\r"): |
for line in lineTmp.split("\r"): |
#logging.log("Deal with: %s"%line) |
#logging.log("Deal with: %s"%line) |
Line 1650 def splitatf(fh,dir=None,ext=None):
|
Line 1764 def splitatf(fh,dir=None,ext=None):
|
nf.close() |
nf.close() |
except: |
except: |
pass |
pass |
|
|
|
if not((type(fh) is StringType) or (type(fh) is UnicodeType)): |
fh.close() |
fh.close() |
return ret,len(os.listdir(dir)) |
return ret,len(os.listdir(dir)) |
|
|
Line 1705 class CDLIFileFolder(extVersionedFileFol
|
Line 1821 class CDLIFileFolder(extVersionedFileFol
|
"""get the content of the file fn""" |
"""get the content of the file fn""" |
founds=self.CDLICatalog.search({'title':fn}) |
founds=self.CDLICatalog.search({'title':fn}) |
if not founds: |
if not founds: |
return [] |
return "" |
else: |
else: |
obj=founds[0].getObject().getLastVersion() |
obj=founds[0].getObject().getLastVersion() |
|
|
Line 1921 class CDLIRoot(Folder):
|
Line 2037 class CDLIRoot(Folder):
|
meta_type="CDLIRoot" |
meta_type="CDLIRoot" |
downloadCounterBaskets=0# counts the current basket downloads if counter > 10 no downloads are possible |
downloadCounterBaskets=0# counts the current basket downloads if counter > 10 no downloads are possible |
|
|
|
def deleteFiles(self,ids): |
|
"""delete files (resp. move into .trash folder)""" |
|
# find or generete trash folder |
|
|
|
found=self.ZopeFind(self,obj_ids=['.trash']) |
|
|
|
if len(found)<1: |
|
manage_addCDLIFileFolder(self, '.trash',title="Trash") |
|
trash=self._getOb('.trash') |
|
else: |
|
logging.info(found) |
|
trash=found[0][1] |
|
|
|
|
|
for id in ids: |
|
founds=self.CDLICatalog.search({'title':id.split(".")[0]}) |
|
if founds: |
|
logging.info(founds) |
|
folder=founds[0].getObject().aq_parent #get the parent folder of the object |
|
logging.info(folder) |
|
cut=folder.manage_cutObjects([founds[0].getId]) #cut it out |
|
trash.manage_pasteObjects(cut) #paste it in the trash |
|
|
|
|
def findWordRegExp(self,indexName,searchTerm): |
def findWordRegExp(self,indexName,searchTerm): |
"""find all words in index which match regexp in SearchTerm |
"""find all words in index which match regexp in SearchTerm |
@param indexName: name of the index to be searched in |
@param indexName: name of the index to be searched in |
Line 2050 class CDLIRoot(Folder):
|
Line 2190 class CDLIRoot(Folder):
|
transaction.get().commit() |
transaction.get().commit() |
|
|
|
|
def showFile(self,fileId): |
def showFile(self,fileId,wholePage=False): |
"""show a file |
"""show a file |
@param fileId: P-Number of the document to be displayed |
@param fileId: P-Number of the document to be displayed |
""" |
""" |
Line 2058 class CDLIRoot(Folder):
|
Line 2198 class CDLIRoot(Folder):
|
if not f: |
if not f: |
return "" |
return "" |
|
|
|
if wholePage: |
|
logging.info("whole") |
|
return f[0].getObject().getLastVersion().view() |
|
else: |
return f[0].getObject().getLastVersionFormattedData() |
return f[0].getObject().getLastVersionFormattedData() |
|
|
|
|
Line 2210 class CDLIRoot(Folder):
|
Line 2354 class CDLIRoot(Folder):
|
return ret |
return ret |
|
|
|
|
|
def uploadATFRPC(self,data,username): |
|
"""upload an atffile via xml-rpc""" |
|
uploader=uploadATFThread() |
|
|
|
#generate an random id for the upload object |
|
from random import randint |
|
if (not self.REQUEST.SESSION.get('idTmp',None)): |
|
|
|
idTmp=str(randint(0,1000000000)) |
|
self.REQUEST.SESSION['idTmp']=idTmp |
|
else: |
|
idTmp=self.REQUEST.SESSION.get('idTmp',None) |
|
|
|
|
|
uploader.set(data,0,username,idTmp) |
|
|
|
stObj=uploader.run() |
|
|
|
processor=uploadATFfinallyThread() |
|
|
|
basketname=stObj.returnValue['basketNameFromFile'] |
|
|
|
processor.set("uploadchanged",basketname=basketname,SESSION=stObj.returnValue,username=username,serverport=self.REQUEST['SERVER_PORT']) |
|
|
|
processor.run() |
|
|
|
|
|
return generateXMLReturn(stObj.returnValue) |
|
|
def uploadATF(self,repeat=None,upload=None,basketId=0,RESPONSE=None): |
def uploadATF(self,repeat=None,upload=None,basketId=0,RESPONSE=None): |
"""upload an atf file / basket file""" |
"""upload an atf file / basket file""" |