"""Handle dispatcher API requests.""" from __future__ import unicode_literals import copy import logging import os import xmlrpclib from django.conf import settings from django.http import Http404 from django.shortcuts import get_object_or_404 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(generics.GenericAPIView): """Send a message to the given dispatcher.""" queryset = Dispatcher.objects.all() serializer_class = DispatchMessageSerializer def get_object(self): queryset = self.get_queryset() queryset = self.filter_queryset(queryset) return get_object_or_404(queryset) def get(self, request, *args, **kwargs): dispatcher = self.get_object() data = {'status': "READY"} message = self.serializer_class(data=data) return Response(message.initial_data) def post(self, request, *args, **kwargs): dispatcher = self.get_object() message = self.serializer_class(data=request.data) if message.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", message.data['message'], dispatcher.destination) bot.privmsg(dispatcher.destination, message.data['message']) elif dispatcher.type == Dispatcher.FILE_TYPE: filename = os.path.abspath(dispatcher.destination) log.debug("sending '%s' to file %s", message.data['message'], filename) with open(filename, 'w') as f: f.write(message.data['message']) f.write('\n') new_data = copy.deepcopy(message.data) new_data['status'] = "OK" new_message = self.serializer_class(data=new_data) return Response(new_message.initial_data) return Response(message.errors, status=status.HTTP_400_BAD_REQUEST)