--- cdli/cdli_files.py 2005/11/03 01:47:58 1.1 +++ cdli/cdli_files.py 2005/12/08 17:11:31 1.3 @@ -1,10 +1,11 @@ """CDLI extensions of the filearchive""" from Products.versionedFile.versionedFile import * from Products.ZCatalog.CatalogPathAwareness import CatalogAware -from tempfile import mkstemp +from tempfile import mkstemp,mkdtemp import os.path import os from types import * +import urlparse class Basket(Folder): """shopping basket""" @@ -12,6 +13,17 @@ class Basket(Folder): meta_type="Basket" _v_stack={} + def getObjUrl(self,objId): + """getUrl""" + founds=self.CDLICatalog.search({'path':objId}) + if len(founds)>0: + return founds[0].getObject().absolute_url() + + else: #assume version + splitted=objId.split("_") + founds=self.CDLICatalog.search({'path':splitted[1]}) + return founds[0].getObject().absolute_url()+'/'+objId + def storeAllLink(self,results): """erzeuge link zum speicher aller results""" nr=self.REQUEST['_ZopeId'] @@ -112,6 +124,7 @@ def manage_addBasket(self,id,title,RESPO class BasketObject(Folder): """Basket Object""" + meta_type="basketObject" def __init__(self): """init basket object""" self.contents=[] @@ -151,19 +164,62 @@ class BasketObject(Folder): RESPONSE.redirect(self.absolute_url()) - - def downloadObjectsAsOneFile(self,REQUEST): + def unlockTest(self): + """unlock all files of the testuser for debuggin""" + for object in self.contents: + + if str(object.lockedBy)=="test": + object.lockedBy="" + + def downloadObjectsAsOneFile(self,lock=None,procedure=None,REQUEST=None): """download all selected files in one file""" + ret="" - for object in self.contents: + lockedObjects={} + - ret+=object.getLastVersion().data + if lock: + + if str(self.REQUEST['AUTHENTICATED_USER'])=='Anonymous User': + + return "please login first" + + #check if a locked object exist in the basket. + lockedObjects={} + for object in self.contents: + + if not object.lockedBy=="": + lockedObjects[object.title]=repr(object.lockedBy) + + + keys=lockedObjects.keys() + + + if len(keys)>0 and (not procedure): + self.REQUEST.SESSION['lockedObjects']=lockedObjects + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','lockedObjects.zpt')).__of__(self) + return pt() + + elif not procedure: #keine fails gesperrt dann alle donwloaden + procedure="downloadAll" + print procedure + for object in self.contents: + + if (procedure=="downloadAll") or (object.lockedBy=='') or (object.lockedBy==self.REQUEST['AUTHENTICATED_USER']): + ret+=object.getLastVersion().data + + if lock and object.lockedBy=='': + object.lockedBy=self.REQUEST['AUTHENTICATED_USER'] + + self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="basket_%s.atf" """%self.getId()) self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream") - len=len(ret) - self.REQUEST.RESPONSE.setHeader("Content-Length",len) + length=len(ret) + self.REQUEST.RESPONSE.setHeader("Content-Length",length) self.REQUEST.RESPONSE.write(ret) + + def manage_addBasketObjectForm(self): """add form""" pass @@ -181,34 +237,12 @@ def manage_addBasketObject(self,id,title if RESPONSE is not None: RESPONSE.redirect('manage_main') - -class CDLIFile(versionedFile,CatalogAware): - """CDLI file""" - - meta_type="CDLI file" - default_catalog='CDLICatalog' - - - -def manage_addCDLIFileForm(self): - """interface for adding the OSAS_root""" - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIFile.zpt')).__of__(self) - return pt() - -def manage_addCDLIFile(self,id,title,lockedBy, author=None, RESPONSE=None): - """add the OSAS_root""" - newObj=CDLIFile(id,title,lockedBy,author) - self._setObject(id,newObj) - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - class CDLIFileObject(versionedFileObject): """CDLI file object""" meta_type="CDLI File Object" + def view(self): """view file""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','viewCDLIFile.zpt')).__of__(self) @@ -247,8 +281,104 @@ def manage_addCDLIFileObject(self,id,vC= if REQUEST is not None: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main') + +class CDLIFile(versionedFile,CatalogAware): + """CDLI file""" + + meta_type="CDLI file" + default_catalog='CDLICatalog' + def manage_addCDLIFileObject(self,id,vC,author,file='',title='',precondition='', content_type='',changeName='no',newName='', RESPONSE=None): + """add""" + try: #TODO: der ganze vC unsinn muss ueberarbeitet werden + vC=self.REQUEST['vC'] + except: + 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_addCDLIFileObject(self,id,vC,author,file,id,precondition, content_type) + objs=self.ZopeFind(self,obj_ids=[id])[0][1].setVersionNumber(int(self.getVersion())) + self.REQUEST.SESSION['objID_parent']=self.getId() + + if RESPONSE: + obj=self.ZopeFind(self,obj_ids=[id])[0][1] + if obj.getSize()==0: + self.REQUEST.SESSION['objID']=obj.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] + + +def manage_addCDLIFileForm(self): + """interface for adding the OSAS_root""" + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addCDLIFile.zpt')).__of__(self) + return pt() + +def manage_addCDLIFile(self,id,title,lockedBy, author=None, RESPONSE=None): + """add the OSAS_root""" + newObj=CDLIFile(id,title,lockedBy,author) + self._setObject(id,newObj) + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + + +def splitatf(fh,dir=None): + """split it""" + + nf=None + for line in fh.readlines(): + + 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") + + nf.write(line) + + nf.close() + fh.close() + class CDLIFileFolder(versionedFileFolder): """CDLI folder""" @@ -257,11 +387,89 @@ class CDLIFileFolder(versionedFileFolder folderMetaType=['CDLI Folder'] default_catalog='CDLICatalog' - def uploadATF(self,upload,RESPONSE): + def uploadATF(self,upload,RESPONSE=None): """upload an atf file""" - mks + #TODO: add comments + #TODO: finish uploadATF + dir=mkdtemp() + changed=[] + errors=[] + newPs=[] + splitatf(upload,dir) + + for fn in os.listdir(dir): + founds=self.CDLICatalog.search({'path':fn}) + if len(founds)==0: + newPs.append(fn) + + for found in founds: + obj=found.getObject() + + if (not obj.lockedBy=='') and (not obj.lockedBy==self.REQUEST['AUTHENTICATED_USER']): + errors.append(obj) + else: + data=file(os.path.join(dir,fn)).read() + diffs=obj.diff(data) + if diffs[0]>0: + changed.append((obj,diffs)) + #hochladen + + self.REQUEST.SESSION['changed']=[x[0].getId() for x in changed] + self.REQUEST.SESSION['errors']=[x.getId() for x in errors] + self.REQUEST.SESSION['newPs']=newPs + self.REQUEST.SESSION['tmpdir']=dir + + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','uploadCheck.zpt')).__of__(self) + return pt(changed=changed,errors=errors,dir=dir,newPs=newPs) + + def uploadATFfinally(self,procedure,comment="",unlock=None,RESPONSE=None): + """upload the files""" + + if procedure=="uploadchanged": + uploadFns=self.REQUEST.SESSION['changed']+self.REQUEST.SESSION['newPs'] + + elif procedure=="uploadAll": + uploadFns=[] + for x in os.listdir(self.REQUEST.SESSION['tmpdir']): + if not x in self.REQUEST.SESSION['errors']: + uploadFns.append(x) + else: + uploadFns=[] + + for fn in uploadFns: + founds=self.CDLICatalog.search({'path':fn}) + if len(founds)>0: + self.REQUEST['author']=str(self.REQUEST['AUTHENTICATED_USER']) + founds[0].getObject().manage_addCDLIFileObject('',comment,self.REQUEST['author'],file=file(os.path.join(self.REQUEST.SESSION['tmpdir'],fn))) + + + newPs=self.REQUEST.SESSION['newPs'] + if len(newPs)>0: + tmpDir=self.REQUEST.SESSION['tmpdir'] + self.cdli_main.importFiles(comment=comment,author=str(self.REQUEST['AUTHENTICATED_USER']) ,folderName=tmpDir, files=newPs) + + + + #unlock + if unlock: + unlockFns=[] + for x in os.listdir(self.REQUEST.SESSION['tmpdir']): + if not x in self.REQUEST.SESSION['errors']: + unlockFns.append(x) + + for fn in unlockFns: + founds=self.CDLICatalog.search({'path':fn}) + if len(founds)>0: + self.REQUEST['author']=str(self.REQUEST['AUTHENTICATED_USER']) + + founds[0].getObject().lockedBy="" + + if RESPONSE is not None: + RESPONSE.redirect(self.aq_parent.absolute_url()) + + def findObjectsFromList(self,upload,RESPONSE): """findObjectsFromList (, TAB oder LINE separated)""" txt=upload.read() @@ -353,11 +561,12 @@ class CDLIFileFolder(versionedFileFolder pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','CDLIFileFolderMain')).__of__(self) return pt() - def importFiles(self,comment="",author="" ): + def importFiles(self,comment="",author="" ,folderName="/Users/dwinter/Documents/workspace/cdli/atf", files=None): """import files""" - folderName="/Users/dwinter/Documents/workspace/cdli/atf" - files=os.listdir(folderName) + if not files: + files=os.listdir(folderName) + for f in files: folder=f[0:3] f2=f[0:5] @@ -379,7 +588,6 @@ class CDLIFileFolder(versionedFileFolder else: fobj2=obj2[0][1] - print f file2=file(os.path.join(folderName,f)) id=f manage_addCDLIFile(fobj2,f,'','') @@ -388,8 +596,12 @@ class CDLIFileFolder(versionedFileFolder ob.title=id manage_addCDLIFileObject(ob,id,comment,author,file2,content_type='') - + 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]) + return "ok" + manage_addCDLIFileFolderForm=DTMLFile('dtml/folderAdd', globals())