"""Handle dispatcher API requests.""" from __future__ import unicode_literals import logging import os import xmlrpclib from django.conf import settings from django.http import Http404 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import generics, status from dispatch.models import Dispatcher from dispatch.serializers import DispatchMessageSerializer, DispatcherSerializer log = logging.getLogger('dispatch.views') class DispatcherList(generics.ListAPIView): """List all dispatchers.""" queryset = Dispatcher.objects.all() serializer_class = DispatcherSerializer class DispatcherDetail(generics.RetrieveAPIView): """Detail the given dispatcher.""" queryset = Dispatcher.objects.all() serializer_class = DispatcherSerializer class DispatchMessage(APIView): """Send a message to the given dispatcher.""" queryset = Dispatcher.objects.none() def get_object(self, pk): try: return Dispatcher.objects.get(pk=pk) except Dispatcher.DoesNotExist: raise Http404 def get(self, request, pk, format=None): dispatcher = self.get_object(pk) return Response({'message': ""}) def post(self, request, pk, format=None): dispatcher = self.get_object(pk) serializer = DispatchMessageSerializer(data=request.data) if serializer.is_valid(): if dispatcher.type == Dispatcher.PRIVMSG_TYPE: bot_url = 'http://{0:s}:{1:d}/'.format(settings.IRCBOT_XMLRPC_HOST, settings.IRCBOT_XMLRPC_PORT) bot = xmlrpclib.ServerProxy(bot_url) log.debug("sending '%s' to channel %s", serializer.data['message'], dispatcher.destination) bot.privmsg(dispatcher.destination, serializer.data['message']) return Response({'status': "OK"}) elif dispatcher.type == Dispatcher.FILE_TYPE: filename = os.path.abspath(dispatcher.destination) log.debug("sending '%s' to file %s", serializer.data['message'], filename) with open(filename, 'w') as f: f.write(serializer.data['message']) f.write('\n') return Response({'status': "OK"}) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)