def modify_quest(request, no):
	'''modify a quest'''

	auth = Authentication(request)
	if not auth.is_login():
		return HttpResponseRedirect(reverse('message', kwargs={'msg': "loginfirst"}))

	try:
		no = int(no)
		quest = Questionnaire.objects.get(id=no, author=auth.get_user())
	except:
		# raise Http404()
		return HttpResponseRedirect(reverse('message', kwargs={'msg': "errorpage"}))

	if quest.released:
		return HttpResponseRedirect(reverse('message', kwargs={'msg': "errorpage"}))

	id = quest.id
	title = quest.title
	subject = quest.subject
	description = quest.description
	contents = quest.contents
	anonymous_limit = quest.anonymous_limit
	questions = Questions()
	questions.clean()
	questions.read(contents)

	return render(request, 'investmanager/edit_quest.html', {'id':id, 'title':title, 'subject':subject, 'description':description, 'questions':questions.questionList, "anonymous_limit":anonymous_limit},)
def modify_quest(request, no):
	'''modify a quest'''

	try:
		no = int(no)
		quest = Questionnaire.objects.get(id=no)
	except:
		raise Http404()

	id = quest.id
	title = quest.title
	subject = quest.subject
	description = quest.description
	contents = quest.contents
	questions = Questions()
	questions.clean()
	questions.read(contents)
	
	return render(request, 'investmanager/modify_quest.html', {'id':id, 'title':title, 'subject':subject, 'description':description, 'questions':questions.questionList},)
def constructQuestions(request):
	'''use a request infomation to construct a Questionnaire'''
	
	questions = Questions()
	questions.clean()
	try:
		questionTitles = request.POST.getlist('question')
		questionTypes = request.POST.getlist('type')
		# 根据post的信息构造Question,将Question加入Questions
		# 太丑了救命
		for i, qtitle in enumerate(questionTitles):
			qtype = questionTypes[i]
			qitems = []
			if qtype == "single" or qtype == "multiply":
				value = 'items' + str(i)
				qitems = request.POST.getlist(value)
			print qtitle, qtype, qitems
			question = Question('', qtype, qtitle, qitems)
			questions.addQuestion(question)
	except Exception, e:
		print e
def result(request, qid):
	try:
		Naire = Questions()
		Naire.clean()
		Naire.qid = qid
		Naire.read(get_object_or_404(Questionnaire, pk=qid).contents)
		q = get_object_or_404(Questionnaire, pk=qid)
		
		auth = Authentication(request)
		user = auth.get_user()
		if not q.released:
			raise Exception()
		if q.anonymous_limit and user == None:
			raise Exception()
		rts = Result.objects.filter(questionnaire_id=qid)

		# Start doing data collection
		# Dataset init
		dataset = []
		for x in xrange(1,Naire.count+1):
			if Naire.questionList[x-1].qtype == 'single':
				choice_set = []
				for x in xrange(0,len(Naire.questionList[x-1].items)):
					choice_set.append(0)
				dataset.append(choice_set)
			elif Naire.questionList[x-1].qtype == 'multiply':
				choice_set = []
				for x in xrange(0,len(Naire.questionList[x-1].items)):
					choice_set.append(0)
				dataset.append(choice_set)
			elif Naire.questionList[x-1].qtype == 'judge':
				choice_set = [ 0 , 0 ]
				dataset.append(choice_set)
			elif Naire.questionList[x-1].qtype == 'essay':
				dataset.append([])

		#print dataset
		# ergodic
		count = 0
		for x in rts:
			simple_sheet = eval(x.answer)
			list_count = 0
			for l in simple_sheet:
				if Naire.questionList[list_count].qtype != 'essay':
					for i in l:
						dataset[list_count][int(i)-1] += 1
				elif Naire.questionList[list_count].qtype == 'essay':
					dataset[list_count] += l
				list_count += 1
			count += 1
		#print dataset
		return render(request, 'results/results.html' ,{'Questionnaire':q ,'naire':Naire ,'qid':qid ,'result':dataset ,'count':count,})
	except:
		return render(request, "homepage/message.html", {"message": AlertMessage("danger", "Page 404!", "Wrong Place you've got.", "/"),})
def answer(request, qid):
	try:
		Naire = Questions()
		Naire.clean()
		Naire.qid = qid
		#print 'questions:', len(Naire.questionList)
		q = get_object_or_404(Questionnaire, pk=qid)
		if q.closed or not q.released:
			raise Exception()

		auth = Authentication(request)
		user = auth.get_user()

		if q.anonymous_limit and user == None:
			raise Exception()
		elif user != None:
			if q.permitobjects_limit != '[]':
				limitlist = eval(q.permitobjects_limit)
				if user.email in limitlist:
					pass
				else:
					return render(request, "homepage/message.html", {"message": AlertMessage("danger", "Page 404!", "You have no right to answer this questionnaire!", "/"),})
			if q.forbidobjects_limit != '[]':
				limitlist = eval(q.forbidobjects_limit)
				if user.email not in limitlist:
					pass
				else:
					return render(request, "homepage/message.html", {"message": AlertMessage("danger", "Page 404!", "You have no right to answer this questionnaire!", "/"),})

			rts = Result.objects.filter(questionnaire_id=qid)
			for r in rts:
				if r.participant_id == user.email:
					return render(request, "homepage/message.html", {"message": AlertMessage("warning", "Don't answer same naire twice!", "You've already answered this Questionnaire", "/"),})
		
		Naire.read(q.contents)
		#print 'questions:', len(Naire.questionList)
		return render(request, 'results/answer.html' ,{'Questionnaire':q ,'naire':Naire ,'qid':qid})
	except:
		return render(request, "homepage/message.html", {"message": AlertMessage("danger", "Page 404!", "Wrong place you've got.", "/"),})
def publish(request, qid):
	try:
		Naire = Questions()
		Naire.clean()
 		Naire.qid = qid
		Naire.read(get_object_or_404(Questionnaire, pk=qid).contents)
		result = []
		for x in xrange(1,Naire.count+1):
			if Naire.questionList[x-1].qtype == 'single':
				result.append([str(request.POST[str(x)])])
			elif Naire.questionList[x-1].qtype == 'multiply':
				rlist = request.REQUEST.getlist(str(x))
				if len(rlist)==0:
					raise Exception()
				m = []
				for r in rlist:
					m .append(r)
				result.append(m)
			elif Naire.questionList[x-1].qtype == 'judge':
				result.append([str(request.POST[str(x)])])
			elif Naire.questionList[x-1].qtype == 'essay':
				if str(request.POST[str(x)]) !=  '' or str(request.POST[str(x)]) !=' ':
					result.append([str(request.POST[str(x)])])

		auth = Authentication(request)
		user = auth.get_user()
		if user == None:
			user = "******"
			
		Questionnaire_answered = Questionnaire.objects.get(pk=qid)
		r = Result(questionnaire_id=Questionnaire_answered,participant_id=user,answer=str(result))
		#print str(result)
		r.save()
		return render(request, "homepage/message.html", {"message": AlertMessage("success", "Success!", "You have already posted your answers", "/naire"+str(qid)+"/results"),})
	except:
		q = get_object_or_404(Questionnaire, pk=qid)
		Naire = Questions()
		Naire.clean()
		Naire.qid = qid
		Naire.read(get_object_or_404(Questionnaire, pk=qid).contents)
		return render(request, 'results/answer.html',{'Questionnaire':q ,'naire':Naire ,'qid':qid, 'errorMsg':'Not finished yet!'})
def publish(request, qid):
	try:
		Naire = Questions()
		Naire.clean()
 		Naire.qid = qid

 		q = get_object_or_404(Questionnaire, pk=qid)		
 		if q.closed or not q.released:
			return render(request, "homepage/message.html", {"message": AlertMessage("danger", "Page 404!", "You have no right to answer this questionnaire!", "/"),})

		auth = Authentication(request)
		user = auth.get_user()

		if q.anonymous_limit and user == None:
			return render(request, "homepage/message.html", {"message": AlertMessage("danger", "Page 404!", "You have no right to answer this questionnaire!", "/"),})
		elif user != None:
			if q.permitobjects_limit != '[]':
				limitlist = eval(q.permitobjects_limit)
				if user.email in limitlist:
					pass
				else:
					return render(request, "homepage/message.html", {"message": AlertMessage("danger", "Page 404!", "You have no right to answer this questionnaire!", "/"),})
			if q.forbidobjects_limit != '[]':
				limitlist = eval(q.forbidobjects_limit)
				if user.email not in limitlist:
					pass
				else:
					return render(request, "homepage/message.html", {"message": AlertMessage("danger", "Page 404!", "You have no right to answer this questionnaire!", "/"),})

			rts = Result.objects.filter(questionnaire_id=qid)
			for r in rts:
				if r.participant_id == user.email:
					return render(request, "homepage/message.html", {"message": AlertMessage("warning", "Don't answer same naire twice!", "You've already answered this Questionnaire", "/"),})
		
		Naire.read(q.contents)
		result = []
		for x in xrange(1,Naire.count+1):
			if Naire.questionList[x-1].qtype == 'single':
				result.append([str(request.POST[str(x)])])
			elif Naire.questionList[x-1].qtype == 'multiply':
				rlist = request.REQUEST.getlist(str(x))
				if len(rlist)==0:
					raise Exception()
				m = []
				for r in rlist:
					m .append(r)
				result.append(m)
			elif Naire.questionList[x-1].qtype == 'judge':
				result.append([str(request.POST[str(x)])])
			elif Naire.questionList[x-1].qtype == 'essay':
				if str(request.POST[str(x)]) !=  '' or str(request.POST[str(x)]) !=' ':
					result.append([str(request.POST[str(x)])])

		email = ''
		if user == None:
			email = "*****@*****.**"
			Questionnaire_answered = Questionnaire.objects.get(pk=qid)
			r = Result(questionnaire_id=Questionnaire_answered,participant_id=email,answer=str(result))
			r.save()
			print email
			return render(request, "homepage/message.html", {"message": AlertMessage("success", "Success!", "You have already posted your answers", "/naire"+str(qid)+"/results"),})
		elif user != None:
			rts = Result.objects.filter(questionnaire_id=qid)
			for r in rts:
				if r.participant_id == user.email:
					print user.email
					return render(request, "homepage/message.html", {"message": AlertMessage("warning", "Don't answer same naire twice!", "You've already answered this Questionnaire", "/"),})
		Questionnaire_answered = Questionnaire.objects.get(pk=qid)
		r = Result(questionnaire_id=Questionnaire_answered,participant_id=user.email,answer=str(result))
		r.save()
		print user.email
		return render(request, "homepage/message.html", {"message": AlertMessage("success", "Success!", "You have already posted your answers", "/naire"+str(qid)+"/results"),})
	except:
		q = get_object_or_404(Questionnaire, pk=qid)
		Naire = Questions()
		Naire.clean()
		Naire.qid = qid
		Naire.read(get_object_or_404(Questionnaire, pk=qid).contents)
		# print 'f**k'
		return render(request, 'results/answer.html',{'Questionnaire':q ,'naire':Naire ,'qid':qid, 'errorMsg':'Not finished yet!'})