--- ECHO_content/VLPExtension.py 2008/08/05 16:17:46 1.70 +++ ECHO_content/VLPExtension.py 2008/10/08 08:35:20 1.78 @@ -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): @@ -52,13 +54,14 @@ def checkXMLfrag(str): xmltempl = """ %s""" + try: - dom=xml.dom.minidom.parseString(xmltempl%str) + dom=xml.dom.minidom.parseString(xmltempl%utf8ify(str)) return str except: str=str.replace("& ","& ") - dom=xml.dom.minidom.parseString(xmltempl%str) + dom=xml.dom.minidom.parseString(xmltempl%utf8ify(str)) return str @@ -159,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""" @@ -246,10 +253,14 @@ class VLP_essay(Folder): 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] @@ -259,16 +270,24 @@ class VLP_essay(Folder): if pageObj is not None: txt = "" - data = pageObj.data - while data is not None: - txt += data - if isinstance(data, str): - data = None - else: - data = data.next + 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 xml + + return unicodify(xml) def getPage(self,pagenum): @@ -464,10 +483,69 @@ 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"): + #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) + 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+( @@ -476,8 +554,6 @@ class VLP_collection(ECHO_collection): {'label':'Update Metadata','action':'updateCollectionMD'}, ) - - def generateSubCollections(self,errorsTXT="",forceUpdate=False,RESPONSE=None): """erzeuge subcollectionen""" logging.debug("generateSubCollections") @@ -516,6 +592,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] @@ -540,6 +617,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

" @@ -548,21 +648,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'): @@ -695,6 +819,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') @@ -749,21 +901,33 @@ 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))) - 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) - - if hasattr(self,'libraryTemplate.html'): - return getattr(self,'libraryTemplate.html')() + mt = self.getMediaType() - pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','library_template.zpt')).__of__(self) - pt.content_type="text/html" + 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() + def getVLPTemplate(self,name): + html=name+".html" + if hasattr(self,html): + return getattr(self,html) + + pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp',name+'.zpt')).__of__(self) + pt.content_type="text/html" + return pt + def index_html(self): """index_html""" #return self.REQUEST