#!/usr/bin/env python3
# Author(s): Toni Sissala
# Copyright 2020 Finnish Social Science Data Archive FSD / University of Tampere
# Licensed under the EUPL. See LICENSE.txt for full license.
"""Build responses containing OSMH records.
"""
from functools import partial
[docs]class RecordsResponse:
"""Response containing records.
Provides methods that can be used as callbacks to
:obj:`kuha_common.query.QueryController`. Uses OSMH records
defined in :mod:`kuha_osmh_repo_handler.osmh.records`.
Stores these records for later processing.
"""
def __init__(self):
self.records = []
self.payloads = []
def _append_record(self, record_constructor, ds_payload):
if ds_payload:
self.records.append(record_constructor(ds_payload))
def _append_payload(self, record_constructor, ds_payload):
if ds_payload:
self.payloads.append(record_constructor(ds_payload).get_payload())
[docs] def iterate_records(self):
"""Iterate throught records gathered to response.
:returns: generator for iterating records.
"""
for _rec in self.records:
yield _rec
[docs] def get_record_appender(self, record_constructor):
"""Get record appender function.
Records that are appended are constructed by using the
record_constructor parameter.
:returns: callback function for appending records that get constructed by
submitting the receiver parameter to given record_constructor.
:rtype: :class:`functools.partial`
"""
return partial(self._append_record, record_constructor)
[docs] def get_payload_appender(self, record_constructor):
"""Get payload appender function.
Records that are appended are constructed by using the
record_constructor parameter. After constructing the record,
calls the constructed record-objects get_payload() method.
:returns: callback function for appending records that get constructed by
submitting the receiver parameter to given record_constructor.
:rtype: :class:`functools.partial`
"""
return partial(self._append_payload, record_constructor)
[docs] def get_response(self):
"""Build and return the response as a list of dictionary payloads.
:returns: record payloads
:rtype: list
"""
if self.records:
for rec in self.iterate_records():
self.payloads.append(rec.get_payload())
return self.payloads
[docs] def get_single_response(self):
"""Get single response payload.
:note: After calling this method the payloads list will be empty.
:returns: single record's payload.
:rtype: dict
:raises: :exc:`ValueError` if contained payloads list has more than a single cell.
"""
payloads = self.get_response()
lenght = len(self.payloads)
if lenght > 1:
# This is a coding error. One should call this method only when excepting a single record.
raise ValueError('Excpecting a single value, but payloads has multiple')
elif lenght < 1:
return {} # return dict so that it may be encoded to json
return payloads.pop()