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)