Mercurial > hg > ZopePubmanConnector
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')