def do_post()

in gnm_deliverables/views/metadata_views.py [0:0]


    def do_post(self, request, project_id:int, platform:str, asset_id:int):
        from gnm_deliverables.signals import MessageRelay
        try:
            asset:DeliverableAsset = DeliverableAsset.objects.get(pk=asset_id)
        except DeliverableAsset.DoesNotExist:
            return Response({"status":"error","details":"Asset not found"}, status=404)

        try:
            relay = MessageRelay()
        except Exception as e:
            logger.error("Could not initialise message relay: {0}".format(e))
            return Response({"status":"error","details": "could not initialise message relay"}, status=500)

        routes_map:dict = getattr(settings, "CDS_ROUTE_MAP")
        if routes_map is None:
            logger.error("Could not find CDS_ROUTE_MAP in the configuration")
            return Response({"status":"config_error","details": "CDS_ROUTE_MAP not in configuration"}, status=500)

        platform_name = platform.lower()
        route_name = routes_map.get(platform_name)
        if route_name is None:
            logger.error("Platform {0} was not recognised. CDS_ROUTE_MAP has {1}".format(platform_name, routes_map))
            return Response({"status":"bad_request","detail": "Platform name not recognised"}, status=400)

        routing_key = "deliverables.syndication.{0}.upload".format(platform_name)

        message_content = {
            "inmeta": inmeta_to_string(asset, platform_name),
            "deliverable_asset": asset.pk,
            "deliverable_bundle": asset.deliverable.pk,
            "filename": os.path.basename(asset.filename),
            "online_id": asset.online_item_id,
            "nearline_id": asset.nearline_item_id,
            "archive_id": asset.archive_item_id,
            "routename": route_name
        }
        try:
            encoded_payload = json.dumps(message_content).encode("UTF-8")
        except Exception as e:
            logger.error("Could not encode the message content payload: {0}".format(str(e)))
            logger.error("Offending content was {0}".format(message_content))
            return Response({"status":"error","detail":str(e)})

        try:
            relay.send_content(routing_key, encoded_payload)
            self.make_sent_note(platform, request.user.username, asset)
            return Response({"status":"ok","routing_key":routing_key})
        except Exception as e:
            logger.error("Could not send message to {0}: {1}".format(routing_key, str(e)))
            return Response({"status":"error","detail": "Could not send message to broker"}, status=500)