initial attempt to use django restframework
[htsworkflow.git] / experiments / views.py
index 294aff27a7ee41e664d4d6a86be047761606a38b..9b1c8a196e4f6171be1881c27b11c0ff8bed9b27 100644 (file)
@@ -1,4 +1,4 @@
-from __future__ import absolute_import, print_function
+from __future__ import absolute_import, print_function, unicode_literals
 
 # Create your views here.
 from datetime import datetime
@@ -10,15 +10,30 @@ from django.contrib.auth.decorators import user_passes_test
 from django.conf import settings
 from django.core.exceptions import ObjectDoesNotExist
 from django.core.mail import EmailMessage, mail_managers
-from django.http import HttpResponse
+from django.http import HttpResponse, Http404
 from django.shortcuts import render_to_response, get_object_or_404
 from django.template import RequestContext
 from django.template.loader import get_template
 
 from .models import DataRun, DataFile, FlowCell, Lane, Sequencer
+from rest_framework import viewsets
+from rest_framework.response import Response
+from rest_framework.renderers import (TemplateHTMLRenderer,
+                                      JSONRenderer,
+                                      BrowsableAPIRenderer)
+
+from .admin import LaneOptions
 from .experiments import estimateFlowcellDuration, estimateFlowcellTimeRemaining, roundToDays, \
      getUsersForFlowcell, \
      makeEmailLaneMap
+from .serializers import (
+    ClusterStationSerializer,
+    SequencerSerializer,
+    LaneSerializer,
+    FlowCellSerializer)
+from samples.changelist import HTSChangeList
+from samples.models import HTSUser
+
 
 def index(request):
     all_runs = DataRun.objects.order_by('-run_start_time')
@@ -128,6 +143,72 @@ def finishedEmail(request, pk):
     return HttpResponse("I've got nothing.")
 
 
+
+class ClusterStationViewSet(viewsets.ReadOnlyModelViewSet):
+    renderer_classes = (TemplateHTMLRenderer,
+                        BrowsableAPIRenderer,
+                        JSONRenderer)
+    queryset = ClusterStation.objects.all()
+    serializer_class = ClusterStationSerializer
+    # template_name = 'experiments/cluster_station.html'
+
+from pprint import pprint
+class FlowCellViewSet(viewsets.ReadOnlyModelViewSet):
+    renderer_classes = (TemplateHTMLRenderer,
+                        BrowsableAPIRenderer,
+                        JSONRenderer)
+    queryset = FlowCell.objects.all()
+    lookup_field = 'flowcell_id'
+    serializer_class = FlowCellSerializer
+    template_name = 'experiments/flowcell_detail.html'
+
+    def retrieve(self, request, *args, **kwargs):
+        fc = get_object_or_404(self.queryset, flowcell_id = kwargs['flowcell_id'])
+        context = kwargs.copy()
+        context['request'] = request
+        serializer = FlowCellSerializer(
+            fc,
+            context=context,
+            )
+        pprint(serializer.data)
+        return Response(serializer.data)
+
+    #def retrieve(self, request, flowcell_id=None, format=None):
+    #    queryset = FlowCell.objects.all()
+    #    fc = get_object_or_404(queryset, flowcell_id=flowcell_id)
+    #    serializer = FlowCellSerializer(
+    #        fc,
+    #        context={
+    #            'request': request,
+    #            'format': format,
+    #        }
+    #    )
+    #    return Response(
+    #        serializer.data,
+    #    )
+
+    #def list(self, *args, **kwargs):
+    #    template_name = 'experiments/flowcell_index.html'
+    #    return super(FlowCellViewSet, self).list(*args, **kwargs)
+
+class LaneViewSet(viewsets.ReadOnlyModelViewSet):
+    renderer_classes = (TemplateHTMLRenderer,
+                        BrowsableAPIRenderer,
+                        JSONRenderer)
+    queryset = Lane.objects.all()
+    serializer_class = LaneSerializer
+    template_name = 'experiments/flowcell_lane_detail.html'
+
+
+
+class SequencerViewSet(viewsets.ReadOnlyModelViewSet):
+    renderer_classes = (TemplateHTMLRenderer,
+                        BrowsableAPIRenderer,
+                        JSONRenderer)
+    queryset = Sequencer.objects.all()
+    serializer_class = SequencerSerializer
+    template_name = 'experiments/sequencer.html'
+
 def flowcell_detail(request, flowcell_id, lane_number=None):
     fc = get_object_or_404(FlowCell, flowcell_id__startswith=flowcell_id)
     fc.update_data_runs()
@@ -176,14 +257,37 @@ def read_result_file(self, key):
         content_type = data_file.file_type.mimetype
 
     if os.path.exists(data_file.pathname):
-        return HttpResponse(open(data_file.pathname,'r'),
+        return HttpResponse(open(data_file.pathname,'rb'),
                             content_type=content_type)
 
     raise Http404
 
 
-def sequencer(request, sequencer_id):
-    sequencer = get_object_or_404(Sequencer, id=sequencer_id)
-    context = RequestContext(request,
-                             {'sequencer': sequencer})
-    return render_to_response('experiments/sequencer.html', context)
+def lanes_for(request, username=None):
+    """
+    Generate a report of recent activity for a user
+    """
+    query = {}
+    if username is not None:
+        try:
+            user = HTSUser.objects.get(username=username)
+            query.update({'library__affiliations__users__id': user.id})
+        except HTSUser.DoesNotExist as e:
+            raise Http404('User not found')
+
+    fcl = HTSChangeList(request, Lane,
+                        list_filter=['library__affiliations',
+                                     'library__library_species'],
+                        search_fields=['flowcell__flowcell_id', 'library__id', 'library__library_name'],
+                        list_per_page=200,
+                        model_admin=LaneOptions(Lane, None),
+                        extra_filters=query
+                        )
+
+    context = {'lanes': fcl, 'title': 'Lane Index'}
+
+    return render_to_response(
+        'samples/lanes_for.html',
+        context,
+        context_instance=RequestContext(request)
+    )