Source code for dhlab.metadata.natbib

"""Tools for querying the Norwegian National Bibliography Marc 21"""
import os
from functools import wraps

import requests

from dhlab.constants import BASE_URL

# TODO: Add support for more fields


def _api_call_deco(service):
    """Decorator for calling a service from DH-lab API

    :param service: Name of service
    """

    def inner_decorator(func):
        """Inner decorator

        :param func: function to decorate. Must return params
        """

        @wraps(func)
        def wrapper(*args, **kwargs):
            params = func(*args, **kwargs)
            return requests.post(os.path.join(BASE_URL, service), json=params).json()

        return wrapper

    return inner_decorator


[docs] @_api_call_deco("metadata_query") def metadata_query(conditions, limit=5): """Query the Norwegian National Bibliography using Marc 21 fields and values Example: conditions = [ ["245", "a", "kongen"], ["008", "", "nno"] ] :param conditions: Marc 21 fields and values to search for :type conditions: list of lists :param limit: number of records to return, defaults to 5 :type limit: int, optional :return: list of urns :rtype: json """ params = {"conditions": conditions, "limit": limit} return params
[docs] @_api_call_deco("metadata_from_urn") def metadata_from_urn(urns, fields=None): """Gets MARC 21 json for a URN or list of URN :param urns: list of URNs :param fields: list of marc 21 fields to return :return: API call parameters """ params = {"urns": urns, "fields": fields} return params
## Utility
[docs] def pretty_print_marc21json(record): """Prints a record from the Norwegian National Bibliography in a readable format :param record: Marc 21 record in json format """ print("Record:") for field in record["fields"]: for key, val in field.items(): if "subfields" in val: print(key + ":") for subfield in val["subfields"]: for subfield_k, subfield_val in subfield.items(): print("\t" + subfield_k + ": " + subfield_val) else: print(key + ": " + val) print()