from rest_framework import authentication, permissions
from django.shortcuts import render
from rest_framework import generics
from django.db.models import get_app, get_models
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render_to_response
from boto.s3.connection import S3Connection
from boto.s3.key import Key
from django.template import RequestContext
import time
import re
from models import Plate, Lab, Experimenter, Strain, Worm, Wormlist
def index(request):
nice_urls = get_urls()
return render(request, "Openworm/home.html", {"links":nice_urls})
def InitialData(request):
model = Lab(name = "Test Name", description = "Test Description", address = "Test Address")
model.save()
lab_id = model.id
model = Experimenter(labkey = Lab.objects.get(pk = lab_id), name = "Test Name", description = "Test Description")
model.save()
experimenter_id = model.id
model = Strain(name = "Test Name", gene = "Test Gene", genotype = "Test Genotype", allele = "Test Allele", chromosome = "Test Chomosome", simulated = "Y")
model.save()
strain_id = model.id
model = Worm(strainkey = Strain.objects.get(pk = strain_id), name = "Test Name", sex = "Test Sex", generationssincethawing = 3, habituation = "Test Habituation")
model.save()
worm_id = model.id
model = Wormlist(wormkey = Worm.objects.get(pk = worm_id), name = "Test Name")
model.save()
wormlist_id = model.id
model = Plate(wormlistkey = Wormlist.objects.get(pk = wormlist_id), experimenterkey = Experimenter.objects.get(pk = experimenter_id), name = "Test Name", sampletype = "Test Type", copyright = "Test Copyright", vulvaorientation = "Test", annotation = "Test Annotation", chemicals = "Test Chemicals", food = "Test Food", illumination = "Test Illumination", temperature = 10, tracker = "Test Tracker", agarside = "Test Agar Side", gasconcentration = "Test Gas Concentration")
model.save()
plate_id = model.id
return HttpResponse(plate_id)
def handle_uploaded_item(request, model, post):
new_model = model()
for post_key, post_value in post.iteritems():
if "videofile" in post_key:
conn = S3Connection()
bucket = conn.get_bucket(AWS_STORAGE_BUCKET_NAME)
k = Key(bucket)
k.key = str(time.time()) + "." + request.FILES['videofile'].name
k.set_contents_from_file(request.FILES['videofile'])
url = k.generate_url(expires_in=0, query_auth=False)
# This is needed due to a bug in boto, see link below for further details
# https://github.com/boto/boto/issues/2043
todelete="x-amz-security-token"
url = re.sub(r''+todelete+'=[a-zA-Z_0-9\/\%]*\&*',r'', url)
url = re.sub(r'&$',r'', url)
setattr(new_model, "videofileurl", url)
elif "key" not in post_key:
setattr(new_model, post_key, post_value)
else:
app = get_app('Openworm')
for model in get_models(app):
p = re.compile('(\w*)key')
model_name = p.match(post_key).group(1).title()
if (model_name == model().get_subclass_name()):
print model_name
setattr(new_model, post_key, model.objects.get(pk = post_value))
new_model.save()
return new_model.id
def dashboard(request, pk='', id=-1):
nice_urls = get_urls()
obj_count = {}
app = get_app('Openworm')
for model in get_models(app):
obj_count[model().get_subclass_name()] = model.objects.all().count() + 1
if (pk == model().get_subclass_name()):
model_class = model
model_name = model().get_subclass_name()
col_width = 100/(len(model._meta.get_all_field_names()) + 1)
break
if (pk == '' ):
return render(request, "Openworm/dashboard.html", {"links":nice_urls})
if (id == -1):
model_list = model_class.objects.all().values()
return render(request, "Openworm/items.html", {"model_list":model_list, "Name":pk.title(), "col_width":col_width, "id":id, "links":nice_urls, "obj_count":obj_count[pk]})
else:
model_list = model_class.objects.filter(id=id).values()
import inspect
import forms
clsmembers = inspect.getmembers(forms, inspect.isclass)
for key, form in clsmembers:
if (model_name + "Form" == key):
form_list = form
break
if request.method == 'POST':
form = form_list(request.POST)
if form.is_valid():
id = handle_uploaded_item(request, model_class, request.POST)
return HttpResponseRedirect('/dashboard/' + model_name + '/' + str(id))
else:
if (len(model_list) > 0):
form = form_list(initial=model_list[0])
else:
form = form_list()
return render_to_response('Openworm/item.html', {'form': form, "links":nice_urls}, context_instance=RequestContext(request))
[docs]def get_urls():
'''Recursively builds a list of all the urls in the current project and the name of their associated view'''
from operator import itemgetter
nice_urls = []
app = get_app('Openworm')
for model in get_models(app):
nice_urls.append({"pattern": model().get_subclass_name()})
nice_urls = sorted(nice_urls, key=itemgetter('pattern')) #sort alphabetically
return nice_urls
def RESTapi(request):
nice_urls = get_urls()
return render(request, "Openworm/api.html", {"links":nice_urls})
class RESTListView(generics.ListCreateAPIView):
authentication_classes = (authentication.TokenAuthentication,)
permission_classes = (permissions.AllowAny,)
def get_queryset(self, *args, **kwargs):
name = self.kwargs['name']
id = self.kwargs['id']
app = get_app('Openworm')
for model in get_models(app):
if (name == model().get_subclass_name()):
model_list = model
break
return model_list.objects.filter(pk=id).values()
def get_serializer_class(self, *args, **kwargs):
import inspect
import serializers
name = self.kwargs['name']
clsmembers = inspect.getmembers(serializers, inspect.isclass)
for key, serializer in clsmembers:
if (name + "Serializer" == key):
model_list = serializer
break
return model_list
class RESTListViewAll(generics.ListCreateAPIView):
authentication_classes = (authentication.TokenAuthentication,)
permission_classes = (permissions.AllowAny,)
def label_from_instance(self, obj):
return "id: " + str(obj.id) + " name: "+ obj.name
def get_queryset(self, *args, **kwargs):
name = self.kwargs['name']
app = get_app('Openworm')
for model in get_models(app):
if (name == model().get_subclass_name()):
model_list = model
break
return model_list.objects.all()
def get_serializer_class(self, *args, **kwargs):
import inspect
import serializers
name = self.kwargs['name']
clsmembers = inspect.getmembers(serializers, inspect.isclass)
for key, serializer in clsmembers:
if (name + "Serializer" == key):
model_list = serializer
break
return model_list