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)