version 1.42, 2005/02/28 20:30:42
|
version 1.93, 2010/09/14 12:44:57
|
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 |
import vlp_xmlhelpers |
import vlp_xmlhelpers |
|
import sys |
|
import os |
|
from stat import * |
from types import * |
from types import * |
from Globals import package_home |
from Globals import package_home |
|
import transaction |
|
import Acquisition |
|
import re |
|
import logging |
|
|
|
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 44 def makeXML(str):
|
Line 51 def makeXML(str):
|
</page>"""%str |
</page>"""%str |
|
|
|
|
|
def checkXMLfrag(str): |
|
"""checks and returns str as XML fragment""" |
|
|
|
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>""" |
|
|
|
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): |
def getText(nodelist): |
|
|
Line 141 def manage_addSendMailForm(self, id, toA
|
Line 164 def manage_addSendMailForm(self, id, toA
|
return '' |
return '' |
|
|
|
|
|
class VLP_collectionFolder(Folder): |
|
"""klasse fuer folder innerhalb der collection""" |
|
meta_type="VLP_collectionFolder" |
|
|
class VLP_essay(Folder): |
class VLP_essay(Folder): |
"""classe für VLP essays""" |
"""classe fr VLP essays""" |
|
|
meta_type="VLP_essay" |
meta_type="VLP_essay" |
|
|
Line 214 class VLP_essay(Folder):
|
Line 241 class VLP_essay(Folder):
|
if RESPONSE is not None: |
if RESPONSE is not None: |
RESPONSE.redirect('manage_main') |
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): |
def getPage(self,pagenum): |
"""gibt essay page mit num aus""" |
"""gibt essay page mit num aus""" |
Line 227 class VLP_essay(Folder):
|
Line 304 class VLP_essay(Folder):
|
|
|
pages.sort(sortFind) |
pages.sort(sortFind) |
#print str(pages[int(pagenum)][1]()) |
#print str(pages[int(pagenum)][1]()) |
if pages[int(pagenum)-1][1].meta_type=='File': |
|
|
|
|
if pages[int(pagenum)-1][1].meta_type=='File': |
#return makeXML(str(pages[int(pagenum)-1][1])) |
#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.decode('utf-8') |
txt=pages[int(pagenum)-1][1].data |
txt=pages[int(pagenum)-1][1].data |
#print txt.encode('utf-8') |
#print txt.encode('utf-8') |
|
|
return self.xml2html(makeXML(txt),quote="no") |
return self.xml2html(makeXML(txt),quote="no") |
else: |
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): |
def nextPage(self,pagenum,url): |
Line 259 class VLP_essay(Folder):
|
Line 332 class VLP_essay(Folder):
|
retstr=url+"?p="+str(int(pagenum)+1) |
retstr=url+"?p="+str(int(pagenum)+1) |
return retstr |
return retstr |
|
|
|
def lastURL(self,pagenum,url): |
|
# teste ob performance ok, sonst in variable |
|
pages=len(self.ZopeFind(self,obj_metatypes=['DTML Document','File'])) |
|
|
|
return url+"?p="+str(pages) |
|
|
def previousURL(self,pagenum,url): |
def previousURL(self,pagenum,url): |
|
|
if int(pagenum)-1 > 0: |
if int(pagenum)-1 > 0: |
Line 342 class VLP_subcollection(ECHO_collection)
|
Line 421 class VLP_subcollection(ECHO_collection)
|
""" subcollection of elements""" |
""" subcollection of elements""" |
|
|
meta_type="VLP_subcollection" |
meta_type="VLP_subcollection" |
|
|
|
def getVLPSubcollectionToc(self,type): |
|
|
|
#different ordering depending on the type |
|
if(type == "(Collection)"): |
|
sort= "shortreference" |
|
else: |
|
sort = "startpages" |
|
|
|
#content of journals also displayed if not online |
|
|
|
if (type == "(JournalVolume)"): |
|
online ="" |
|
else: |
|
online ="AND online = 1" |
|
sort=self.collectionSort(type) |
|
|
|
item = [x for x in self.ZSQLSimpleSearch("""SELECT * FROM vl_literature |
|
WHERE volumeid ~ '%s\\\\M' """%self.getId() |
|
+ """ %s AND not referenceType='%s' """%(online,type) |
|
+ """ORDER BY """ + sort)] |
|
|
|
tocItem = [x for x in self.ZSQLSimpleSearch("""SELECT * FROM vl_literature |
|
WHERE reference = '%s' """%self.getId() |
|
+ """AND online = 1 AND referenceType='%s' """%type |
|
+ """ORDER BY """ + sort)] |
|
|
|
|
|
|
|
return tocItem+item |
|
|
|
def checkForFrontMatter(self,item): |
|
"""Teste ob Frontmatter exists""" |
|
if not item==self.getId(): |
|
return False |
|
|
|
if self.ZopeFind(self,obj_ids=[self.getId()]): |
|
return True |
|
else: |
|
return False |
|
|
def generateSubCollectionFromDB(self): |
def generateSubCollectionFromDB(self): |
"""erzeuge subcollection""" |
"""erzeuge subcollection""" |
for item in self.ZSQLSimpleSearch("select * from vl_literature where volumeid like '%s'"%self.id): |
for item in self.ZSQLSimpleSearch("select * from vl_literature where volumeid like '%s'"%self.id): |
manage_addECHO_link(self,item.reference,item.titlerefdisplay,item.titlerefdisplay) |
manage_addECHO_link(self,item.reference,item.titlerefdisplay,item.titlerefdisplay) |
|
|
|
|
def index_html(self): |
def index_html(self): |
"""erzeuge darstellung""" |
"""erzeuge darstellung""" |
pt=zptFile(self, 'vlp/collection_template.zpt') |
|
|
if hasattr(self,'subCollection_template.html'): |
|
return getattr(self,'subCollection_template.html')() |
|
|
|
pt=zptFile(self, 'vlp/subCollection_template.zpt') |
return pt() |
return pt() |
|
|
|
|
Line 360 def manage_addVLP_subCollection(self,id,
|
Line 485 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 |
|
try: |
|
from ZPublisher.BaseRequest import DefaultPublishTraverse |
|
except: |
|
pass |
|
|
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 foxridgePath2vlp(self,url,mk,RESPONSE=None): |
|
"""convertiert einen pfad zu einer url in vlp""" |
|
litRe = re.match(r".*lit([0-9]*)",url) |
|
logging.debug("foxridgePath2vlp URL:"+repr(url)) |
|
lit = "lit"+litRe.group(1) |
|
splitted=url.split("/") |
|
path=splitted[-1].split(".")[0] |
|
newUrl=lit+"?p=%s&mk=%s"%(path,mk) |
|
|
|
if RESPONSE: |
|
RESPONSE.redirect(newUrl) |
|
return |
|
|
|
return newUrl |
|
|
|
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] |
|
logging.debug("pub_trav:"+actual_url) |
|
|
|
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") or (lastActual=="getTitle") or (lastActual=="getMetaDataLink") or (lastActual=="hasTranscription") or (lastActual=="transcription"): |
|
#obj=self. ZopeFind(self,obj_ids=[name],search_sub=1) |
|
ob=self.findObjFromLitName(name) |
|
if not ob: |
|
return "LIt not found" |
|
else: |
|
|
|
logging.debug("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'}, |
{'label':'Update Library','action':'updateCollection'}, |
{'label':'Update Library','action':'updateCollection'}, |
{'label':'Update Metadata','action':'updateCollectionMD'}, |
{'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): |
def generateSubCollections(self,errorsTXT="",forceUpdate=False,RESPONSE=None): |
"""erzeuge subcollectionen""" |
"""erzeuge subcollectionen""" |
founds=self.ZSQLSimpleSearch("select * from vl_literature where referencetype in ('(Book)','(Collection)','(Journal)','(Library)')") |
logging.debug("generateSubCollections") |
|
founds=self.ZSQLSimpleSearch("select * from vl_literature where referencetype in ('(Edited Book)','(Book)','(Collection)','(JournalVolume)','(Generic Container)')") |
|
|
self.REQUEST.RESPONSE.write("<html><body>\n") |
if RESPONSE is not None: |
|
RESPONSE.setHeader('Content-Type','text/html') |
|
self.REQUEST.RESPONSE.write("<h2>Create Subcollections</h2>\n") |
for found in founds: |
for found in founds: |
|
try: |
foundCol=self.ZopeFind(self,obj_ids=[found.reference]) |
litid = str(found.reference) |
|
foundCol=self.findObjFromLitName(litid) |
|
#foundCol=self.ZopeFind(self,obj_ids=[litid]) |
if foundCol: |
if foundCol: |
self.manage_delObjects([foundCol[0][0]]) |
col = foundCol |
|
logging.debug("generateSubCollections: subcollection %s exists (%s)"%(repr(col),found.reference)) |
|
logging.debug(repr([col.title,found.titlerefdisplay,col.label,found.titlerefdisplay])) |
|
if (unicodify(col.title) != unicodify(found.titlerefdisplay)) or (unicodify(col.label) != unicodify(found.titlerefdisplay)): |
|
# subcollection seems to have changed |
|
logging.debug("generateSubCollections: subcollection has changed, recreating!") |
|
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.getOrCreateFolderForFile(litid),litid,found.titlerefdisplay,found.titlerefdisplay) |
|
|
manage_addVLP_subCollection(self,found.reference,found.titlerefdisplay,found.titlerefdisplay) |
#teste ob es Images auf dem Server gibt mit gleichem Namen (frontmatter) |
#getattr(self,found.reference).generateSubCollectionFromDB() |
if os.path.exists(os.path.join(self.vlp_basis,litid)): |
|
logging.debug("generateSubCollections: found frontmatter in %s"%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','','','','','','') |
|
obj._setObject(litid,newObj) |
|
|
self.REQUEST.RESPONSE.write("<p>%s</p>\n"%found.reference) |
genObj=getattr(obj,litid) |
|
genObj.createIndexFile(forceUpdate=forceUpdate) |
|
|
|
if RESPONSE is not None: |
|
self.REQUEST.RESPONSE.write("<p>%s</p>\n"%litid) |
|
logging.debug("<p>%s</p>\n"%litid) |
|
|
|
except: |
|
error=sys.exc_info()[0:2] |
|
logging.error("generateSubCollections: ERROR in %s"%litid) |
|
if RESPONSE is not None: |
|
RESPONSE.write("<p>(ERROR updateII(%s): %s %s TXT: %s)\n</p>"%(litid,error[0],error[1],sys.exc_info()[2])) |
|
RESPONSE.write("<p>(ERROR (%s): %s %s)</p>\n"%(litid,error[0],error[1])) |
|
logging.error("generateSubCollections: %s %s"%error) |
|
self.REQUEST.RESPONSE.write("(ERROR (%s): %s %s)\n"%(litid,repr(error[0]),repr(error[1]))) |
|
errorsTXT+="<p>ERROR: No subcollection of %s (ERROR: %s %s)</p>\n"%(litid,error[0],error[1]) |
|
errorsTXT+="<p>No subcollection of %s "%litid+"(ERROR: %s %s)</p>"%error |
|
|
|
return errorsTXT |
|
|
def VLP_path_configForm(self): |
def VLP_path_configForm(self): |
"""change pt""" |
"""change pt""" |
path=PageTemplateFile(os.path.join(package_home(globals()),'vlp','ChangeVLPPath.zpt')).__of__(self) |
pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','ChangeVLPPath.zpt')).__of__(self) |
return pt() |
return pt() |
|
|
def VLP_path_config(self,path,RESPONSE=None): |
def VLP_path_config(self,path,RESPONSE=None): |
"""config""" |
"""config""" |
self.path=path |
self.vlp_basis=path |
if RESPONSE is not None: |
if RESPONSE is not None: |
RESPONSE.redirect('manage_main') |
RESPONSE.redirect('manage_main') |
|
|
def updateCollection(self,RESPONSE=None): |
|
"""liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner""" |
def getOrCreateFolderForFile(self,fileName): |
files=os.listdir(self.path) |
|
|
if not fileName[0:3]=="lit": |
|
logging.error("getOrCreateFolder wrong filename: %s"%fileName) |
|
return None |
|
|
|
try: |
|
restName="%08d"%int(fileName[3:]) |
|
except: |
|
logging.error("getOrCreateFolder wrong filename: %s"%fileName) |
|
return None |
|
|
|
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 changeOrAddResources(self,forceUpdate=False,RESPONSE=None): |
|
"""changes ord updates all resources found in the file system""" |
|
|
|
errorsTXT="<h2>Errors</h2>" |
|
if RESPONSE is not None: |
|
RESPONSE.setHeader('Content-Type','text/html') |
|
RESPONSE.write("<html><body>") |
|
|
|
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" |
if not hasattr(self,fileName): |
|
|
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(folder,fileName): |
|
# create new resource |
|
logging.debug("updateCollection: new %s"%fileName) |
|
if RESPONSE is not None: |
|
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) |
|
RESPONSE.write("got: %s\n"%fileName) |
folder._setObject(fileName,newObj) |
genObj=getattr(self,fileName) |
|
genObj.createIndexFile() |
|
|
|
if RESPONSE is not None: |
if RESPONSE is not None: |
RESPONSE.redirect('manage_main') |
RESPONSE.write("<p>got: %s "%fileName) |
|
|
|
genObj=getattr(folder,fileName) |
|
logging.debug("got: %s "%fileName) |
|
|
|
logging.debug("updateCollection: inspecting %s"%fileName) |
|
# create index |
|
if hasattr(genObj,'createIndexFile'): |
|
try: |
|
logging.debug("updateCollection: creating index for %s"%fileName) |
|
msg = genObj.createIndexFile(forceUpdate=forceUpdate) |
|
if msg and RESPONSE is not None: |
|
RESPONSE.write(msg) |
|
except: |
|
error=sys.exc_info()[0:2] |
|
if RESPONSE is not None: |
|
RESPONSE.write("(ERROR Update(%s): %s %s %s) "%(fileName,error[0],error[1],sys.exc_info()[2])) |
|
errorsTXT+="<p>ERROR creating index for %s "%fileName+"(ERROR: %s %s)</p>\n"%error |
|
|
|
# update pageSizeSum for subcollections |
|
if genObj.meta_type=="VLP_subcollection": |
|
if RESPONSE is not None: |
|
RESPONSE.write(" is subcollection") |
|
logging.debug("updateCollection: %s is subcollection"%fileName) |
|
genObj.pageSizeSum=getattr(genObj,fileName).getPageSizeSum() |
|
else: |
|
genObj.pageSizeSum=genObj.getPageSizeSum() |
|
|
|
if RESPONSE is not None: |
|
RESPONSE.write("</p>\n") |
|
|
|
except: |
|
error=sys.exc_info()[0:2] |
|
logging.error("updateCollection: ERROR in %s (%s %s)"%(fileName,error[0],error[1])) |
|
if RESPONSE is not None: |
|
RESPONSE.write("(ERROR updateII(%s): %s %s %s) "%(fileName,error[0],error[1],sys.exc_info()[2])) |
|
errorsTXT+="<p>File not created:%s (ERROR: %s %s)</p>\n"%(fileName,error[0],error[1]) |
|
return errorsTXT |
|
|
|
def updateCollection(self,forceUpdate=True,RESPONSE=None): |
|
"""liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner""" |
|
|
|
# update subcollections |
|
errorsTXT="" |
|
errorsTXT+=self.changeOrAddResources(forceUpdate, RESPONSE); |
|
errorsTXT+=self.generateSubCollections(forceUpdate=forceUpdate,RESPONSE=RESPONSE) |
|
errorsTXT+="\n" |
|
if RESPONSE is not None: |
|
RESPONSE.write(errorsTXT) |
|
RESPONSE.write("</body></html>") |
|
|
def updateCollectionMD(self,RESPONSE=None): |
def updateCollectionMD(self,RESPONSE=None): |
"""updateMD""" |
"""updateMD""" |
files=os.listdir(self.path) |
files=os.listdir(self.vlp_basis) |
for fileName in files: |
for fileName in files: |
if fileName[0:3]=="lit": |
if fileName[0:3]=="lit": |
genObj=getattr(self,fileName) |
genObj=getattr(self,fileName) |
Line 474 class VLP_resource(ECHO_resource,Cacheab
|
Line 829 class VLP_resource(ECHO_resource,Cacheab
|
|
|
meta_type="VLP_resource" |
meta_type="VLP_resource" |
|
|
vlp_basis="/mpiwg/online/permanent/vlp" |
def _p_resolveConflict(self,oldstate,savedstate,newstate): |
|
logging.debug("updateCollection: Have to resolve conflict!") |
|
return newstate |
|
|
|
#vlp_basis="/mpiwg/online/permanent/vlp" |
|
|
|
|
|
|
referencetypes=[] |
referencetypes=[] |
Line 486 class VLP_resource(ECHO_resource,Cacheab
|
Line 846 class VLP_resource(ECHO_resource,Cacheab
|
{'label':'Generate Library Template','action':'generateLibraryTemplateHTML'}, |
{'label':'Generate Library Template','action':'generateLibraryTemplateHTML'}, |
) |
) |
|
|
|
def getMetaDataLink(self): |
|
"""link auf die metatdaten""" |
|
return self.absolute_url()+"/index_meta" |
|
|
|
|
|
def getTitle(self): |
|
"""Title der Ressource""" |
|
title= self.ZSQLSimpleSearch("""select title from vl_literature where reference= \'%s\' """ %self.getId())[0].title |
|
logging.debug(title) |
|
return title |
|
|
|
|
|
|
def getImagePath(self): |
def getImagePath(self): |
"""Pfad zu den Images""" |
"""Pfad zu den Images""" |
|
path=None |
|
|
if os.path.isdir(os.path.join(self.vlp_basis,self.resourceID,'pageimg')): |
if os.path.isdir(os.path.join(self.vlp_basis,self.resourceID,'pageimg')): |
return os.path.join(self.vlp_basis,self.resourceID,'pageimg') |
path= os.path.join(self.vlp_basis,self.resourceID,'pageimg') |
elif os.path.isdir(os.path.join(self.vlp_basis,self.resourceID,'pagesHi')): |
elif os.path.isdir(os.path.join(self.vlp_basis,self.resourceID,'pages')): |
|
path = os.path.join(self.vlp_basis,self.resourceID,'pages') |
|
# workaround in some cases there seem to be no pictures in pages |
|
|
|
if os.path.isdir(os.path.join(self.vlp_basis,self.resourceID,'pagesHi')): |
|
|
|
|
|
pagesHi = os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pagesHi')) |
|
if path is None: |
return os.path.join(self.vlp_basis,self.resourceID,'pagesHi') |
return os.path.join(self.vlp_basis,self.resourceID,'pagesHi') |
|
|
|
pages = os.listdir(path) |
|
|
|
if len (pagesHi) > len(pages): |
|
|
|
countHi=0 |
|
for p in pagesHi: |
|
dat,ext = os.path.splitext(p) |
|
if ext.lower() in [".tiff",".tif",".jpg"]: |
|
countHi+=1 |
|
count=0 |
|
for p in pages: |
|
dat,ext = os.path.splitext(p) |
|
if ext.lower() in [".tiff",".tif",".jpg"]: |
|
count+=1 |
|
|
|
if countHi > count: |
|
path=os.path.join(self.vlp_basis,self.resourceID,'pagesHi') |
|
|
|
logging.error("pages < pagesHi: %s"%self.resourceID) |
|
if path is None: |
|
|
|
|
|
if len (os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pagesHi'))) > len(os.listdir(path)): |
|
|
|
|
|
|
|
path=os.path.join(self.vlp_basis,self.resourceID,'pagesHi') |
|
logging.error("pages < pagesHi: %s"%self.resourceID) |
else: |
else: |
return "<error>no images </error>" |
|
|
|
|
logging.error("no images: %s"%self.resourceID) |
|
return None |
|
|
|
return path |
|
|
|
|
def transcription(self): |
def transcription(self): |
Line 510 class VLP_resource(ECHO_resource,Cacheab
|
Line 924 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 528 class VLP_resource(ECHO_resource,Cacheab
|
Line 970 class VLP_resource(ECHO_resource,Cacheab
|
|
|
ret+="</text>" |
ret+="</text>" |
re2=ret[0:] |
re2=ret[0:] |
re3=re2.decode('latin-1').encode('utf-8') |
re3=self.unicodify(re2) |
#re3=re2 |
#re3=re2 |
ft=self.ZopeFind(self,obj_metatypes=['ECHO_fullText']) |
ft=self.ZopeFind(self,obj_metatypes=['ECHO_fullText']) |
|
|
Line 549 class VLP_resource(ECHO_resource,Cacheab
|
Line 991 class VLP_resource(ECHO_resource,Cacheab
|
else: |
else: |
return "no: %s"%self.getId() |
return "no: %s"%self.getId() |
|
|
|
def hasTranscription(self): |
|
"""transcription""" |
|
|
|
if not hasattr(self,'fulltext'): |
|
self.copyTranscriptionFromDB() |
|
if not hasattr(self,'fulltext'): #still not |
|
return False |
|
|
|
return True |
|
|
def resetMetaLink(self,all="no",RESPONSE=None): |
def resetMetaLink(self,all="no",RESPONSE=None): |
"""resets metalink to standard resp. in case of server change it sets to the new server url""" |
"""resets metalink to standard resp. in case of server change it sets to the new server url""" |
if all=="yes": |
if all=="yes": |
Line 564 class VLP_resource(ECHO_resource,Cacheab
|
Line 1016 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))) |
self.REQUEST.RESPONSE.redirect(self.REQUEST['URL']+"?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') |
|
|
if hasattr(self,'libraryTemplate.html'): |
return pt() |
return getattr(self,'libraryTemplate.html')() |
|
|
|
pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','library_template.zpt')).__of__(self) |
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" |
pt.content_type="text/html" |
return pt() |
return pt |
|
|
def index_html(self): |
def index_html(self): |
"""index_html""" |
"""index_html""" |
Line 602 class VLP_resource(ECHO_resource,Cacheab
|
Line 1069 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 |
|
|
|
def getPageSizeSum(self): |
|
"""generate average page size""" |
|
|
|
#size of hi resolution |
|
files=[] |
|
try: |
|
pathHi=os.path.join(self.vlp_basis,self.resourceID,'pages') |
|
files=os.listdir(pathHi) |
|
hi=0 |
|
for f in files: |
|
hi+=os.stat(os.path.join(pathHi,f))[ST_SIZE] |
|
|
|
except: |
|
hi=0 |
|
|
|
#size of hi resolution |
|
try: |
|
pathHi=os.path.join(self.vlp_basis,self.resourceID,'pagesLo') |
|
files=os.listdir(pathHi) |
|
lo=0 |
|
for f in files: |
|
lo+=os.stat(os.path.join(pathHi,f))[ST_SIZE] |
|
|
|
except: |
|
lo=0 |
|
|
|
|
|
return (hi,lo,len(files)) |
|
|
|
|
|
def getPageWeights(self): |
|
"""average Page sizes in kBytes""" |
|
|
|
res=getattr(self,'pageSizeSum',(0,0,1)) |
|
return (res[0]/(1024*res[2]),res[1]/(1024*res[2])) |
|
|
|
|
|
|
def dir2index(self): |
def dir2index(self): |
"""dir to index""" |
"""dir to index""" |
|
|
excludeNames=['Icon'] |
excludeNames=['Icon'] |
|
|
|
|
def calculateName(str): |
def calculateName(str): |
name=os.path.splitext(str[1:])[0] |
name=os.path.splitext(str[1:])[0] |
ret="%s: %s"%(str[0],name) |
ret="%s: %s"%(str[0],name) |
return ret |
return ret |
|
|
try: |
self.imagePathFull=self.getImagePath(); |
ret=os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pageimg')) |
self.imagePath=self.imagePathFull.split("/")[-1] |
self.imagePath='pageimg' |
if (self.imagePath is None): |
except: |
return None |
ret=os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pagesHi')) |
|
self.imagePath='pagesHi' |
|
temp=[] |
temp=[] |
|
ret = os.listdir(self.imagePathFull) |
|
|
ret.sort() |
ret.sort() |
for x in ret: |
for x in ret: |
if (not (x[0]==".")) and (not x[0:4] in excludeNames): |
if (not (x[0] in ('.',':'))) and (not x[0:4] in excludeNames): |
|
|
temp.append((calculateName(x),os.path.splitext(x)[0])) |
temp.append((calculateName(x),os.path.splitext(x)[0])) |
return temp |
return temp |
|
|
Line 648 class VLP_resource(ECHO_resource,Cacheab
|
Line 1164 class VLP_resource(ECHO_resource,Cacheab
|
def firstPage(self,url=None): |
def firstPage(self,url=None): |
"""showlink to the first image""" |
"""showlink to the first image""" |
if self.REQUEST.get('pn','1')=="1": #erste seinte dann kein a tag |
if self.REQUEST.get('pn','1')=="1": #erste seinte dann kein a tag |
return """<img src="../../images/first.gif" alt="first" width="14" height="14" border="0"><br>first""" |
return """<img src="/images/first.gif" alt="first" width="14" height="14" border="0"><br>first""" |
|
|
else: |
else: |
ws=self.REQUEST.get('ws','1') |
ws=self.REQUEST.get('ws','1') |
return """<a href=%s> |
return """<a href=%s> |
<img src="../../images/first.gif" alt="first" width="14" height="14" border="0"><br>first |
<img src="/images/first.gif" alt="first" width="14" height="14" border="0"><br>first |
</a> |
</a> |
"""%(self.REQUEST['URL']+"?pn=1&ws=%s"%ws) |
"""%(self.REQUEST['URL']+"?pn=1&ws=%s"%ws) |
|
|
Line 664 class VLP_resource(ECHO_resource,Cacheab
|
Line 1180 class VLP_resource(ECHO_resource,Cacheab
|
ln=len(pages) |
ln=len(pages) |
|
|
if (self.REQUEST.get('pn')==str(ln)) or (ln==1): #letzte seite dann kein a tag oder nur eine Seite |
if (self.REQUEST.get('pn')==str(ln)) or (ln==1): #letzte seite dann kein a tag oder nur eine Seite |
return """<img src="../../images/last.gif" alt="last" width="14" height="14" border="0"><br>last""" |
return """<img src="/images/last.gif" alt="last" width="14" height="14" border="0"><br>last""" |
|
|
else: |
else: |
ws=self.REQUEST.get('ws','1') |
ws=self.REQUEST.get('ws','1') |
return """<a href=%s> |
return """<a href=%s> |
<img src="../../images/last.gif" alt="last" width="14" height="14" border="0"><br>last |
<img src="/images/last.gif" alt="last" width="14" height="14" border="0"><br>last |
</a> |
</a> |
"""%(self.REQUEST['URL']+"?pn="+str(ln)+"&ws="+ws) |
"""%(self.REQUEST['URL']+"?pn="+str(ln)+"&ws="+ws) |
|
|
Line 679 class VLP_resource(ECHO_resource,Cacheab
|
Line 1195 class VLP_resource(ECHO_resource,Cacheab
|
|
|
nn = int(self.REQUEST.get('pn','1'))-1 |
nn = int(self.REQUEST.get('pn','1'))-1 |
if nn < 1: #letzte seite dann kein a tag |
if nn < 1: #letzte seite dann kein a tag |
return """<img src="../../images/lisePrev.gif" alt="prev" width="14" height="14" border="0"><br>prev""" |
return """<img src="/images/lisePrev.gif" alt="prev" width="14" height="14" border="0"><br>prev""" |
|
|
else: |
else: |
ws=self.REQUEST.get('ws','1') |
ws=self.REQUEST.get('ws','1') |
return """<a href=%s> |
return """<a href=%s> |
<img src="../../images/lisePrev.gif" alt="prev" width="14" height="14" border="0"><br>prev |
<img src="/images/lisePrev.gif" alt="prev" width="14" height="14" border="0"><br>prev |
</a> |
</a> |
"""%(self.REQUEST['URL']+"?pn="+str(nn)+"&ws="+ws) |
"""%(self.REQUEST['URL']+"?pn="+str(nn)+"&ws="+ws) |
|
|
Line 696 class VLP_resource(ECHO_resource,Cacheab
|
Line 1212 class VLP_resource(ECHO_resource,Cacheab
|
|
|
nn = int(self.REQUEST.get('pn','1'))+1 |
nn = int(self.REQUEST.get('pn','1'))+1 |
if (nn>int(ln)) or (ln==1): #letzte seite dann kein a tag |
if (nn>int(ln)) or (ln==1): #letzte seite dann kein a tag |
return """<img src="../../images/liseNext.gif" alt="next" width="14" height="14" border="0"><br>next""" |
return """<img src="/images/liseNext.gif" alt="next" width="14" height="14" border="0"><br>next""" |
|
|
else: |
else: |
ws=self.REQUEST.get('ws','1') |
ws=self.REQUEST.get('ws','1') |
return """<a href=%s> |
return """<a href=%s> |
<img src="../../images/liseNext.gif" alt="next" width="14" height="14" border="0"><br>next |
<img src="/images/liseNext.gif" alt="next" width="14" height="14" border="0"><br>next |
</a> |
</a> |
"""%(self.REQUEST['URL']+"?pn="+str(nn)+"&ws="+ws) |
"""%(self.REQUEST['URL']+"?pn="+str(nn)+"&ws="+ws) |
|
|
Line 709 class VLP_resource(ECHO_resource,Cacheab
|
Line 1225 class VLP_resource(ECHO_resource,Cacheab
|
def readIndexFile(self,url=None): |
def readIndexFile(self,url=None): |
"""reads the indexfile. presently url not None isn't implemented. In the future url can be defined.""" |
"""reads the indexfile. presently url not None isn't implemented. In the future url can be defined.""" |
if not url: |
if not url: |
url=self.absolute_url()+"/index.xml" |
urlTmp=self.absolute_url()+"/index.xml" |
|
|
if self.ZCacheable_isCachingEnabled(): |
if self.ZCacheable_isCachingEnabled(): |
|
|
result = self.ZCacheable_get(view_name=url) |
result = self.ZCacheable_get(view_name=urlTmp) |
if result is not None: |
if result is not None: |
# Got a cached value. |
# Got a cached value. |
return result |
return result |
|
|
pagelist=[] |
pagelist=[] |
|
|
fh=ECHO_helpers.urlopen(url) |
if not url: |
|
|
|
xmlTxt=getattr(self,'index.xml')() |
|
dom=xml.dom.minidom.parseString(xmlTxt) |
|
else: |
|
fh=ECHO_helpers.urlopen(urlTmp) |
dom=xml.dom.minidom.parse(fh) |
dom=xml.dom.minidom.parse(fh) |
|
|
|
|
Line 730 class VLP_resource(ECHO_resource,Cacheab
|
Line 1251 class VLP_resource(ECHO_resource,Cacheab
|
fileName=page.getAttribute('file') |
fileName=page.getAttribute('file') |
pagelist.append((pageNum,text,fileName)) |
pagelist.append((pageNum,text,fileName)) |
|
|
self.ZCacheable_set(pagelist,view_name=url) |
self.ZCacheable_set(pagelist,view_name=urlTmp) |
return pagelist |
return pagelist |
|
|
def getFileName(self): |
def getFileName(self): |
Line 742 class VLP_resource(ECHO_resource,Cacheab
|
Line 1263 class VLP_resource(ECHO_resource,Cacheab
|
pageinfo=self.readIndexFile()[pn-1] |
pageinfo=self.readIndexFile()[pn-1] |
return pageinfo[2] |
return pageinfo[2] |
|
|
def createIndexFile(self,RESPONSE=None): |
def createIndexFile(self,forceUpdate=False,RESPONSE=None): |
"""create index file""" |
"""create index file""" |
|
logging.debug("createindexfile of %s"%self.id) |
|
|
|
if hasattr(self,'index.xml'): |
|
# index exists |
|
zt=getattr(self,'index.xml') |
|
if not forceUpdate: |
|
# check if directory is newer (self.imagePath sould be set by now) |
|
path = self.getImagePath() |
|
if (path is None): |
|
return "CREATE INDEX FILE NOT POSSIBLE" |
|
imgdir = os.path.join(path) |
|
dirtime = os.path.getmtime(imgdir) |
|
zttime = zt.bobobase_modification_time() |
|
logging.debug("createindexfile: dir %s of %s index of %s"%(imgdir,dirtime,zttime)) |
|
if dirtime < zttime: |
|
# nothing to do |
|
logging.debug("createindexfile: dir %s older than index"%(imgdir)) |
|
return "index is up to date" |
|
|
pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','index_template.zpt')).__of__(self)() |
else: |
|
# create new index template |
|
|
|
|
if not hasattr(self,'index.xml'): |
|
zt=ZopePageTemplate('index.xml') |
zt=ZopePageTemplate('index.xml') |
self._setObject('index.xml',zt) |
self._setObject('index.xml',zt) |
else: |
|
zt=getattr(self,'index.xml') |
|
|
|
|
|
|
# fill index template |
|
pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','index_template.zpt')).__of__(self)() |
|
#logging.debug("createindexfile uses %s"%pt) |
zt.pt_edit(pt, 'text/xml') |
zt.pt_edit(pt, 'text/xml') |
|
transaction.get().commit() |
|
|
if RESPONSE is not None: |
if RESPONSE is not None: |
RESPONSE.redirect('manage_main') |
RESPONSE.redirect('manage_main') |