Source code for kuha_osmh_repo_handler.response

#!/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()