Skip to content

Commit

Permalink
minor cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
cboulay committed Apr 20, 2024
1 parent 1822462 commit 907c6f0
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 81 deletions.
61 changes: 31 additions & 30 deletions python/serf/urls.py
Original file line number Diff line number Diff line change
@@ -1,67 +1,68 @@
from django.conf.urls import include, url
from django.views.generic import DetailView, ListView
#from eerfapp.models import Subject, Datum
from eerfapp import models, views
from serf import models, views

#===============================================================================

# ===============================================================================
# urlpatterns = patterns('api.views',
# url(r'^monitor/$', 'monitor'),
# url(r'^subject/$', 'subject_index'),
# url(r'^subject/(?P<subject_id>\d+)/$', 'subject_detail'), #calls subject_detail(request=<HttpRequest object>, subject_id='123')
# url(r'^period/(?P<period_id>\d+)/$', 'period_detail'),
# )
#===============================================================================
# ===============================================================================


urlpatterns = [

#/eerfapp/ ==> a redirect to /eerfapp/subjects/
# /eerfapp/ ==> a redirect to /eerfapp/subjects/
url(r'^$', views.index, name='index'),

#===========================================================================
# ===========================================================================
# Some URLs for a basic API.
#===========================================================================
# ===========================================================================

#/eerfapp/my_session/ ==> #GET session info in JSON or POST session details (trial_start, trial_stop, monitor)
# /eerfapp/my_session/ ==> #GET session info in JSON or POST session details (trial_start, trial_stop, monitor)
url(r'^my_session/$', views.my_session, name='my_session'),

#/eerfapp/detail_types/ ==> JSON of detail_types names
# /eerfapp/detail_types/ ==> JSON of detail_types names
url(r'^detail_types/$', views.detail_types),

#/eerfapp/feature_types/ ==> JSON of feature_types names
# /eerfapp/feature_types/ ==> JSON of feature_types names
url(r'^feature_types/$', views.feature_types),

#/eerfapp/get_xy/ ==> GET data of detail (x) and feature (y) for subject_pk. Uses session for trial_start and trial_stop
# /eerfapp/get_xy/ ==> GET data of detail (x) and feature (y) for subject_pk. Uses session for trial_start and trial_stop
url(r'^get_xy/$', views.get_xy),

#url(r'^erps/(?P<trial_pk_csv>(?:\d+,*)*)', 'erps'),
#url(r'^store_pk_check/(?P<pk>\d*)', 'store_pk_check'),
# url(r'^erps/(?P<trial_pk_csv>(?:\d+,*)*)', 'erps'),
# url(r'^store_pk_check/(?P<pk>\d*)', 'store_pk_check'),

#===========================================================================
# ===========================================================================
# URLs with rendered views.
#===========================================================================
url(r'^subject/$', #List all the subjects.
# ===========================================================================
url(r'^subject/$', # List all the subjects.
ListView.as_view(
queryset=models.Subject.objects.all(),
#context_object_name='subject_list', #default
#template_name='eerfapp/subject_list.html' #default
# context_object_name='subject_list', #default
# template_name='eerfapp/subject_list.html' #default
),
name='subject'
),
url(r'^subject_import/$', views.subject_import, name='subject_import'),
url(r'^subject/(?P<pk>\d+)/$', #Give details about a specific subject.
url(r'^subject/(?P<pk>\d+)/$', # Give details about a specific subject.
DetailView.as_view(
model=models.Subject,
#template_name='api/subject_detail.html'
# template_name='api/subject_detail.html'
),
name='subject_item'
),
url(r'^subject/(?P<pk>\d+)/view_data/$', views.view_data, name='view_data'), #Show trial data for a specific subject.
url(r'^subject/(?P<pk>\d+)/set_details/$', views.set_details, name='set_details'), #POST a dict of detail kvps for subject pk
url(r'^subject/(?P<pk>\d+)/detail_values/(?P<detail_name>\w*)/$', views.get_detail_values), #GET the values for a detail name
url(r'^subject/(?P<pk>\d+)/feature_values/(?P<feature_name>\w*)/$', views.get_feature_values), #GET the values for a feature name
url(r'^subject/(?P<pk>\d+)/count_trials/$', views.count_trials), #GET the number of trials, filtered by session variables.
url(r'^subject/(?P<pk>\d+)/erp_data/$', views.erp_data), #GET the erp_data for this subject, filtered by session variables.
url(r'^subject/(?P<pk>\d+)/recalculate_feature/(?P<feature_name>\w+)/$', views.recalculate_feature), #Recalculate feature values
url(r'^subject/(?P<pk>\d+)/view_data/$', views.view_data, name='view_data'), # Show trial data for a specific subject.
url(r'^subject/(?P<pk>\d+)/set_details/$', views.set_details, name='set_details'), # POST a dict of detail kvps for subject pk
url(r'^subject/(?P<pk>\d+)/detail_values/(?P<detail_name>\w*)/$', views.get_detail_values), # GET the values for a detail name
url(r'^subject/(?P<pk>\d+)/feature_values/(?P<feature_name>\w*)/$', views.get_feature_values), # GET the values for a feature name
url(r'^subject/(?P<pk>\d+)/count_trials/$', views.count_trials), # GET the number of trials, filtered by session variables.
url(r'^subject/(?P<pk>\d+)/erp_data/$', views.erp_data), # GET the erp_data for this subject, filtered by session variables.
url(r'^subject/(?P<pk>\d+)/recalculate_feature/(?P<feature_name>\w+)/$', views.recalculate_feature), # Recalculate feature values
url(r'^period/(?P<pk>\d+)/$',
DetailView.as_view(
model=models.Datum,
Expand All @@ -71,8 +72,8 @@
name='period_detail'
),

#===========================================================================
# ===========================================================================
# Other URLs
#===========================================================================
# ===========================================================================
url(r'^import_elizan/$', views.import_elizan, name='import_elizan'),
]
]
122 changes: 71 additions & 51 deletions python/serf/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,32 @@
import datetime
from django.shortcuts import render, get_object_or_404
from django.views.decorators.http import require_http_methods
from django.http import HttpResponse, HttpResponseRedirect#, Http404
from django.http import HttpResponse, HttpResponseRedirect # , Http404
from django.contrib.sessions.models import Session
from django.core.serializers.json import DjangoJSONEncoder
from eerfapp import models
#import pdb
#from django.core.urlresolvers import reverse
#from django.template import RequestContext, loader

#===============================================================================
# Index. For now this is a redirect to something useful.
#===============================================================================
from serf import models
# import pdb
# from django.core.urlresolvers import reverse
# from django.template import RequestContext, loader


def index(request):
#return render_to_response('eerfapp/index.html')
#pdb.set_trace()
"""
Index. For now this is a redirect to something useful.
:param request:
:return: HttpResponseRedirect
"""
# return render_to_response('eerfapp/index.html')
# pdb.set_trace()
request.session.flush()
return HttpResponseRedirect('/eerfapp/subject/')

#===============================================================================

# ===============================================================================
# Helper functions (not views)
#===============================================================================
def store_man_for_request_subject(request, pk): #Helper function to return a filtered DatumStore manager.
# ===============================================================================
def store_man_for_request_subject(request, pk):
# Helper function to return a filtered DatumStore manager.
store_man = models.DatumStore.objects.filter(datum__subject__pk=pk).filter(datum__span_type=1).filter(n_samples__gt=0)
my_session = models.Session.objects.get(pk=request.session.session_key).get_decoded()
if my_session.has_key('trial_start'):
Expand All @@ -32,52 +37,58 @@ def store_man_for_request_subject(request, pk): #Helper function to return a fil
store_man = store_man.filter(datum__stop_time__lte=my_session['trial_stop'])
return store_man

#===============================================================================
# ===============================================================================
# Rendering views
#===============================================================================
# ===============================================================================

#/subject/, /subject/pk/, and /period/ are all automatic views.
# /subject/, /subject/pk/, and /period/ are all automatic views.

def subject_list(request): #View list of subjects and option to import

def subject_list(request): # View list of subjects and option to import
mySubjects = models.Subject.objects.all()
context = {'subject_list': mySubjects}
return render(request, 'eerfapp/subject_list.html', context)



def subject_import(request):
#TODO: Get list of elizan subjects. Mark those that are already imported.
# TODO: Get list of elizan subjects. Mark those that are already imported.
context = {'elizan_subjects': {} }
return render(request, 'eerfapp/subject_import.html', context)

def view_data(request, pk):#View data for subject with pk


def view_data(request, pk): # View data for subject with pk
subject = get_object_or_404(models.Subject, pk=pk)
context = {'subject': subject}
return render(request, 'eerfapp/subject_view_data.html', context)



def erps(request, trial_pk_csv='0'):
#convert trial_pk_csv to trial_pk_list
# convert trial_pk_csv to trial_pk_list
trial_pk_list = trial_pk_csv.split(',')
if len(trial_pk_list[0])>0:
trial_pk_list = [int(val) for val in trial_pk_list]
stores = models.DatumStore.objects.filter(pk__in=trial_pk_list)
#subject = get_object_or_404(Subject, pk=subject_id)
# subject = get_object_or_404(Subject, pk=subject_id)
data = ','.join(['"' + str(st.datum_id) + '": ' + json.dumps(st.erp.tolist()) for st in stores])
data = '{' + data + '}'
else:
data = '{}'
return render(request, 'eerfapp/erp_data.html',{'data': data})

#===============================================================================

# ===============================================================================
# API: GET or POST. Non-rendering.
#===============================================================================
# ===============================================================================
@require_http_methods(["GET", "POST"])
def set_details(request, pk):
subject = get_object_or_404(models.Subject, pk=pk)
my_dict = request.POST.copy()
my_dict.pop('csrfmiddlewaretoken', None)#Remove the token provided by the POST command
for key in my_dict:
subject = get_object_or_404(models.Subject, pk=pk)
my_dict = request.POST.copy()
my_dict.pop('csrfmiddlewaretoken', None) # Remove the token provided by the POST command
for key in my_dict:
subject.update_ddv(key, my_dict[key])
#return HttpResponseRedirect(reverse('eerfapp.views.monitor', args=(pk,)))
return HttpResponseRedirect(request.META['HTTP_REFERER'])
# return HttpResponseRedirect(reverse('eerfapp.views.monitor', args=(pk,)))
return HttpResponseRedirect(request.META['HTTP_REFERER'])


@require_http_methods(["GET"])
def get_detail_values(request, pk, detail_name, json_vals_only=True):
Expand All @@ -94,6 +105,7 @@ def get_detail_values(request, pk, detail_name, json_vals_only=True):
else:
return ddvs_man


@require_http_methods(["GET"])
def get_feature_values(request, pk, feature_name, json_vals_only=True):
feature_type = get_object_or_404(models.FeatureType, name=feature_name)
Expand All @@ -109,6 +121,7 @@ def get_feature_values(request, pk, feature_name, json_vals_only=True):
else:
return dfvs_man


def recalculate_feature(request, pk, feature_name):
trial_man = models.Datum.objects.filter(subject__pk=pk, span_type=1, store__n_samples__gt=0)
my_session = Session.objects.get(pk=request.session.session_key).get_decoded()
Expand All @@ -120,24 +133,26 @@ def recalculate_feature(request, pk, feature_name):
tr.calculate_value_for_feature_name(feature_name)
return HttpResponse('success')


@require_http_methods(["GET"])
def count_trials(request, pk): #GET number of trials for subject. Uses session variables. Non-rendering
def count_trials(request, pk): # GET number of trials for subject. Uses session variables. Non-rendering
store_man = store_man_for_request_subject(request, pk)
return HttpResponse(json.dumps(store_man.count()))


@require_http_methods(["GET"])
def erp_data(request, pk): #Gets ERP data for a subject. Uses session variables. Non-rendering.
[x_min,x_max] = [-10,100.0]
def erp_data(request, pk): # Gets ERP data for a subject. Uses session variables. Non-rendering.
[x_min, x_max] = [-10, 100.0]

#Get the manager for datum_store... and reverse its order
# Get the manager for datum_store... and reverse its order
store_man = store_man_for_request_subject(request, pk).order_by('-pk')

#Get the last trial_limit trials
# Get the last trial_limit trials
my_session = Session.objects.get(pk=request.session.session_key).get_decoded()
trial_limit = int(my_session['trial_limit']) if my_session.has_key('trial_limit') and int(my_session['trial_limit'])>0 else store_man.count()
store_man = store_man[0:trial_limit]

#Return the channel_labels and data
# Return the channel_labels and data
if store_man.count()>0:
n_channels = [st.n_channels for st in store_man]
channel_labels = store_man[np.nonzero(n_channels==np.max(n_channels))[0][0]].channel_labels
Expand All @@ -147,6 +162,7 @@ def erp_data(request, pk): #Gets ERP data for a subject. Uses session variables.
data = {}
return HttpResponse(json.dumps({'data': data, 'channel_labels': channel_labels}))


@require_http_methods(["GET"])
def get_xy(request):
getter = request.GET.copy()
Expand All @@ -159,10 +175,11 @@ def get_xy(request):
trial_man = trial_man.distinct()
x = [float(tr._detail_values.get(detail_type__name='TMS_powerA').value) for tr in trial_man]
y = [tr._feature_values.get(feature_type__name='MEP_p2p').value for tr in trial_man]
data = [{ "label": getter['y_name'], "data": np.column_stack((x,y)).tolist()}]
data = [{"label": getter['y_name'], "data": np.column_stack((x,y)).tolist()}]
return HttpResponse(json.dumps(data))

#GET or POST session dictionary.

# GET or POST session dictionary.
@require_http_methods(["GET", "POST"])
def my_session(request):
my_session = Session.objects.get(pk=request.session.session_key).get_decoded()
Expand All @@ -172,35 +189,38 @@ def my_session(request):
my_post = request.POST.copy()#mutable copy of POST
my_post.pop('csrfmiddlewaretoken', None)

#Fix date values. %b->Sep, %d->11, %Y->2001, %X->locale time
#Returned as '1/25/2013 6:46:03 AM'
#date_format = '%b %d %Y %X'#date_format = '%Y-%m-%dT%H:%M:%S'
# Fix date values. %b->Sep, %d->11, %Y->2001, %X->locale time
# Returned as '1/25/2013 6:46:03 AM'
# date_format = '%b %d %Y %X'#date_format = '%Y-%m-%dT%H:%M:%S'
date_format = '%m/%d/%Y %I:%M:%S %p'
date_keys = ['trial_start', 'trial_stop']
for key in date_keys:
my_post[key] = datetime.datetime.strptime(my_post[key], date_format) if my_post.has_key(key) else request.session.get(key, datetime.datetime.now())

#Other values to fix
# Other values to fix
my_post['monitor'] = my_post.has_key('monitor') if my_post.has_key('trial_start') else True

#Put the values back into request.session
# Put the values back into request.session
for key in my_post: request.session[key] = my_post[key]
return HttpResponseRedirect(request.META['HTTP_REFERER'])


@require_http_methods(["GET"])
def detail_types(request):
dts = models.DetailType.objects.all()
dt_names = [dt.name for dt in dts]
return HttpResponse(json.dumps(dt_names))


@require_http_methods(["GET"])
def feature_types(request):
fts = models.FeatureType.objects.all()
ft_names = [ft.name for ft in fts]
return HttpResponse(json.dumps(ft_names))


def store_pk_check(request, pk):
#Given a pk, return how many DatumStore objects we have with pk greater
# Given a pk, return how many DatumStore objects we have with pk greater
pk = int(pk) if len(pk)>0 else 0
n_stores = models.DatumStore.objects.filter(pk__gte=pk).count()
return HttpResponse(json.dumps(n_stores))
Expand All @@ -209,10 +229,10 @@ def store_pk_check(request, pk):
@require_http_methods(["POST"])
def import_elizan(request):
my_session = Session.objects.get(pk=request.session.session_key).get_decoded()
my_post = request.POST.copy()#mutable copy of POST
my_post = request.POST.copy() # mutable copy of POST
my_post.pop('csrfmiddlewaretoken', None)
selected_sub = my_post.has_key('subject_select')
subject_json = my_post['subject_json']
#TODO: parse JSON
#TODO: import subject.
return HttpResponseRedirect(request.META['HTTP_REFERER'])
# TODO: parse JSON
# TODO: import subject.
return HttpResponseRedirect(request.META['HTTP_REFERER'])

0 comments on commit 907c6f0

Please sign in to comment.