Advertisement
seraphile22

Untitled

Mar 1st, 2017
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 103.61 KB | None | 0 0
  1. from django.shortcuts import render, render_to_response, redirect
  2. from django.http import HttpResponse, HttpResponseRedirect, Http404
  3. from django.template import RequestContext
  4. from django.template.loader import render_to_string
  5.  
  6. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  7.  
  8. from django.views.decorators.csrf import csrf_exempt
  9. from django.contrib.auth import authenticate, login, logout
  10. from django.contrib.auth.decorators import login_required, user_passes_test
  11. from django.contrib.auth.hashers import make_password
  12. from django.core.mail import send_mail
  13. from django.conf import settings
  14. from django.core.exceptions import ObjectDoesNotExist
  15.  
  16. from django.contrib.auth.models import User
  17. from django.db.models import Avg
  18.  
  19. from django.contrib.contenttypes.models import ContentType
  20. from django.contrib.comments.models import Comment
  21.  
  22. from edukts_db.models import *
  23. from edukts import assessment_engine, formatter_engine
  24. from edukts_web import forms
  25.  
  26. from datetime import datetime, timedelta
  27.  
  28. import math, re, random, sys
  29. import requests
  30. import json
  31.  
  32. def account_login(request):
  33. if request.method == 'POST':
  34. username = request.POST['username']
  35. password = request.POST['password']
  36.  
  37. # Authenticate user w/db
  38. user = authenticate(username=username, password=password)
  39.  
  40. if user is not None:
  41. if user.is_active:
  42. login(request, user)
  43. # Success, check permissions (user/admin)
  44. if user.is_staff:
  45. # Staff redirected to control panel
  46. return redirect('/control/')
  47. else:
  48. # User redirected to practice homepage
  49. return redirect('/home/')
  50. else:
  51. if user.last_login == user.date_joined:
  52. # Not activated
  53. return render(request, 'auth.login.html', {'error': 'inactive'})
  54. else:
  55. # User account has been disabled
  56. return render_to_response('auth.login.html', {'error': 'disabled'}, context_instance=RequestContext(request))
  57. else:
  58. # User account not found or password is incorrect
  59. return render_to_response('auth.login.html', {'error': 'incorrect'}, context_instance=RequestContext(request))
  60. else:
  61. if request.user.is_authenticated():
  62. if 'next' not in request.GET:
  63. # Why are you visiting my sign in page again?
  64. return redirect('/')
  65. else:
  66. return render(request, 'auth.login.html', {'error':'permission'})
  67. else:
  68. return render(request, 'auth.login.html')
  69.  
  70. def account_logout(request):
  71. # Logout for user
  72.  
  73. # edukts_added : Clear site session var
  74. del request.session['edukts_site']
  75.  
  76. logout(request)
  77.  
  78. return render_to_response('auth.logout.html', {}, context_instance=RequestContext(request))
  79.  
  80. def account_register(request):
  81. if request.method == 'POST':
  82. form = forms.RegistrationForm(request.POST) # Bind to user submitted form
  83. if form.is_valid():
  84. # Process account registration
  85. user = User.objects.create_user(username=form.cleaned_data['email'], email=form.cleaned_data['email'], password=form.cleaned_data['password'])
  86. user.first_name=form.cleaned_data['first_name']
  87. user.last_name=form.cleaned_data['last_name']
  88. user.is_active = False
  89. user.save()
  90.  
  91. # Generate a activation key using existing salt for pwd
  92. algorithm, iterations, salt, hashed = user.password.split('$', 3)
  93. activation_key = make_password(user.email, salt, algorithm)
  94. algorithm, iterations, salt, activation_key = activation_key.split('$', 3)
  95. activation_key = activation_key[:-1]
  96. # Alternative char for + and /
  97. activation_key = activation_key.replace('+','-').replace('/','_')
  98.  
  99. title = 'Account Activation'
  100. content = render_to_string('register.email', {'first_name': user.first_name, 'last_name': user.last_name, 'is_secure': request.is_secure(), 'host': request.get_host(), 'activation_key': activation_key, 'sender': settings.PROJECT_NAME})
  101.  
  102. send_mail(title, content, settings.PROJECT_NAME + ' <' + settings.EMAIL_HOST_USER + '>', [user.email])
  103.  
  104. return render(request, 'account.register.success.html')
  105. else:
  106. # Display new form for user to fill in
  107. form = forms.RegistrationForm()
  108.  
  109. return render(request, 'account.register.form.html', {'form': form})
  110.  
  111. def account_activate(request):
  112. # Already activated
  113. if request.user.is_authenticated():
  114. return render(request, 'account.activate.success.html', {'error': 'activated'})
  115.  
  116. if request.method == 'GET':
  117. # Get activation details
  118. activation_key = request.GET.get('key')
  119.  
  120. # No activation key, throw to login page
  121. if activation_key is None:
  122. return redirect('/accounts/login/')
  123.  
  124. # Keep activation key in session awaiting login
  125. request.session['activation_key'] = activation_key
  126.  
  127. form = forms.ActivationForm()
  128. else:
  129. # Attempt to activate user using given user, password and key
  130. form = forms.ActivationForm(request.POST)
  131. if form.is_valid():
  132. # Try logging in
  133. user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'])
  134.  
  135. if user is None:
  136. form.activation_error = 'incorrect'
  137. else:
  138. # Already active? error!
  139. if user.is_active:
  140. form.activation_error = 'expired'
  141. else:
  142. # Match activation key
  143. algorithm, iterations, salt, hashed = user.password.split('$', 3)
  144. activation_key = make_password(user.email, salt, algorithm)
  145. algorithm, iterations, salt, activation_key = activation_key.split('$', 3)
  146. activation_key = activation_key[:-1]
  147. # Alternative char for + and /
  148. activation_key = activation_key.replace('+','-').replace('/','_')
  149.  
  150. form.key1 = request.session['activation_key']
  151. form.key2 = activation_key
  152.  
  153. # Match keys
  154. if activation_key == request.session['activation_key']:
  155. # Activated, login and proceed
  156. user.is_active = True
  157. user.save()
  158. login(request, user)
  159.  
  160. return render(request, 'account.activate.success.html')
  161. else:
  162. # Key expired!
  163. form.activation_error = 'expired'
  164.  
  165. return render(request, 'account.activate.form.html', {'form': form})
  166.  
  167. def account_forgot(request):
  168. if request.method == 'POST':
  169. form = forms.PasswordForgetForm(request.POST) # Bind to user submitted form
  170. if form.is_valid():
  171. # Retrieve user from db
  172. try:
  173. user = User.objects.get(email=form.cleaned_data['email'])
  174. except User.DoesNotExist:
  175. return redirect('/accounts/forgot/?error=nouser')
  176.  
  177. # Generate a reset key using existing salt for pwd
  178. algorithm, iterations, salt, hashed = user.password.split('$', 3)
  179. reset_key = make_password(user.email, salt, algorithm)
  180. algorithm, iterations, salt, reset_key = reset_key.split('$', 3)
  181. reset_key = reset_key[:-1]
  182. # Alternative char for + and /
  183. reset_key = reset_key.replace('+','-').replace('/','_')
  184.  
  185. title = 'Password Reset'
  186. content = render_to_string('passwordreset.email', {'first_name': user.first_name, 'last_name': user.last_name, 'host': request.get_host(), 'reset_key': reset_key, 'sender': settings.PROJECT_NAME, 'email': user.email})
  187.  
  188. send_mail(title, content, settings.PROJECT_NAME + ' <' + settings.EMAIL_HOST_USER + '>', [user.email])
  189.  
  190. return render(request, 'account.forgot.success.html')
  191. else:
  192. # Display new form for user to fill in
  193. form = forms.PasswordForgetForm()
  194.  
  195. return render(request, 'account.forget.form.html', {'form': form})
  196.  
  197. def account_reset(request):
  198. if request.user.is_authenticated():
  199. pass
  200. else:
  201. if request.method == 'GET':
  202. # TODO: Error messages if key is not valid or email is wrong
  203.  
  204. # Reset password for user who has forgotten it
  205. # Get user from request data
  206. user_email = request.GET.get('user')
  207.  
  208. # Retrieve user from db
  209. try:
  210. user = User.objects.get(email=user_email)
  211. except User.DoesNotExist:
  212. return redirect('/accounts/forgot/?error=nouser')
  213.  
  214. # Get reset key from request data
  215. reset_key_input = request.GET.get('key')
  216.  
  217. # No reset key, throw to login page
  218. if reset_key_input is None:
  219. return redirect('/accounts/forgot/?error=nokey')
  220.  
  221. # Match reset key
  222. algorithm, iterations, salt, hashed = user.password.split('$', 3)
  223. reset_key = make_password(user.email, salt, algorithm)
  224. algorithm, iterations, salt, reset_key = reset_key.split('$', 3)
  225. reset_key = reset_key[:-1]
  226. # Alternative char for + and /
  227. reset_key = reset_key.replace('+','-').replace('/','_')
  228.  
  229. # Match keys
  230. if reset_key == reset_key_input:
  231. # Reset keys match, render page for user to reset
  232. # Store reset email in session
  233. request.session['reset_email'] = user_email
  234.  
  235. form = forms.PasswordResetForm(initial={'email': user_email})
  236. else:
  237. # Key expired!
  238. return redirect('/accounts/forgot/?error=keymismatch')
  239. elif request.method == 'POST':
  240. form = forms.PasswordResetForm(request.POST)
  241. if form.is_valid():
  242. # Perform real resetting of account
  243. # Check if emails from form and session matches
  244. if form.cleaned_data['email'] == request.session['reset_email']:
  245. # Get user
  246. try:
  247. user = User.objects.get(email=request.session['reset_email'])
  248. except User.DoesNotExist:
  249. return redirect('/accounts/forgot/?error=nouser')
  250.  
  251. # Update password of user in system
  252. user.set_password(form.cleaned_data['password'])
  253. user.save()
  254.  
  255. # Success, login user and display success page
  256. user = authenticate(username=user.username, password=form.cleaned_data['password'])
  257. login(request, user)
  258.  
  259. return render(request, 'account.reset.success.html')
  260. else:
  261. return redirect('/accounts/forgot/?error=email')
  262.  
  263. return render(request, 'account.reset.form.html', {'form': form})
  264.  
  265. @login_required
  266. def survey(request):
  267. "Survey form for user to submit feedbacks"
  268.  
  269. return render(request, 'edukts_web/survey.form.html')
  270.  
  271. @login_required
  272. def feedback(request):
  273. "Feedback form for user to submit feedbacks"
  274.  
  275. if request.method == 'POST':
  276. form = forms.FeedbackForm(request.POST)
  277. if form.is_valid():
  278. # Maybe in the future this can be done in a webform with feedback id generated
  279.  
  280. title = 'Feedback Received from ' + request.user.get_full_name()
  281. content = render_to_string('feedback.email', {'first_name': request.user.first_name, 'last_name': request.user.last_name, 'feedback': form.cleaned_data['feedback']})
  282.  
  283. send_mail(title, content, settings.PROJECT_NAME + ' <' + settings.EMAIL_HOST_USER + '>', ['clangkts@gmail.com'])
  284.  
  285. return render(request, 'edukts_web/feedback.success.html')
  286. else:
  287. # Display new form for user to fill in
  288. form = forms.FeedbackForm()
  289.  
  290. return render(request, 'edukts_web/feedback.form.html', {'form': form})
  291.  
  292. def home(request):
  293. "Main page of the site, redirects if logged in"
  294. # Redirect to respective home portals
  295. if request.user.is_authenticated():
  296.  
  297. # Record usage for stats purpose
  298. page = "home"
  299. # Never accessed this page before, or last access was more than 10 mins ago
  300. if 'user_usage_'+page not in request.session or datetime.now() > datetime.strptime(request.session['user_usage_'+page], "%a %b %d %H:%M:%S %Y") + timedelta(minutes=10):
  301. usage = UserUsage(user=request.user, page=page)
  302. usage.save()
  303. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  304. # End usage recording
  305.  
  306. if request.user.is_staff:
  307. # Redirect staff to staff portal
  308. return redirect('/control/')
  309. else:
  310. # Redirect user to user portal
  311. return redirect('/home/')
  312.  
  313. # Home page for non authenticated users
  314. return render(request, 'edukts_web/test.html')
  315.  
  316. @login_required
  317. def user_home(request):
  318. "Home view to display practice or trial testing modes"
  319. this_concept = Concept.objects.filter(subject=request.site.id)
  320. return render(request, 'edukts_web/home.html', {'concepts' : this_concept} )
  321.  
  322. @login_required
  323. def labtest(request):
  324. "Activate Lab Test with a test ID"
  325. if request.method == 'POST':
  326. return render(request, 'labtest.html', {'error': 'invalid'})
  327. else:
  328. return render(request, 'labtest.html')
  329.  
  330.  
  331.  
  332. @login_required
  333. def exercise(request):
  334. "Activate Lab Test with a test ID"
  335. if request.method == 'POST':
  336. return render(request, 'exercise.html', {'error': 'invalid'})
  337. else:
  338. return render(request, 'exercise.html')\
  339.  
  340.  
  341. @login_required
  342. def papertest(request, test_id=None):
  343. "Boombastic function! Change with care."
  344. # Record usage for stats purpose
  345. page = "paper_test"
  346. # Never accessed this page before, or last access was more than 10 mins ago
  347. if 'user_usage_'+page not in request.session or datetime.now() > datetime.strptime(request.session['user_usage_'+page], "%a %b %d %H:%M:%S %Y") + timedelta(minutes=10):
  348. usage = UserUsage(user=request.user, page=page)
  349. usage.save()
  350. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  351. # End usage recording
  352.  
  353. # Obtain the list of topics
  354. topics = Topic.objects.all().filter(subject=request.site.id)
  355.  
  356. if not test_id:
  357. if request.method == 'POST' and 'test_id' in request.POST and request.POST['test_id']:
  358. return redirect('/papertest/'+request.POST['test_id']+'/')
  359. elif request.method == 'POST' and 'num_qn' in request.POST and request.POST['num_qn'] and 'topics' in request.POST:
  360. # Check if all param is in
  361. # Get number of questions and difficulty
  362.  
  363. numQns = int(request.POST['num_qn'])
  364. if numQns > 25:
  365. numQns = 25
  366.  
  367. testid = ''.join(random.choice('abcdefghijklmnopqrstuvwxyz0123456789') for i in range(6))
  368.  
  369. #### VERY IMPORTANT TODO:: CHECK FOR UNIQUE ID
  370. new_test = Test(id=testid, assessment=Assessment.objects.all().get(name='Paper Test'))
  371. new_test.save()
  372.  
  373. numQns = int(numQns)
  374.  
  375. topics_selected = request.POST.getlist('topics')
  376.  
  377. topics_all = list(topics.values_list('id', flat=True))
  378.  
  379. for topic_id in topics_selected:
  380. topics_all.remove(int(topic_id))
  381.  
  382. question_pool = Question.objects.all().filter(subject=request.site.id)
  383. question_pool = question_pool.exclude(topic__in=topics_all)
  384.  
  385. for i in range (0, numQns):
  386. # Get a random question and add to paper
  387. question_pool = question_pool.exclude(id__in=new_test.questions.all().values_list('id'))
  388.  
  389. if question_pool:
  390. question = question_pool[random.randint(0, question_pool.count()-1)]
  391. newTestQuestion = TestQuestion(question=question, test=new_test)
  392. newTestQuestion.save()
  393.  
  394. return redirect('/papertest/'+str(testid)+'/')
  395. elif request.method == 'POST':
  396. error = {}
  397. if 'num_qn' not in request.POST or not request.POST['num_qn']:
  398. error['num_qn'] = True
  399. return render(request, 'edukts_web/papertest.home.html', {'error': error, 'topics': topics})
  400.  
  401. return render(request, 'edukts_web/papertest.home.html', {'topics': topics})
  402. else:
  403. # test_id is available, render test instead
  404. test = Test.objects.all().get(id=test_id)
  405.  
  406. return render(request, 'edukts_web/papertest.question.html', {'test': test})
  407.  
  408. @login_required
  409. def papertestsubmit(request, test_id):
  410. test = Test.objects.all().get(id=test_id)
  411.  
  412. if request.method == 'POST':
  413. # Check each question if it has been attempted
  414. for question in test.questions.all():
  415. try:
  416. # Previously saved response available? OK do nothing for now.
  417. test_response = TestResponse.objects.filter(test=test).filter(user=request.user).get(question=question)
  418. pass
  419. # Otherwise new response, create object
  420. except ObjectDoesNotExist:
  421. test_response = TestResponse(test=test, user=request.user, question=question, response='<No Answer Given>', criterion=question.marks, assessment=test.assessment)
  422. test_response.save()
  423.  
  424. # Assign a score for each question
  425. total_ability = 0
  426.  
  427. for question in test.questions.all():
  428. test_response = TestResponse.objects.filter(test=test).filter(user=request.user).get(question=question)
  429.  
  430. response = test_response.response
  431. response = response.replace(' ', '').replace('\\n', '').replace('\\r', '').replace('\\t', '')
  432.  
  433. # Get actual answer in string
  434. answer_text = question.choices[question.answers.all()[0].content.lower()]
  435. answer_text = answer_text.replace(' ', '').replace('\n', '').replace('\r', '').replace('\t', '')
  436.  
  437. correctness = 0
  438. if re.match('^'+answer_text+'$', response):
  439. correctness = question.answers.all()[0].correctness
  440.  
  441. print >> sys.stderr, response + " == " + answer_text + " : " + str(correctness)
  442.  
  443. # Update correctness
  444. test_response.correctness = correctness
  445.  
  446. # Update ability
  447. total_ability = total_ability + correctness
  448. test_response.ability = total_ability
  449.  
  450. test_response.save()
  451.  
  452. test.state = True
  453. test.save()
  454.  
  455. # Prevent resubmission of test
  456. return redirect('/papertest/submit/' + test_id + '/')
  457.  
  458. elif request.method == 'GET':
  459. return render(request, 'edukts_web/papertest.submit.html', {'test': test, 'final_score': int(test.score)})
  460.  
  461. @login_required
  462. def papertestutil(request, test_id=None, util_name=None):
  463. "Util functions for Boombastic function!"
  464.  
  465. if test_id:
  466. test = Test.objects.all().get(id=test_id)
  467. # Util to return test endtime
  468. if util_name == 'getendtime':
  469. time = test.questions.count()*3
  470. endtime = test.generated+timedelta(minutes=time)
  471.  
  472. return HttpResponse(endtime.isoformat())
  473. elif util_name == 'save':
  474. if 'qn_id' in request.POST and request.POST['qn_id']:
  475. # Get question (or nothing) from orm
  476. question = Question.objects.all().filter(subject=request.site.id).get(id=request.POST['qn_id'])
  477.  
  478. # Check test not completed, question exists
  479. if test.state == False and test.questions.filter(id=question.id).exists():
  480. # Check that there was a answer sent together with message
  481. if 'answer' in request.POST and request.POST['answer']:
  482. try:
  483. # Previously saved response available? Resave if so!
  484. test_response = TestResponse.objects.filter(test=test).filter(user=request.user).get(question=question)
  485. test_response.response = request.POST['answer']
  486. test_response.save()
  487. # Otherwise new response, create object
  488. except ObjectDoesNotExist:
  489. test_response = TestResponse(test=test, user=request.user, question=question, response=request.POST['answer'], criterion=question.marks, assessment=test.assessment)
  490. test_response.save()
  491.  
  492. return HttpResponse("Saved")
  493. # Otherwise no answer just return nothing happened!
  494. else:
  495. return HttpResponse("Empty")
  496. raise Http404
  497.  
  498. @login_required
  499. def trialtest(request):
  500. "Placeholder for trial test"
  501. # Obtain the list of topics
  502. topics = Topic.objects.all().filter(subject=request.site.id)
  503.  
  504. # Record usage for stats purpose
  505. page = "cat_test"
  506. # Never accessed this page before, or last access was more than 10 mins ago
  507. if 'user_usage_'+page not in request.session or datetime.now() > datetime.strptime(request.session['user_usage_'+page], "%a %b %d %H:%M:%S %Y") + timedelta(minutes=10):
  508. usage = UserUsage(user=request.user, page=page)
  509. usage.save()
  510. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  511. # End usage recording
  512.  
  513. if 'complete' in request.GET and request.GET['complete']:
  514. complete = True
  515. if 'ability' in request.GET and request.GET['ability']:
  516. ability = request.GET['ability']
  517. else:
  518. complete = False
  519. ability = None
  520.  
  521. return render(request, 'trialtest.html', {'topics':topics, 'complete': complete, 'ability': ability})
  522.  
  523. @login_required
  524. def trialtest_generate(request):
  525. if request.method == 'POST':
  526. testid = ''.join(random.choice('abcdefghijklmnopqrstuvwxyz0123456789') for i in range(6))
  527.  
  528. #### VERY IMPORTANT TODO:: CHECK FOR UNIQUE ID
  529. new_test = Test(id=testid, assessment=Assessment.objects.all().get(name='CAT Test'))
  530. new_test.save()
  531.  
  532. # Clear previous test questions if any
  533. request.session['trialtest_current_qn'] = None
  534.  
  535. # Store topic in session, change this to db storage soon
  536. request.session['trialtest_topic_id'] = int(request.POST['topic'])
  537.  
  538. return redirect('/trialtest/go/'+testid+'/')
  539. return redirect('/')
  540.  
  541. @login_required
  542. def trialtest_go(request, test_id):
  543. # Obtain the list of topics
  544. topics = Topic.objects.all().filter(subject=request.site.id)
  545.  
  546. # Get Test object
  547. test = Test.objects.all().get(id=test_id)
  548.  
  549. # Selected topic
  550. topic_id = request.session['trialtest_topic_id']
  551. if topic_id > 0:
  552. topic = Topic.objects.all().filter(subject=request.site.id).get(id=topic_id)
  553. else:
  554. topic = None
  555.  
  556. # Init session variable for question
  557. if 'trialtest_current_qn' not in request.session:
  558. request.session['trialtest_current_qn'] = None
  559.  
  560. # Debug data
  561. debug = {}
  562.  
  563. # Error data
  564. error = {}
  565.  
  566. # GET Request or POST w/o session data >> Load Question
  567. # POST Request >> Answer Question
  568. if request.method == 'GET' or request.session['trialtest_current_qn'] is None:
  569. # Generate new question if not resuming
  570. if request.session['trialtest_current_qn'] == None:
  571. # Get assessment engine for CAT Test and dynamically load engine
  572. active_engine = Assessment.objects.all().get(name='CAT Test')
  573. engine = getattr(assessment_engine, active_engine.engine)()
  574.  
  575. # Initialise session storage for assessment engine
  576. if 'engine_store' not in request.session:
  577. request.session['engine_store'] = None
  578.  
  579. # Request a new question from the assessment engine
  580. question = engine.get_next_question(user=request.user, test=test, topic=topic, session_store=request.session['engine_store'])
  581.  
  582. # Get current ability for debug purposes
  583. debug['ability'] = engine.get_user_ability(user=request.user, test=test)
  584.  
  585. # Test ends if question is None (out of questions), redirect to completion screen
  586. if not question:
  587. return render(request, 'trialtest.html', {'topics':topics, 'complete': True, 'ability': engine.get_user_ability(user=request.user, test=test)})
  588.  
  589. debug['answer'] = question.answers.all()[0].content
  590.  
  591. # Update the question to session (for persistance if user refresh page/relogin)
  592. request.session['trialtest_current_qn'] = question.id
  593.  
  594. # Update time starts from here
  595. request.session['trialtest_time'] = datetime.now().strftime("%a %b %d %H:%M:%S %Y")
  596. else:
  597. # Reload question from session data if resuming practice or page refresh
  598. question = Question.objects.all().filter(subject=request.site.id).get(id=request.session['trialtest_current_qn'])
  599.  
  600. # Rendering at end of page
  601. else:
  602. # Submitting a test question
  603. if 'qid' in request.POST and request.POST['qid']:
  604. qnid_post = request.POST['qid']
  605. else:
  606. qnid_post = None
  607.  
  608. qnid_session = request.session['trialtest_current_qn']
  609.  
  610. if qnid_post != qnid_session:
  611. # Something strange is happening, missing qid from form or mismatch between form and session, TODO: Handle this PROPERLY
  612. debug['qnid_post'] = qnid_post
  613. debug['qnid_session'] = qnid_session
  614.  
  615. # Reload question from session data
  616. question = Question.objects.all().filter(subject=request.site.id).get(id=qnid_session)
  617.  
  618. # Check if answer was submitted
  619. if 'ans' in request.POST and request.POST['ans']:
  620. choice = request.POST['ans']
  621.  
  622. # Get assessment engine for CAT Test and dynamically load engine
  623. active_engine = Assessment.objects.all().get(name='CAT Test')
  624. engine = getattr(assessment_engine, active_engine.engine)()
  625.  
  626. # Initialise session storage for assessment engine
  627. if 'engine_store' not in request.session:
  628. request.session['engine_store'] = None
  629.  
  630. # Match answer using assessment engine
  631. result = engine.match_answers(user=request.user, test=test, response=choice, question=question, session_store=request.session['engine_store'])
  632.  
  633. # Restore updated engine store
  634. request.session['engine_store'] = result['session_store']
  635.  
  636. # Reset current practice qn to None
  637. request.session['trialtest_current_qn'] = None
  638.  
  639. # Answer is correct if full points is awarded
  640. if result['correctness'] == 1.0:
  641. correct = True
  642. else:
  643. correct = False
  644.  
  645. # Get correct answer
  646. question.answer = question.answers.all()[0]
  647.  
  648. # Terminating condition is true!
  649. if result['terminate']:
  650. ability_list = engine.get_user_ability_list(user=request.user, test=test)
  651.  
  652. return render(request, 'trialtest.html', {'topics':topics, 'complete': True, 'ability': result['ability'], 'ability_list': ability_list, 'debug': result['debug_t_cond']})
  653. # Otherwise, no need to render a answer page, so we just save answers and then load next qn
  654. # else:
  655. # return redirect(request.path)
  656.  
  657.  
  658. # Format question for web mode
  659. formatter = formatter_engine.WebQuestionFormatter()
  660. question = formatter.format(question)
  661.  
  662. # Temp variable to allow ajax through https
  663. host = request.get_host()
  664. is_secure = not "localhost" in host
  665.  
  666. # Kill debug for non test users
  667. if request.user.get_profile().debug is False:
  668. debug = {}
  669.  
  670. return render(request, 'edukts_web/trialtest.submit.html', {'question': question, 'topic': topic, 'choice': choice, 'correct': correct, 'debug': debug, 'host': host, 'is_secure': is_secure})
  671. else:
  672. # Option not selected, prompt error
  673. error['unselected'] = True
  674.  
  675. # Format question for web mode
  676. formatter = formatter_engine.WebQuestionFormatter()
  677. question = formatter.format(question)
  678.  
  679. # Kill debug for non test users
  680. if request.user.get_profile().debug is False:
  681. debug = {}
  682.  
  683. # Render question page
  684. return render(request, 'edukts_web/trialtest.question.html', {'question': question, 'topic': topic, 'error': error, 'debug': debug, 'test_id': test.id})
  685.  
  686. @login_required
  687. def trialtestutil(request, test_id=None, util_name=None):
  688. "Util functions for Boombastic function!"
  689.  
  690. if test_id:
  691. test = Test.objects.all().get(id=test_id)
  692. # Util to return question endtime
  693. if util_name == 'getendtime':
  694. # 5 mins from time the question was loaded
  695. endtime = datetime.strptime(request.session['trialtest_time'], "%a %b %d %H:%M:%S %Y") + timedelta(minutes=5)
  696.  
  697. return HttpResponse(endtime.isoformat())
  698. raise Http404
  699.  
  700. # @login_required
  701. # def practice_home(request):
  702. # "Home view to display topics to choose from for practice"
  703. # # Record usage for stats purpose
  704. # page = "practice"
  705. # # Never accessed this page before, or last access was more than 10 mins ago
  706. # if 'user_usage_'+page not in request.session or datetime.now() > datetime.strptime(request.session['user_usage_'+page], "%a %b %d %H:%M:%S %Y") + timedelta(minutes=10):
  707. # usage = UserUsage(user=request.user, page=page)
  708. # usage.save()
  709. # request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  710. # # End usage recording
  711.  
  712. # # Obtain the list of topics
  713. # topics = Topic.objects.all().filter(subject=request.site.id)
  714. # print >> sys.stderr, topics
  715.  
  716. # active_engine = Assessment.objects.all().filter(active=True).get(type=Assessment.PRACTICE)
  717. # engine = getattr(assessment_engine, active_engine.engine)()
  718.  
  719. # topic_ability = {}
  720. # for topic in topics:
  721. # ability = engine.get_user_ability(user=request.user, topic=topic)
  722. # if ability is not None:
  723. # topic_ability[topic] = int(ability)
  724. # else:
  725. # topic_ability[topic] = None
  726.  
  727. # # Check previous session
  728. # previous_session = 'practice_current_qn' in request.session and request.session['practice_current_qn'] != None
  729.  
  730. # # Get list of questions that user has previously commented on
  731. # questions_commented_id = Comment.objects.all().filter(content_type=ContentType.objects.get_for_model(Question)).filter(user=request.user).values_list('object_pk')
  732. # questions_commented = Question.objects.all().filter(subject=request.site.id).filter(pk__in=questions_commented_id)
  733.  
  734. # # Debug data
  735. # debug = {}
  736. # debug['assessment_engine'] = active_engine
  737. # debug['asd'] = 1
  738.  
  739. # # Kill debug for non test users
  740. # if request.user.get_profile().debug is False:
  741. # debug = {}
  742.  
  743. # return render(request, 'edukts_web/practice.home.html', {'topics': topics, 'topic_ability': topic_ability, 'previous_session': previous_session, 'questions_commented': questions_commented, 'debug': debug})
  744.  
  745.  
  746.  
  747. @login_required
  748. def attempt_situational_question(request, question_id):
  749. question = Question.objects.all().filter(subject=request.site.id).get(id=question_id)
  750. topic = Topic.objects.all().filter(subject=request.site.id).get(id=question.topic_id)
  751.  
  752.  
  753.  
  754. if request.method == 'POST':
  755.  
  756. if request.POST['content'] == "" or question.reference =="":
  757. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic})
  758. else:
  759. refEssay = question.reference
  760. refEssay = refEssay.replace("<br>", "")
  761. point1 = question.point1
  762. point2 = question.point2
  763. point3 = question.point3
  764. point4 = question.point4
  765. point5 = question.point5
  766. point6 = question.point6
  767. point7 = question.point7
  768. Question1 = question.content
  769. point1 = point1.replace("<br>", "")
  770. point2 = point2.replace("<br>", "")
  771. point3 = point3.replace("<br>", "")
  772. point4 = point4.replace("<br>", "")
  773. point5 = point5.replace("<br>", "")
  774. point6 = point6.replace("<br>", "")
  775. point7 = point7.replace("<br>", "")
  776. Question1 = Question1.replace("<br>", "")
  777. picturecontent = question.picturecontent
  778. formToSubmit = { "ansEssay": request.POST['content'], "refEssay": refEssay, "point1":point1, "point2":point2,"point3":point3,"point4":point4,"point5":point5,"point6":point6,"point7":point7, "Question1":Question1, "picturecontent":picturecontent}
  779.  
  780. headers={'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0'}
  781.  
  782. try:
  783. r = requests.post("http://localhost:8080/simcheck", data=formToSubmit, headers=headers)
  784. r.raise_for_status()
  785. except requests.exceptions.HTTPError as err:
  786. print err
  787.  
  788.  
  789. print((r.json()) if r else (r.status_code)), "<:::COPY THIS:::>"
  790.  
  791. scores = json.loads(r.text)
  792. #lsaScore=scores['lsaScore'], ngramScore=scores['ngramScore']
  793. lsascore = int(scores['lsaScore']*100)
  794. ngramscore = int(scores['ngramScore']*100)
  795. averageScore = int((lsascore + ngramscore) / 2)
  796. totalScore = int(scores['totalScore'])
  797. b = StudentScores(user=request.user, qn_no = question, score = totalScore)
  798. b.save()
  799. synStructures = scores['synStructures']
  800. synComplexMeasures = scores['synComplexMeasures']
  801. lexStructures = scores['lexStructures']
  802. lexComplexMeasures = scores['lexComplexMeasures']
  803. print type(lexComplexMeasures)
  804. print type(lexStructures)
  805. #averageScore = (scores['lsaScore'] + scores['ngramScore']) / 2
  806. spellingErrors=scores['spellingErrors']
  807. grammarErrors=scores['grammarErrors']
  808. oldcontent=request.POST['content']
  809. oldcontent=oldcontent.replace("\r\n", "<br>")
  810. for field, possible_values in spellingErrors.iteritems():
  811. #for key in spellingErrors:
  812. pos = oldcontent.find(field)
  813. endpos = pos + len(field)
  814. print repr(possible_values)
  815. suggestions = '<span title="' + possible_values + '">'
  816. oldcontent = oldcontent[:pos] + '<font color="red">'+ suggestions + oldcontent[pos:endpos] + '</span></font>' + oldcontent[endpos:]
  817. #<font color="blue"></font>
  818. #print key, 'corresponds to', d[key]
  819. essay_response = EssayResponse(title=question.title, content=oldcontent, subject=Subject.objects.get(id=request.site.id), user=request.user, topic=Topic.objects.get(id=request.site.id), question = question, lsaScore=lsascore, ngramScore=ngramscore, numPointsTotal=scores['numPointsTotal'], numPointsMissed=scores['numPointsMissed'], missedContentPoints=scores['missedContentPoints'], ContentPoints=scores['extractedpts'], avgScore=averageScore, spellingErrors=scores['spellingErrors'], grammarErrors=scores['grammarErrors'], synScore=scores['synScore'], lexScore=scores['lexScore'], synComplexMeasures=synComplexMeasures, synStructures=synStructures, lexStructures=lexStructures, lexComplexMeasures=lexComplexMeasures, totalScore = totalScore)
  820. return render(request, 'edukts_web/essay.result.html', {'question': question, 'topic': topic, 'essay_response' : essay_response} )
  821. return redirect('/situational/')
  822.  
  823. #return practice_question(request, topic.id)
  824. else:
  825.  
  826. point1 = question.point1
  827. point2 = question.point2
  828. point3 = question.point3
  829. point4 = question.point4
  830. point5 = question.point5
  831. point6 = question.point6
  832. point7 = question.point7
  833.  
  834.  
  835. point8 = point1 + point2 + point3 + point4 + point5 + point6 + point7
  836. essay_response = EssayResponse(ExtractedContentPoints=point3)
  837. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic, 'essay_response' : essay_response})
  838.  
  839.  
  840. @login_required
  841. def attempt_composition_question(request, question_id):
  842. question = Question.objects.all().filter(subject=request.site.id).get(id=question_id)
  843. topic = Topic.objects.all().filter(subject=request.site.id).get(id=question.topic_id)
  844.  
  845. if request.method == 'POST':
  846.  
  847. if request.POST['content'] == "" or question.reference =="":
  848. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic})
  849. else:
  850. refEssay = question.reference
  851. refEssay = refEssay.replace("<br>", "")
  852. formToSubmit = { "ansEssay": request.POST['content'], "refEssay": refEssay}
  853. r = requests.post("http://localhost:8080/simcheck", data=formToSubmit)
  854. scores = json.loads(r.text)
  855. #lsaScore=scores['lsaScore'], ngramScore=scores['ngramScore']
  856. lsascore = int(scores['lsaScore']*100)
  857. ngramscore = int(scores['ngramScore']*100)
  858. averageScore = int((lsascore + ngramscore) / 2)
  859. totalScore = int(scores['totalScore'])
  860. synStructures = scores['synStructures']
  861. synComplexMeasures = scores['synComplexMeasures']
  862. lexStructures = scores['lexStructures']
  863. lexComplexMeasures = scores['lexComplexMeasures']
  864. print type(lexComplexMeasures)
  865. print type(lexStructures)
  866. #averageScore = (scores['lsaScore'] + scores['ngramScore']) / 2
  867. spellingErrors=scores['spellingErrors']
  868. grammarErrors=scores['grammarErrors']
  869. oldcontent=request.POST['content']
  870. oldcontent=oldcontent.replace("\r\n", "<br>")
  871. for field, possible_values in spellingErrors.iteritems():
  872. #for key in spellingErrors:
  873. pos = oldcontent.find(field)
  874. endpos = pos + len(field)
  875. print repr(possible_values)
  876. suggestions = '<span title="' + possible_values + '">'
  877. oldcontent = oldcontent[:pos] + '<font color="red">'+ suggestions + oldcontent[pos:endpos] + '</span></font>' + oldcontent[endpos:]
  878. #<font color="blue"></font>
  879. #print key, 'corresponds to', d[key]
  880. essay_response = EssayResponse(title=question.title, content=oldcontent, subject=Subject.objects.get(id=request.site.id), user=request.user, topic=Topic.objects.get(id=request.site.id), question = question, lsaScore=lsascore, ngramScore=ngramscore, numPointsTotal=scores['numPointsTotal'], numPointsMissed=scores['numPointsMissed'], missedContentPoints=scores['missedContentPoints'], avgScore=averageScore, spellingErrors=scores['spellingErrors'], grammarErrors=scores['grammarErrors'], synScore=scores['synScore'], lexScore=scores['lexScore'], synComplexMeasures=synComplexMeasures, synStructures=synStructures, lexStructures=lexStructures, lexComplexMeasures=lexComplexMeasures, totalScore = totalScore)
  881. return render(request, 'edukts_web/essay.result.html', {'question': question, 'topic': topic, 'essay_response' : essay_response} )
  882. return redirect('/composition/')
  883.  
  884. #return practice_question(request, topic.id)
  885. else:
  886. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic})
  887.  
  888. @login_required
  889. def practice_question(request, topic):
  890. # Selected topic
  891. topic = Topic.objects.all().filter(subject=request.site.id).get(id=topic)
  892.  
  893. # Init session variable for question
  894. if 'practice_current_qn' not in request.session:
  895. request.session['practice_current_qn'] = None
  896.  
  897. # Debug data
  898. debug = {}
  899.  
  900. # Error data
  901. error = {}
  902.  
  903. # GET Request or POST w/o session data >> Load Question
  904. # POST Request >> Answer Question
  905.  
  906. if request.method == 'GET' or request.session['practice_current_qn'] is None:
  907. # Check if existing loaded question is from same topic, otherwise clear it
  908. if request.session['practice_current_qn'] != None:
  909. question_topic = Question.objects.all().filter(subject=request.site.id).get(id=request.session['practice_current_qn']).topic
  910. if question_topic != topic:
  911. # New practice topic, clear session variable
  912. request.session['practice_current_qn'] = None
  913.  
  914. # Generate new question if not resuming
  915. if request.session['practice_current_qn'] == None:
  916. # Retrieve pool of questions with this topic
  917. question_pool = Question.objects.all().filter(subject=request.site.id).filter(topic=topic)
  918.  
  919. # Get active assessment engine (practice) and dynamically load engine
  920. active_engine = Assessment.objects.all().filter(active=True).get(type=Assessment.PRACTICE)
  921. engine = getattr(assessment_engine, active_engine.engine)()
  922.  
  923. # Initialise session storage for assessment engine
  924. if 'engine_store' not in request.session:
  925. request.session['engine_store'] = None
  926.  
  927. # Request a new question from the assessment engine
  928. question = engine.get_next_question(user=request.user, topic=topic, question_pool=question_pool, session_store=request.session['engine_store'])
  929.  
  930. # Get current ability for debug purposes
  931. debug['ability'] = engine.get_user_ability(user=request.user, topic=topic)
  932.  
  933. #debug['answer'] = question.choices[question.answers.all()[0].content.lower()]
  934.  
  935. # Woops, we ran out of suitable questions, give error and direct to reset
  936. # TODO: Proper RESET (Currently when it runs out of questions it will just go back to home!)
  937. if not question:
  938. return redirect('/practice/')
  939.  
  940. # Update the question to session (for persistance if user refresh page/relogin)
  941. request.session['practice_current_qn'] = question.id
  942. else:
  943. # Reload question from session data if resuming practice or page refresh
  944. question = Question.objects.all().filter(subject=request.site.id).get(id=request.session['practice_current_qn'])
  945.  
  946. # Rendering at end of page
  947. else:
  948.  
  949. # Submitting a practice question
  950. if 'qid' in request.POST and request.POST['qid']:
  951. qnid_post = request.POST['qid']
  952. else:
  953. qnid_post = None
  954.  
  955. qnid_session = request.session['practice_current_qn']
  956.  
  957. if qnid_post != qnid_session:
  958. # Something strange is happening, missing qid from form or mismatch between form and session, TODO: Handle this PROPERLY
  959. debug['qnid_post'] = qnid_post
  960. debug['qnid_session'] = qnid_session
  961.  
  962. # Reload question from session data
  963. question = Question.objects.all().filter(subject=request.site.id).get(id=qnid_session)
  964.  
  965. # Check if answer was submitted
  966. if 'ans' in request.POST and request.POST['ans']:
  967. choice = request.POST['ans']
  968.  
  969. # Get active assessment engine (practice) and dynamically load engine
  970. active_engine = Assessment.objects.all().filter(active=True).get(type=Assessment.PRACTICE)
  971. engine = getattr(assessment_engine, active_engine.engine)()
  972.  
  973. # Initialise session storage for assessment engine
  974. if 'engine_store' not in request.session:
  975. request.session['engine_store'] = None
  976.  
  977. # Match answer using assessment engine
  978. result = engine.match_answers(user=request.user, response=choice, question=question, session_store=request.session['engine_store'])
  979.  
  980. # Restore updated engine store
  981. # request.session['engine_store'] = result['session_store']
  982.  
  983. # Answer is correct if full points is awarded
  984. if result['correctness'] == 1.0:
  985. correct = True
  986. else:
  987. correct = False
  988.  
  989. # Get correct answer
  990. question.answer = question.answers.all()[0]
  991.  
  992. # Ability score for debug purposes
  993. debug['ability'] = result['ability']
  994.  
  995. # Reset current practice qn to None
  996. request.session['practice_current_qn'] = None
  997.  
  998. # Format question for web mode
  999. formatter = formatter_engine.WebQuestionFormatter()
  1000. question = formatter.format(question)
  1001.  
  1002. # Temp variable to allow ajax through https
  1003. host = request.get_host()
  1004. is_secure = not "localhost" in host
  1005.  
  1006. # Kill debug for non test users
  1007. if request.user.get_profile().debug is False:
  1008. debug = {}
  1009.  
  1010. return render(request, 'edukts_web/practice.submit.html', {'question': question, 'topic': topic, 'choice': choice, 'correct': correct, 'debug': debug, 'host': host, 'is_secure': is_secure})
  1011. else:
  1012. # Option not selected, prompt error
  1013. error['unselected'] = True
  1014. # Process completed form
  1015. # Process completed form
  1016. if request.method == 'POST':
  1017. form = forms.QnaQuestionForm(subject=request.site.id, data=request.POST) # Bind form to user data
  1018. #return HttpResponse(request.POST.get("content"))
  1019.  
  1020. if form.is_valid():
  1021. # Insert new QnA question into database
  1022. # TODO: Harden the qna form by rechecking & filtering the data for subject & topic fields to ensure validity
  1023. essay_response = EssayResponse(title=form.cleaned_data['title'], content=form.cleaned_data['content'], subject=Subject.objects.get(id=request.site.id), user=request.user, topic=Topic.objects.get(id=request.site.id), question = question)
  1024. essay_response.save()
  1025.  
  1026. # QnA Question successfully added
  1027. return redirect('/myessays/list/')
  1028. # Oops something went wrong in form
  1029. else:
  1030. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic, 'error': error, 'debug': debug})
  1031.  
  1032. # Invalid HTTP request
  1033. else:
  1034. raise Http404
  1035.  
  1036. # Format question for web mode
  1037. formatter = formatter_engine.WebQuestionFormatter()
  1038. question = formatter.format(question)
  1039.  
  1040. # Kill debug for non test users
  1041. if request.user.get_profile().debug is False:
  1042. debug = {}
  1043.  
  1044. # Render question page
  1045. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic, 'error': error, 'debug': debug})
  1046.  
  1047. @login_required
  1048. def practice_resume(request):
  1049. "Restore practice session into last state"
  1050.  
  1051. if 'practice_current_qn' in request.session and request.session['practice_current_qn'] != None:
  1052. # Load previous question by going to the respective practice url
  1053. # Retrieve topic from question id in session
  1054. question = Question.objects.all().filter(subject=request.site.id).get(id=request.session['practice_current_qn'])
  1055. topid_id = int(question.topic.id)
  1056.  
  1057. # Redirect to correct topical practice page
  1058. return redirect('/practice/'+str(topid_id)+'/')
  1059.  
  1060. else:
  1061. # Go back to main practice page
  1062. return redirect('/practice/')
  1063.  
  1064. @login_required
  1065. def practice_end(request):
  1066. "End current practice session"
  1067.  
  1068. if 'practice_current_qn' in request.session:
  1069. del request.session['practice_current_qn']
  1070.  
  1071. # Go back to main practice page
  1072. return redirect('/practice/')
  1073.  
  1074. @login_required
  1075. def question_view(request, id, practiced=False):
  1076. "Lets the user view the question with answers"
  1077.  
  1078. # Question exists?
  1079. question = Question.objects.all().filter(subject=request.site.id).get(id=id)
  1080. if question:
  1081. # Check if user has done question if practiced = true
  1082. if practiced:
  1083. user_practiced = Response.objects.all().filter(user=request.user).filter(question=id)
  1084. if not user_practiced:
  1085. return redirect('/')
  1086.  
  1087. # Load question and render
  1088. # Get correct answer
  1089. question.answer = question.answers.all()[0]
  1090.  
  1091. # Format question for web mode
  1092. formatter = formatter_engine.WebQuestionFormatter()
  1093. question = formatter.format(question)
  1094.  
  1095. # Temp variable to allow ajax through https
  1096. host = request.get_host()
  1097. is_secure = not "localhost" in host
  1098.  
  1099. return render(request, 'edukts_web/question.view.html', {'question': question, 'topic': question.topic, 'host': host, 'is_secure': is_secure})
  1100.  
  1101. else:
  1102. return redirect('/')
  1103.  
  1104. pass
  1105.  
  1106. # additional view to list all possible questions
  1107.  
  1108. @user_passes_test(lambda u: u.is_superuser)
  1109. def admin(request):
  1110. return render(request, 'edukts_web/submit.html')
  1111.  
  1112. @user_passes_test(lambda u: u.is_superuser)
  1113. def system_health_check(request):
  1114. # Check system to ensure only 1 (and not less) assessment per type (practice and test) is active
  1115.  
  1116. # Check system to ensure all assessment engines can be loaded
  1117.  
  1118. pass
  1119.  
  1120. @login_required
  1121. def debug_changemode(request, mode):
  1122. mode = int(mode)
  1123.  
  1124. if mode == 1:
  1125. # Swap to Random Practice mode
  1126. catengine = Assessment.objects.all().get(name='CAT Practice')
  1127. randomengine = Assessment.objects.all().get(name='Random Practice')
  1128.  
  1129. catengine.active = False
  1130. randomengine.active = True
  1131.  
  1132. catengine.save()
  1133. randomengine.save()
  1134. elif mode == 2:
  1135. # Swap to CAT Practice mode
  1136. catengine = Assessment.objects.all().get(name='CAT Practice')
  1137. randomengine = Assessment.objects.all().get(name='Random Practice')
  1138.  
  1139. catengine.active = True
  1140. randomengine.active = False
  1141.  
  1142. catengine.save()
  1143. randomengine.save()
  1144.  
  1145. return HttpResponseRedirect('/home/')
  1146.  
  1147. @login_required
  1148. def debug_clearresponses(request):
  1149. # Clears all responses for current user
  1150.  
  1151. request.session['engine_store'] = None
  1152.  
  1153. Response.objects.all().filter(user=request.user).delete()
  1154.  
  1155. return redirect('/practice/')
  1156.  
  1157. @user_passes_test(lambda u: u.is_staff)
  1158. def control(request):
  1159. "Control Panel Code"
  1160. # Obtain the list of topics
  1161. tests = Test.objects.all()
  1162.  
  1163. testcount = tests.count()
  1164.  
  1165. return render_to_response('edukts_web/control-empty.html', {'tests': tests, 'testcount': testcount}, context_instance=RequestContext(request))
  1166.  
  1167. @user_passes_test(lambda u: u.is_staff)
  1168. def control_cattest_settings(request):
  1169. topics = Topic.objects.all().filter(subject=request.site.id)
  1170.  
  1171. return render(request, 'edukts_web/control-createnewtest.html', {'topics': topics})
  1172.  
  1173. @user_passes_test(lambda u: u.is_staff)
  1174. def controlnewtest(request):
  1175. "Control Panel Code"
  1176. # Obtain the list of topics
  1177. tests = Test.objects.all()
  1178.  
  1179. return render_to_response('edukts_web/control-createnewtest.html', {'tests': tests}, context_instance=RequestContext(request))
  1180.  
  1181. @user_passes_test(lambda u: u.is_staff)
  1182. def controlnewtest_submit(request):
  1183. "Control Panel Code"
  1184. # Obtain the list of topics
  1185. if request.method == 'POST' and request.POST['newtestNumOfQns']:
  1186. numQns = request.POST['newtestNumOfQns']
  1187.  
  1188. testid = ''.join(random.choice('abcdefghijklmnopqrstuvwxyz0123456789') for i in range(6))
  1189.  
  1190. #### VERY IMPORTANT TODO:: CHECK FOR UNIQUE ID
  1191. new_test = Test(id=testid, assessment=Assessment.objects.all().get(name='Generic Test'))
  1192. new_test.save()
  1193.  
  1194. numQns = int(numQns)
  1195.  
  1196. for i in range (0, numQns):
  1197. # Get a random question and add to paper
  1198. question_pool = Question.objects.all().filter(subject=request.site.id).filter(topic=1)
  1199. question_pool = question_pool.exclude(id__in=new_test.questions.all().values_list('id'))
  1200.  
  1201. if question_pool:
  1202. question = question_pool[random.randint(0, question_pool.count()-1)]
  1203. newTestQuestion = TestQuestion(question=question, test=new_test)
  1204. newTestQuestion.save()
  1205.  
  1206.  
  1207. return render_to_response('edukts_web/control-createnewtest.html', {'testid': testid}, context_instance=RequestContext(request))
  1208.  
  1209. @user_passes_test(lambda u: u.is_staff)
  1210. def controlviewpaper(request, testid):
  1211. "Control Panel Code"
  1212. # Obtain the list of topics
  1213. tests = Test.objects.all()
  1214.  
  1215. # Get this test
  1216. thisTest = Test.objects.all().get(id=testid)
  1217.  
  1218. # Home mode
  1219. # Show test responses
  1220. # Open paper for testing
  1221. # Download paper in LaTeX format
  1222.  
  1223. # Question modecontrol_cattest_settingsconcontrol_cattest_settingstrol_cattest_settings
  1224. # Display all questions in test
  1225. # Display dummy modify button
  1226. questions = thisTest.questions.all()
  1227.  
  1228. averagediff = thisTest.questions.all().aggregate(Avg('difficulty')).values()[0]
  1229.  
  1230. # Stats mode
  1231. # Currently not used
  1232. # Paper users, scores, etc
  1233.  
  1234. return render_to_response('edukts_web/control.html', {'tests': tests, 'testid': testid, 'thistest': thisTest, 'questions': questions, 'avgdiff': averagediff}, context_instance=RequestContext(request))
  1235.  
  1236. @user_passes_test(lambda u: u.is_staff)
  1237. def controldownloadpaper(request, testid):
  1238. "Control Panel Code"
  1239. # Obtain the list of topics
  1240. tests = Test.objects.all()
  1241.  
  1242. # Get this test
  1243. thisTest = Test.objects.all().get(id=testid)
  1244.  
  1245. # Home mode
  1246. # Show test responses
  1247. # Open paper for testing
  1248. # Download paper in LaTeX format
  1249.  
  1250. # Question mode
  1251. # Display all questions in test
  1252. # Display dummy modify button
  1253. questions = thisTest.questions.all()
  1254.  
  1255. averagediff = thisTest.questions.all().aggregate(Avg('difficulty')).values()[0]
  1256.  
  1257. # Stats mode
  1258. # Currently not used
  1259. # Paper users, scores, etc
  1260.  
  1261. return render_to_response('edukts_web/download.tex', {'tests': tests, 'testid': testid, 'thistest': thisTest, 'questions': questions, 'avgdiff': averagediff}, context_instance=RequestContext(request))
  1262.  
  1263. @csrf_exempt
  1264. def postdata(request):
  1265. if request.method == 'POST':
  1266.  
  1267. # loop through keys and values
  1268. for key, value in request.POST.iteritems():
  1269. pass
  1270.  
  1271. return render_to_response('postdata.html', {'postdata': request.POST}, context_instance=RequestContext(request))
  1272.  
  1273. @user_passes_test(lambda u: u.is_staff)
  1274. def prototype(request, question_id=None):
  1275. # Init
  1276. selected_question = None
  1277.  
  1278. # Obtain the list of topics
  1279. topics = Topic.objects.all().filter(subject=request.site.id)
  1280. themes = Theme.objects.all().filter(subject=request.site.id)
  1281. types = QuestionType.objects.all().filter(subject=request.site.id)
  1282.  
  1283. # Objectify the selected question
  1284. if question_id:
  1285. selected_question = Question.objects.all().filter(subject=request.site.id).get(id=int(question_id))
  1286.  
  1287. if request.method == 'POST':
  1288. form = forms.InsertEditQuestionForm(request.POST, request.FILES) # Bind to user submitted form
  1289. #print form
  1290.  
  1291. #print request.FILES['newimage']
  1292. #print request.POST
  1293. #print request.FILES
  1294. #print form
  1295. #filename = request.FILES['image'].name
  1296. #print filename
  1297. #for filename, file in request.FILES.iteritems():
  1298. #name = request.FILES[filename].name
  1299. #print name
  1300.  
  1301.  
  1302.  
  1303.  
  1304. if form.is_valid():
  1305. # Check if question exists or need to create new
  1306. #print form
  1307. if selected_question:
  1308. # Edit existing question
  1309.  
  1310.  
  1311. selected_question.content=form.cleaned_data['content'].replace("\r\n", "<br>")
  1312. selected_question.difficulty=form.cleaned_data['difficulty']
  1313. selected_question.topic=form.cleaned_data['topic']
  1314. selected_question.theme=form.cleaned_data['theme']
  1315. selected_question.time=form.cleaned_data['time']
  1316. selected_question.title=form.cleaned_data['title']
  1317. selected_question.marks=form.cleaned_data['marks']
  1318. selected_question.reference=form.cleaned_data['answer'].replace("\r\n", "<br>")
  1319. selected_question.point1=form.cleaned_data['point1']
  1320. selected_question.point2=form.cleaned_data['point2']
  1321. selected_question.point3=form.cleaned_data['point3']
  1322. selected_question.point4=form.cleaned_data['point4']
  1323. selected_question.point5=form.cleaned_data['point5']
  1324. selected_question.point6=form.cleaned_data['point6']
  1325. selected_question.point7=form.cleaned_data['point7']
  1326. selected_question.picturecontent=form.cleaned_data['picturecontent']
  1327.  
  1328. if (selected_question.topic.name in ["Picture-Based", "Situation-Based"] ):
  1329. selected_question.type = QuestionType.objects.all().filter(subject=request.site.id).get(id=1)
  1330. else:
  1331. selected_question.type = QuestionType.objects.all().filter(subject=request.site.id).get(id=2)
  1332.  
  1333.  
  1334. if request.FILES:
  1335. filename = request.FILES['newimage'].name
  1336. extension = filename.split(".")[-1]
  1337. imageurlstatic = "static/images/EssayPictures/Question" + str(selected_question.id) + "." + extension
  1338. imageurl = imageurlstatic.replace("static/", "", 1);
  1339. handle_uploaded_file(request.FILES['newimage'], imageurlstatic)
  1340. selected_question.image=imageurl
  1341.  
  1342.  
  1343. selected_question.save()
  1344.  
  1345. # Tag adding/deleting
  1346. selected_question.tags.clear()
  1347. for tag_name in form.cleaned_data['tags']:
  1348. # Check tag exists in db, otherwise add
  1349. # Currently no need since automatically verified
  1350. tag = Tag.objects.all().filter(subject=request.site.id).get(name=tag_name)
  1351.  
  1352. qn_tag = QuestionTag(question=selected_question, tag=tag)
  1353. qn_tag.save()
  1354.  
  1355. return redirect('/prototype2/list/topic/'+ str(selected_question.topic.id) +'/?msg=Question '+ str(selected_question.id) +' edited successfully#question-'+ str(selected_question.id))
  1356. else:
  1357. # Insert new question
  1358. question = Question(content=form.cleaned_data['content'].replace("\r\n", "<br>"), difficulty=form.cleaned_data['difficulty'], topic=form.cleaned_data['topic'], theme=form.cleaned_data['theme'], time=form.cleaned_data['time'], title=form.cleaned_data['title'], marks=form.cleaned_data['marks'], reference=form.cleaned_data['answer'].replace("\r\n", "<br>"), point1=form.cleaned_data['point1'].replace("\r\n", "<br>"), point2=form.cleaned_data['point2'].replace("\r\n", "<br>"), point3=form.cleaned_data['point3'].replace("\r\n", "<br>"), point4=form.cleaned_data['point4'].replace("\r\n", "<br>"), point5=form.cleaned_data['point5'].replace("\r\n", "<br>"), point6=form.cleaned_data['point6'].replace("\r\n", "<br>"), point7=form.cleaned_data['point7'].replace("\r\n", "<br>"), picturecontent=form.cleaned_data['picturecontent'], subject=Subject.objects.get(id=request.site.id))
  1359.  
  1360. if (question.topic.name in ["Picture-Based", "Situation-Based"] ):
  1361. question.type = QuestionType.objects.all().filter(subject=request.site.id).get(id=1)
  1362. else:
  1363. question.type = QuestionType.objects.all().filter(subject=request.site.id).get(id=2)
  1364.  
  1365. question.save()
  1366.  
  1367. if request.FILES:
  1368. filename = request.FILES['newimage'].name
  1369. extension = filename.split(".")[-1]
  1370. imageurlstatic = "static/images/EssayPictures/Question" + str(question.id) + "." + extension
  1371. imageurl = imageurlstatic.replace("static/", "", 1);
  1372. handle_uploaded_file(request.FILES['newimage'], imageurlstatic)
  1373. question.image=imageurl
  1374.  
  1375. question.save()
  1376.  
  1377. for tag_name in form.cleaned_data['tags']:
  1378. # Check tag exists in db, otherwise add
  1379. # Currently no need since automatically verified
  1380. tag = Tag.objects.all().filter(subject=request.site.id).get(name=tag_name)
  1381.  
  1382. qn_tag = QuestionTag(question=question, tag=tag)
  1383. qn_tag.save()
  1384.  
  1385. # Question inserted successfully!
  1386. return redirect('/prototype2/list/topic/'+ str(question.topic.id) +'/?msg=Question '+ str(question.id) +' added successfully#question-'+ str(question.id))
  1387.  
  1388. # Reply regardless valid
  1389. return render(request, 'edukts_web/manage.question.form.html', {'form': form, 'topics': topics, 'selected_question': selected_question, 'themes': themes})
  1390. else:
  1391. # Check if question exists or give blank form
  1392. if selected_question:
  1393. # Load existing question into a form
  1394. #answer = selected_question.reference.replace("<br>", "&#013;");
  1395. answer = selected_question.reference.replace("<br>", "\n");
  1396. point1 = selected_question.point1.replace("<br>", "\n");
  1397. content = selected_question.content.replace("<br>", "\n");
  1398. point2 = selected_question.point2.replace("<br>", "\n");
  1399. point3 = selected_question.point3.replace("<br>", "\n");
  1400. point4 = selected_question.point4.replace("<br>", "\n");
  1401. point5 = selected_question.point5.replace("<br>", "\n");
  1402. point6 = selected_question.point6.replace("<br>", "\n");
  1403. point7 = selected_question.point7.replace("<br>", "\n");
  1404. picturecontent = selected_question.picturecontent
  1405. form = forms.InsertEditQuestionForm(initial={'content':content, 'difficulty':selected_question.difficulty, 'topic':selected_question.topic, 'answer':answer, 'point1': point1, 'point2': point2, 'point3': point3, 'point4': point4, 'point5': point5, 'point6': point6, 'point7': point7, 'picturecontent':picturecontent, 'tags': selected_question.tags.all().values_list('name', flat=True), 'theme':selected_question.theme, 'title':selected_question.title, 'image' : selected_question.image, 'type': selected_question.type})
  1406. solution_exists = Solution.objects.all().filter(question=selected_question).count()
  1407. refEssay = selected_question.reference.replace("<br>", "");
  1408. Question1 = selected_question.content.replace("<br>", "");
  1409.  
  1410. formToSubmit = { "refEssay": refEssay, "Question1":Question1, "picturecontent":picturecontent}
  1411.  
  1412.  
  1413. try:
  1414.  
  1415. r = requests.post("http://localhost:8080/simcheck", data=formToSubmit)
  1416. r.raise_for_status()
  1417. except requests.exceptions.HTTPError as err:
  1418. print err
  1419.  
  1420.  
  1421.  
  1422. scores = json.loads(r.text)
  1423.  
  1424. essay_response = EssayResponse(subject=Subject.objects.get(id=request.site.id), user=request.user, topic=Topic.objects.get(id=request.site.id), ExtractedContentPoints = scores['missedContentPoints'])
  1425. if solution_exists > 0:
  1426. form.fields["solution"].initial = selected_question.solution.content
  1427. return render(request, 'edukts_web/manage.question.form.html', {'form': form, 'topics': topics, 'selected_question': selected_question, 'themes':themes, 'types' : types, 'essay_response' : essay_response})
  1428. else:
  1429. # Display new form for user to fill in
  1430. form = forms.InsertEditQuestionForm()
  1431.  
  1432. return render(request, 'edukts_web/manage.question.form.html', {'form': form, 'topics': topics, 'selected_question': selected_question, 'themes':themes, 'types' : types})
  1433.  
  1434. @user_passes_test(lambda u: u.is_staff)
  1435. def new_practice_question(request, question_id=None):
  1436. # Init
  1437. selected_question = None
  1438.  
  1439. # Obtain the list of topics
  1440. topics = Topic.objects.all().filter(subject=request.site.id)
  1441. themes = Theme.objects.all().filter(subject=request.site.id)
  1442.  
  1443. # Objectify the selected question
  1444. if question_id:
  1445. selected_question = Question.objects.all().filter(subject=request.site.id).get(id=int(question_id))
  1446.  
  1447. if request.method == 'POST':
  1448. form = forms.InsertEditQuestionForm(request.POST) # Bind to user submitted form
  1449. if form.is_valid():
  1450. # Check if question exists or need to create new
  1451. if selected_question:
  1452. # Edit existing question
  1453. selected_question.content=form.cleaned_data['content']
  1454. selected_question.difficulty=form.cleaned_data['difficulty']
  1455. selected_question.topic=form.cleaned_data['topic']
  1456. selected_question.save()
  1457.  
  1458. answer = selected_question.answers.all()[0]
  1459. answer.content = form.cleaned_data['answer']
  1460. answer.save()
  1461.  
  1462. # Insert solution if exists
  1463. if form.cleaned_data['solution']:
  1464. # Check if solution exists
  1465. solution_exists = Solution.objects.all().filter(question=selected_question).count()
  1466.  
  1467. if solution_exists > 0:
  1468. # Update solution
  1469. solution = selected_question.solution
  1470. solution.content = form.cleaned_data['solution']
  1471. solution.save()
  1472. else:
  1473. # New solution for this question
  1474. solution = Solution(question=selected_question, content=form.cleaned_data['solution'])
  1475. solution.save()
  1476.  
  1477. # Tag adding/deleting
  1478. selected_question.tags.clear()
  1479. for tag_name in form.cleaned_data['tags']:
  1480. # Check tag exists in db, otherwise add
  1481. # Currently no need since automatically verified
  1482. tag = Tag.objects.all().filter(subject=request.site.id).get(name=tag_name)
  1483.  
  1484. qn_tag = QuestionTag(question=selected_question, tag=tag)
  1485. qn_tag.save()
  1486.  
  1487. return redirect('/prototype2/list/topic/'+ str(selected_question.topic.id) +'/?msg=Question '+ str(selected_question.id) +' edited successfully#question-'+ str(selected_question.id))
  1488. else:
  1489. # Insert new question
  1490. question = Question(content=form.cleaned_data['content'], difficulty=form.cleaned_data['difficulty'], topic=form.cleaned_data['topic'])
  1491. question.save()
  1492.  
  1493. # Insert answer for question
  1494. answer = Answer(question=question, content=form.cleaned_data['answer'])
  1495. answer.save()
  1496.  
  1497. # Insert solution if exists
  1498. if form.cleaned_data['solution']:
  1499. solution = Solution(question=question, content=form.cleaned_data['solution'])
  1500. solution.save()
  1501.  
  1502. for tag_name in form.cleaned_data['tags']:
  1503. # Check tag exists in db, otherwise add
  1504. # Currently no need since automatically verified
  1505. tag = Tag.objects.all().filter(subject=request.site.id).get(name=tag_name)
  1506.  
  1507. qn_tag = QuestionTag(question=question, tag=tag)
  1508. qn_tag.save()
  1509.  
  1510. # Question inserted successfully!
  1511. return redirect('/prototype2/list/topic/'+ str(question.topic.id) +'/?msg=Question '+ str(question.id) +' added successfully#question-'+ str(question.id))
  1512.  
  1513. # Reply regardless valid
  1514. return render(request, 'edukts_web/manage.question.form.html', {'form': form, 'topics': topics, 'themes' : themes,'selected_question': selected_question})
  1515. else:
  1516. # Check if question exists or give blank form
  1517. if selected_question:
  1518. # Load existing question into a form
  1519. form = forms.InsertEditQuestionForm(initial={'content':selected_question.content, 'difficulty':selected_question.difficulty, 'topic':selected_question.topic, 'answer':selected_question.answers.all()[0].content, 'tags': selected_question.tags.all().values_list('name', flat=True)})
  1520.  
  1521. solution_exists = Solution.objects.all().filter(question=selected_question).count()
  1522.  
  1523. if solution_exists > 0:
  1524. form.fields["solution"].initial = selected_question.solution.content
  1525. else:
  1526. # Display new form for user to fill in
  1527. form = forms.InsertEditQuestionForm()
  1528.  
  1529. return render(request, 'edukts_web/manage.question.form.html', {'form': form, 'topics': topics, 'themes' : themes, 'selected_question': selected_question})
  1530.  
  1531.  
  1532.  
  1533. @user_passes_test(lambda u: u.is_staff)
  1534. def prototype3(request, question_id=None):
  1535. # Init
  1536. selected_question = None
  1537.  
  1538. # Obtain the list of topics
  1539. topics = Topic.objects.all().filter(subject=request.site.id)
  1540.  
  1541. # Objectify the selected question
  1542. if question_id:
  1543. selected_question = Question.objects.all().filter(subject=request.site.id).get(id=int(question_id))
  1544.  
  1545. # Check if question exists otherwise redirect to question list
  1546. if selected_question:
  1547. # Hide question and save. Then give message to user
  1548. #selected_question.is_active = False
  1549. #selected_question.save()
  1550. selected_question.delete()
  1551.  
  1552. return redirect('/prototype2/?msg=Question has been deleted')
  1553. else:
  1554. # Redirect user back to question lists
  1555. return redirect('/prototype/')
  1556.  
  1557. @login_required
  1558. def list_practice_question(request, topic_id=None, theme_id=None):
  1559. # Record usage for stats purpose
  1560. page = "question_management"
  1561. # Never accessed this page before, or last access was more than 10 mins ago
  1562. if 'user_usage_'+page not in request.session or datetime.now() > datetime.strptime(request.session['user_usage_'+page], "%a %b %d %H:%M:%S %Y") + timedelta(minutes=10):
  1563. usage = UserUsage(user=request.user, page=page)
  1564. usage.save()
  1565. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  1566. # End usage recording
  1567.  
  1568. # Init
  1569. filtered_questions = None
  1570. selected_topic = None
  1571. selected_theme = None
  1572.  
  1573. # Obtain the list of topics
  1574. topics = Topic.objects.all().filter(subject=request.site.id)
  1575. all_tags = Tag.objects.all().filter(subject=request.site.id)
  1576. themes = Theme.objects.all().filter(subject=request.site.id)
  1577.  
  1578. # int the selected topic
  1579. if topic_id:
  1580. selected_topic = Topic.objects.all().filter(subject=request.site.id).get(id=int(topic_id))
  1581.  
  1582. if topic_id:
  1583. # Retrieve questions for this topic
  1584. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(topic=topic_id).filter(type=2)
  1585.  
  1586. if topic_id:
  1587. # Retrieve questions for this topic
  1588. Ann_questions = Question.objects.all().filter(topic=1).filter(type=2)
  1589. if topic_id:
  1590. # Retrieve questions for this topic
  1591. pic_questions = Question.objects.all().filter(topic=12).filter(type=2)
  1592. if topic_id:
  1593. # Retrieve questions for this topic
  1594. rep_questions = Question.objects.all().filter(topic=11).filter(type=2)
  1595. if topic_id:
  1596. # Retrieve questions for this topic
  1597. lett_questions = Question.objects.all().filter(topic=10).filter(type=2)
  1598. if topic_id:
  1599. # Retrieve questions for this topic
  1600. sit_questions = Question.objects.all().filter(topic=9).filter(type=2)
  1601. if topic_id:
  1602. # Retrieve questions for this topic
  1603. note_questions = Question.objects.all().filter(topic=8).filter(type=2)
  1604. if topic_id:
  1605. # Retrieve questions for this topic
  1606. sum_questions = Question.objects.all().filter(topic=7).filter(type=2)
  1607. if topic_id:
  1608. # Retrieve questions for this topic
  1609. inst_questions = Question.objects.all().filter(topic=6).filter(type=2)
  1610. if topic_id:
  1611. # Retrieve questions for this topic
  1612. rev_questions = Question.objects.all().filter(topic=5).filter(type=2)
  1613. if topic_id:
  1614. # Retrieve questions for this topic
  1615. post_questions = Question.objects.all().filter(topic=4).filter(type=2)
  1616. if topic_id:
  1617. # Retrieve questions for this topic
  1618. ad_questions = Question.objects.all().filter(topic=3).filter(type=2)
  1619. if topic_id:
  1620. # Retrieve questions for this topic
  1621. notice_questions = Question.objects.all().filter(topic=2).filter(type=2)
  1622. if topic_id:
  1623. # Retrieve questions for this topic
  1624. em_questions = Question.objects.all().filter(topic=13).filter(type=2)
  1625. # Filter for difficulty if specified
  1626. if request.GET.__contains__('difficulty'):
  1627. difficulty = request.GET.get('difficulty')
  1628.  
  1629. # Only filter if input is an int!
  1630. try:
  1631. difficulty = int(difficulty)
  1632. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1633. except exceptions.ValueError:
  1634. pass
  1635. return render(request, 'edukts_web/situational.question.list.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'acount': Ann_questions, 'bcount': pic_questions, 'ccount': rep_questions, 'dcount': lett_questions, 'ecount': sit_questions, 'fcount': note_questions, 'gcount': sum_questions, 'hcount': inst_questions, 'icount': rev_questions,'jcount': post_questions,'kcount': ad_questions,'lcount': notice_questions,'mcount': em_questions, 'all_tags': all_tags, 'themes': themes, 'themed': False})
  1636. if theme_id:
  1637. selected_theme = Theme.objects.all().filter(subject=request.site.id).get(id=int(theme_id))
  1638.  
  1639. if theme_id:
  1640. # Retrieve questions for this topic
  1641. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(theme=theme_id).filter(type=2)
  1642.  
  1643. # Filter for difficulty if specified
  1644. if request.GET.__contains__('difficulty'):
  1645. difficulty = request.GET.get('difficulty')
  1646.  
  1647. # Only filter if input is an int!
  1648. try:
  1649. difficulty = int(difficulty)
  1650. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1651. except exceptions.ValueError:
  1652. pass
  1653.  
  1654. return render(request, 'edukts_web/situational.question.list.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'all_tags': all_tags, 'themes': themes, 'selected_theme' : selected_theme, 'themed': True})
  1655.  
  1656. Ann_questions = Question.objects.all().filter(topic=1).filter(type=2)
  1657. pic_questions = Question.objects.all().filter(topic=12).filter(type=2)
  1658. rep_questions = Question.objects.all().filter(topic=11).filter(type=2)
  1659. lett_questions = Question.objects.all().filter(topic=10).filter(type=2)
  1660.  
  1661. sit_questions = Question.objects.all().filter(topic=9).filter(type=2)
  1662. note_questions = Question.objects.all().filter(topic=8).filter(type=2)
  1663. sum_questions = Question.objects.all().filter(topic=7).filter(type=2)
  1664. inst_questions = Question.objects.all().filter(topic=6).filter(type=2)
  1665. rev_questions = Question.objects.all().filter(topic=5).filter(type=2)
  1666. post_questions = Question.objects.all().filter(topic=4).filter(type=2)
  1667. ad_questions = Question.objects.all().filter(topic=3).filter(type=2)
  1668. notice_questions = Question.objects.all().filter(topic=2).filter(type=2)
  1669. em_questions = Question.objects.all().filter(topic=13).filter(type=2)
  1670. return render(request, 'edukts_web/situational.question.list.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'acount': Ann_questions, 'bcount': pic_questions, 'ccount': rep_questions, 'dcount': lett_questions, 'ecount': sit_questions, 'fcount': note_questions, 'gcount': sum_questions, 'hcount': inst_questions, 'icount': rev_questions,'jcount': post_questions,'kcount': ad_questions,'lcount': notice_questions,'mcount': em_questions, 'all_tags': all_tags, 'themes': themes, 'selected_theme' : selected_theme, 'themed': False})
  1671.  
  1672.  
  1673. @login_required
  1674. def progress(request, topic_id=None, theme_id=None):
  1675. # Record usage for stats purpose
  1676. page = "question_management"
  1677. # Never accessed this page before, or last access was more than 10 mins ago
  1678. if 'user_usage_'+page not in request.session or datetime.now() > datetime.strptime(request.session['user_usage_'+page], "%a %b %d %H:%M:%S %Y") + timedelta(minutes=10):
  1679. usage = UserUsage(user=request.user, page=page)
  1680. usage.save()
  1681. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  1682. # End usage recording
  1683.  
  1684. # Init
  1685. filtered_questions = None
  1686. selected_topic = None
  1687. selected_theme = None
  1688.  
  1689. # Obtain the list of topics
  1690. topics = Topic.objects.all().filter(subject=request.site.id)
  1691. all_tags = Tag.objects.all().filter(subject=request.site.id)
  1692. themes = Theme.objects.all().filter(subject=request.site.id)
  1693.  
  1694. # int the selected topic
  1695. if topic_id:
  1696. selected_topic = Topic.objects.all().filter(subject=request.site.id).get(id=int(topic_id))
  1697.  
  1698. if topic_id:
  1699. # Retrieve questions for this topic
  1700. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(topic=topic_id).filter(type=2)
  1701.  
  1702. if topic_id:
  1703. # Retrieve questions for this topic
  1704. Ann_questions = Question.objects.all().filter(topic=1).filter(type=2)
  1705. if topic_id:
  1706. # Retrieve questions for this topic
  1707. pic_questions = Question.objects.all().filter(topic=12).filter(type=2)
  1708. if topic_id:
  1709. # Retrieve questions for this topic
  1710. rep_questions = Question.objects.all().filter(topic=11).filter(type=2)
  1711. if topic_id:
  1712. # Retrieve questions for this topic
  1713. lett_questions = Question.objects.all().filter(topic=10).filter(type=2)
  1714. if topic_id:
  1715. # Retrieve questions for this topic
  1716. sit_questions = Question.objects.all().filter(topic=9).filter(type=2)
  1717. if topic_id:
  1718. # Retrieve questions for this topic
  1719. note_questions = Question.objects.all().filter(topic=8).filter(type=2)
  1720. if topic_id:
  1721. # Retrieve questions for this topic
  1722. sum_questions = Question.objects.all().filter(topic=7).filter(type=2)
  1723. if topic_id:
  1724. # Retrieve questions for this topic
  1725. inst_questions = Question.objects.all().filter(topic=6).filter(type=2)
  1726. if topic_id:
  1727. # Retrieve questions for this topic
  1728. rev_questions = Question.objects.all().filter(topic=5).filter(type=2)
  1729. if topic_id:
  1730. # Retrieve questions for this topic
  1731. post_questions = Question.objects.all().filter(topic=4).filter(type=2)
  1732. if topic_id:
  1733. # Retrieve questions for this topic
  1734. ad_questions = Question.objects.all().filter(topic=3).filter(type=2)
  1735. if topic_id:
  1736. # Retrieve questions for this topic
  1737. notice_questions = Question.objects.all().filter(topic=2).filter(type=2)
  1738. if topic_id:
  1739. # Retrieve questions for this topic
  1740. em_questions = Question.objects.all().filter(topic=13).filter(type=2)
  1741. # Filter for difficulty if specified
  1742. if request.GET.__contains__('difficulty'):
  1743. difficulty = request.GET.get('difficulty')
  1744.  
  1745. # Only filter if input is an int!
  1746. try:
  1747. difficulty = int(difficulty)
  1748. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1749. except exceptions.ValueError:
  1750. pass
  1751. return render(request, 'progress.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'acount': Ann_questions, 'bcount': pic_questions, 'ccount': rep_questions, 'dcount': lett_questions, 'ecount': sit_questions, 'fcount': note_questions, 'gcount': sum_questions, 'hcount': inst_questions, 'icount': rev_questions,'jcount': post_questions,'kcount': ad_questions,'lcount': notice_questions,'mcount': em_questions, 'all_tags': all_tags, 'themes': themes, 'themed': False})
  1752. if theme_id:
  1753. selected_theme = Theme.objects.all().filter(subject=request.site.id).get(id=int(theme_id))
  1754.  
  1755. if theme_id:
  1756. # Retrieve questions for this topic
  1757. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(theme=theme_id).filter(type=2)
  1758.  
  1759. # Filter for difficulty if specified
  1760. if request.GET.__contains__('difficulty'):
  1761. difficulty = request.GET.get('difficulty')
  1762.  
  1763. # Only filter if input is an int!
  1764. try:
  1765. difficulty = int(difficulty)
  1766. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1767. except exceptions.ValueError:
  1768. pass
  1769.  
  1770. return render(request, 'progress.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'all_tags': all_tags, 'themes': themes, 'selected_theme' : selected_theme, 'themed': True})
  1771. Ann_questions = Question.objects.all().filter(topic=1).filter(type=2)
  1772. pic_questions = Question.objects.all().filter(topic=12).filter(type=2)
  1773. rep_questions = Question.objects.all().filter(topic=11).filter(type=2)
  1774. lett_questions = Question.objects.all().filter(topic=10).filter(type=2)
  1775.  
  1776. sit_questions = Question.objects.all().filter(topic=9).filter(type=2)
  1777. note_questions = Question.objects.all().filter(topic=8).filter(type=2)
  1778. sum_questions = Question.objects.all().filter(topic=7).filter(type=2)
  1779. inst_questions = Question.objects.all().filter(topic=6).filter(type=2)
  1780. rev_questions = Question.objects.all().filter(topic=5).filter(type=2)
  1781. post_questions = Question.objects.all().filter(topic=4).filter(type=2)
  1782. ad_questions = Question.objects.all().filter(topic=3).filter(type=2)
  1783. notice_questions = Question.objects.all().filter(topic=2).filter(type=2)
  1784. em_questions = Question.objects.all().filter(topic=13).filter(type=2)
  1785. return render(request, 'progress.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'acount': Ann_questions, 'bcount': pic_questions, 'ccount': rep_questions, 'dcount': lett_questions, 'ecount': sit_questions, 'fcount': note_questions, 'gcount': sum_questions, 'hcount': inst_questions, 'icount': rev_questions,'jcount': post_questions,'kcount': ad_questions,'lcount': notice_questions,'mcount': em_questions, 'all_tags': all_tags, 'themes': themes, 'selected_theme' : selected_theme, 'themed': False})
  1786.  
  1787. @login_required
  1788. def progress_question(request, question_id):
  1789.  
  1790. question = Question.objects.all().filter(subject=request.site.id).get(id=question_id)
  1791. CurrentUserscore= StudentScores.objects.all()
  1792. Userid=request.user
  1793. return render(request, 'progressattempt.html', {'UserScore':CurrentUserscore , 'User':Userid, 'question':question})
  1794.  
  1795.  
  1796. @login_required
  1797. def list_practice_question2(request, topic_id=None, theme_id=None):
  1798. # Record usage for stats purpose
  1799. page = "question_management"
  1800. # Never accessed this page before, or last access was more than 10 mins ago
  1801. if 'user_usage_'+page not in request.session or datetime.now() > datetime.strptime(request.session['user_usage_'+page], "%a %b %d %H:%M:%S %Y") + timedelta(minutes=10):
  1802. usage = UserUsage(user=request.user, page=page)
  1803. usage.save()
  1804. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  1805. # End usage recording
  1806.  
  1807. # Init
  1808. filtered_questions = None
  1809. selected_topic = None
  1810. selected_theme = None
  1811.  
  1812. # Obtain the list of topics
  1813. topics = Topic.objects.all().filter(subject=request.site.id)
  1814. all_tags = Tag.objects.all().filter(subject=request.site.id)
  1815. themes = Theme.objects.all().filter(subject=request.site.id)
  1816.  
  1817. # int the selected topic
  1818. if topic_id:
  1819. selected_topic = Topic.objects.all().filter(subject=request.site.id).get(id=int(topic_id))
  1820.  
  1821. if topic_id:
  1822. # Retrieve questions for this topic
  1823. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(topic=topic_id).filter(type=1)
  1824.  
  1825. # Filter for difficulty if specified
  1826. if request.GET.__contains__('difficulty'):
  1827. difficulty = request.GET.get('difficulty')
  1828.  
  1829. # Only filter if input is an int!
  1830. try:
  1831. difficulty = int(difficulty)
  1832. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1833. except exceptions.ValueError:
  1834. pass
  1835. return render(request, 'edukts_web/composition.question.list.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'all_tags': all_tags, 'themes': themes, 'themed': False})
  1836. if theme_id:
  1837. selected_theme = Theme.objects.all().filter(subject=request.site.id).get(id=int(theme_id))
  1838.  
  1839. if theme_id:
  1840. # Retrieve questions for this topic
  1841. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(theme=theme_id).filter(type=1)
  1842.  
  1843. # Filter for difficulty if specified
  1844. if request.GET.__contains__('difficulty'):
  1845. difficulty = request.GET.get('difficulty')
  1846.  
  1847. # Only filter if input is an int!
  1848. try:
  1849. difficulty = int(difficulty)
  1850. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1851. except exceptions.ValueError:
  1852. pass
  1853.  
  1854. return render(request, 'edukts_web/composition.question.list.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'all_tags': all_tags, 'themes': themes, 'selected_theme' : selected_theme, 'themed': True})
  1855. return render(request, 'edukts_web/composition.question.list.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'all_tags': all_tags, 'themes': themes, 'selected_theme' : selected_theme, 'themed': False})
  1856.  
  1857. @user_passes_test(lambda u: u.is_staff)
  1858. def prototype2(request, topic_id=None, theme_id=None):
  1859.  
  1860. # Record usage for stats purpose
  1861. page = "question_management"
  1862. # Never accessed this page before, or last access was more than 10 mins ago
  1863. if 'user_usage_'+page not in request.session or datetime.now() > datetime.strptime(request.session['user_usage_'+page], "%a %b %d %H:%M:%S %Y") + timedelta(minutes=10):
  1864. usage = UserUsage(user=request.user, page=page)
  1865. usage.save()
  1866. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  1867. # End usage recording
  1868.  
  1869. # Init
  1870. filtered_questions = None
  1871. selected_topic = None
  1872. selected_theme = None
  1873.  
  1874. # Obtain the list of topics
  1875. topics = Topic.objects.all().filter(subject=request.site.id)
  1876. themes = Theme.objects.all().filter(subject=request.site.id)
  1877. all_tags = Tag.objects.all().filter(subject=request.site.id)
  1878. Ann_questions = Question.objects.all().filter(topic=1)
  1879. pic_questions = Question.objects.all().filter(topic=12)
  1880. rep_questions = Question.objects.all().filter(topic=11)
  1881. lett_questions = Question.objects.all().filter(topic=10)
  1882.  
  1883. sit_questions = Question.objects.all().filter(topic=9)
  1884. note_questions = Question.objects.all().filter(topic=8)
  1885. sum_questions = Question.objects.all().filter(topic=7)
  1886. inst_questions = Question.objects.all().filter(topic=6)
  1887. rev_questions = Question.objects.all().filter(topic=5)
  1888. post_questions = Question.objects.all().filter(topic=4)
  1889. ad_questions = Question.objects.all().filter(topic=3)
  1890. notice_questions = Question.objects.all().filter(topic=2)
  1891. em_questions = Question.objects.all().filter(topic=13)
  1892. # int the selected topic
  1893. if topic_id:
  1894. selected_topic = Topic.objects.all().filter(subject=request.site.id).get(id=int(topic_id))
  1895.  
  1896.  
  1897. if topic_id:
  1898. # Retrieve questions for this topic
  1899. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(topic=topic_id)
  1900.  
  1901. # Filter for difficulty if specified
  1902. if request.GET.__contains__('difficulty'):
  1903. difficulty = request.GET.get('difficulty')
  1904.  
  1905. # Only filter if input is an int!
  1906. try:
  1907. difficulty = int(difficulty)
  1908. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1909. except exceptions.ValueError:
  1910. pass
  1911.  
  1912. return render(request, 'edukts_web/manage.question.list.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'acount': Ann_questions, 'bcount': pic_questions, 'ccount': rep_questions, 'dcount': lett_questions, 'ecount': sit_questions, 'fcount': note_questions, 'gcount': sum_questions, 'hcount': inst_questions, 'icount': rev_questions,'jcount': post_questions,'kcount': ad_questions,'lcount': notice_questions,'mcount': em_questions, 'all_tags': all_tags, 'themes': themes, 'selected_theme' : selected_theme, 'themed': False})
  1913.  
  1914. if theme_id:
  1915. selected_theme = Theme.objects.all().filter(subject=request.site.id).get(id=int(theme_id))
  1916.  
  1917. if theme_id:
  1918. # Retrieve questions for this topic
  1919. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(theme=theme_id)
  1920.  
  1921. # Filter for difficulty if specified
  1922. if request.GET.__contains__('difficulty'):
  1923. difficulty = request.GET.get('difficulty')
  1924.  
  1925. # Only filter if input is an int!
  1926. try:
  1927. difficulty = int(difficulty)
  1928. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1929. except exceptions.ValueError:
  1930. pass
  1931.  
  1932. return render(request, 'edukts_web/manage.question.list.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions, 'acount': Ann_questions, 'bcount': pic_questions, 'ccount': rep_questions, 'dcount': lett_questions, 'ecount': sit_questions, 'fcount': note_questions, 'gcount': sum_questions, 'hcount': inst_questions, 'icount': rev_questions,'jcount': post_questions,'kcount': ad_questions,'lcount': notice_questions,'mcount': em_questions,'all_tags': all_tags, 'themes': themes, 'selected_theme' : selected_theme, 'themed': True})
  1933.  
  1934. return render(request, 'edukts_web/manage.question.list.html', {'topics': topics, 'selected_topic': selected_topic, 'questions': filtered_questions,'acount': Ann_questions, 'bcount': pic_questions, 'ccount': rep_questions, 'dcount': lett_questions, 'ecount': sit_questions, 'fcount': note_questions, 'gcount': sum_questions, 'hcount': inst_questions, 'icount': rev_questions,'jcount': post_questions,'kcount': ad_questions,'lcount': notice_questions,'mcount': em_questions, 'all_tags': all_tags, 'themes': themes})
  1935.  
  1936. @user_passes_test(lambda u: u.is_staff)
  1937. def prototype2a(request):
  1938. # Init
  1939. filtered_questions = Question.objects.all().filter(subject=request.site.id)
  1940.  
  1941. # Obtain the list of topics
  1942. topics = Topic.objects.all().filter(subject=request.site.id)
  1943. all_tags = Tag.objects.all().filter(subject=request.site.id)
  1944.  
  1945. # Filter by tags given from input
  1946. tags = request.GET.getlist("tags")
  1947.  
  1948. print >> sys.stderr, tags
  1949.  
  1950. if tags:
  1951. for tag in tags:
  1952. print >> sys.stderr, tag
  1953. filtered_questions = filtered_questions.filter(tags__name=tag)
  1954. else:
  1955. filtered_questions = None
  1956.  
  1957.  
  1958.  
  1959. return render(request, 'edukts_web/manage.question.list.html', {'topics': topics, 'questions': filtered_questions, 'tags': tags, 'all_tags': all_tags})
  1960.  
  1961. @user_passes_test(lambda u: u.is_staff)
  1962. def preview(request, question_id=None):
  1963. # Init
  1964. selected_question = None
  1965.  
  1966. # Objectify the selected question
  1967. if question_id:
  1968. selected_question = Question.objects.all().filter(subject=request.site.id).get(id=int(question_id))
  1969. # Get correct answer
  1970. #selected_question.answer = selected_question.answers.all()[0]
  1971. #selected_question.answer = selected_question.answers.all()[0]
  1972. #reference
  1973. # Check if question exists otherwise redirect to question list
  1974. if selected_question:
  1975. return render(request, 'edukts_web/manage.question.preview.html', {'question': selected_question})
  1976. else:
  1977. # 404 if question was not found
  1978. raise Http404
  1979.  
  1980. @user_passes_test(lambda u: u.is_staff)
  1981. def testquestion(request, question_id=None):
  1982.  
  1983.  
  1984. if question_id is not None:
  1985. # Get question (or nothing) from orm
  1986. question = Question.objects.all().filter(subject=request.site.id).get(id=question_id)
  1987.  
  1988. if 'answer' in request.POST and request.POST['answer']:
  1989. response = request.POST['answer']
  1990. response = response.replace(' ', '').replace('\\n', '').replace('\\r', '').replace('\\t', '')
  1991.  
  1992. # Get actual answer in string
  1993. answer_text = question.choices[question.answers.all()[0].content.lower()]
  1994. answer_text = answer_text.replace(' ', '').replace('\n', '').replace('\r', '').replace('\t', '')
  1995.  
  1996. print sys.stderr, answer_text
  1997.  
  1998. if re.match('^'+answer_text+'$', response):
  1999. return HttpResponse("Answer is Correct")
  2000. else:
  2001. return HttpResponse("Answer do not Match\nInput: "+ response+ "\nActual: "+ answer_text)
  2002. # Otherwise no answer just return nothing happened!
  2003. else:
  2004. return HttpResponse("Empty Field!")
  2005. raise Http404
  2006.  
  2007. @login_required
  2008. def flag_question(request, question_id):
  2009. "View to allow users to flag/report a problem with the question"
  2010.  
  2011. if request.method == 'POST':
  2012. form = forms.FlagQuestionForm(request.POST)
  2013. if form.is_valid():
  2014. # Get the question from orm
  2015. question = Question.objects.get(id=question_id)
  2016.  
  2017. # Flag question now!
  2018. flag = QuestionFlag(question=question, user=request.user, issue=form.cleaned_data['issue'])
  2019. flag.save()
  2020.  
  2021. return render(request, 'edukts_web/question.flag.html', {'form': form, 'submitted': True})
  2022. else:
  2023. # Display new form for user to fill in
  2024. form = forms.FlagQuestionForm()
  2025.  
  2026. return render(request, 'edukts_web/question.flag.html', {'form': form})
  2027.  
  2028. @user_passes_test(lambda u: u.is_staff)
  2029. def flag_display(request):
  2030. flagged_qns = QuestionFlag.objects.all()
  2031.  
  2032. return render(request, 'edukts_web/control.flaggedquestions.html', {'flagged_qns': flagged_qns})
  2033.  
  2034. @login_required
  2035. def search(request):
  2036. # Init
  2037. filtered_questions = Question.objects.all().filter(subject=request.site.id)
  2038.  
  2039. # Obtain the list of topics
  2040. topics = Topic.objects.all().filter(subject=request.site.id)
  2041. all_tags = Tag.objects.all().filter(subject=request.site.id)
  2042.  
  2043. # Filter by tags given from input
  2044. tags = request.GET.getlist("tags")
  2045.  
  2046. if tags:
  2047. for tag in tags:
  2048. filtered_questions = filtered_questions.filter(tags__name=tag)
  2049.  
  2050. paginator = Paginator(filtered_questions, 5)
  2051.  
  2052. page = request.GET.get('page')
  2053.  
  2054. try:
  2055. questions = paginator.page(page)
  2056. except PageNotAnInteger:
  2057. questions = paginator.page(1)
  2058. except EmptyPage:
  2059. questions = paginator.page(paginator.num_pages)
  2060. else:
  2061. questions = None
  2062.  
  2063. # Remove page number from querystring
  2064. q = request.GET
  2065. z = q.copy()
  2066. try:
  2067. del z['page']
  2068. except KeyError:
  2069. pass
  2070. querystring = '?' + z.urlencode()
  2071.  
  2072. return render(request, 'edukts_web/search.html', {'topics': topics, 'questions': questions, 'tags': tags, 'all_tags': all_tags, 'querystring': querystring})
  2073.  
  2074.  
  2075.  
  2076.  
  2077.  
  2078.  
  2079. ## New edukts views
  2080. @login_required
  2081. def site_selection(request, site_name=None):
  2082. if site_name == None:
  2083. subjects = Subject.objects.all().filter(displayed=True)
  2084.  
  2085. return render(request, 'edukts_web/site-selection.html', {'subjects': subjects})
  2086.  
  2087. # Update session
  2088. site = Subject.objects.all().get(webname=site_name)
  2089. request.session['edukts_site'] = site.id
  2090. return redirect('/')
  2091.  
  2092. @login_required
  2093. def concept_display(request, concept_id):
  2094. this_concept = Concept.objects.all().get(id=concept_id)
  2095. this_video = Video.objects.filter(subject=request.site.id)
  2096.  
  2097. if this_concept.filename == None:
  2098. return render(request, 'edukts_web/conceptvideo.html', {'concept': this_concept, 'video': this_video})
  2099. else:
  2100. return render(request, 'edukts_web/concept.html', {'concept': this_concept})
  2101.  
  2102. @login_required
  2103. def qna_question_new(request):
  2104. # Load empty form for new question
  2105. if request.method == 'GET':
  2106. form = forms.QnaQuestionForm(subject=request.site.id)
  2107.  
  2108. return render(request, 'edukts_web/qna.question.new.html', {'form': form})
  2109.  
  2110. # Process completed form
  2111. elif request.method == 'POST':
  2112. form = forms.QnaQuestionForm(subject=request.site.id, data=request.POST) # Bind form to user data
  2113.  
  2114. if form.is_valid():
  2115. # Insert new QnA question into database
  2116. # TODO: Harden the qna form by rechecking & filtering the data for subject & topic fields to ensure validity
  2117. qna_question = QnaQuestion(title=form.cleaned_data['title'], content=form.cleaned_data['content'], subject=Subject.objects.get(id=request.site.id), user=request.user)
  2118. qna_question.save()
  2119.  
  2120. # QnA Question successfully added
  2121. return redirect('/qna/question/list/')
  2122. # Oops something went wrong in form
  2123. else:
  2124. return render(request, 'edukts_web/qna.question.new.html', {'form': form})
  2125.  
  2126. # Invalid HTTP request
  2127. else:
  2128. raise Http404
  2129.  
  2130. @login_required
  2131. def qna_question_list(request):
  2132. # Get all qna questions and display as a list
  2133. qna_questions = QnaQuestion.objects.filter(subject=request.site.id)
  2134.  
  2135. return render(request, 'edukts_web/qna.question.list.html', {'questions': qna_questions})
  2136.  
  2137. @login_required
  2138. def essay_answer_list(request):
  2139. # Get all qna questions and display as a list
  2140. essay_responses = EssayResponse.objects.filter(user=request.user)
  2141.  
  2142. return render(request, 'edukts_web/essay.response.list.html', {'essays': essay_responses})
  2143.  
  2144. @login_required
  2145. def qna_question_view(request, question_id):
  2146. # Load question and empty answer form for new question
  2147. if request.method == 'GET':
  2148. qna_question = QnaQuestion.objects.get(id=question_id)
  2149. qna_question.content = qna_question.content.replace('\n', '<br>')
  2150.  
  2151. form = forms.QnaAnswerForm()
  2152.  
  2153. return render(request, 'edukts_web/qna.question.view.html', {'question': qna_question, 'form': form})
  2154.  
  2155. # Process completed form
  2156. elif request.method == 'POST':
  2157. qna_question = QnaQuestion.objects.get(id=question_id)
  2158. qna_question.content = qna_question.content.replace('\n', '<br>')
  2159.  
  2160. form = forms.QnaAnswerForm(data=request.POST) # Bind form to user data
  2161.  
  2162. if form.is_valid():
  2163. # Insert new QnA answer into database
  2164. qna_answer = QnaAnswer(question=qna_question, content=form.cleaned_data['content'], user=request.user)
  2165. qna_answer.save()
  2166.  
  2167. # QnA Answer successfully added
  2168. return HttpResponseRedirect('')
  2169. # Oops something went wrong in form
  2170. else:
  2171. return render(request, 'edukts_web/qna.question.view.html', {'question': qna_question, 'form': form})
  2172.  
  2173. # Invalid HTTP request
  2174. else:
  2175. raise Http404
  2176.  
  2177. @login_required
  2178. def essay_response_view(request, question_id):
  2179. # Load question and empty answer form for new question
  2180. if request.method == 'GET':
  2181. essay_response = EssayResponse.objects.get(id=question_id)
  2182. question = Question.objects.get(id=essay_response.question_id)
  2183. essay_response.content = essay_response.content.replace('\n', '<br>')
  2184. return render(request, 'edukts_web/essay.response.view.html', {'essayresponse': essay_response, 'question': question})
  2185.  
  2186. # Process completed form
  2187. elif request.method == 'POST':
  2188. qna_question = QnaQuestion.objects.get(id=question_id)
  2189. qna_question.content = qna_question.content.replace('\n', '<br>')
  2190.  
  2191. form = forms.QnaAnswerForm(data=request.POST) # Bind form to user data
  2192.  
  2193. if form.is_valid():
  2194. # Insert new QnA answer into database
  2195. qna_answer = QnaAnswer(question=qna_question, content=form.cleaned_data['content'], user=request.user)
  2196. qna_answer.save()
  2197.  
  2198. # QnA Answer successfully added
  2199. return HttpResponseRedirect('')
  2200. # Oops something went wrong in form
  2201. else:
  2202. return render(request, 'edukts_web/qna.question.view.html', {'question': qna_question, 'form': form})
  2203.  
  2204. # Invalid HTTP request
  2205. else:
  2206. raise Http404
  2207.  
  2208. @login_required
  2209. def temp_tutor_notice_new(request, looking):
  2210. looking = int(looking)
  2211. # Load empty form for tutor notice
  2212. if request.method == 'GET':
  2213. form = forms.TempTutoringForm()
  2214.  
  2215. if looking == 1:
  2216. looking = True
  2217. else:
  2218. looking = False
  2219.  
  2220. return render(request, 'edukts_web/tutor.new.html', {'form': form, 'looking': looking})
  2221.  
  2222. # Process completed form
  2223. elif request.method == 'POST':
  2224. form = forms.TempTutoringForm(data=request.POST) # Bind form to user data
  2225.  
  2226. if form.is_valid():
  2227. # Flip the looking around
  2228. if looking == 1:
  2229. looking = 0
  2230. else:
  2231. looking = 1
  2232.  
  2233. # Insert new QnA question into database
  2234. # TODO: Harden the qna form by rechecking & filtering the data for subject & topic fields to ensure validity
  2235. qna_question = TempTutorNotice(title=form.cleaned_data['title'], content=form.cleaned_data['content'], user=request.user, looking=looking)
  2236. qna_question.save()
  2237.  
  2238. # QnA Question successfully added
  2239. return redirect('/tutor/list/' + str(looking) + '/')
  2240. # Oops something went wrong in form
  2241. else:
  2242. if looking == 1:
  2243. looking = True
  2244. else:
  2245. looking = False
  2246.  
  2247. return render(request, 'edukts_web/tutor.new.html', {'form': form, 'looking': looking})
  2248.  
  2249. # Invalid HTTP request
  2250. else:
  2251. raise Http404
  2252.  
  2253. @login_required
  2254. def temp_tutor_notice_list(request, looking):
  2255. looking = int(looking)
  2256. # Get all tutor notice and display as a list
  2257. tutor_notices = TempTutorNotice.objects.filter(looking=looking)
  2258.  
  2259. if looking == 1:
  2260. looking = True
  2261. else:
  2262. looking = False
  2263.  
  2264. return render(request, 'edukts_web/tutor.list.html', {'tutor_notices': tutor_notices, 'looking': looking})
  2265.  
  2266. @login_required
  2267. def temp_tutor_notice_view(request, notice_id):
  2268. tutor_notice = TempTutorNotice.objects.get(id=notice_id)
  2269. tutor_notice.content = tutor_notice.content.replace('\n', '<br>')
  2270.  
  2271. return render(request, 'edukts_web/tutor.view.html', {'notice': tutor_notice})
  2272.  
  2273.  
  2274. def handle_uploaded_file(f, fileurl):
  2275. with open(fileurl, 'wb+') as destination:
  2276. for chunk in f.chunks():
  2277. destination.write(chunk)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement