initial attempt to use django restframework
[htsworkflow.git] / samples / views.py
index e7d2e92bf3fb894e7d99f685ece514aee7cffc4f..78cd0ba0c6f5d838cc46fae8d243274cb2ac9c53 100644 (file)
@@ -3,29 +3,33 @@ from __future__ import absolute_import, print_function, unicode_literals
 # Create your views here.
 import logging
 import os
-import sys
-
 import json
 
 from django.views.decorators.csrf import csrf_exempt
-from django.core.exceptions import ObjectDoesNotExist
 from django.http import HttpResponse, HttpResponseRedirect, 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 django.contrib.auth.decorators import login_required
-from django.conf import settings
+
+from rest_framework import viewsets
+from rest_framework.response import Response
+from rest_framework.renderers import (TemplateHTMLRenderer,
+                                      JSONRenderer,
+                                      BrowsableAPIRenderer)
 
 from htsworkflow.auth import require_api_key
-from experiments.models import FlowCell, Lane, LANE_STATUS_MAP
-from experiments.admin import LaneOptions
+from experiments.models import FlowCell, LANE_STATUS_MAP
 from .changelist import HTSChangeList
-from .models import Antibody, Library, Species, HTSUser
+from .models import Antibody, Library, Species
 from .admin import LibraryOptions
 from .results import get_flowcell_result_dict
+from .serializers import (ExperimentTypeSerializer,
+                          LibrarySerializer,
+                          SpeciesSerializer)
+
 from bcmagic.forms import BarcodeMagicForm
 from htsworkflow.pipelines import runfolder
-from htsworkflow.pipelines.eland import ResultLane
 from htsworkflow.pipelines.samplekey import SampleKey
 from htsworkflow.util.conversion import str_or_none, parse_flowcell_id
 from htsworkflow.util import makebed
@@ -41,75 +45,23 @@ SAMPLES_CONTEXT_DEFAULTS = {
 LOGGER = logging.getLogger(__name__)
 
 
-def count_lanes(lane_set):
-    single = 0
-    paired = 1
-    short_read = 0
-    medium_read = 1
-    long_read = 2
-    counts = [[0, 0, 0], [0, 0, 0]]
-
-    for lane in lane_set.all():
-        if lane.flowcell.paired_end:
-            lane_type = paired
-        else:
-            lane_type = single
-        if lane.flowcell.read_length < 40:
-            read_type = short_read
-        elif lane.flowcell.read_length < 100:
-            read_type = medium_read
-        else:
-            read_type = long_read
-        counts[lane_type][read_type] += 1
-
-    return counts
-
-
-def create_library_context(cl):
-    """
-     Create a list of libraries that includes how many lanes were run
-    """
-    records = []
-    #for lib in library_items.object_list:
-    for lib in cl.result_list:
-        summary = {}
-        summary['library'] = lib
-        summary['library_id'] = lib.id
-        summary['library_name'] = lib.library_name
-        summary['species_name'] = lib.library_species.scientific_name
-        if lib.amplified_from_sample is not None:
-            summary['amplified_from'] = lib.amplified_from_sample.id
-        else:
-            summary['amplified_from'] = ''
-        lanes_run = count_lanes(lib.lane_set)
-        # suppress zeros
-        for row in xrange(len(lanes_run)):
-            for col in xrange(len(lanes_run[row])):
-                if lanes_run[row][col] == 0:
-                    lanes_run[row][col] = ''
-        summary['lanes_run'] = lanes_run
-        summary['is_archived'] = lib.is_archived()
-        records.append(summary)
-    cl.result_count = str(cl.paginator._count)
-    return {'library_list': records}
-
-
 def library(request, todo_only=False):
-    queryset = Library.objects.filter(hidden__exact=0)
-    filters = {'hidden__exact': 0}
+    #filters = {'hidden__exact': 0}
     if todo_only:
         filters['lane'] = None
-    # build changelist
+
     fcl = HTSChangeList(request, Library,
                         list_filter=['affiliations', 'library_species'],
                         search_fields=['id', 'library_name', 'amplified_from_sample__id'],
                         list_per_page=200,
                         model_admin=LibraryOptions(Library, None),
-                        extra_filters=filters
                         )
 
-    context = {'cl': fcl, 'title': 'Library Index', 'todo_only': todo_only}
-    context.update(create_library_context(fcl))
+    context = {'cl': fcl,
+               'library_list': fcl.result_list,
+               'title': 'Library Index',
+               'todo_only': todo_only}
+
     t = get_template('samples/library_index.html')
     c = RequestContext(request, context)
     return HttpResponse(t.render(c))
@@ -160,31 +112,6 @@ def library_to_flowcells(request, lib_id):
         context_instance=RequestContext(request))
 
 
-def lanes_for(request, username=None):
-    """
-    Generate a report of recent activity for a user
-    """
-    query = {}
-    if username is not None:
-        user = HTSUser.objects.get(username=username)
-        query.update({'library__affiliations__users__id': user.id})
-    fcl = HTSChangeList(request, Lane,
-                        list_filter=[],
-                        search_fields=['flowcell__flowcell_id', 'library__id', 'library__library_name'],
-                        list_per_page=200,
-                        model_admin=LaneOptions,
-                        queryset=Lane.objects.filter(**query)
-                        )
-
-    context = {'lanes': fcl, 'title': 'Lane Index'}
-
-    return render_to_response(
-        'samples/lanes_for.html',
-        context,
-        context_instance=RequestContext(request)
-    )
-
-
 def summaryhtm_fc_cnm(request, flowcell_id, cnm):
     """
     returns a Summary.htm file if it exists.
@@ -534,26 +461,62 @@ def library_json(request, library_id):
     return HttpResponse(lib_json, content_type='application/json')
 
 
-@csrf_exempt
-def species_json(request, species_id):
-    """
-    Return information about a species.
-    """
-    raise Http404
-
-
-def species(request, species_id):
-    species = get_object_or_404(Species, id=species_id)
-
-    context = RequestContext(request,
-                             {'species': species})
-
-    return render_to_response("samples/species_detail.html", context)
+class LibraryViewSet(viewsets.ReadOnlyModelViewSet):
+    renderer_classes = (TemplateHTMLRenderer,
+                        BrowsableAPIRenderer,
+                        JSONRenderer)
+    queryset = Library.objects.all()
+    serializer_class = LibrarySerializer
+    pagination_class = 'rest_framework.pagination.LimitOffsetPagination'
+    default_limit = 50
+    template_name = 'samples/library_detail.html'
+
+
+class ExperimentTypeViewSet(viewsets.ReadOnlyModelViewSet):
+    renderer_classes = (BrowsableAPIRenderer,
+                        JSONRenderer)
+    queryset = ExperimentType.objects.all()
+    serializer_class = ExperimentTypeSerializer
+
+#@csrf_exempt
+#def species_json(request, species_id):
+#    """
+#    Return information about a species.
+#    """
+#    raise Http404
+#
+#
+#def species(request, species_id):
+#    species = get_object_or_404(Species, id=species_id)
+#
+#    context = RequestContext(request,
+#                             {'species': species})
+#
+#    return render_to_response("samples/species_detail.html", context)
+#
+
+class SpeciesViewSet(viewsets.ReadOnlyModelViewSet):
+    renderer_classes = (TemplateHTMLRenderer,
+                        BrowsableAPIRenderer,
+                        JSONRenderer)
+    queryset = Species.objects.all()
+    serializer_class = SpeciesSerializer
+    template_name = 'samples/species_detail.html'
+
+    def list(self, request, format=format):
+        queryset = Species.objects.all()
+        serializer = self.serializer_class(
+            queryset,
+            many=True,
+            context={'request': request})
+        return Response({'species': serializer.data},
+                        template_name='samples/species_list.html')
 
 
 def antibodies(request):
-    context = RequestContext(request,
-                             {'antibodies': Antibody.objects.order_by('antigene')})
+    context = RequestContext(
+        request,
+        {'antibodies': Antibody.objects.order_by('antigene')})
     return render_to_response("samples/antibody_index.html", context)