Source code for api.datamodel

"""
This module contains helper functions to serialize Blast data into a flat
science payload to be delivered by the Blast web API.
"""
import itertools
from dataclasses import dataclass
from typing import List

import django
from host import models
from rest_framework import serializers


[docs] @dataclass class DataModelComponent: """ A dataclass to store all information on how to serialise a Blast model into the Blast science payload. Attributes: prefix (str): What will be appended to the column name in the Blast science payload query (dict): A django query that will uniquely identify the data for the Blast science payload model (django.db.models.Model): The Blast model that the query will be passed to serializer (rest_framework.serializers.Serializer) The serializer associated with the model """ prefix: str query: dict model: django.db.models.Model serializer: serializers.Serializer
[docs] def serialize_blast_science_data(datamodel: List[DataModelComponent]) -> dict: """ Serializes all data associated with a transient into a flat structure. parameters: datamodel: (List[DataModelComponent]): datamodel to be serialized. returns: science_payload: Flat dictionary containing science data fields and values. """ science_payload = {} for component in datamodel: prefix, serializer = component.prefix, component.serializer try: object = component.model.objects.get(**component.query) object_data = serializer(object).data object_dict = {prefix + name: value for name, value in object_data.items()} except: object_dict = {prefix + name: None for name in serializer().fields} science_payload = {**science_payload, **object_dict} return science_payload
[docs] def unpack_component_groups( component_groups: List[List[DataModelComponent]], ) -> List[DataModelComponent]: """ Unpacks list of datamodel component groups into a flat structure parameters: component_groups (List[List[DataModelComponent]]): list of groups to be unpacked returns: flat_components (List[DataModelComponent]): flattened list of components """ return list(itertools.chain(*component_groups))