version 1.72, 2008/08/05 16:50:56
|
version 1.81, 2008/11/13 14:35:53
|
Line 2
|
Line 2
|
This module contains extensions which where originally made for the VLP. |
This module contains extensions which where originally made for the VLP. |
""" |
""" |
from OFS.Cache import Cacheable |
from OFS.Cache import Cacheable |
from Products.ECHO_content.ECHO_collection import * |
|
from Products.PageTemplates.PageTemplateFile import PageTemplateFile |
from Products.PageTemplates.PageTemplateFile import PageTemplateFile |
from Products.PageTemplates.PageTemplate import PageTemplate |
from Products.PageTemplates.PageTemplate import PageTemplate |
from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate |
from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate |
from OFS.Image import File |
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 xml.dom.minidom |
import urllib |
import urllib |
import xmlrpclib |
import xmlrpclib |
Line 22 from stat import *
|
Line 16 from stat import *
|
from types import * |
from types import * |
from Globals import package_home |
from Globals import package_home |
import transaction |
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): |
def lemmatize(str): |
Line 52 def checkXMLfrag(str):
|
Line 54 def checkXMLfrag(str):
|
|
|
xmltempl = """<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
xmltempl = """<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
<txt>%s</txt>""" |
<txt>%s</txt>""" |
|
|
try: |
try: |
dom=xml.dom.minidom.parseString(xmltempl%str) |
dom=xml.dom.minidom.parseString(xmltempl%utf8ify(str)) |
return str |
return str |
except: |
except: |
str=str.replace("& ","& ") |
str=str.replace("& ","& ") |
|
|
dom=xml.dom.minidom.parseString(xmltempl%str) |
dom=xml.dom.minidom.parseString(xmltempl%utf8ify(str)) |
return str |
return str |
|
|
|
|
Line 159 def manage_addSendMailForm(self, id, toA
|
Line 162 def manage_addSendMailForm(self, id, toA
|
return '' |
return '' |
|
|
|
|
|
class VLP_collectionFolder(Folder): |
|
"""klasse fŸr folder innheralb der collection""" |
|
meta_type="VLP_collectionFolder" |
|
|
class VLP_essay(Folder): |
class VLP_essay(Folder): |
"""classe fr VLP essays""" |
"""classe fr VLP essays""" |
|
|
Line 246 class VLP_essay(Folder):
|
Line 253 class VLP_essay(Folder):
|
|
|
pages = self.objectItems(['DTML Document','File']) |
pages = self.objectItems(['DTML Document','File']) |
pages.sort(sortFind) |
pages.sort(sortFind) |
|
#logging.debug("pageList=%s"%repr(pages)) |
return pages |
return pages |
|
|
|
|
Line 262 class VLP_essay(Folder):
|
Line 270 class VLP_essay(Folder):
|
|
|
if pageObj is not None: |
if pageObj is not None: |
txt = "" |
txt = "" |
|
if pageObj.meta_type == 'File': |
data = pageObj.data |
data = pageObj.data |
|
#logging.debug("data=%s txt=%s"%(repr(data),txt)) |
while data is not None: |
while data is not None: |
txt += str(data) |
|
if isinstance(data, str): |
if isinstance(data, str): |
|
txt += data |
data = None |
data = None |
else: |
else: |
|
txt += data.data |
data = data.next |
data = data.next |
|
|
|
else: |
|
# not a File object... perhaps its executable |
|
txt += pageObj() |
|
|
xml = checkXMLfrag(txt) |
xml = checkXMLfrag(txt) |
|
|
return xml |
return unicodify(xml) |
|
|
|
|
def getPage(self,pagenum): |
def getPage(self,pagenum): |
Line 468 def manage_addVLP_subCollection(self,id,
|
Line 483 def manage_addVLP_subCollection(self,id,
|
if RESPONSE is not None: |
if RESPONSE is not None: |
RESPONSE.redirect('manage_main') |
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""" |
"""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" |
meta_type="VLP_collection" |
manage_options=ECHO_collection.manage_options+( |
manage_options=ECHO_collection.manage_options+( |
{'label':'Change Path','action':'VLP_path_configForm'}, |
{'label':'Change Path','action':'VLP_path_configForm'}, |
Line 480 class VLP_collection(ECHO_collection):
|
Line 557 class VLP_collection(ECHO_collection):
|
{'label':'Update Metadata','action':'updateCollectionMD'}, |
{'label':'Update Metadata','action':'updateCollectionMD'}, |
) |
) |
|
|
|
|
|
|
def generateSubCollections(self,errorsTXT="",forceUpdate=False,RESPONSE=None): |
def generateSubCollections(self,errorsTXT="",forceUpdate=False,RESPONSE=None): |
"""erzeuge subcollectionen""" |
"""erzeuge subcollectionen""" |
logging.debug("generateSubCollections") |
logging.debug("generateSubCollections") |
Line 493 class VLP_collection(ECHO_collection):
|
Line 568 class VLP_collection(ECHO_collection):
|
for found in founds: |
for found in founds: |
try: |
try: |
litid = str(found.reference) |
litid = str(found.reference) |
foundCol=self.ZopeFind(self,obj_ids=[litid]) |
foundCol=self.findObjFromLitName(litid) |
|
#foundCol=self.ZopeFind(self,obj_ids=[litid]) |
if foundCol: |
if foundCol: |
col = foundCol[0][1] |
col = foundCol |
logging.debug("generateSubCollections: subcollection %s exists (%s)"%(col.getId(),found.reference)) |
logging.debug("generateSubCollections: subcollection %s exists (%s)"%(repr(col),found.reference)) |
if (col.title != found.titlerefdisplay) or (col.label != found.titlerefdisplay): |
if (col.title != found.titlerefdisplay) or (col.label != found.titlerefdisplay): |
# subcollection seems to have changed |
# subcollection seems to have changed |
logging.debug("generateSubCollections: subcollection has changed, recreating!") |
logging.debug("generateSubCollections: subcollection has changed, recreating!") |
self.manage_delObjects([foundCol[0][0]]) |
col.aq_parent.manage_delObjects([col.getId()]) |
manage_addVLP_subCollection(self,litid,found.titlerefdisplay,found.titlerefdisplay) |
manage_addVLP_subCollection(self.getOrCreateFolderForFile(litid),litid,found.titlerefdisplay,found.titlerefdisplay) |
else: |
else: |
logging.debug("generateSubCollections: creating new subcollection %s"%found.reference) |
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) |
#teste ob es Images auf dem Server gibt mit gleichem Namen (frontmatter) |
if os.path.exists(os.path.join(self.vlp_basis,litid)): |
if os.path.exists(os.path.join(self.vlp_basis,litid)): |
logging.debug("generateSubCollections: found frontmatter in %s"%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]): |
if not self.ZopeFind(obj,obj_ids=[litid]): |
metalink=self.REQUEST['URL1']+"/"+litid+"/"+litid+"/index_meta" |
metalink=self.REQUEST['URL1']+"/"+litid+"/"+litid+"/index_meta" |
newObj=VLP_resource(litid,'',metalink,litid,litid,litid,'generated','book','','','','','','') |
newObj=VLP_resource(litid,'',metalink,litid,litid,litid,'generated','book','','','','','','') |
Line 520 class VLP_collection(ECHO_collection):
|
Line 596 class VLP_collection(ECHO_collection):
|
|
|
if RESPONSE is not None: |
if RESPONSE is not None: |
self.REQUEST.RESPONSE.write("<p>%s</p>\n"%litid) |
self.REQUEST.RESPONSE.write("<p>%s</p>\n"%litid) |
|
logging.debug("<p>%s</p>\n"%litid) |
|
|
except: |
except: |
error=sys.exc_info()[0:2] |
error=sys.exc_info()[0:2] |
Line 544 class VLP_collection(ECHO_collection):
|
Line 621 class VLP_collection(ECHO_collection):
|
if RESPONSE is not None: |
if RESPONSE is not None: |
RESPONSE.redirect('manage_main') |
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): |
def updateCollection(self,forceUpdate=False,RESPONSE=None): |
"""liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner""" |
"""liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner""" |
errorsTXT="<h2>Errors</h2>" |
errorsTXT="<h2>Errors</h2>" |
Line 552 class VLP_collection(ECHO_collection):
|
Line 652 class VLP_collection(ECHO_collection):
|
RESPONSE.write("<html><body>") |
RESPONSE.write("<html><body>") |
|
|
files=os.listdir(self.vlp_basis) |
files=os.listdir(self.vlp_basis) |
|
i=0 |
for fileName in files: |
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("<p>committed</p>") |
if fileName[0:3]=="lit": |
if fileName[0:3]=="lit": |
metalink=self.REQUEST['URL1']+"/"+fileName+"/index_meta" |
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: |
try: |
if not hasattr(self,fileName): |
if not hasattr(folder,fileName): |
# create new resource |
# create new resource |
logging.debug("updateCollection: new %s"%fileName) |
logging.debug("updateCollection: new %s"%fileName) |
if RESPONSE is not None: |
if RESPONSE is not None: |
RESPONSE.write("<p>new: %s</p>\n"%fileName) |
RESPONSE.write("<p>new: %s</p>\n"%fileName) |
|
logging.debug("new: %s \n"%fileName) |
newObj=VLP_resource(fileName,'',metalink,fileName,fileName,fileName,'generated','book','','','','','','') |
newObj=VLP_resource(fileName,'',metalink,fileName,fileName,fileName,'generated','book','','','','','','') |
self._setObject(fileName,newObj) |
|
|
folder._setObject(fileName,newObj) |
|
|
if RESPONSE is not None: |
if RESPONSE is not None: |
RESPONSE.write("<p>got: %s "%fileName) |
RESPONSE.write("<p>got: %s "%fileName) |
genObj=getattr(self,fileName) |
|
|
genObj=getattr(folder,fileName) |
|
logging.debug("got: %s "%fileName) |
|
|
logging.debug("updateCollection: inspecting %s"%fileName) |
logging.debug("updateCollection: inspecting %s"%fileName) |
# create index |
# create index |
if hasattr(genObj,'createIndexFile'): |
if hasattr(genObj,'createIndexFile'): |
Line 699 class VLP_resource(ECHO_resource,Cacheab
|
Line 823 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): |
def copyTranscriptionFromDB(self): |
"""checks if transcription exits in DB""" |
"""checks if transcription exits in DB""" |
founds=self.ZSQLSimpleSearch('select * from vl_transcript where source=\''+self.resourceID+'\' order by id') |
founds=self.ZSQLSimpleSearch('select * from vl_transcript where source=\''+self.resourceID+'\' order by id') |
Line 753 class VLP_resource(ECHO_resource,Cacheab
|
Line 905 class VLP_resource(ECHO_resource,Cacheab
|
def show(self): |
def show(self): |
"""show the rendered file""" |
"""show the rendered file""" |
|
|
if 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))) |
#self.REQUEST.set('pn',self.file2page(self.REQUEST.get('p',None))) |
params = "pn=%s"%self.file2page(self.REQUEST.get('p',None)) |
params = "pn=%s"%self.file2page(self.REQUEST.get('p',None)) |
mk = self.REQUEST.get('mk',None) |
mk = self.REQUEST.get('mk',None) |
Line 761 class VLP_resource(ECHO_resource,Cacheab
|
Line 919 class VLP_resource(ECHO_resource,Cacheab
|
params += "&mk=%s"%mk |
params += "&mk=%s"%mk |
self.REQUEST.RESPONSE.redirect(self.REQUEST['URL']+'?'+params) |
self.REQUEST.RESPONSE.redirect(self.REQUEST['URL']+'?'+params) |
|
|
if hasattr(self,'libraryTemplate.html'): |
pt = self.getVLPTemplate('libraryTemplate') |
return getattr(self,'libraryTemplate.html')() |
|
|
|
pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','library_template.zpt')).__of__(self) |
|
pt.content_type="text/html" |
|
return pt() |
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): |
def index_html(self): |
"""index_html""" |
"""index_html""" |
#return self.REQUEST |
#return self.REQUEST |
Line 794 class VLP_resource(ECHO_resource,Cacheab
|
Line 958 class VLP_resource(ECHO_resource,Cacheab
|
RESPONSE.redirect('manage_main') |
RESPONSE.redirect('manage_main') |
|
|
|
|
def index_meta(self): |
def index_meta(self,RESPONSE=None): |
"""index_meta""" |
"""index_meta""" |
|
|
pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','index_meta.zpt')).__of__(self) |
pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','index_meta.zpt')).__of__(self) |
pt.content_type="text/html" |
pt.content_type="text/xml" |
return pt() |
x= pt.pt_render() |
|
#logging.debug("index_meta 4:"+x) |
|
if RESPONSE: |
|
RESPONSE.setHeader("Content-Type","text/xml") |
|
return x |
def file2page(self,p): |
def file2page(self,p): |
"""converts filename to pagenumber""" |
"""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'): |
for page in dom.getElementsByTagName('page'): |
# pageummer mit lo oder hi sind aequivalent |
# pageummer mit lo oder hi sind aequivalent |
if (page.getAttribute('file')==p) or ("%slo"%page.getAttribute('file')==p) or ("%shi"%page.getAttribute('file')==p): |
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 |
return 0 |
|
|