.. turbasen.py documentation master file, created by
sphinx-quickstart on Fri Jan 29 07:26:30 2016.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
turbasen.py
=============================
Python client for `Nasjonal Turbase `_,
featuring:
- :ref:`Object model for all datatypes `
- :ref:`Container API on instances to access document fields (dict-like)
`
- :ref:`Exceptions abstract away HTTP status codes `
- :ref:`Automatic iteration over paginated list queries `
- :ref:`Handling partial documents returned from list queries
`
- :ref:`ETag handling with refresh on expiry `
- :ref:`Client caching `
- :ref:`Event triggers `
Installation
-----------------------------
.. code-block:: bash
pip install turbasen
.. _datatypes:
Datatypes
-----------------------------
.. py:class:: turbasen.Bilde
`Images `_
.. py:class:: turbasen.Gruppe
`Groups `_
.. py:class:: turbasen.Liste
`Lister `_
.. py:class:: turbasen.Område
`Areas `_
.. py:class:: turbasen.Sted
`Places `_
.. py:class:: turbasen.Tur
`Trips `_
Environment variables
-----------------------------
``API_KEY``
Your API key. Can also be specified via the ``API_KEY`` setting.
``ENDPOINT_URL``
API endpoint. See the ``ENDPOINT_URL`` setting.
.. _settings:
Settings
-----------------------------
``ENDPOINT_URL = https://api.nasjonalturbase.no``
API endpoint. Set to ``https://dev.nasjonalturbase.no`` for development.
``LIMIT = 20``
Documents returned per page. API hard max limit is currently 50. Note that
setting this to a low number when the use case is to retrieve all documents is
inefficient.
``CACHE = DummyCache()``
Can be set to a cache engine implementing a small subset of the Django cache
API to enable caching.
``CACHE_LOOKUP_PERIOD = 60 * 60 * 24``
Number of seconds a *list* cache is retained
``CACHE_GET_PERIOD = 60 * 60 * 24 * 30``
Number of seconds an *object* cache is retained. Note that *ETag* may be
checked and used to expire the cache if applicable, so this value should
normally be high.
``ETAG_CACHE_PERIOD = 60 * 60``
Number of seconds to ignore ``ETag`` checks and use local cache blindly.
``API_KEY = os.environ.get('API_KEY', '')``
Get your API key at
`Nasjonal Turbase Developer `_.
Example usage
-----------------------------
Initialization:
.. code-block:: python
import turbasen
turbasen.configure(LIMIT=3, ENDPOINT='https://dev.nasjonalturbase.no')
List documents, with some parameter filters:
.. code-block:: python
turbasen.Sted.list(pages=1, params={
'tilbyder': 'DNT',
'status': 'Offentlig',
'tags': 'Hytte',
})
# [,
# ,
# ]
Get single document:
.. code-block:: python
sted = turbasen.Sted.get('546b36a511f41a9c00c0d4d9')
#
sted['navn']
# En liten hytte
len(sted)
# 17
Create and delete document:
.. code-block:: python
sted = turbasen.Sted(
lisens='Privat',
status='Kladd',
navn='Testcabin',
beskrivelse='Testcabin',
tags=['Hytte'],
)
sted.save()
# API warning: {
# 'code': 'missing_field',
# 'field': 'navngiving',
# 'resource': 'Document'
# }
sted.delete()
API
-----------------------------
.. _static-methods:
Static methods
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. py:function:: list(pages=None, params=dict())
Return a list of documents. If ``pages`` is not ``None``, limits the results
to ``pages`` pages with ``LIMIT`` documents on each page.
Filter results with ``params``, or specify which ``fields`` should be
returned to increase performance, avoiding extra fetches for
:ref:`partial documents `. See
`the API documentation `_.
.. py:function:: get(object_id)
Retrieve a document of this datatype with the given object id.
.. _instance-methods:
Instance methods
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. py:function:: save()
Save this document. If the document doesn't have an ``_id`` field, it will be
assigned. Saving a :ref:`partial document ` will perform
a ``PATCH`` request, only overwriting fields that are defined locally.
.. py:function:: delete()
Delete this document. It must be saved (ie. have an ``_id`` field).
.. py:function:: get_field(key[, default])
See `dict.get `_
.. _document-fields:
Document fields
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Instances are
`collections `_, so document
fields are accessed as keys on a regular ``dict``. All
`dict methods `_ are
implemented, except for
`dict.get `_ which is
renamed to ``get_field``, see :ref:`instance methods `.
.. _exceptions:
Exceptions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. py:class:: turbasen.exceptions.DocumentNotFound
Thrown when a request references to a document with an object id that doesn't
exist.
.. py:class:: turbasen.exceptions.Unauthorized
Thrown when a request returns a HTTP 401 Unathorized or 403 Forbidden status
code.
.. py:class:: turbasen.exceptions.InvalidDocument
Thrown when updating or creating a document with invalid data.
.. py:class:: turbasen.exceptions.ServerError
Thrown when a request results in a 5xx server error response.
.. _partial-documents:
Partial documents
-----------------------------
Documents returned from calling ``list`` are not complete, but classified as
*partial*. When accessing a field on a partial document which does not exist,
a ``GET`` request is automatically performed under the hood to request the
entire document. If the accessed field now exists, it is returned as normal.
If you know you only need a few fields from a ``list`` call, it may be a good
idea to specify those in the params field like this:
``params={'fields': ['field1', 'field2']}`` to avoid performing a ``GET``
request for each of the documents in your list.
.. _events:
Events
-----------------------------
.. code-block:: python
def handle_get_request():
logger.debug("turbasen.py performed a GET request.")
turbasen.handle_event('api.get_object', handle_get_request)
``api.get_object``
GET request made for a single object
``api.get_objects``
GET request for a new page with list of objects - called once for each new
page
``api.post_object``
POST request made with a new object
``api.put_object``
PUT request made for an existing object
``api.delete_object``
DELETE request made for an existing object