From dac7999c0feae924b4d9d8f1541a9b6b7a6c4a0b Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Fri, 19 Jun 2015 10:51:11 -0500 Subject: [PATCH] dispatch: use generics better (?) in /message use GenericAPIView rather than APIView in order to get some common idiom stuff done for us. we continue to support GET and POST in DispatchMessage, now it's just a bit cleaner. i think. anyway if we were doing this stuff more we could/should probably create mixins for them, but at the moment this is pretty sane i think --- dr_botzo/dispatch/serializers.py | 1 + dr_botzo/dispatch/views.py | 49 ++++++++++++++++++-------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/dr_botzo/dispatch/serializers.py b/dr_botzo/dispatch/serializers.py index f14db08..afd1c52 100644 --- a/dr_botzo/dispatch/serializers.py +++ b/dr_botzo/dispatch/serializers.py @@ -15,3 +15,4 @@ class DispatcherSerializer(serializers.ModelSerializer): class DispatchMessageSerializer(serializers.Serializer): message = serializers.CharField() + status = serializers.CharField(read_only=True) diff --git a/dr_botzo/dispatch/views.py b/dr_botzo/dispatch/views.py index bab2e0c..57f7113 100644 --- a/dr_botzo/dispatch/views.py +++ b/dr_botzo/dispatch/views.py @@ -2,12 +2,14 @@ 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 @@ -35,38 +37,43 @@ class DispatcherDetail(generics.RetrieveAPIView): serializer_class = DispatcherSerializer -class DispatchMessage(APIView): +class DispatchMessage(generics.GenericAPIView): """Send a message to the given dispatcher.""" - queryset = Dispatcher.objects.none() + queryset = Dispatcher.objects.all() + serializer_class = DispatchMessageSerializer - def get_object(self, pk): - try: - return Dispatcher.objects.get(pk=pk) - except Dispatcher.DoesNotExist: - raise Http404 + def get_object(self): + queryset = self.get_queryset() + queryset = self.filter_queryset(queryset) + return get_object_or_404(queryset) - def get(self, request, pk, format=None): - dispatcher = self.get_object(pk) - return Response({'message': ""}) + 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, pk, format=None): - dispatcher = self.get_object(pk) - serializer = DispatchMessageSerializer(data=request.data) - if serializer.is_valid(): + 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", serializer.data['message'], dispatcher.destination) - bot.privmsg(dispatcher.destination, serializer.data['message']) - return Response({'status': "OK"}) + 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", serializer.data['message'], filename) + log.debug("sending '%s' to file %s", message.data['message'], filename) with open(filename, 'w') as f: - f.write(serializer.data['message']) + f.write(message.data['message']) f.write('\n') - return Response({'status': "OK"}) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + 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)