File:  [Repository] / ECHO_content / VLPExtension.py
Revision 1.21: download - view: text, annotated - select for diffs - revision graph
Tue Aug 17 15:58:56 2004 UTC (19 years, 9 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
changed urllib.urlopen to timeout version in VLP

    1: from Products.ECHO_content.ECHO_collection import *
    2: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    3: from Products.PageTemplates.PageTemplate import PageTemplate
    4: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
    5: 
    6: try:
    7: 	from Products.zogiLib import zogiLib
    8: except:
    9: 	print "Zogilib not installed, VLP_resource will not work"
   10: 
   11: import xml.dom.minidom
   12: import urllib
   13: import xmlrpclib
   14: 
   15: 
   16: 
   17: 
   18: def lemmatize(str):
   19: 	"""takes a str and addes links the dictionary service"""
   20: 	server = xmlrpclib.ServerProxy("http://archimedes.fas.harvard.edu/cgi-bin/donatus-rpc")
   21: 	if server:
   22: 		splitted=str.split(" ")
   23: 		wordlist=["<w>%s</w>"%split for split in splitted].join()
   24: 	return wordlist
   25: 
   26: 		
   27: 
   28: 		
   29: def makeXML(str):
   30: 	    try:
   31: 		    dom=xml.dom.minidom.parseString(str)
   32: 		    return str
   33: 	    except:
   34: 		    
   35: 		    return """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><page>
   36: 		              %s
   37: 			      </page>"""%str
   38: 	    
   39: 	    
   40: def getText(nodelist):
   41: 
   42:     rc = ""
   43:     for node in nodelist:
   44:     	if node.nodeType == node.TEXT_NODE:
   45:            rc = rc + node.data
   46:     return rc
   47: 
   48: class VLP_essay(Folder):
   49:     """classe für VLP essays"""
   50: 
   51:     meta_type="VLP_essay"
   52: 
   53:     manage_options = Folder.manage_options+(
   54: 		{'label':'Main Config','action':'ConfigVLP_essayForm'},
   55: 		{'label':'Generate Essay Template','action':'generateEssayTemplateHTML'},
   56:                 )
   57: 
   58:     def content_html(self,type='collection'):
   59:         """template fuer content"""
   60:         #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
   61:         #
   62:         #if templates:
   63:         #    return templates[0][1]()
   64: 	
   65:         if hasattr(self,type+"_template"):
   66:             obj=getattr(self,type+"_template")
   67:             return obj()
   68:         else:
   69:             pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
   70:             pt.content_type="text/html"
   71:             return pt()
   72: 
   73:     def ConfigVLP_essayForm(self):
   74:         """Form for adding"""
   75:         pt=PageTemplateFile('Products/ECHO_content/vlp/ChangeVLP_essay.zpt').__of__(self)
   76:         return pt()
   77: 
   78:     def ChangeVLP_essay(self,title,label,description,RESPONSE=None):
   79:         """Change vlp_essay"""
   80:         self.title=title
   81:         self.label=label
   82:         self.description=description
   83: 
   84:         if RESPONSE is not None:
   85:             RESPONSE.redirect('manage_main')
   86: 
   87:     def __init__(self,id,title,label):
   88:         """init"""
   89:         self.id=id
   90:         self.title=title
   91:         self.label=label
   92: 
   93:     def index_html(self):
   94: 	
   95: 	    """show the rendered file"""
   96: 	    
   97: 	    if hasattr(self,'essayTemplate.html'):
   98: 			return getattr(self,'essayTemplate.html')()
   99: 
  100: 	    pt=PageTemplateFile('Products/ECHO_content/vlp/essay_template.zpt').__of__(self)
  101: 	    pt.content_type="text/html"
  102: 	    return pt()
  103: 
  104:     def generateEssayTemplateHTML(self,RESPONSE=None):
  105:         """lege standard index.html an"""
  106: 
  107: 	if not hasattr(self,'essayTemplate.html'):
  108:             zt=ZopePageTemplate('essayTemplate.html')
  109:             self._setObject('essayTemplate.html',zt)
  110:             default_content_fn = os.path.join(package_home(globals()),
  111:                                                'vlp/essay_template.zpt')
  112:             text = open(default_content_fn).read()
  113:             zt.pt_edit(text, 'text/html')
  114: 
  115:         else:
  116:             return "already exists!"
  117:         
  118:         if RESPONSE is not None:
  119:             RESPONSE.redirect('manage_main')
  120: 
  121: 
  122:     def getPage(self,pagenum):
  123:         """gibt essay page mit num aus"""
  124:         def sortFind(x,y):
  125:             return cmp(x[0],y[0])
  126:         pages=[]
  127:         pagestmp=self.ZopeFind(self,obj_metatypes=['DTML Document','File'])
  128: 	for page in pagestmp:
  129: 		if not (page[1].getId()[0]=="."):
  130: 			pages.append(page)
  131: 			
  132:         pages.sort(sortFind)
  133:         #print str(pages[int(pagenum)][1]())
  134:         if pages[int(pagenum)-1][1].meta_type=='File':
  135: 		#return makeXML(str(pages[int(pagenum)-1][1]))
  136: 		print "A"
  137: 		return self.xml2html(makeXML(str(pages[int(pagenum)-1][1])),quote="no")
  138:         else:
  139: 		print "B"
  140: 		#return makeXML(str(pages[int(pagenum)-1][1]))
  141: 		return self.xml2html(makeXML(pages[int(pagenum)-1][1]()),quote="no")
  142:         
  143:     def nextPage(self,pagenum,url):
  144:         pages=len(self.ZopeFind(self,obj_metatypes=['DTML Document','File'])) # teste ob performance ok, sonst in variable
  145:         if int(pagenum)+1 <= pages:
  146:             retstr=url+"?p="+str(int(pagenum)+1)
  147:             return """<td align="right" <a href="%s">next</a></td>"""%retstr
  148:         
  149:     def previousPage(self,pagenum,url):
  150:         
  151:         if int(pagenum)-1 > 0:
  152:             retstr=url+"?p="+str(int(pagenum)-1)
  153:             return """<td align="left" <a href="%s">previous</a></td>"""%retstr
  154:         
  155:     def nextURL(self,pagenum,url):
  156:         pages=len(self.ZopeFind(self,obj_metatypes=['DTML Document','File'])) # teste ob performance ok, sonst in variable
  157:         if int(pagenum)+1 <= pages:
  158:             retstr=url+"?p="+str(int(pagenum)+1)
  159:             return retstr
  160:         
  161:     def previousURL(self,pagenum,url):
  162:         
  163:         if int(pagenum)-1 > 0:
  164:             retstr=url+"?p="+str(int(pagenum)-1)
  165:             return retstr
  166:         
  167:         
  168: def manage_addVLP_essayForm(self):
  169:     """Form for adding"""
  170:     pt=PageTemplateFile('Products/ECHO_content/vlp/AddVLP_essay.zpt').__of__(self)
  171:     return pt()
  172: 
  173: def manage_addVLP_essay(self, id,title,label,RESPONSE=None):
  174: 	"""add the copyright"""
  175: 
  176: 	
  177: 	self._setObject(id, VLP_essay(id, title,label))
  178: 
  179: 	if RESPONSE is not None:
  180: 		RESPONSE.redirect('manage_main')
  181: 	
  182: 
  183: 
  184: class VLP_collection(ECHO_collection):
  185:     """VLP spezifische Erweiterung der Collection"""
  186: 
  187:     meta_type="VLP_collection"
  188:     manage_options=ECHO_collection.manage_options+(
  189:         {'label':'Change Path','action':'VLP_path_configForm'},
  190:         {'label':'Update Library','action':'updateCollection'},
  191:         {'label':'Update Metadata','action':'updateCollectionMD'},
  192:         )
  193: 
  194:     def VLP_path_configForm(self):
  195:         """change pt"""
  196:         path=PageTemplateFile('Products/ECHO_content/vlp/ChangeVLPPath.zpt').__of__(self)
  197:         return pt()
  198: 
  199:     def VLP_path_config(self,path,RESPONSE=None):
  200:         """config"""
  201:         self.path=path
  202:         if RESPONSE is not None:
  203:             RESPONSE.redirect('manage_main')
  204: 
  205:     def updateCollection(self,RESPONSE=None):
  206:         """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner"""
  207:         files=os.listdir(self.path)
  208:         for fileName in files:
  209:             
  210:             if fileName[0:3]=="lit":
  211:                 
  212:                 metalink=self.REQUEST['URL1']+"/"+fileName+"/index_meta"
  213:                 newObj=VLP_resource(fileName,'',metalink,fileName,fileName,fileName,'generated','book','','','','','','')
  214:                 self._setObject(fileName,newObj)
  215:                 
  216:                 genObj=getattr(self,fileName)
  217:                 genObj.createIndexFile()
  218:                 
  219:                 
  220:         if RESPONSE is not None:
  221:             RESPONSE.redirect('manage_main')
  222: 
  223:     def updateCollectionMD(self,RESPONSE=None):
  224:         """updateMD"""
  225:         files=os.listdir(self.path)
  226:         for fileName in files:
  227:             if fileName[0:3]=="lit":
  228:                 genObj=getattr(self,fileName)
  229:                 genObj.copyIndex_meta2echo_resource()
  230:                 genObj.generate_title()
  231: 
  232:         if RESPONSE is not None:
  233:             RESPONSE.redirect('manage_main')
  234: 
  235:     def copyFullTextsFromDB(self,RESPONSE=None):
  236: 	    """copy fulltext aus DB"""
  237: 
  238: 	    ress=self.ZopeFind(self,obj_metatypes=['VLP_resource'])
  239: 	    ret=""
  240: 	    for res in ress:
  241: 		    tmp=res[1].copyTranscriptionFromDB()
  242: 		    ret+=tmp
  243: 
  244: 		    if RESPONSE:
  245: 			    RESPONSE.write(tmp+"\n")
  246: 	    if not RESPONSE:		    
  247: 		    return ret
  248: 	    else:
  249: 		    RESPONSE.write("END\n")
  250: 		    
  251: 	    
  252: def manage_addVLP_collectionForm(self):
  253:         """Form for adding a ressource"""
  254:         pt=PageTemplateFile('Products/ECHO_content/vlp/AddVLP_collectionForm.zpt').__of__(self)
  255:         return pt()
  256: 
  257: 
  258: 
  259: def manage_addVLP_collection(self,id,title,label,description,contentType,responsible,weight,sortfield,path,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour=""):
  260:     """add a echo collection"""
  261:     
  262: 
  263:     newObj=VLP_collection(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
  264: 
  265:     self._setObject(id,newObj)
  266:     setattr(newObj,'path',path)
  267: 
  268:     if RESPONSE is not None:
  269:         RESPONSE.redirect('manage_main')
  270: 
  271: 
  272: 
  273: class VLP_resource(ECHO_resource):
  274:     """VLP spezifische Erweiterung"""
  275: 
  276:     meta_type="VLP_resource"
  277: 
  278:     vlp_basis="/mpiwg/online/permanent/vlp"
  279: 
  280:     
  281:     referencetypes=[]
  282: 
  283:     manage_options=ECHO_resource.manage_options+(
  284:         {'label':'Update Index','action':'createIndexFile'},
  285:         {'label':'Reset MetaLink','action':'resetMetaLink'},
  286:         {'label':'Generate Title','action':'generate_title'},
  287: 	{'label':'Generate Library Template','action':'generateLibraryTemplateHTML'},
  288:         )
  289: 
  290:     
  291:     def transcription(self):
  292: 	    """show the rendered transcriptiofile"""
  293: 	    
  294: 	    if hasattr(self,'libraryTranscriptionTemplate.html'):
  295: 			return getattr(self,'libraryTranscriptionTemplate.html')()
  296: 
  297: 	    pt=PageTemplateFile('Products/ECHO_content/vlp/library_transcriptionTemplate.zpt').__of__(self)
  298: 	    pt.content_type="text/html"
  299: 	    return pt()
  300: 
  301: 
  302: 
  303:     def copyTranscriptionFromDB(self):
  304: 	    """checks if transcription exits in DB"""
  305: 	    founds=self.search(var='select * from vl_transcript where source=\''+self.resourceID+'\' order by id')
  306: 
  307: 	    
  308: 	    ret="""<?xml version="1.0" encoding="utf-8"?>
  309:                <text>"""
  310:         
  311: 	    if founds:
  312: 		    
  313: 		    for found in founds:
  314: 			    text=found.transcript
  315: 			    if not text: text=""
  316: 			    ret+="<page><pb/>"+text+"</page>"
  317: 
  318: 		    ret+="</text>"
  319: 		    re2=ret[0:]
  320: 		    re3=re2.decode('latin-1')
  321: 		    
  322: 		    ft=self.ZopeFind(self,obj_metatypes=['ECHO_fullText'])
  323: 		    
  324: 		    if ft:
  325: 			
  326: 			    ft[0][1].pt_edit(re3.encode('utf-8','ignore'),'text/xml')
  327: 			
  328: 		    else:
  329: 			    self._setObject('fulltext',ECHO_fullText(id,re3))
  330: 			
  331: 		    return "FT: %s"%self.getId()
  332: 	    else:
  333: 		    return "no: %s"%self.getId()
  334: 	    
  335:     def resetMetaLink(self,all="no",RESPONSE=None):
  336:         """resets metalink to standard resp. in case of server change it sets to the new server url"""
  337:         if all=="yes":
  338:             self.metalink=self.absolute_url()+"/index_meta"
  339:         else:
  340:             splitted=self.metalink.split("/")
  341:             if (len(splitted)>1) and (splitted[len(splitted)-1]=="index_meta") and (splitted[len(splitted)-2]==self.getId()): # heuristic nur generische Metadatafiles andern
  342:                 self.metalink=self.absolute_url()+"/index_meta"
  343: 
  344:         if RESPONSE:
  345:             return "done"
  346:             
  347:     def show(self):
  348:         """show the rendered file"""
  349: 
  350:         if self.REQUEST.get('p',None):
  351:             self.REQUEST.set('pn',self.file2page(self.REQUEST.get('p',None)))
  352:            
  353: 	if hasattr(self,'libraryTemplate.html'):
  354: 		return getattr(self,'libraryTemplate.html')()
  355: 	
  356:         pt=PageTemplateFile('Products/ECHO_content/vlp/library_template.zpt').__of__(self)
  357:         pt.content_type="text/html"
  358:         return pt()
  359:     
  360:     index_html=show
  361: 
  362:     def generateLibraryTemplateHTML(self,RESPONSE=None):
  363:         """lege standard index.html an"""
  364: 
  365: 	if not hasattr(self,'libraryTemplate.html'):
  366:             zt=ZopePageTemplate('libraryTemplate.html')
  367:             self._setObject('libraryTemplate.html',zt)
  368:             default_content_fn = os.path.join(package_home(globals()),
  369:                                                'vlp/library_template.zpt')
  370:             text = open(default_content_fn).read()
  371:             zt.pt_edit(text, 'text/html')
  372: 
  373:         else:
  374:             return "already exists!"
  375:         
  376:         if RESPONSE is not None:
  377:             RESPONSE.redirect('manage_main')
  378: 
  379: 
  380:     def index_meta(self):
  381:         """index_meta"""
  382:         
  383:         pt=PageTemplateFile('Products/ECHO_content/vlp/index_meta.zpt').__of__(self)
  384:         pt.content_type="text/html"
  385:         return pt()
  386: 
  387:     def file2page(self,p):
  388:         """converts filename to pagenumber"""
  389:         dom=xml.dom.minidom.parse(ECHO_helpers.urlopen(getattr(self,'index.xml').absolute_url()))
  390:         
  391:         for page in dom.getElementsByTagName('page'):
  392:             if page.getAttribute('file')==p:
  393:                 return page.getAttribute('nr')
  394:             
  395:         return 0
  396:     
  397:     def dir2index(self):
  398:         """dir to index"""
  399: 
  400:         def calculateName(str):
  401:             ret="%s: %s"%(str[0],str[1:5])
  402:             return ret
  403: 
  404:         try:
  405:             ret=os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pageimg'))
  406:             self.imagePath='pageimg'
  407:         except:
  408:             ret=os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pagesHi'))
  409:             self.imagePath='pagesHi'
  410:         temp=[]
  411:         for x in ret:
  412:             if not (x[0]=="."):
  413:                 
  414:                 temp.append((calculateName(x),os.path.splitext(x)[0]))
  415:         return temp
  416: 
  417:     
  418:     def firstPage(self,url=None):
  419:         """showlink to the first image"""
  420:         if self.REQUEST.get('pn')=="1": #erste seinte dann kein a tag
  421:             return """<img src="../../images/first.gif" alt="first" width="14" height="14" border="0"><br>first"""
  422: 
  423:         else:
  424:             return """<a href=%s>
  425:                          <img src="../../images/first.gif" alt="first" width="14" height="14" border="0"><br>first
  426:                          </a>
  427:                          """%(self.REQUEST['URL']+"?pn=1")
  428: 
  429:     def lastPage(self,url=None):
  430:         """showlink to the first image"""
  431:         pages=self.readIndexFile(url)
  432:         if pages:
  433:             ln=len(pages)
  434:         
  435:         if self.REQUEST.get('pn')==str(ln): #letzte seite dann kein a tag
  436:             return """<img src="../../images/last.gif" alt="last" width="14" height="14" border="0"><br>last"""
  437: 
  438:         else:
  439:             return """<a href=%s>
  440:                          <img src="../../images/last.gif" alt="last" width="14" height="14" border="0"><br>last
  441:                          </a>
  442:                          """%(self.REQUEST['URL']+"?pn="+str(ln))
  443:             
  444:     def prevPage(self,url=None):
  445:         """showlink to the first image"""
  446:         
  447: 
  448:         nn = int(self.REQUEST.get('pn','1'))-1
  449:         if nn < 1: #letzte  seite dann kein a tag
  450:             return """<img src="../../images/prev.gif" alt="prev" width="14" height="14" border="0"><br>prev"""
  451: 
  452:         else:
  453:             return """<a href=%s>
  454:                          <img src="../../images/prev.gif" alt="prev" width="14" height="14" border="0"><br>prev
  455:                          </a>
  456:                          """%(self.REQUEST['URL']+"?pn="+str(nn))
  457: 
  458:     def nextPage(self,url=None):
  459:         """showlink to the first image"""
  460:         pages=self.readIndexFile(url)
  461:         if pages:
  462:             ln=len(pages)
  463: 
  464:         nn = int(self.REQUEST.get('pn','1'))+1
  465:         if nn>int(ln): #letzte  seite dann kein a tag
  466:             return """<img src="../../images/next.gif" alt="next" width="14" height="14" border="0"><br>next"""
  467: 
  468:         else:
  469:             return """<a href=%s>
  470:                          <img src="../../images/next.gif" alt="next" width="14" height="14" border="0"><br>next
  471:                          </a>
  472:                          """%(self.REQUEST['URL']+"?pn="+str(nn))
  473:         
  474:     
  475:     def readIndexFile(self,url=None):
  476:         """reads the indexfile. presently url not None isn't implemented. In the future url can be defined."""
  477:         pagelist=[]
  478:         if not url:
  479:             url=self.absolute_url()+"/index.xml"
  480: 
  481:         fh=ECHO_helpers.urlopen(url)
  482:         dom=xml.dom.minidom.parse(fh)
  483:         
  484:         
  485:         for page in dom.getElementsByTagName('page'):
  486:             text=getText(page.childNodes)
  487:             pageNum=page.getAttribute('nr')
  488:             pagelist.append((pageNum,text))
  489: 
  490:         return pagelist
  491:     
  492:     def createIndexFile(self,RESPONSE=None):
  493:         """create index file"""
  494: 
  495:         
  496:         pt=PageTemplateFile('Products/ECHO_content/vlp/index_template.zpt').__of__(self)()
  497: 
  498: 
  499:         
  500:         if not hasattr(self,'index.xml'):
  501:             zt=ZopePageTemplate('index.xml')
  502:             self._setObject('index.xml',zt)
  503:         else:
  504:             zt=getattr(self,'index.xml')
  505:             
  506:             
  507:         zt.pt_edit(pt, 'text/xml')
  508: 
  509:         if RESPONSE is not None:
  510:             RESPONSE.redirect('manage_main')
  511: 
  512:         
  513: def manage_addVLP_resourceForm(self):
  514:         """Form for adding a ressource"""
  515:         pt=PageTemplateFile('Products/ECHO_content/vlp/AddVLP_resourceForm.zpt').__of__(self)
  516:         return pt()
  517: 
  518: 
  519: 
  520: def manage_addVLP_resource(self,id,title,label,description,responsible,link,metalink,weight,resourceID=None,contentType=None,renderingType=None,credits=None,coords=None,RESPONSE=None):
  521:     """addaresource"""
  522: 
  523:     
  524:     if metalink=='':
  525:         metalink=self.absolute_url()+"/"+id+"/index_meta"
  526:             
  527:     newObj=VLP_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,responsible,credits,weight,coords)
  528: 
  529:     self._setObject(id,newObj)
  530: 
  531:     if RESPONSE is not None:
  532:         RESPONSE.redirect('manage_main')
  533:  

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>