atomresponder/views.py (48 lines of code) (raw):
from rest_framework.views import APIView
from rest_framework.renderers import JSONRenderer
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from django.views.generic.list import ListView
import logging
logger = logging.getLogger(__name__)
class JobNotifyView(APIView):
permission_classes = (AllowAny, )
renderer_classes = (JSONRenderer, )
def post(self, request):
"""
Receives notifications from VS that a relevant import has taken place.
Notification is set up in notification.py
:param request: Django request object
:return: Response
"""
from rabbitmq.job_notification import JobNotification
from lxml.etree import XMLSyntaxError, LxmlError
from .notification import process_notification
from .models import ImportJob
logger.info("Received import notification")
try:
notification = JobNotification(request.body)
except XMLSyntaxError:
logger.error("Invalid XML document received from Vidispine: {0}".format(request.body))
return Response({'status': 'Bad XML'}, status=400) #returning 400=> VS won't try again
except LxmlError:
logger.error("Unable to process Vidispine XML document, but syntax as ok")
return Response({'status': 'Unable to process'}, status=500) #returning 500=> VS will try again (more likely problem is our side)
try:
process_notification(notification)
return Response({'status': 'ok'})
except ImportJob.DoesNotExist:
logger.error("JobNotifyView: No import job found for {0}".format(notification))
return Response({'status': 'notfound'}, status=200)
class ImportJobListView(ListView):
from .models import ImportJob
model = ImportJob
template_name = "gnmatomresponder/import_job_list.html"
def get_queryset(self):
qs = self.model.objects.all()
if 'status' in self.request.GET:
qs = qs.filter(status=self.request.GET['status'])
if 'itemId' in self.request.GET and self.request.GET['itemId']!='':
qs = qs.filter(item_id=self.request.GET['itemId'])
return qs.order_by('-completed_at', '-started_at')
def get_context_data(self, **kwargs):
rtn = super(ImportJobListView, self).get_context_data(**kwargs)
if 'intest' in self.request.GET:
rtn['in_test'] = True
else:
rtn['in_test'] = False
return rtn
# class ResyncToAtomApi(APIView):
# renderer_classes = (JSONRenderer, )
#
# def get(self, request, item_id=None):
# from portal.plugins.gnm_masters.models import VSMaster
# import portal.plugins.gnm_vidispine_utils.constants as const
# import requests
# from django.conf import settings
#
# try:
# master = VSMaster(item_id, request.user)
# atom_id = master.get(const.GNM_MASTERS_MEDIAATOM_ATOMID, "")
#
# if atom_id is None:
# return Response({"status": "error","error": "This master has no atom ID yet"}, status=400)
#
# url = settings.GNM_ATOM_RESPONDER_LAUNCHDETECTOR_URL + "/update/" + atom_id
# logger.info("Update URL for {0} is {1}".format(item_id, url))
# response = requests.put(url)
#
# logger.info("Updating {0}: Launch detector said {1} {2}".format(item_id, response.status_code, response.content))
# #simply echo the Launch Detector's response back to the client
# return Response(response.json(), status=response.status_code)
# except requests.ConnectTimeout:
# return Response({"status": "error", "error": "Timeout connecting to LaunchDetector, please try again and notify multimediatech@theguardian.com"},status=500)
# except requests.ConnectionError:
# return Response({"status": "error", "error": "Unable to connect to LaunchDetector, please notify multimediatech@theguardian.com"},status=500)
# except Exception as e:
# return Response({"status": "error", "error": str(e)},status=500)