--- ECHO_content/VLPExtension.py 2007/10/04 18:45:33 1.65 +++ ECHO_content/VLPExtension.py 2008/11/16 12:15:42 1.83 @@ -2,16 +2,10 @@ This module contains extensions which where originally made for the VLP. """ from OFS.Cache import Cacheable -from Products.ECHO_content.ECHO_collection import * from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.PageTemplates.PageTemplate import PageTemplate from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate from OFS.Image import File -try: - from Products.zogiLib import zogiLib -except: - print "Zogilib not installed, VLP_resource will not work" - import xml.dom.minidom import urllib import xmlrpclib @@ -22,6 +16,14 @@ from stat import * from types import * from Globals import package_home import transaction +import Acquisition + +from Products.ECHO_content.ECHO_collection import * +from vlp_xmlhelpers import * +try: + from Products.zogiLib import zogiLib +except: + print "Zogilib not installed, VLP_resource will not work" def lemmatize(str): @@ -46,6 +48,22 @@ def makeXML(str): %s """%str + +def checkXMLfrag(str): + """checks and returns str as XML fragment""" + + xmltempl = """ + %s""" + + try: + dom=xml.dom.minidom.parseString(xmltempl%utf8ify(str)) + return str + except: + str=str.replace("& ","& ") + + dom=xml.dom.minidom.parseString(xmltempl%utf8ify(str)) + return str + def getText(nodelist): @@ -144,6 +162,10 @@ def manage_addSendMailForm(self, id, toA return '' +class VLP_collectionFolder(Folder): + """klasse fŸr folder innheralb der collection""" + meta_type="VLP_collectionFolder" + class VLP_essay(Folder): """classe fr VLP essays""" @@ -217,6 +239,56 @@ class VLP_essay(Folder): if RESPONSE is not None: RESPONSE.redirect('manage_main') + def getPageList(self): + """returns sorted list of (id,object) of page objects""" + + def sortFind(x,y): + return cmp(x[0],y[0]) + +# pages=[] +# pagestmp=self.ZopeFind(self,obj_metatypes=['DTML Document','File']) +# for page in pagestmp: +# if not (page[1].getId()[0]=="."): +# pages.append(page) + + pages = self.objectItems(['DTML Document','File']) + pages.sort(sortFind) + #logging.debug("pageList=%s"%repr(pages)) + return pages + + + def getPageXMLfrag(self, pageNum=None, pageId=None, pageObj=None): + """returns XML fragment of page with id""" + xml = None + + if pageNum is not None: + pl = self.getPageList() + pageObj = pl[int(pageNum)-1][1] + + if pageId is not None: + pageObj = getattr(self, pageId, None) + + if pageObj is not None: + txt = "" + if pageObj.meta_type == 'File': + data = pageObj.data + #logging.debug("data=%s txt=%s"%(repr(data),txt)) + while data is not None: + if isinstance(data, str): + txt += data + data = None + else: + txt += data.data + data = data.next + + else: + # not a File object... perhaps its executable + txt += pageObj() + + xml = checkXMLfrag(txt) + + return unicodify(xml) + def getPage(self,pagenum): """gibt essay page mit num aus""" @@ -225,25 +297,20 @@ class VLP_essay(Folder): pages=[] pagestmp=self.ZopeFind(self,obj_metatypes=['DTML Document','File']) for page in pagestmp: - if not (page[1].getId()[0]=="."): - pages.append(page) + if not (page[1].getId()[0]=="."): + pages.append(page) pages.sort(sortFind) #print str(pages[int(pagenum)][1]()) if pages[int(pagenum)-1][1].meta_type=='File': - - #return makeXML(str(pages[int(pagenum)-1][1])) - #txt=pages[int(pagenum)-1][1].data.decode('utf-8') - txt=pages[int(pagenum)-1][1].data - #print txt.encode('utf-8') - - return self.xml2html(makeXML(txt),quote="no") + #return makeXML(str(pages[int(pagenum)-1][1])) + #txt=pages[int(pagenum)-1][1].data.decode('utf-8') + txt=pages[int(pagenum)-1][1].data + #print txt.encode('utf-8') + return self.xml2html(makeXML(txt),quote="no") else: - - - - return self.xml2html(makeXML(pages[int(pagenum)-1][1]()),quote="no") + return self.xml2html(makeXML(pages[int(pagenum)-1][1]()),quote="no") def nextPage(self,pagenum,url): pages=len(self.ZopeFind(self,obj_metatypes=['DTML Document','File'])) # teste ob performance ok, sonst in variable @@ -416,10 +483,73 @@ def manage_addVLP_subCollection(self,id, if RESPONSE is not None: RESPONSE.redirect('manage_main') +from zope.publisher.interfaces import IPublishTraverse +from zope.interface import implements +from zope.publisher.interfaces import NotFound +from zope.app import zapi +from zope.component import queryMultiAdapter +from ZPublisher.BaseRequest import DefaultPublishTraverse -class VLP_collection(ECHO_collection): +class VLP_collection(ECHO_collection,Acquisition.Explicit): """VLP spezifische Erweiterung der Collection""" + + + implements(IPublishTraverse) + def findObjFromLitName(self,fileName): + if not fileName[0:3]=="lit": + logging.error("getOrCreateFolder wrong filename: %s"%fileName) + return None + + + restName="%08d"%int(fileName[3:]) + + fs=(restName[0:2],restName[0:4],restName[0:6]) + + current =self + for f in fs: + obj = getattr(current,f,None) + if not obj: #subfolder existiert nicht + return None + current=obj + + return getattr(current,fileName,None) + + def publishTraverse(self,request,name): + """change the traversal if literature object""" + + actual_url=request['ACTUAL_URL'] + lastActual=actual_url.split("/")[-1] + + + if name.startswith("lit"): #umleitung wenn lit aufgerufen wirk + # umleitung auf den eigentlichen folder nur wenn direkt der Folder litXXX oder dessen index_html methode aufgerufen wird + if lastActual.startswith("lit") or (lastActual=="index_html") or (lastActual=="index_meta"): + #obj=self. ZopeFind(self,obj_ids=[name],search_sub=1) + ob=self.findObjFromLitName(name) + if not ob: + return "LIt not found" + else: + + logging.error("request:"+repr(ob)) + request.response.setStatus(200) + #if (lastActual=="index_meta"): + # logging.debug("index_meta requested") + # return ob.index_meta + return ob + + else: ## andern falls transversiere zum parent. + obj = self.aq_parent + return obj + else: # mache gar nichts falls nicht lit aufgerufen wird + + + tr=DefaultPublishTraverse(self, request) + ob= tr.publishTraverse(request, name) + + return ob + #raise NotFound(self.context, name, request) + #return repr(request) meta_type="VLP_collection" manage_options=ECHO_collection.manage_options+( @@ -427,9 +557,15 @@ class VLP_collection(ECHO_collection): {'label':'Update Library','action':'updateCollection'}, {'label':'Update Metadata','action':'updateCollectionMD'}, ) - - - + def getAllRessources(self): + """getallressources""" + res=self.ZopeFind(self,obj_metatypes=['VLP_resource'],search_sub=1) + ret=[] + for r in res: + ret.append([r[0],r[1].absolute_url()]) + + return ret + def generateSubCollections(self,errorsTXT="",forceUpdate=False,RESPONSE=None): """erzeuge subcollectionen""" logging.debug("generateSubCollections") @@ -441,23 +577,24 @@ class VLP_collection(ECHO_collection): for found in founds: try: litid = str(found.reference) - foundCol=self.ZopeFind(self,obj_ids=[litid]) + foundCol=self.findObjFromLitName(litid) + #foundCol=self.ZopeFind(self,obj_ids=[litid]) if foundCol: - col = foundCol[0][1] - logging.debug("generateSubCollections: subcollection %s exists (%s)"%(col.getId(),found.reference)) + col = foundCol + logging.debug("generateSubCollections: subcollection %s exists (%s)"%(repr(col),found.reference)) if (col.title != found.titlerefdisplay) or (col.label != found.titlerefdisplay): # subcollection seems to have changed logging.debug("generateSubCollections: subcollection has changed, recreating!") - self.manage_delObjects([foundCol[0][0]]) - manage_addVLP_subCollection(self,litid,found.titlerefdisplay,found.titlerefdisplay) + col.aq_parent.manage_delObjects([col.getId()]) + manage_addVLP_subCollection(self.getOrCreateFolderForFile(litid),litid,found.titlerefdisplay,found.titlerefdisplay) else: logging.debug("generateSubCollections: creating new subcollection %s"%found.reference) - manage_addVLP_subCollection(self,litid,found.titlerefdisplay,found.titlerefdisplay) + manage_addVLP_subCollection(self.getOrCreateFolderForFile(litid),litid,found.titlerefdisplay,found.titlerefdisplay) #teste ob es Images auf dem Server gibt mit gleichem Namen (frontmatter) if os.path.exists(os.path.join(self.vlp_basis,litid)): logging.debug("generateSubCollections: found frontmatter in %s"%litid) - obj=getattr(self,litid) + obj=self.findObjFromLitName(litid) if not self.ZopeFind(obj,obj_ids=[litid]): metalink=self.REQUEST['URL1']+"/"+litid+"/"+litid+"/index_meta" newObj=VLP_resource(litid,'',metalink,litid,litid,litid,'generated','book','','','','','','') @@ -468,6 +605,7 @@ class VLP_collection(ECHO_collection): if RESPONSE is not None: self.REQUEST.RESPONSE.write("

%s

\n"%litid) + logging.debug("

%s

\n"%litid) except: error=sys.exc_info()[0:2] @@ -492,6 +630,29 @@ class VLP_collection(ECHO_collection): if RESPONSE is not None: RESPONSE.redirect('manage_main') + + def getOrCreateFolderForFile(self,fileName): + + if not fileName[0:3]=="lit": + logging.error("getOrCreateFolder wrong filename: %s"%fileName) + return None + + + restName="%08d"%int(fileName[3:]) + + fs=(restName[0:2],restName[0:4],restName[0:6]) + + current =self + for f in fs: + obj = getattr(current,f,None) + if not obj: + newObj=VLP_collectionFolder(f) + current._setObject(f,newObj) + obj = getattr(current,f) + current=obj + + return current + def updateCollection(self,forceUpdate=False,RESPONSE=None): """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner""" errorsTXT="

Errors

" @@ -500,21 +661,45 @@ class VLP_collection(ECHO_collection): RESPONSE.write("") files=os.listdir(self.vlp_basis) + i=0 for fileName in files: + if i<100: + i+=1 + else: + i=0 + j=0 + while j<5: + try: + transaction.get().commit() + j=6 + except: + logging.error("Commit: %s"%j) + j+=1 + + RESPONSE.write("

committed

") if fileName[0:3]=="lit": metalink=self.REQUEST['URL1']+"/"+fileName+"/index_meta" + + folder=self.getOrCreateFolderForFile(fileName) #get the folder where fileName lives or should live + if not folder: #folder gave an error + continue try: - if not hasattr(self,fileName): + if not hasattr(folder,fileName): # create new resource logging.debug("updateCollection: new %s"%fileName) if RESPONSE is not None: RESPONSE.write("

new: %s

\n"%fileName) + logging.debug("new: %s \n"%fileName) newObj=VLP_resource(fileName,'',metalink,fileName,fileName,fileName,'generated','book','','','','','','') - self._setObject(fileName,newObj) + + folder._setObject(fileName,newObj) if RESPONSE is not None: RESPONSE.write("

got: %s "%fileName) - genObj=getattr(self,fileName) + + genObj=getattr(folder,fileName) + logging.debug("got: %s "%fileName) + logging.debug("updateCollection: inspecting %s"%fileName) # create index if hasattr(genObj,'createIndexFile'): @@ -628,8 +813,8 @@ class VLP_resource(ECHO_resource,Cacheab if os.path.isdir(os.path.join(self.vlp_basis,self.resourceID,'pageimg')): return os.path.join(self.vlp_basis,self.resourceID,'pageimg') - elif os.path.isdir(os.path.join(self.vlp_basis,self.resourceID,'pagesHi')): - return os.path.join(self.vlp_basis,self.resourceID,'pagesHi') + elif os.path.isdir(os.path.join(self.vlp_basis,self.resourceID,'pages')): + return os.path.join(self.vlp_basis,self.resourceID,'pages') else: return "no images " @@ -647,6 +832,34 @@ class VLP_resource(ECHO_resource,Cacheab + def identifyMediaType(self): + """identifiziert den Medientype aus der VLP Datenbank""" + founds=self.ZSQLSimpleSearch('select * from vl_literature where reference=\''+self.resourceID+'\' order by id') + if (not founds) or (len(founds)==0): + self.mediaType="generic" # steht nicht in der Datenbank, dann nimm generisch an + return self.mediaType + + + if founds[0].referencetype =="Audio": + self.mediaType ="audio" + elif founds[0].referencetype =="Film": + self.mediaType ="video" + else: + self.mediaType ="image" # nimm an, dass alle anderen Eintrage in der Datenbank auf images verweisen (Buecher oder Fotografien). + + return self.mediaType + + def getMediaType(self,cached=False): + """give the Media-type back, if chached False, then get it from the database""" + + if (not hasattr(self,'mediaType')) or (self.mediaType=="") or (not cached): + self.identifyMediaType() + + return self.mediaType + + + + def copyTranscriptionFromDB(self): """checks if transcription exits in DB""" founds=self.ZSQLSimpleSearch('select * from vl_transcript where source=\''+self.resourceID+'\' order by id') @@ -701,17 +914,32 @@ class VLP_resource(ECHO_resource,Cacheab def show(self): """show the rendered file""" - if self.REQUEST.get('p',None): - #self.REQUEST.set('pn',self.file2page(self.REQUEST.get('p',None))) - self.REQUEST.RESPONSE.redirect(self.REQUEST['URL']+"?pn="+self.file2page(self.REQUEST.get('p',None))) + mt = self.getMediaType() + + if (mt in ['video','audio']): + pt = self.getVLPTemplate('libraryMovieTemplate') + else: #zur zeit werden alle anderen type auf das libraryTemplate abgebildet. + + if self.REQUEST.get('p',None): #make sure that parameter p exists + #self.REQUEST.set('pn',self.file2page(self.REQUEST.get('p',None))) + params = "pn=%s"%self.file2page(self.REQUEST.get('p',None)) + mk = self.REQUEST.get('mk',None) + if mk: + params += "&mk=%s"%mk + self.REQUEST.RESPONSE.redirect(self.REQUEST['URL']+'?'+params) + + pt = self.getVLPTemplate('libraryTemplate') + + return pt() - - if hasattr(self,'libraryTemplate.html'): - return getattr(self,'libraryTemplate.html')() + def getVLPTemplate(self,name): + html=name+".html" + if hasattr(self,html): + return getattr(self,html) - pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','library_template.zpt')).__of__(self) + pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp',name+'.zpt')).__of__(self) pt.content_type="text/html" - return pt() + return pt def index_html(self): """index_html""" @@ -739,21 +967,31 @@ class VLP_resource(ECHO_resource,Cacheab RESPONSE.redirect('manage_main') - def index_meta(self): + def index_meta(self,RESPONSE=None): """index_meta""" - + pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','index_meta.zpt')).__of__(self) - pt.content_type="text/html" - return pt() - + pt.content_type="text/xml" + x= pt.pt_render() + #logging.debug("index_meta 4:"+x) + if RESPONSE: + RESPONSE.setHeader("Content-Type","text/xml") + return x def file2page(self,p): """converts filename to pagenumber""" - dom=xml.dom.minidom.parse(ECHO_helpers.urlopen(getattr(self,'index.xml').absolute_url())) + + #dom=xml.dom.minidom.parse(ECHO_helpers.urlopen(getattr(self,'index.xml').absolute_url())) + index=getattr(self,'index.xml') + + txt=index.pt_render() + dom=xml.dom.minidom.parseString(txt) for page in dom.getElementsByTagName('page'): # pageummer mit lo oder hi sind aequivalent if (page.getAttribute('file')==p) or ("%slo"%page.getAttribute('file')==p) or ("%shi"%page.getAttribute('file')==p): - return page.getAttribute('nr') + nr=page.getAttribute('nr') + + return nr return 0 @@ -763,7 +1001,7 @@ class VLP_resource(ECHO_resource,Cacheab #size of hi resolution files=[] try: - pathHi=os.path.join(self.vlp_basis,self.resourceID,'pagesHi') + pathHi=os.path.join(self.vlp_basis,self.resourceID,'pages') files=os.listdir(pathHi) hi=0 for f in files: @@ -810,8 +1048,8 @@ class VLP_resource(ECHO_resource,Cacheab ret=os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pageimg')) self.imagePath='pageimg' except: - ret=os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pagesHi')) - self.imagePath='pagesHi' + ret=os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pages')) + self.imagePath='pages' temp=[] ret.sort() for x in ret: @@ -823,12 +1061,12 @@ class VLP_resource(ECHO_resource,Cacheab def firstPage(self,url=None): """showlink to the first image""" if self.REQUEST.get('pn','1')=="1": #erste seinte dann kein a tag - return """first
first""" + return """first
first""" else: ws=self.REQUEST.get('ws','1') return """ - first
first + first
first
"""%(self.REQUEST['URL']+"?pn=1&ws=%s"%ws) @@ -839,12 +1077,12 @@ class VLP_resource(ECHO_resource,Cacheab ln=len(pages) if (self.REQUEST.get('pn')==str(ln)) or (ln==1): #letzte seite dann kein a tag oder nur eine Seite - return """last
last""" + return """last
last""" else: ws=self.REQUEST.get('ws','1') return """ - last
last + last
last
"""%(self.REQUEST['URL']+"?pn="+str(ln)+"&ws="+ws) @@ -854,12 +1092,12 @@ class VLP_resource(ECHO_resource,Cacheab nn = int(self.REQUEST.get('pn','1'))-1 if nn < 1: #letzte seite dann kein a tag - return """prev
prev""" + return """prev
prev""" else: ws=self.REQUEST.get('ws','1') return """ - prev
prev + prev
prev
"""%(self.REQUEST['URL']+"?pn="+str(nn)+"&ws="+ws) @@ -871,12 +1109,12 @@ class VLP_resource(ECHO_resource,Cacheab nn = int(self.REQUEST.get('pn','1'))+1 if (nn>int(ln)) or (ln==1): #letzte seite dann kein a tag - return """next
next""" + return """next
next""" else: ws=self.REQUEST.get('ws','1') return """ - next
next + next
next
"""%(self.REQUEST['URL']+"?pn="+str(nn)+"&ws="+ws)