view zopePubmanConnector.py @ 3:602b6e46b176

error handling bei falscher suche
author dwinter
date Tue, 30 Apr 2013 18:34:18 +0200
parents 9dbb9354abbe
children f845502cf73a
line wrap: on
line source

# -*- coding: utf-8 -*-

#Verbindet Zope mit pubman. 


from OFS.SimpleItem import SimpleItem
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
import os.path

from Globals import package_home
import httplib2
import urlparse
import urllib
import re
import xml.etree.ElementTree as ET
import json
import logging

def zptFile(self, path, orphaned=False):
    """returns a page template file from the product"""
    if orphaned:
        # unusual case
        pt=PageTemplateFile(os.path.join(package_home(globals()), path))
    else:
      
            pt=PageTemplateFile(os.path.join(package_home(globals()), path)).__of__(self)
    return pt

class ZopePubmanConnector(SimpleItem):
    
    
    connectorString="http://pubman.mpiwg-berlin.mpg.de/search/SearchAndExport?"
    
    
    meta_type="ZopePubmanConnector"
   
    manage_options= ({'label':'Main Config','action': 'changeMain'},) + SimpleItem.manage_options
    
    def __init__(self,id,title,pubmanURL):
        self.id=id 
        self.title=title
        self.pubmanURL=pubmanURL #URL einer pubman instance bzw. einer collection, falls nicht die default collection benutzt werden soll
        
    

    def changeMain(self,pubmanURL=None,title=None,REQUEST=None,RESPONSE=None):
        """change main settings"""
        if pubmanURL:
            self.pubmanURL=pubmanURL
            self.title=title  
            
            if RESPONSE is not None:
                RESPONSE.redirect('manage_main')
     
     
        else:
            pt=zptFile(self, 'zpt/ChangeZopePubmanConnector.zpt')
            return pt()
        
        
    def getPublications(self,personID,limit=None,publicationType=None):
        """get all publications der personID"""
        h = httplib2.Http()
        
        
        
        if publicationType is None:
            cn = self.connectorString+"cqlQuery=escidoc.any-identifier=%22"+personID+"%22&"
        else:
            cn = self.connectorString+"cqlQuery=escidoc.any-identifier=%22"+personID+"%22"
            cn +="%20and%20escidoc.publication.type=%22"+publicationType+"%22&"
        
        cn +="exportFormat=APA&outputFormat=snippet&language=all&sortKeys=escidoc.any-dates&sortOrder=descending"
        if limit:
            cn+="&maximumRecords=%s"%limit
  
        logging.debug(cn)
        resp, content = h.request(cn)
    
       
    
        ET.register_namespace("dcterms", "http://purl.org/dc/terms/")

        root = ET.fromstring(content)
        
        #<escidocItem:item objid="escidoc:630782" 
        
        citationxpath=".//{http://purl.org/dc/terms/}bibliographicCitation"
        
        objxpath=".//{http://www.escidoc.de/schemas/item/0.8}item"
        citations=root.findall(objxpath)
        
        ret=[]
        for citation in citations:
            objId = citation.get('objid')
            
            text = citation.find(citationxpath)
            
            ret.append((objId,text.text))

        
        
        return ret
    
    
    def search(self,values,exact=False):
        
        """search pubman
        @values map mit field->value
        @return map mit escidocId -> XML-formatted snippeds
        """
        
        fieldToEscidoc={"title":"escidoc.any-title",
                        "author":"escidoc.publication.any.publication-creator-names",
                        "any":"escidoc.any-metadata"}
        
             
        cn = self.connectorString+"cqlQuery=%s&"
        cn +="exportFormat=APA&outputFormat=snippet&language=all&sortKeys=escidoc.any-dates&sortOrder=descending"
        
       
       
        querys = []
        for field in values.keys():
        
            searchField = fieldToEscidoc.get(field,None)
            if searchField is None:
                logging.debug("search, don't know field: %s"%field)
                continue
            
            
            value = values[field]
            
            if value == '':
                continue
            logging.debug("%s=%s"%(field,value))
            if not exact:
                value=value+"*"
   
        
            querys.append("%s=%%22%s%%22"%(searchField,value))
        
        
        query=" AND ".join(querys)
        h = httplib2.Http()
       
        logging.debug(cn%query)
        resp, content = h.request(cn%query)
       
        ET.register_namespace("dcterms", "http://purl.org/dc/terms/")
        
        try:
            root = ET.fromstring(content)
        except:
            logging.error("Couldn't parse content of:%s"%(cn%query))
            return {}
        #<escidocItem:item objid="escidoc:630782" 
        
        citationxpath=".//{http://purl.org/dc/terms/}bibliographicCitation"
        
        objxpath=".//{http://www.escidoc.de/schemas/item/0.8}item"
        citations=root.findall(objxpath)
        
        ret={}
        for citation in citations:
            objId = citation.get('objid')
            
            text = citation.find(citationxpath)
            
            ret[objId]=text.text

        
        
        return ret
        
         
        
    def getEntryFromPubman(self,escidocid):
        escidocid=escidocid.lstrip().strip()
        h = httplib2.Http()
        cn = self.connectorString+"cqlQuery=escidoc.objid=%s&"
        cn +="exportFormat=APA&outputFormat=snippet&language=all&sortKeys=escidoc.any-dates&sortOrder=descending"
      
        resp, content = h.request(cn%escidocid)
        ET.register_namespace("dcterms", "http://purl.org/dc/terms/")
        logging.debug(cn%escidocid)
        
        root = ET.fromstring(content)
        
        
        citationxpath=".//{http://purl.org/dc/terms/}bibliographicCitation"
        
        citation=root.find(citationxpath)
        
        if citation is not None:

            return citation.text
    
        return ""
        
    def pubmanConnectorURL(self):
        return self.connectorString
        
def manage_addZopePubmanConnectorForm(self):
        """Form for external Links"""
        pt=zptFile(self, 'zpt/AddZopePubmanConnector.zpt')
        return pt()


def manage_addZopePubmanConnector(self,id,title,pubmanURL,RESPONSE=None):
    """Add an external Link"""

    newObj=ZopePubmanConnector(id,title,pubmanURL)

    self._setObject(id,newObj)
    
  
    if RESPONSE is not None:
        RESPONSE.redirect('manage_main')