from django.shortcuts import render
from django.shortcuts import render_to_response
from django.http import HttpResponse, HttpResponseRedirect
from django.template import RequestContext, loader
from django.core.urlresolvers import reverse

from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.decorators.csrf import csrf_protect
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
from django.contrib.auth import login as django_login
from django.contrib.auth import logout as django_logout
from django.contrib.auth.forms import AuthenticationForm

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core import serializers

from itertools import chain

# Create your views here.
from .models import Session
from .models import Tracking
#from .models import Gaze
from .models import AOI
from .models import AoiPosition

from .forms import SessionForm
from .forms import AOIForm
from .forms import LoginForm
from .forms import RegisterForm
from .forms import AccountForm
from .forms import AOIUpdateForm

from django.conf import settings

from django.core.mail import send_mail

import logging
logger = logging.getLogger(__name__)

import pdb
import json
import datetime

from PIL import Image, ImageDraw
from io import BytesIO
import base64
import cStringIO

import boto3
from boto3.s3.transfer import S3Transfer
from botocore.client import Config

import os
import threading


from random import randint
from utils import GeaData

def index(request):
	return HttpResponseRedirect('login')
	
@login_required
def sessions(request):	
	logger.info('Getting sessions for user ' + str(request.user))
	sessions = Session.objects.select_related().filter(owner = request.user) | Session.objects.select_related().filter(shared = request.user)
	sessions = sessions.distinct()
	paginator = Paginator(sessions, 15) # Show 25 contacts per page
	page = request.GET.get('page')

	#pdb.set_trace()
		
	try:
		sessions_list = paginator.page(page)
	except PageNotAnInteger:
		# If page is not an integer, deliver first page.
		sessions_list = paginator.page(1)
	except EmptyPage:
		logger.error('page out of range, delivering last page ')
			# If page is out of range (e.g. 9999), deliver last page of results.
		sessions_list = paginator.page(paginator.num_pages)
	
	sessionForm = SessionForm()
	aoiForm = AOIForm()
	aoiUpdateForm = AOIUpdateForm()
	
	return render(request, 'gazeanalyserapp/sessions.html' , {'sessionForm': sessionForm, 'aoiForm' : aoiForm, 'aoiUpdateForm' : aoiUpdateForm, 'sessions': sessions_list})

@login_required
def createSession(request):

	logger.info('Creating session for user ' + str(request.user))
	if request.is_ajax() and request.method == 'POST':
		form = SessionForm(request.POST)
		errors = {}
		if form.is_valid():
			owner = request.user
			name = request.POST['name']
			description = request.POST['description']
			session = Session(owner = owner, description = description, name = name, confirmation=randint(10000, 99999))
			session.save()
			
			
			logger.info('Session ' + str(session.key) + ' with params (' + str(owner) + ', ' + name + ', ' + description + ', ' + str(confirmation) + ' succesfully created.') 
			
			errors['valid'] = 1
			data = json.dumps(errors)
			return HttpResponse(data, content_type='application/json')
		else:
			#errors = dict([,(k, [unicode(e) for e in v]) for k,v in form.errors.items()])
			
			errors['valid'] = 0
			
			logger.error('Session form is not valid. Session will not be created')
			
			for k,v in form.errors.items():
				errors[k] = v
				logger.error('Session form error = ' + v)
			
			data = json.dumps(errors)
			return HttpResponse(data, content_type='application/json')

	return HttpResponseRedirect(reverse("sessions"))

@login_required
def uploadImage(request):
	if request.is_ajax() and request.method == 'POST':
		
		form = AOIForm(request.POST, request.FILES)
		errors = {}
		
		if form.is_valid():
		
			uuid = request.POST['key']
			session = Session.objects.get(key = uuid)
		
			logger.info('Uploading image to session ' + uuid)
		
			if(session.owner.id == request.user.id):
		
				file = request.FILES['aoi']
				
				aoi = AOI(session = session, file = file)
				aoi.save()
				
				logger.info('Image file saved to ' +  str(aoi.file.name))
				
				errors['valid'] = 1
				data = json.dumps(errors)
				return HttpResponse(data, content_type='application/json')
			else:
				errors['valid'] = 0
			
				errors['upload_image_error'] = [] 
				errors['upload_image_error'].append("You are not owner of this session!")
				
				logger.info('Image upload error. User is not owner of this session')
				
				data = json.dumps(errors)
				return HttpResponse(data, content_type='application/json')	
		else:
			errors['valid'] = 0
			
			logger.error('Upload form is not valid. Image will not be uploaded')
			
			for k,v in form.errors.items():
				errors[k] = v
				logger.error('Upload form error = ' + v)
			
			data = json.dumps(errors)
			return HttpResponse(data, content_type='application/json')

	return HttpResponseRedirect(reverse("sessions"))
	
@login_required
def createSessionNoAjax(request):
	# if this is a POST request we need to process the form data
	if request.method == 'POST':
		# create a form instance and populate it with data from the request:
		form = SessionForm(request.POST, request.FILES)
		# check whether it's valid:
		if form.is_valid():
			# process the data in form.cleaned_data as required
			# ...
			owner = request.user
			description = request.POST['description']
			aoi = request.FILES['aoi']
			session = Session(owner = owner, description = description, aoi = aoi)
			session.save()
			
			# redirect to a new URL:
			return HttpResponseRedirect(reverse("sessions"))	
			
	# if a GET (or any other method) we'll create a blank form
	else:
		form = SessionForm()
		
	return render(request, 'gazeanalyserapp/createSession.html', {'form': form})

@login_required
def deleteSession(request, uuid):
		
		logger.info('Deleting session ' + uuid)
	#pdb.set_trace()
	#try:
		session = Session.objects.get(key = uuid)

		if(session.owner.id == request.user.id):
			session.delete()
			logger.info('Session ' + uuid + 'deleted succesfully')
	
		return HttpResponseRedirect(reverse("sessions"))
	#except:
		#return HttpResponseRedirect(reverse("sessions"))
	
def register(request):
	if request.method == 'POST':
		form = RegisterForm(request.POST)
		if form.is_valid():
			username = request.POST['username']
			password = request.POST['password']
			firstName = request.POST['first_name']
			lastName = request.POST['last_name']
			email = request.POST['email']
	
			user = User.objects.create_user(username, email, password)
			user.first_name = firstName
			user.last_name = lastName
	
			user.save()
			
			return render(request, 'gazeanalyserapp/login.html', {'form': form})
		else:
			return render(request, 'gazeanalyserapp/register.html', {'form': form})
	else:
		form = RegisterForm()
		return render(request, 'gazeanalyserapp/register.html', {'form': form})
	
def login(request):
	
	if request.method == 'POST':
		form = AuthenticationForm(data=request.POST)
		if form.is_valid():
			user = form.get_user()
			if user is not None:
				if user.is_active:
					django_login(request, user)
					return HttpResponseRedirect(reverse("sessions"))
			else:
				return render(request, 'gazeanalyserapp/login.html', {'form': form})
		else:
			return render(request, 'gazeanalyserapp/login.html', {'form': form})
	else:
		form = AuthenticationForm()
		return render(request, 'gazeanalyserapp/login.html', {'form': form})


def logout(request):
	django_logout(request)
	return HttpResponseRedirect(reverse("login"))
	
	
	
def gazeTrackerBeta(request,uuid):
	logger.info('Loading gaze tracking front end for session ' + uuid)
	try:
		session = Session.objects.get(key = uuid)
		return render(request, 'gazeanalyserapp/gazeTrackerBeta.html', context={'session':session})
	except:
		return render(request, 'gazeanalyserapp/404.html')
	
def gazeTracker(request,uuid):
	logger.info('Loading gaze tracking front end for session ' + uuid)
	try:
		session = Session.objects.get(key = uuid)
		return render(request, 'gazeanalyserapp/gazeTracker.html', context={'session':session})
	except:
		return render(request, 'gazeanalyserapp/404.html')


def TrackDetect(request):
	return render(request, 'gazeanalyserapp/TrackerDetector.html')		
		
def uploadAnnotation(request, uuid):
	data = json.loads(request.POST.get('annData'))
	sessionID = request.POST['sessionID']
	timestampID = request.POST['timeStamp']
	bucketKey = 'gaze-annotations'
	
	client = boto3.client('s3', aws_access_key_id = 'AKIAJ2SINXH66UFNIAYQ', aws_secret_access_key = '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', config=Config(signature_version='s3v4'), region_name='us-east-1')
	transfer = S3Transfer(client)
	extra_args = {'ServerSideEncryption': 'aws:kms'}
	
	outputFileName = settings.MEDIA_ROOT + '/' + 'annotations_' + str(sessionID) + '_' + str(timestampID) + '.txt'
	destFileName = 'annotations_' + str(sessionID) + '_' + str(timestampID) + '.txt'
	
	with open(outputFileName, 'w') as outfile:
		json.dump(data, outfile)
	
	print "bucketKey value: %s" % bucketKey
	print "outputFileName value: %s" % outputFileName
	print "outfile value: %s" % outfile
	
	transfer.upload_file(outputFileName, bucketKey, destFileName, extra_args=extra_args)

	os.remove(outputFileName)
	print "SUCCESS!"
	return HttpResponse('success')
	
def uploadCalibrationData(request, uuid):
	data = json.loads(request.POST.get('calibData'))
	timestampID = request.POST['timeStamp']
	sessionID = request.POST['sessionID']
	bucketKey = 'gaze-annotations'
	
	client = boto3.client('s3', aws_access_key_id = 'AKIAJ2SINXH66UFNIAYQ', aws_secret_access_key = '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', config=Config(signature_version='s3v4'), region_name='us-east-1')
	transfer = S3Transfer(client)
	extra_args = {'ServerSideEncryption': 'aws:kms'}
	
	outputFileName = settings.MEDIA_ROOT + '/' + 'calibration_' + str(sessionID) + '_' + str(timestampID) + '.txt'
	
	with open(outputFileName, 'w') as outfile:
		json.dump(data, outfile)
	
	print "bucketKey value: %s" % bucketKey
	print "outputFileName value: %s" % outputFileName
	print "outfile value: %s" % outfile

	transfer.upload_file(outputFileName, bucketKey, outputFileName, extra_args=extra_args)
	
	os.remove(outputFileName)
	
	print "SUCCESS!"
	return HttpResponse('success')
	
def upload(request, uuid):

	logger.info('Uploading tracking data for session ' + uuid)
	try:
		type = request.POST.get('type')	
		width = request.POST.get('width')
		height = request.POST.get('height')
		quality = request.POST.get('quality')
		
		data = json.loads(request.POST.get('data'))
		aois = json.loads(request.POST.get('aois'))
		
		validations = json.loads(request.POST.get('validation'))
		
		#trackResults = request.POST.getlist('trackResults[]')	
		#geResults = request.POST.getlist('GEData[]')

		session = Session.objects.get(key = uuid)

		tracking = Tracking(session = session, quality = quality, width = width, height = height)
		tracking.save()
		
		logger.info('Creating tracking data with params ( ' + str(tracking.id) + ', ' + str(session.key) + ', ' + str(quality) + ', ' + str(width) + ', ' + str(height))
		
		i = 0
		logger.info('Saving AOI positions for tracking ' + str(tracking.id) + 'Number of AOIs in this session is ' + str(len(aois)))
		while i < len(aois):
			position = AoiPosition(aoi_id = aois[i]['key'], tracking_id = tracking.id, x = aois[i]['x'], y = aois[i]['y'], width = aois[i]['width'], height = aois[i]['height'])
			i+=1
			position.save()
		
		#j = 0
		#i = 0
		#count = 0

		x = []
		y = []
		timestamp = []
		quality = []
		emo_anger = []
		emo_disgust = []
		emo_fear = []
		emo_happy = []
		emo_sadness = []
		emo_surprise = []
		gender = []
		i = 0
		#pdb.set_trace()
		logger.info('Processing frame data for gaze and emotion tracking')
		while i < len(data):
			x.append(data[i]['x'])
			y.append(data[i]['y'])
			timestamp.append(data[i]['timestamp'])
			quality.append(data[i]['quality'])
			
			emo_anger.append(data[i]['anger'])
			emo_disgust.append(data[i]['disgust'])
			emo_fear.append(data[i]['fear'])
			emo_happy.append(data[i]['happy'])
			emo_sadness.append(data[i]['sadness'])
			emo_surprise.append(data[i]['surprise'])
			gender.append(data[i]['gender'])
			i+=1
		
		i = 0
		
		validPoints = []
		
		logger.info('Processing validation point data')
		while i < len(validations):
			validPoint = {}
			validPoint['position_x'] = validations[i]['position_x']
			validPoint['position_y'] = validations[i]['position_y']
			validPoint['gaze_x'] = validations[i]['gaze_x']
			validPoint['gaze_y'] = validations[i]['gaze_y']
			
			validPoints.append(validPoint)
			i+=1
		
		logger.info('Creating JSON dictionary with frame data and validation points')
		data = {'x' : x, 'y' : y, 'timestamp' : timestamp, 'emo_anger' : emo_anger, 'emo_disgust' : emo_disgust, 'emo_fear' : emo_fear, 'emo_happy' : emo_happy, 'emo_sadness' : emo_sadness, 'emo_surprise' : emo_surprise,
				'gender' : gender, 'quality' : quality, 'validations' : validPoints}
		
		filename = str(tracking.id) + "_regressor.json" if type == 'regressor' else str(tracking.id) + "_gauss.json"
		logger.info('Saving frame data and validation points to file with name ' + filename)
		
		with open(settings.MEDIA_ROOT + '/' + filename, 'w') as outfile:
			json.dump(data, outfile)		
		
		logger.info('Data sucessfuly dumped to ' + settings.MEDIA_ROOT + '/' + filename)
		
		tracking.file.name = "./" + filename
		tracking.save(update_fields=['file'])
		
		logger.info('Tracking ' + str(tracking.id) + ' updated with data file location')
		
		return HttpResponse(json.dumps(dict(trackingID=tracking.id)), content_type='application/json')
	except Exception, e:
		print(str(e))
		logger.error(str(e))
		return HttpResponse('Upload failed')

@login_required	
def getResults(request, uuid):	
	session = Session.objects.get(key = uuid)
	
	is_shared = False
	for user in session.shared.all():
		if(user.id == request.user.id):
			is_shared = True
			break
	
	if(session.owner.id != request.user.id and not is_shared):
		return HttpResponse('You are not allowed to view this session. This incident has been reported.')
	
	trackings = Tracking.objects.select_related().filter(session = session.id)
	#trackings = Tracking.objects.select_related().filter(session = session.id).filter(width__gt=1000).filter(height__gt=600)
	#trackings = Tracking.objects.select_related().filter(session = session.id).filter(width=1920).filter(height=1080)
	
	results = []	

	for tracking in trackings:		
		
		#print(settings.MEDIA_ROOT + "/" + tracking.file.name)
		
		json_data=open(settings.MEDIA_ROOT + '/' + tracking.file.name).read()
		jsonData = json.loads(json_data)
		
		aois = []
		
		positions = AoiPosition.objects.filter(tracking = tracking)

		for position in positions:
			aois.append(position.as_json())
		
		count = len(jsonData['timestamp'])
		data = []
		for i in range(0, count):
			emotions = []
			emotions.append(jsonData['emo_anger'][i])
			emotions.append(jsonData['emo_disgust'][i])
			emotions.append(jsonData['emo_fear'][i])
			emotions.append(jsonData['emo_happy'][i])
			emotions.append(jsonData['emo_sadness'][i])
			emotions.append(jsonData['emo_surprise'][i])
			
			framedata = GeaData(jsonData['timestamp'][i], jsonData['x'][i], jsonData['y'][i], jsonData['quality'][i], jsonData['gender'][i], emotions)
			
			#if(framedata.timestamp > 3000 and framedata.timestamp < 6000 or 
			#   framedata.timestamp > 7000 and framedata.timestamp < 10000 or
			#   framedata.timestamp > 11000 and framedata.timestamp < 14000 or
			#   framedata.timestamp > 15000 and framedata.timestamp < 18000 or
			#   framedata.timestamp > 19000 and framedata.timestamp < 22000):
			data.append(framedata.as_json())

		validations = []
		if('validations' in jsonData):
			validations = jsonData['validations']
		
		# tracking.file contains 'gauss' type = gauss else regressor
		results.append(dict(name=tracking.file.name, tracking = tracking.id, width=tracking.width, height=tracking.height, quality = tracking.quality, aois=aois, data=data, validations=validations))		
		#for gaze in tracking.gaze_set.all():
			#gazes.append(dict(width=tracking.width, height=tracking.height, tracking=tracking.id, quality=tracking.quality, data=gaze.as_json()))
	
	return HttpResponse(json.dumps(results), content_type='application/json')
	
@login_required	
def getResult(request, uuid, page, pageSize):	
	
	session = Session.objects.get(key = uuid)
	
	is_shared = False
	for user in session.shared.all():
		if(user.id == request.user.id):
			is_shared = True
			break
	
	if(session.owner.id != request.user.id and not is_shared):
		return HttpResponse('You are not allowed to view this session. This incident has been reported.')
	
	trackings = Tracking.objects.select_related().filter(session_id = session.id)
	
	results = []		
	
	pageSize = int(pageSize)
	page = int(page)
	
	if trackings.count() < pageSize:
		nPages = 1
	else:
		nPages = int(trackings.count()) // pageSize if int(trackings.count()) // pageSize == 0 else int(trackings.count()) // pageSize + 1
	
	if page > nPages:
		return HttpResponse(json.dumps(results), content_type='application/json')
	
	nPageElements = pageSize if page * pageSize <= int(trackings.count()) else int(trackings.count()) % pageSize
	
	pagedTrackings = []
	for i in range((page - 1) * pageSize, (page - 1) * pageSize + nPageElements):
		pagedTrackings.append(trackings[i])
	
	#print(settings.MEDIA_ROOT + "/" + tracking.file.name)
	
	for tracking in pagedTrackings:
	
		json_data=open(settings.MEDIA_ROOT + '/' + tracking.file.name).read()
		jsonData = json.loads(json_data)
		
		aois = []
		
		positions = AoiPosition.objects.filter(tracking = tracking)

		for position in positions:
			aois.append(position.as_json())
		
		count = len(jsonData['timestamp'])
		data = []
		for i in range(0, count):
			emotions = []
			emotions.append(jsonData['emo_anger'][i])
			emotions.append(jsonData['emo_disgust'][i])
			emotions.append(jsonData['emo_fear'][i])
			emotions.append(jsonData['emo_happy'][i])
			emotions.append(jsonData['emo_sadness'][i])
			emotions.append(jsonData['emo_surprise'][i])
			
			framedata = GeaData(jsonData['timestamp'][i], jsonData['x'][i], jsonData['y'][i], jsonData['quality'][i], jsonData['gender'][i], emotions)
			
			#if(framedata.timestamp > 3000 and framedata.timestamp < 6000 or 
			#   framedata.timestamp > 7000 and framedata.timestamp < 10000 or
			#   framedata.timestamp > 11000 and framedata.timestamp < 14000 or
			#   framedata.timestamp > 15000 and framedata.timestamp < 18000 or
			#   framedata.timestamp > 19000 and framedata.timestamp < 22000):
			data.append(framedata.as_json())

		validations = []
		if('validations' in jsonData):
			validations = jsonData['validations']
		
		# tracking.file contains 'gauss' type = gauss else regressor
		results.append(dict(name=tracking.file.name, tracking = tracking.id, width=tracking.width, height=tracking.height, quality = tracking.quality, aois=aois, data=data, validations=validations))		
		#for gaze in tracking.gaze_set.all():
			#gazes.append(dict(width=tracking.width, height=tracking.height, tracking=tracking.id, quality=tracking.quality, data=gaze.as_json()))
	
	return HttpResponse(json.dumps(results), content_type='application/json')	
	
@login_required	
def details(request, uuid):
	try:
		session = Session.objects.get(key = uuid)
		return render(request, 'gazeanalyserapp/results.html', context={'session':session})
	except:
		return render(request, 'gazeanalyserapp/404.html')
	
def httpreq(request):
	return render(request, 'gazeanalyserapp/httpreq.html')
	
def handler404(request):
	response = render_to_response('gazeanalyserapp/404.html', {}, context_instance=RequestContext(request))
	response.status_code = 404
	return response
	
def handler503(request):
	response = render_to_response('gazeanalyserapp/503.html', {}, context_instance=RequestContext(request))
	response.status_code = 503
	return response
	
def comment(request):
	sessionID = request.POST.get('sessionID')
	#trackingID = request.POST.get('trackingID')
	trackingID = 0
	comment = request.POST.get('comment')
	
	send_mail('comment for session ' + str(sessionID), str(comment), 'gea@visagetechnologies.com', ['gea@visagetechnologies.com'])
	
	return HttpResponse('Comment sent!')
	
def about(request):
	return render(request, 'gazeanalyserapp/about.html')
	
def confirmation(request, uuid):
	session = Session.objects.get(key = uuid)
	#return HttpResponse(json.dumps(dict(confirmation="6765615F31372E322E3136")), content_type='application/json')
	return HttpResponse(json.dumps(dict(confirmation=session.confirmation)), content_type='application/json')
	
@login_required	
def update(request):
	
	form = SessionForm(request.POST)
	errors = {}
	
	if form.is_valid():
		uuid = request.POST['key']
		name = request.POST['name']
		description = request.POST['description']
		
		session = Session.objects.get(key = uuid)
		
		if session.owner.id == request.user.id:
		
			session.name = name
			session.description = description
			session.save(update_fields=['name', 'description'])
			
			errors['valid'] = 1
			data = json.dumps(errors)
			
			return HttpResponse(data, content_type='application/json')
		else:
			errors['valid'] = 0
			
			errors['update_session_error'] = [] 
			errors['update_session_error'].append("You are not owner of this session!")
			
			data = json.dumps(errors)
			return HttpResponse(data, content_type='application/json')	
			
	else:
		errors['valid'] = 0
			
		for k,v in form.errors.items():
			errors[k] = v
			
		data = json.dumps(errors)
		return HttpResponse(data, content_type='application/json')	
	
		
	
@login_required	
def updateNoAjax(request):
	uuid = request.POST['key']
	name = request.POST['name']
	description = request.POST['description']
	
	try:
		session = Session.objects.get(key = uuid)
		session.name = name
		session.description = description
		session.save(update_fields=['name', 'description'])
		
		#return render(request, 'gazeanalyserapp/sessions.html')
		return HttpResponseRedirect(reverse("sessions"))
	except:
		return render(request, 'gazeanalyserapp/404.html')	

@login_required	
def updateimageNoAjax(request):
	id = request.POST['id']
	duration = request.POST['duration']
	try:
		aoi= AOI.objects.get(id = id)
		aoi.duration = int(float(duration)*1000)
		
		aoi.save(update_fields=['duration'])
		
		#return render(request, 'gazeanalyserapp/sessions.html')
		return HttpResponseRedirect(reverse("sessions"))
	except:
		return render(request, 'gazeanalyserapp/404.html')	
		
@login_required	
def updateimage(request):

	form = AOIUpdateForm(request.POST)	
	errors = {}
	
	if(form.is_valid()):
		id = request.POST['id']
		duration = request.POST['duration']
	
		
		if float(duration) < 0:
			errors['valid'] = 0
			errors['duration'] = [] 
			errors['duration'].append("Duration cannot be lesser than 0!")
			data = json.dumps(errors)
			return HttpResponse(data, content_type='application/json')
		
		aoi= AOI.objects.get(id = id)
		
		if aoi.session.owner.id == request.user.id:
		
			aoi.duration = int(float(duration)*1000)
			
			aoi.save(update_fields=['duration'])
			
			errors['valid'] = 1
			data = json.dumps(errors)
			return HttpResponse(data, content_type='application/json')
		else:
			errors['valid'] = 0
			
			errors['update_image_error'] = [] 
			errors['update_image_error'].append("You are not owner of this session!")
			
			data = json.dumps(errors)
			return HttpResponse(data, content_type='application/json')	
	else:
		
		errors['valid'] = 0
			
		for k,v in form.errors.items():
			errors[k] = v
			
		data = json.dumps(errors)
		return HttpResponse(data, content_type='application/json')	
	
@login_required		
def account(request):
	if request.method == 'POST':
		form = AccountForm(data=request.POST, user=request.user)
		if form.is_valid():
			new_password = request.POST['new_password']
			
			request.user.set_password(new_password)
			request.user.save(update_fields=['password'])
			
			return HttpResponseRedirect(reverse("sessions"))			
		else:
			return render(request, 'gazeanalyserapp/account.html', {'form': form})
	else:
		form = AccountForm(user=request.user)
		return render(request, 'gazeanalyserapp/account.html', {'form': form})
	
	
def uploadAnnotatedImageToS3(request):
	input_string = request.POST['url']
	bucketKey = 'gaze-annotations'
	sessionID = request.POST['sessionID']
	timeStamp = request.POST['timeStamp']
	calibPointIndex = request.POST['calibPointIndex']
	data_index = input_string.index('base64') + 7
	data = input_string[data_index:len(input_string)]
	im = Image.open(BytesIO(base64.b64decode(data)))
	
	session = Session.objects.get(id = sessionID)
	
	if(int(calibPointIndex) < 10):
		calibPointIndex = '0' + calibPointIndex
	
	imName = settings.MEDIA_ROOT + '/' + str(sessionID) + str(timeStamp) + calibPointIndex + '.jpg'
	im.save(imName, 'JPEG')

	client = boto3.client('s3', aws_access_key_id = 'AKIAJ2SINXH66UFNIAYQ', aws_secret_access_key = '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', config=Config(signature_version='s3v4'), region_name='us-east-1')
	transfer = S3Transfer(client)
	extra_args = {'ServerSideEncryption': 'aws:kms'}
	
	outputFileName = 'img' + '_' + str(sessionID) + '_' + str(timeStamp) + '_' + calibPointIndex + '.jpg'
	
	transfer.upload_file(imName, bucketKey, outputFileName, extra_args=extra_args)

	os.remove(imName)
	return HttpResponse('success')
	
def uploadLog(request):
	message = request.POST['message']
	client = request.POST['clientID']
	logger.info('CLIENT ' + client + ': ' + message)
	return HttpResponse('log processed')