# 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
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))
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.
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)