Source code for ferrosoft.apps.emiflow.api.views.transport

#  Copyright (c) 2025 Ferrosoft GmbH. All rights reserved.
import logging

from rest_framework import status, viewsets
from rest_framework.response import Response

from ferrosoft.apps.emiflow.api.serializer.transport import (
    TransportChainSerializer,
    TCEPartialSerializer,
    EmissionBookingRecordSerializer,
)
from ferrosoft.apps.emiflow.models import TransportChain
from ferrosoft.apps.ferrobase.services.taskqueue import background_task_tenant


[docs] class TransportChainViewSet(viewsets.ViewSet):
[docs] def list(self, request): serializer = TransportChainSerializer( TransportChain.prefetched_objects.all(), many=True ) return Response(serializer.data)
[docs] def create(self, request): try: is_many = isinstance(request.data, list) serializer = TransportChainSerializer(data=request.data, many=is_many) if not serializer.is_valid(): return Response( {"errors": serializer.errors}, status=status.HTTP_400_BAD_REQUEST ) instances = serializer.save() responses = [] if isinstance(instances, list): for instance in instances: emissions = instance.post_emission() responses += EmissionBookingRecordSerializer( emissions, many=True ).data elif isinstance(instances, TransportChain): emissions = instances.post_emission() responses += EmissionBookingRecordSerializer(emissions, many=True).data return Response(responses, status=status.HTTP_201_CREATED) except Exception as e: logging.exception("failed creating transport chain") return Response( {"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR )
[docs] class TransportChainElementViewSet(viewsets.ViewSet):
[docs] def create(self, request): serializer = TCEPartialSerializer(data=request.data) if not serializer.is_valid(): return Response( {"errors": serializer.errors}, status=status.HTTP_400_BAD_REQUEST ) result = serializer.save() background_task_tenant( "ferrosoft.apps.emiflow.tasks.report_emission_to_foreign_system", str(result["chain_id"]), ) return Response(serializer.data, status=status.HTTP_201_CREATED)