blob: 12d2b9450d74454739c12bc2f12c96a2e3ecf59e [file] [log] [blame]
from django.shortcuts import render, redirect
from op_tasks.models import UserProfile, Product, Dataset, OpTask, TaskListItem, Experiment
from django.contrib.auth.decorators import login_required
from django.contrib.auth import get_user_model
from django.http import JsonResponse, HttpResponseForbidden
from op_tasks import tasksUtil
from op_tasks import mechanicalTurk
from op_tasks.surveyMongoUpdate import SM_EXPERIMENT_NAME
from base import ALE_URL
from elasticsearch import Elasticsearch
@login_required(login_url='/tasking/login')
def view_users(request):
userprofiles = UserProfile.objects.all().order_by('-user__last_login')
return render(request, 'users.html', {'userprofiles': userprofiles})
@login_required(login_url='/tasking/login')
def manage_users(request):
userprofiles = UserProfile.objects.all().order_by('-user__last_login')
return render(request, 'users.html', {'userprofiles': userprofiles})
@login_required(login_url='/tasking/login')
def edit_user(request, userprofilepk):
userprofile = UserProfile.objects.get(id=userprofilepk)
experiment = Experiment.objects.get(name=request.POST['experiment_name'])
userprofile.experiment = experiment
userprofile.save()
return redirect('exp_portal:view_users')
@login_required(login_url='/tasking/login')
def add_user(request):
experiments = Experiment.objects.all()
products = Product.objects.all()
return render(request, 'add_user.html', {'experiments': experiments, 'products':products})
@login_required(login_url='/tasking/login')
def delete_user(request, userprofilepk):
userprofile = UserProfile.objects.get(id=userprofilepk)
user = userprofile.user
usertasks = userprofile.tasklistitem_set.all()
for tasklistitem in usertasks:
tasklistitem.delete()
user.delete()
userprofile.delete()
return redirect('exp_portal:view_users')
@login_required(login_url='/tasking/login')
def new_user(request):
user = get_user_model()(email=request.POST['email'])
user.set_password(request.POST['password_1'])
user.last_login = '1970-01-01 00:00'
user.save()
userprofile = UserProfile()
userprofile.user = user
experiment = Experiment.objects.get(name=request.POST['experiment_name'])
userprofile.experiment = experiment
userprofile.save()
# logic for assigning tasks
if request.POST['product_name'] == 'all':
# all products all tasks buffet style
tasksUtil.appendAllTasks(user)
else:
# single product - task ordering assumed
product = Product.objects.get(name=request.POST['product_name'])
if str(request.POST['taskorder']) == 'b':
print 'true'
tasks = product.dataset.optask_set.all().order_by('id').reverse()
else:
tasks = product.dataset.optask_set.all().order_by('id')
tasks = tasks.filter(is_active=True)
index = 0
for task in tasks:
newtasklistitem = TaskListItem()
newtasklistitem.userprofile = userprofile
newtasklistitem.op_task = task
newtasklistitem.product = product
newtasklistitem.index = index
# if index == 0 or experiment.sequential_tasks == False:
# newtasklistitem.task_active = True
# else:
# newtasklistitem.task_active = False
index = index + 1
newtasklistitem.save()
return redirect('exp_portal:view_users')
@login_required(login_url='/tasking/login')
def user_added(request):
return render(request, 'user_added.html')
@login_required(login_url='/tasking/login')
def view_user_tasks(request, profile):
userprofile = UserProfile.objects.all().filter(user_hash=profile)[0]
usertasks = userprofile.tasklistitem_set.all()
experiments = Experiment.objects.all()
datasets = Dataset.objects.all()
count = 0
tasklistitems = []
for dataset in datasets:
for product in dataset.product_set.all():
for task in dataset.optask_set.all():
count = count + 1
return render(request, 'user_tasks.html', {'userprofile': userprofile, 'experiments':experiments})
@login_required(login_url='/tasking/login')
def add_user_task(request, userpk):
userprofile = UserProfile.objects.get(id=userpk)
datasets = Dataset.objects.all()
products = Product.objects.all()
tasks = OpTask.objects.all()
return render(request, 'add_user_task.html', {'userprofile':userprofile,
'datasets': datasets, 'products': products, 'tasks': tasks})
@login_required(login_url='/tasking/login')
def update_user_tasks(request, userpk, datasetpk, productpk, taskpk):
dataset = Dataset.objects.get(id=datasetpk)
userprofile = UserProfile.objects.get(id=userpk)
index = userprofile.tasklistitem_set.count()
newtasklistitem = TaskListItem()
newtasklistitem.userprofile = userprofile
newtasklistitem.op_task = OpTask.objects.get(id=taskpk)
newtasklistitem.product = Product.objects.get(id=productpk)
newtasklistitem.index = index
newtasklistitem.task_active = True
newtasklistitem.save()
return redirect('exp_portal:add_user_task', userpk)
def view_users_experiment(request, experiment_name):
print "Experiment User Request From: ", request.META['REMOTE_ADDR']
if request.META['REMOTE_ADDR'] != '127.0.0.1':
return HttpResponseForbidden()
experiment = Experiment.objects.get(name=experiment_name)
userprofiles = experiment.userprofile_set.all()
user_hashes = {}
for userprofile in userprofiles:
tasklistitems = userprofile.tasklistitem_set.all()
completedTasks = [task for task in tasklistitems if task.task_complete is True]
#Mechanical Turk task completion payment code
mtcode = mechanicalTurk.generateCode(userprofile.user.id,userprofile.user_hash)
if userprofile.intake_complete == 1:
session_id = str(userprofile.user_hash)+'::0'
stoutVars = {'SYS.FIL.DAT.':'',
'SYS.FIL.EXP.':SM_EXPERIMENT_NAME,
'SYS.FIL.APP.':'',
'SYS.FIL.TSK.':'INTAKE',
'SYS.FIL.ORD.':'',
'SYS.FIL.STD.':''}
user_hashes[session_id]={'mtcode':mtcode,'vars':stoutVars}
for task in completedTasks:
#unique identifier for user::task
session_id = str(userprofile.user_hash)+'::'+str(task.pk)
#TEST VALUE
#session_id = "49bacc695d39a2f23cf44f949409e7::1104"
#ALE logged survey start time
XDATA_INDEX="xdata_v3"
es = Elasticsearch(ALE_URL)
queryData = {}
fieldFilter = ["timestamp", "sessionID", "elementId"]
sMatch = {"match" : {"sessionID" : session_id}}
eMatch = {"match" : {"elementId" : "open_task_button"}}
mustField = [sMatch, eMatch]
queryData["query"] = { "bool": { "must" : mustField } }
results = es.search(index=XDATA_INDEX, body=queryData, fields=fieldFilter, size=1000)['hits']
timestamps = [d['fields']['timestamp'] for d in results['hits']]
#ES WILL BE BLOCKED SOON. INSTEAD:
#results = requests.get(ALE_URL + "/" + XDATA_INDEX + "/select?q=sessionID:" + sessionID + "&q=elementID:open_task_button&fl=timestamp,sessionID,elementID&size=1000")
if len(timestamps) > 1:
print "Warning, more than 1 timestamp from Elastic"
if len(timestamps) < 1:
print "Warning, no timestamp from Elastic"
timestamps = [["NA"]]
print "Elastic result: ", timestamps
#print "Timestamp: ", timestamps[0][0], "; Type: ", type(timestamps[0][0])
stoutVars = {'SYS.FIL.DAT.':task.op_task.dataset.name,
'SYS.FIL.EXP.':SM_EXPERIMENT_NAME,
'SYS.FIL.APP.':task.product.name,
'SYS.FIL.TSK.':task.op_task.name,
'SYS.FIL.ORD.':str(task.index),
'SYS.FIL.STD.':timestamps[0][0]}
user_hashes[session_id]={'mtcode':mtcode,'vars':stoutVars}
response = JsonResponse(user_hashes, safe=False)
return response