Advertisement
seraphile22

Untitled

Mar 1st, 2017
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 103.07 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. @login_required
  746. def attempt_situational_question(request, question_id):
  747. question = Question.objects.all().filter(subject=request.site.id).get(id=question_id)
  748. topic = Topic.objects.all().filter(subject=request.site.id).get(id=question.topic_id)
  749.  
  750. if request.method == 'POST':
  751.  
  752. if request.POST['content'] == "" or question.reference =="":
  753. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic})
  754. else:
  755. refEssay = question.reference
  756. refEssay = refEssay.replace("<br>", "")
  757. point1 = question.point1
  758. point2 = question.point2
  759. point3 = question.point3
  760. point4 = question.point4
  761. point5 = question.point5
  762. point6 = question.point6
  763. point7 = question.point7
  764. Question1 = question.content
  765. point1 = point1.replace("<br>", "")
  766. point2 = point2.replace("<br>", "")
  767. point3 = point3.replace("<br>", "")
  768. point4 = point4.replace("<br>", "")
  769. point5 = point5.replace("<br>", "")
  770. point6 = point6.replace("<br>", "")
  771. point7 = point7.replace("<br>", "")
  772. Question1 = Question1.replace("<br>", "")
  773. picturecontent = question.picturecontent
  774. 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}
  775. r = requests.post("http://localhost:8080/simcheck", data=formToSubmit)
  776.  
  777. scores = json.loads(r.text)
  778. #lsaScore=scores['lsaScore'], ngramScore=scores['ngramScore']
  779. lsascore = int(scores['lsaScore']*100)
  780. ngramscore = int(scores['ngramScore']*100)
  781. averageScore = int((lsascore + ngramscore) / 2)
  782. totalScore = int(scores['totalScore'])
  783. b = StudentScores(user=request.user, qn_no = question, score = totalScore)
  784. b.save()
  785. synStructures = scores['synStructures']
  786. synComplexMeasures = scores['synComplexMeasures']
  787. lexStructures = scores['lexStructures']
  788. lexComplexMeasures = scores['lexComplexMeasures']
  789. print type(lexComplexMeasures)
  790. print type(lexStructures)
  791. #averageScore = (scores['lsaScore'] + scores['ngramScore']) / 2
  792. spellingErrors=scores['spellingErrors']
  793. grammarErrors=scores['grammarErrors']
  794. oldcontent=request.POST['content']
  795. oldcontent=oldcontent.replace("\r\n", "<br>")
  796. for field, possible_values in spellingErrors.iteritems():
  797. #for key in spellingErrors:
  798. pos = oldcontent.find(field)
  799. endpos = pos + len(field)
  800. print repr(possible_values)
  801. suggestions = '<span title="' + possible_values + '">'
  802. oldcontent = oldcontent[:pos] + '<font color="red">'+ suggestions + oldcontent[pos:endpos] + '</span></font>' + oldcontent[endpos:]
  803. #<font color="blue"></font>
  804. #print key, 'corresponds to', d[key]
  805. 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)
  806. return render(request, 'edukts_web/essay.result.html', {'question': question, 'topic': topic, 'essay_response' : essay_response} )
  807. return redirect('/situational/')
  808.  
  809. #return practice_question(request, topic.id)
  810. else:
  811.  
  812. point1 = question.point1
  813. point2 = question.point2
  814. point3 = question.point3
  815. point4 = question.point4
  816. point5 = question.point5
  817. point6 = question.point6
  818. point7 = question.point7
  819.  
  820.  
  821. point8 = point1 + point2 + point3 + point4 + point5 + point6 + point7
  822. essay_response = EssayResponse(ExtractedContentPoints=point3)
  823. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic, 'essay_response' : essay_response})
  824.  
  825.  
  826. @login_required
  827. def attempt_composition_question(request, question_id):
  828. question = Question.objects.all().filter(subject=request.site.id).get(id=question_id)
  829. topic = Topic.objects.all().filter(subject=request.site.id).get(id=question.topic_id)
  830.  
  831. if request.method == 'POST':
  832.  
  833. if request.POST['content'] == "" or question.reference =="":
  834. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic})
  835. else:
  836. refEssay = question.reference
  837. refEssay = refEssay.replace("<br>", "")
  838. formToSubmit = { "ansEssay": request.POST['content'], "refEssay": refEssay}
  839. r = requests.post("http://localhost:8080/simcheck", data=formToSubmit)
  840. scores = json.loads(r.text)
  841. #lsaScore=scores['lsaScore'], ngramScore=scores['ngramScore']
  842. lsascore = int(scores['lsaScore']*100)
  843. ngramscore = int(scores['ngramScore']*100)
  844. averageScore = int((lsascore + ngramscore) / 2)
  845. totalScore = int(scores['totalScore'])
  846. synStructures = scores['synStructures']
  847. synComplexMeasures = scores['synComplexMeasures']
  848. lexStructures = scores['lexStructures']
  849. lexComplexMeasures = scores['lexComplexMeasures']
  850. print type(lexComplexMeasures)
  851. print type(lexStructures)
  852. #averageScore = (scores['lsaScore'] + scores['ngramScore']) / 2
  853. spellingErrors=scores['spellingErrors']
  854. grammarErrors=scores['grammarErrors']
  855. oldcontent=request.POST['content']
  856. oldcontent=oldcontent.replace("\r\n", "<br>")
  857. for field, possible_values in spellingErrors.iteritems():
  858. #for key in spellingErrors:
  859. pos = oldcontent.find(field)
  860. endpos = pos + len(field)
  861. print repr(possible_values)
  862. suggestions = '<span title="' + possible_values + '">'
  863. oldcontent = oldcontent[:pos] + '<font color="red">'+ suggestions + oldcontent[pos:endpos] + '</span></font>' + oldcontent[endpos:]
  864. #<font color="blue"></font>
  865. #print key, 'corresponds to', d[key]
  866. 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)
  867. return render(request, 'edukts_web/essay.result.html', {'question': question, 'topic': topic, 'essay_response' : essay_response} )
  868. return redirect('/composition/')
  869.  
  870. #return practice_question(request, topic.id)
  871. else:
  872. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic})
  873.  
  874. @login_required
  875. def practice_question(request, topic):
  876. # Selected topic
  877. topic = Topic.objects.all().filter(subject=request.site.id).get(id=topic)
  878.  
  879. # Init session variable for question
  880. if 'practice_current_qn' not in request.session:
  881. request.session['practice_current_qn'] = None
  882.  
  883. # Debug data
  884. debug = {}
  885.  
  886. # Error data
  887. error = {}
  888.  
  889. # GET Request or POST w/o session data >> Load Question
  890. # POST Request >> Answer Question
  891.  
  892. if request.method == 'GET' or request.session['practice_current_qn'] is None:
  893. # Check if existing loaded question is from same topic, otherwise clear it
  894. if request.session['practice_current_qn'] != None:
  895. question_topic = Question.objects.all().filter(subject=request.site.id).get(id=request.session['practice_current_qn']).topic
  896. if question_topic != topic:
  897. # New practice topic, clear session variable
  898. request.session['practice_current_qn'] = None
  899.  
  900. # Generate new question if not resuming
  901. if request.session['practice_current_qn'] == None:
  902. # Retrieve pool of questions with this topic
  903. question_pool = Question.objects.all().filter(subject=request.site.id).filter(topic=topic)
  904.  
  905. # Get active assessment engine (practice) and dynamically load engine
  906. active_engine = Assessment.objects.all().filter(active=True).get(type=Assessment.PRACTICE)
  907. engine = getattr(assessment_engine, active_engine.engine)()
  908.  
  909. # Initialise session storage for assessment engine
  910. if 'engine_store' not in request.session:
  911. request.session['engine_store'] = None
  912.  
  913. # Request a new question from the assessment engine
  914. question = engine.get_next_question(user=request.user, topic=topic, question_pool=question_pool, session_store=request.session['engine_store'])
  915.  
  916. # Get current ability for debug purposes
  917. debug['ability'] = engine.get_user_ability(user=request.user, topic=topic)
  918.  
  919. #debug['answer'] = question.choices[question.answers.all()[0].content.lower()]
  920.  
  921. # Woops, we ran out of suitable questions, give error and direct to reset
  922. # TODO: Proper RESET (Currently when it runs out of questions it will just go back to home!)
  923. if not question:
  924. return redirect('/practice/')
  925.  
  926. # Update the question to session (for persistance if user refresh page/relogin)
  927. request.session['practice_current_qn'] = question.id
  928. else:
  929. # Reload question from session data if resuming practice or page refresh
  930. question = Question.objects.all().filter(subject=request.site.id).get(id=request.session['practice_current_qn'])
  931.  
  932. # Rendering at end of page
  933. else:
  934.  
  935. # Submitting a practice question
  936. if 'qid' in request.POST and request.POST['qid']:
  937. qnid_post = request.POST['qid']
  938. else:
  939. qnid_post = None
  940.  
  941. qnid_session = request.session['practice_current_qn']
  942.  
  943. if qnid_post != qnid_session:
  944. # Something strange is happening, missing qid from form or mismatch between form and session, TODO: Handle this PROPERLY
  945. debug['qnid_post'] = qnid_post
  946. debug['qnid_session'] = qnid_session
  947.  
  948. # Reload question from session data
  949. question = Question.objects.all().filter(subject=request.site.id).get(id=qnid_session)
  950.  
  951. # Check if answer was submitted
  952. if 'ans' in request.POST and request.POST['ans']:
  953. choice = request.POST['ans']
  954.  
  955. # Get active assessment engine (practice) and dynamically load engine
  956. active_engine = Assessment.objects.all().filter(active=True).get(type=Assessment.PRACTICE)
  957. engine = getattr(assessment_engine, active_engine.engine)()
  958.  
  959. # Initialise session storage for assessment engine
  960. if 'engine_store' not in request.session:
  961. request.session['engine_store'] = None
  962.  
  963. # Match answer using assessment engine
  964. result = engine.match_answers(user=request.user, response=choice, question=question, session_store=request.session['engine_store'])
  965.  
  966. # Restore updated engine store
  967. # request.session['engine_store'] = result['session_store']
  968.  
  969. # Answer is correct if full points is awarded
  970. if result['correctness'] == 1.0:
  971. correct = True
  972. else:
  973. correct = False
  974.  
  975. # Get correct answer
  976. question.answer = question.answers.all()[0]
  977.  
  978. # Ability score for debug purposes
  979. debug['ability'] = result['ability']
  980.  
  981. # Reset current practice qn to None
  982. request.session['practice_current_qn'] = None
  983.  
  984. # Format question for web mode
  985. formatter = formatter_engine.WebQuestionFormatter()
  986. question = formatter.format(question)
  987.  
  988. # Temp variable to allow ajax through https
  989. host = request.get_host()
  990. is_secure = not "localhost" in host
  991.  
  992. # Kill debug for non test users
  993. if request.user.get_profile().debug is False:
  994. debug = {}
  995.  
  996. return render(request, 'edukts_web/practice.submit.html', {'question': question, 'topic': topic, 'choice': choice, 'correct': correct, 'debug': debug, 'host': host, 'is_secure': is_secure})
  997. else:
  998. # Option not selected, prompt error
  999. error['unselected'] = True
  1000. # Process completed form
  1001. # Process completed form
  1002. if request.method == 'POST':
  1003. form = forms.QnaQuestionForm(subject=request.site.id, data=request.POST) # Bind form to user data
  1004. #return HttpResponse(request.POST.get("content"))
  1005.  
  1006. if form.is_valid():
  1007. # Insert new QnA question into database
  1008. # TODO: Harden the qna form by rechecking & filtering the data for subject & topic fields to ensure validity
  1009. 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)
  1010. essay_response.save()
  1011.  
  1012. # QnA Question successfully added
  1013. return redirect('/myessays/list/')
  1014. # Oops something went wrong in form
  1015. else:
  1016. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic, 'error': error, 'debug': debug})
  1017.  
  1018. # Invalid HTTP request
  1019. else:
  1020. raise Http404
  1021.  
  1022. # Format question for web mode
  1023. formatter = formatter_engine.WebQuestionFormatter()
  1024. question = formatter.format(question)
  1025.  
  1026. # Kill debug for non test users
  1027. if request.user.get_profile().debug is False:
  1028. debug = {}
  1029.  
  1030. # Render question page
  1031. return render(request, 'edukts_web/essay.question.html', {'question': question, 'topic': topic, 'error': error, 'debug': debug})
  1032.  
  1033. @login_required
  1034. def practice_resume(request):
  1035. "Restore practice session into last state"
  1036.  
  1037. if 'practice_current_qn' in request.session and request.session['practice_current_qn'] != None:
  1038. # Load previous question by going to the respective practice url
  1039. # Retrieve topic from question id in session
  1040. question = Question.objects.all().filter(subject=request.site.id).get(id=request.session['practice_current_qn'])
  1041. topid_id = int(question.topic.id)
  1042.  
  1043. # Redirect to correct topical practice page
  1044. return redirect('/practice/'+str(topid_id)+'/')
  1045.  
  1046. else:
  1047. # Go back to main practice page
  1048. return redirect('/practice/')
  1049.  
  1050. @login_required
  1051. def practice_end(request):
  1052. "End current practice session"
  1053.  
  1054. if 'practice_current_qn' in request.session:
  1055. del request.session['practice_current_qn']
  1056.  
  1057. # Go back to main practice page
  1058. return redirect('/practice/')
  1059.  
  1060. @login_required
  1061. def question_view(request, id, practiced=False):
  1062. "Lets the user view the question with answers"
  1063.  
  1064. # Question exists?
  1065. question = Question.objects.all().filter(subject=request.site.id).get(id=id)
  1066. if question:
  1067. # Check if user has done question if practiced = true
  1068. if practiced:
  1069. user_practiced = Response.objects.all().filter(user=request.user).filter(question=id)
  1070. if not user_practiced:
  1071. return redirect('/')
  1072.  
  1073. # Load question and render
  1074. # Get correct answer
  1075. question.answer = question.answers.all()[0]
  1076.  
  1077. # Format question for web mode
  1078. formatter = formatter_engine.WebQuestionFormatter()
  1079. question = formatter.format(question)
  1080.  
  1081. # Temp variable to allow ajax through https
  1082. host = request.get_host()
  1083. is_secure = not "localhost" in host
  1084.  
  1085. return render(request, 'edukts_web/question.view.html', {'question': question, 'topic': question.topic, 'host': host, 'is_secure': is_secure})
  1086.  
  1087. else:
  1088. return redirect('/')
  1089.  
  1090. pass
  1091.  
  1092. # additional view to list all possible questions
  1093.  
  1094. @user_passes_test(lambda u: u.is_superuser)
  1095. def admin(request):
  1096. return render(request, 'edukts_web/submit.html')
  1097.  
  1098. @user_passes_test(lambda u: u.is_superuser)
  1099. def system_health_check(request):
  1100. # Check system to ensure only 1 (and not less) assessment per type (practice and test) is active
  1101.  
  1102. # Check system to ensure all assessment engines can be loaded
  1103.  
  1104. pass
  1105.  
  1106. @login_required
  1107. def debug_changemode(request, mode):
  1108. mode = int(mode)
  1109.  
  1110. if mode == 1:
  1111. # Swap to Random Practice mode
  1112. catengine = Assessment.objects.all().get(name='CAT Practice')
  1113. randomengine = Assessment.objects.all().get(name='Random Practice')
  1114.  
  1115. catengine.active = False
  1116. randomengine.active = True
  1117.  
  1118. catengine.save()
  1119. randomengine.save()
  1120. elif mode == 2:
  1121. # Swap to CAT Practice mode
  1122. catengine = Assessment.objects.all().get(name='CAT Practice')
  1123. randomengine = Assessment.objects.all().get(name='Random Practice')
  1124.  
  1125. catengine.active = True
  1126. randomengine.active = False
  1127.  
  1128. catengine.save()
  1129. randomengine.save()
  1130.  
  1131. return HttpResponseRedirect('/home/')
  1132.  
  1133. @login_required
  1134. def debug_clearresponses(request):
  1135. # Clears all responses for current user
  1136.  
  1137. request.session['engine_store'] = None
  1138.  
  1139. Response.objects.all().filter(user=request.user).delete()
  1140.  
  1141. return redirect('/practice/')
  1142.  
  1143. @user_passes_test(lambda u: u.is_staff)
  1144. def control(request):
  1145. "Control Panel Code"
  1146. # Obtain the list of topics
  1147. tests = Test.objects.all()
  1148.  
  1149. testcount = tests.count()
  1150.  
  1151. return render_to_response('edukts_web/control-empty.html', {'tests': tests, 'testcount': testcount}, context_instance=RequestContext(request))
  1152.  
  1153. @user_passes_test(lambda u: u.is_staff)
  1154. def control_cattest_settings(request):
  1155. topics = Topic.objects.all().filter(subject=request.site.id)
  1156.  
  1157. return render(request, 'edukts_web/control-createnewtest.html', {'topics': topics})
  1158.  
  1159. @user_passes_test(lambda u: u.is_staff)
  1160. def controlnewtest(request):
  1161. "Control Panel Code"
  1162. # Obtain the list of topics
  1163. tests = Test.objects.all()
  1164.  
  1165. return render_to_response('edukts_web/control-createnewtest.html', {'tests': tests}, context_instance=RequestContext(request))
  1166.  
  1167. @user_passes_test(lambda u: u.is_staff)
  1168. def controlnewtest_submit(request):
  1169. "Control Panel Code"
  1170. # Obtain the list of topics
  1171. if request.method == 'POST' and request.POST['newtestNumOfQns']:
  1172. numQns = request.POST['newtestNumOfQns']
  1173.  
  1174. testid = ''.join(random.choice('abcdefghijklmnopqrstuvwxyz0123456789') for i in range(6))
  1175.  
  1176. #### VERY IMPORTANT TODO:: CHECK FOR UNIQUE ID
  1177. new_test = Test(id=testid, assessment=Assessment.objects.all().get(name='Generic Test'))
  1178. new_test.save()
  1179.  
  1180. numQns = int(numQns)
  1181.  
  1182. for i in range (0, numQns):
  1183. # Get a random question and add to paper
  1184. question_pool = Question.objects.all().filter(subject=request.site.id).filter(topic=1)
  1185. question_pool = question_pool.exclude(id__in=new_test.questions.all().values_list('id'))
  1186.  
  1187. if question_pool:
  1188. question = question_pool[random.randint(0, question_pool.count()-1)]
  1189. newTestQuestion = TestQuestion(question=question, test=new_test)
  1190. newTestQuestion.save()
  1191.  
  1192.  
  1193. return render_to_response('edukts_web/control-createnewtest.html', {'testid': testid}, context_instance=RequestContext(request))
  1194.  
  1195. @user_passes_test(lambda u: u.is_staff)
  1196. def controlviewpaper(request, testid):
  1197. "Control Panel Code"
  1198. # Obtain the list of topics
  1199. tests = Test.objects.all()
  1200.  
  1201. # Get this test
  1202. thisTest = Test.objects.all().get(id=testid)
  1203.  
  1204. # Home mode
  1205. # Show test responses
  1206. # Open paper for testing
  1207. # Download paper in LaTeX format
  1208.  
  1209. # Question modecontrol_cattest_settingsconcontrol_cattest_settingstrol_cattest_settings
  1210. # Display all questions in test
  1211. # Display dummy modify button
  1212. questions = thisTest.questions.all()
  1213.  
  1214. averagediff = thisTest.questions.all().aggregate(Avg('difficulty')).values()[0]
  1215.  
  1216. # Stats mode
  1217. # Currently not used
  1218. # Paper users, scores, etc
  1219.  
  1220. return render_to_response('edukts_web/control.html', {'tests': tests, 'testid': testid, 'thistest': thisTest, 'questions': questions, 'avgdiff': averagediff}, context_instance=RequestContext(request))
  1221.  
  1222. @user_passes_test(lambda u: u.is_staff)
  1223. def controldownloadpaper(request, testid):
  1224. "Control Panel Code"
  1225. # Obtain the list of topics
  1226. tests = Test.objects.all()
  1227.  
  1228. # Get this test
  1229. thisTest = Test.objects.all().get(id=testid)
  1230.  
  1231. # Home mode
  1232. # Show test responses
  1233. # Open paper for testing
  1234. # Download paper in LaTeX format
  1235.  
  1236. # Question mode
  1237. # Display all questions in test
  1238. # Display dummy modify button
  1239. questions = thisTest.questions.all()
  1240.  
  1241. averagediff = thisTest.questions.all().aggregate(Avg('difficulty')).values()[0]
  1242.  
  1243. # Stats mode
  1244. # Currently not used
  1245. # Paper users, scores, etc
  1246.  
  1247. return render_to_response('edukts_web/download.tex', {'tests': tests, 'testid': testid, 'thistest': thisTest, 'questions': questions, 'avgdiff': averagediff}, context_instance=RequestContext(request))
  1248.  
  1249. @csrf_exempt
  1250. def postdata(request):
  1251. if request.method == 'POST':
  1252.  
  1253. # loop through keys and values
  1254. for key, value in request.POST.iteritems():
  1255. pass
  1256.  
  1257. return render_to_response('postdata.html', {'postdata': request.POST}, context_instance=RequestContext(request))
  1258.  
  1259. @user_passes_test(lambda u: u.is_staff)
  1260. def prototype(request, question_id=None):
  1261. # Init
  1262. selected_question = None
  1263.  
  1264. # Obtain the list of topics
  1265. topics = Topic.objects.all().filter(subject=request.site.id)
  1266. themes = Theme.objects.all().filter(subject=request.site.id)
  1267. types = QuestionType.objects.all().filter(subject=request.site.id)
  1268.  
  1269. # Objectify the selected question
  1270. if question_id:
  1271. selected_question = Question.objects.all().filter(subject=request.site.id).get(id=int(question_id))
  1272.  
  1273. if request.method == 'POST':
  1274. form = forms.InsertEditQuestionForm(request.POST, request.FILES) # Bind to user submitted form
  1275. #print form
  1276.  
  1277. #print request.FILES['newimage']
  1278. #print request.POST
  1279. #print request.FILES
  1280. #print form
  1281. #filename = request.FILES['image'].name
  1282. #print filename
  1283. #for filename, file in request.FILES.iteritems():
  1284. #name = request.FILES[filename].name
  1285. #print name
  1286.  
  1287.  
  1288.  
  1289.  
  1290. if form.is_valid():
  1291. # Check if question exists or need to create new
  1292. #print form
  1293. if selected_question:
  1294. # Edit existing question
  1295.  
  1296.  
  1297. selected_question.content=form.cleaned_data['content'].replace("\r\n", "<br>")
  1298. selected_question.difficulty=form.cleaned_data['difficulty']
  1299. selected_question.topic=form.cleaned_data['topic']
  1300. selected_question.theme=form.cleaned_data['theme']
  1301. selected_question.time=form.cleaned_data['time']
  1302. selected_question.title=form.cleaned_data['title']
  1303. selected_question.marks=form.cleaned_data['marks']
  1304. selected_question.reference=form.cleaned_data['answer'].replace("\r\n", "<br>")
  1305. selected_question.point1=form.cleaned_data['point1']
  1306. selected_question.point2=form.cleaned_data['point2']
  1307. selected_question.point3=form.cleaned_data['point3']
  1308. selected_question.point4=form.cleaned_data['point4']
  1309. selected_question.point5=form.cleaned_data['point5']
  1310. selected_question.point6=form.cleaned_data['point6']
  1311. selected_question.point7=form.cleaned_data['point7']
  1312. selected_question.picturecontent=form.cleaned_data['picturecontent']
  1313.  
  1314. if (selected_question.topic.name in ["Picture-Based", "Situation-Based"] ):
  1315. selected_question.type = QuestionType.objects.all().filter(subject=request.site.id).get(id=1)
  1316. else:
  1317. selected_question.type = QuestionType.objects.all().filter(subject=request.site.id).get(id=2)
  1318.  
  1319.  
  1320. if request.FILES:
  1321. filename = request.FILES['newimage'].name
  1322. extension = filename.split(".")[-1]
  1323. imageurlstatic = "static/images/EssayPictures/Question" + str(selected_question.id) + "." + extension
  1324. imageurl = imageurlstatic.replace("static/", "", 1);
  1325. handle_uploaded_file(request.FILES['newimage'], imageurlstatic)
  1326. selected_question.image=imageurl
  1327.  
  1328.  
  1329. selected_question.save()
  1330.  
  1331. # Tag adding/deleting
  1332. selected_question.tags.clear()
  1333. for tag_name in form.cleaned_data['tags']:
  1334. # Check tag exists in db, otherwise add
  1335. # Currently no need since automatically verified
  1336. tag = Tag.objects.all().filter(subject=request.site.id).get(name=tag_name)
  1337.  
  1338. qn_tag = QuestionTag(question=selected_question, tag=tag)
  1339. qn_tag.save()
  1340.  
  1341. return redirect('/prototype2/list/topic/'+ str(selected_question.topic.id) +'/?msg=Question '+ str(selected_question.id) +' edited successfully#question-'+ str(selected_question.id))
  1342. else:
  1343. # Insert new question
  1344. 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))
  1345.  
  1346. if (question.topic.name in ["Picture-Based", "Situation-Based"] ):
  1347. question.type = QuestionType.objects.all().filter(subject=request.site.id).get(id=1)
  1348. else:
  1349. question.type = QuestionType.objects.all().filter(subject=request.site.id).get(id=2)
  1350.  
  1351. question.save()
  1352.  
  1353. if request.FILES:
  1354. filename = request.FILES['newimage'].name
  1355. extension = filename.split(".")[-1]
  1356. imageurlstatic = "static/images/EssayPictures/Question" + str(question.id) + "." + extension
  1357. imageurl = imageurlstatic.replace("static/", "", 1);
  1358. handle_uploaded_file(request.FILES['newimage'], imageurlstatic)
  1359. question.image=imageurl
  1360.  
  1361. question.save()
  1362.  
  1363. for tag_name in form.cleaned_data['tags']:
  1364. # Check tag exists in db, otherwise add
  1365. # Currently no need since automatically verified
  1366. tag = Tag.objects.all().filter(subject=request.site.id).get(name=tag_name)
  1367.  
  1368. qn_tag = QuestionTag(question=question, tag=tag)
  1369. qn_tag.save()
  1370.  
  1371. # Question inserted successfully!
  1372. return redirect('/prototype2/list/topic/'+ str(question.topic.id) +'/?msg=Question '+ str(question.id) +' added successfully#question-'+ str(question.id))
  1373.  
  1374. # Reply regardless valid
  1375. return render(request, 'edukts_web/manage.question.form.html', {'form': form, 'topics': topics, 'selected_question': selected_question, 'themes': themes})
  1376. else:
  1377. # Check if question exists or give blank form
  1378. if selected_question:
  1379. # Load existing question into a form
  1380. #answer = selected_question.reference.replace("<br>", "&#013;");
  1381. answer = selected_question.reference.replace("<br>", "\n");
  1382. point1 = selected_question.point1.replace("<br>", "\n");
  1383. content = selected_question.content.replace("<br>", "\n");
  1384. point2 = selected_question.point2.replace("<br>", "\n");
  1385. point3 = selected_question.point3.replace("<br>", "\n");
  1386. point4 = selected_question.point4.replace("<br>", "\n");
  1387. point5 = selected_question.point5.replace("<br>", "\n");
  1388. point6 = selected_question.point6.replace("<br>", "\n");
  1389. point7 = selected_question.point7.replace("<br>", "\n");
  1390. picturecontent = selected_question.picturecontent
  1391. 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})
  1392. solution_exists = Solution.objects.all().filter(question=selected_question).count()
  1393. refEssay = selected_question.reference.replace("<br>", "");
  1394. Question1 = selected_question.content.replace("<br>", "");
  1395.  
  1396. formToSubmit = { "refEssay": refEssay, "Question1":Question1, "picturecontent":picturecontent}
  1397. r = requests.post("http://localhost:8080/simcheck", data=formToSubmit)
  1398. scores = json.loads(r.text)
  1399.  
  1400. 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'])
  1401. if solution_exists > 0:
  1402. form.fields["solution"].initial = selected_question.solution.content
  1403. 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})
  1404. else:
  1405. # Display new form for user to fill in
  1406. form = forms.InsertEditQuestionForm()
  1407.  
  1408. return render(request, 'edukts_web/manage.question.form.html', {'form': form, 'topics': topics, 'selected_question': selected_question, 'themes':themes, 'types' : types})
  1409.  
  1410. @user_passes_test(lambda u: u.is_staff)
  1411. def new_practice_question(request, question_id=None):
  1412. # Init
  1413. selected_question = None
  1414.  
  1415. # Obtain the list of topics
  1416. topics = Topic.objects.all().filter(subject=request.site.id)
  1417. themes = Theme.objects.all().filter(subject=request.site.id)
  1418.  
  1419. # Objectify the selected question
  1420. if question_id:
  1421. selected_question = Question.objects.all().filter(subject=request.site.id).get(id=int(question_id))
  1422.  
  1423. if request.method == 'POST':
  1424. form = forms.InsertEditQuestionForm(request.POST) # Bind to user submitted form
  1425. if form.is_valid():
  1426. # Check if question exists or need to create new
  1427. if selected_question:
  1428. # Edit existing question
  1429. selected_question.content=form.cleaned_data['content']
  1430. selected_question.difficulty=form.cleaned_data['difficulty']
  1431. selected_question.topic=form.cleaned_data['topic']
  1432. selected_question.save()
  1433.  
  1434. answer = selected_question.answers.all()[0]
  1435. answer.content = form.cleaned_data['answer']
  1436. answer.save()
  1437.  
  1438. # Insert solution if exists
  1439. if form.cleaned_data['solution']:
  1440. # Check if solution exists
  1441. solution_exists = Solution.objects.all().filter(question=selected_question).count()
  1442.  
  1443. if solution_exists > 0:
  1444. # Update solution
  1445. solution = selected_question.solution
  1446. solution.content = form.cleaned_data['solution']
  1447. solution.save()
  1448. else:
  1449. # New solution for this question
  1450. solution = Solution(question=selected_question, content=form.cleaned_data['solution'])
  1451. solution.save()
  1452.  
  1453. # Tag adding/deleting
  1454. selected_question.tags.clear()
  1455. for tag_name in form.cleaned_data['tags']:
  1456. # Check tag exists in db, otherwise add
  1457. # Currently no need since automatically verified
  1458. tag = Tag.objects.all().filter(subject=request.site.id).get(name=tag_name)
  1459.  
  1460. qn_tag = QuestionTag(question=selected_question, tag=tag)
  1461. qn_tag.save()
  1462.  
  1463. return redirect('/prototype2/list/topic/'+ str(selected_question.topic.id) +'/?msg=Question '+ str(selected_question.id) +' edited successfully#question-'+ str(selected_question.id))
  1464. else:
  1465. # Insert new question
  1466. question = Question(content=form.cleaned_data['content'], difficulty=form.cleaned_data['difficulty'], topic=form.cleaned_data['topic'])
  1467. question.save()
  1468.  
  1469. # Insert answer for question
  1470. answer = Answer(question=question, content=form.cleaned_data['answer'])
  1471. answer.save()
  1472.  
  1473. # Insert solution if exists
  1474. if form.cleaned_data['solution']:
  1475. solution = Solution(question=question, content=form.cleaned_data['solution'])
  1476. solution.save()
  1477.  
  1478. for tag_name in form.cleaned_data['tags']:
  1479. # Check tag exists in db, otherwise add
  1480. # Currently no need since automatically verified
  1481. tag = Tag.objects.all().filter(subject=request.site.id).get(name=tag_name)
  1482.  
  1483. qn_tag = QuestionTag(question=question, tag=tag)
  1484. qn_tag.save()
  1485.  
  1486. # Question inserted successfully!
  1487. return redirect('/prototype2/list/topic/'+ str(question.topic.id) +'/?msg=Question '+ str(question.id) +' added successfully#question-'+ str(question.id))
  1488.  
  1489. # Reply regardless valid
  1490. return render(request, 'edukts_web/manage.question.form.html', {'form': form, 'topics': topics, 'themes' : themes,'selected_question': selected_question})
  1491. else:
  1492. # Check if question exists or give blank form
  1493. if selected_question:
  1494. # Load existing question into a form
  1495. 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)})
  1496.  
  1497. solution_exists = Solution.objects.all().filter(question=selected_question).count()
  1498.  
  1499. if solution_exists > 0:
  1500. form.fields["solution"].initial = selected_question.solution.content
  1501. else:
  1502. # Display new form for user to fill in
  1503. form = forms.InsertEditQuestionForm()
  1504.  
  1505. return render(request, 'edukts_web/manage.question.form.html', {'form': form, 'topics': topics, 'themes' : themes, 'selected_question': selected_question})
  1506.  
  1507.  
  1508.  
  1509. @user_passes_test(lambda u: u.is_staff)
  1510. def prototype3(request, question_id=None):
  1511. # Init
  1512. selected_question = None
  1513.  
  1514. # Obtain the list of topics
  1515. topics = Topic.objects.all().filter(subject=request.site.id)
  1516.  
  1517. # Objectify the selected question
  1518. if question_id:
  1519. selected_question = Question.objects.all().filter(subject=request.site.id).get(id=int(question_id))
  1520.  
  1521. # Check if question exists otherwise redirect to question list
  1522. if selected_question:
  1523. # Hide question and save. Then give message to user
  1524. #selected_question.is_active = False
  1525. #selected_question.save()
  1526. selected_question.delete()
  1527.  
  1528. return redirect('/prototype2/?msg=Question has been deleted')
  1529. else:
  1530. # Redirect user back to question lists
  1531. return redirect('/prototype/')
  1532.  
  1533. @login_required
  1534. def list_practice_question(request, topic_id=None, theme_id=None):
  1535. # Record usage for stats purpose
  1536. page = "question_management"
  1537. # Never accessed this page before, or last access was more than 10 mins ago
  1538. 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):
  1539. usage = UserUsage(user=request.user, page=page)
  1540. usage.save()
  1541. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  1542. # End usage recording
  1543.  
  1544. # Init
  1545. filtered_questions = None
  1546. selected_topic = None
  1547. selected_theme = None
  1548.  
  1549. # Obtain the list of topics
  1550. topics = Topic.objects.all().filter(subject=request.site.id)
  1551. all_tags = Tag.objects.all().filter(subject=request.site.id)
  1552. themes = Theme.objects.all().filter(subject=request.site.id)
  1553.  
  1554. # int the selected topic
  1555. if topic_id:
  1556. selected_topic = Topic.objects.all().filter(subject=request.site.id).get(id=int(topic_id))
  1557.  
  1558. if topic_id:
  1559. # Retrieve questions for this topic
  1560. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(topic=topic_id).filter(type=2)
  1561.  
  1562. if topic_id:
  1563. # Retrieve questions for this topic
  1564. Ann_questions = Question.objects.all().filter(topic=1).filter(type=2)
  1565. if topic_id:
  1566. # Retrieve questions for this topic
  1567. pic_questions = Question.objects.all().filter(topic=12).filter(type=2)
  1568. if topic_id:
  1569. # Retrieve questions for this topic
  1570. rep_questions = Question.objects.all().filter(topic=11).filter(type=2)
  1571. if topic_id:
  1572. # Retrieve questions for this topic
  1573. lett_questions = Question.objects.all().filter(topic=10).filter(type=2)
  1574. if topic_id:
  1575. # Retrieve questions for this topic
  1576. sit_questions = Question.objects.all().filter(topic=9).filter(type=2)
  1577. if topic_id:
  1578. # Retrieve questions for this topic
  1579. note_questions = Question.objects.all().filter(topic=8).filter(type=2)
  1580. if topic_id:
  1581. # Retrieve questions for this topic
  1582. sum_questions = Question.objects.all().filter(topic=7).filter(type=2)
  1583. if topic_id:
  1584. # Retrieve questions for this topic
  1585. inst_questions = Question.objects.all().filter(topic=6).filter(type=2)
  1586. if topic_id:
  1587. # Retrieve questions for this topic
  1588. rev_questions = Question.objects.all().filter(topic=5).filter(type=2)
  1589. if topic_id:
  1590. # Retrieve questions for this topic
  1591. post_questions = Question.objects.all().filter(topic=4).filter(type=2)
  1592. if topic_id:
  1593. # Retrieve questions for this topic
  1594. ad_questions = Question.objects.all().filter(topic=3).filter(type=2)
  1595. if topic_id:
  1596. # Retrieve questions for this topic
  1597. notice_questions = Question.objects.all().filter(topic=2).filter(type=2)
  1598. if topic_id:
  1599. # Retrieve questions for this topic
  1600. em_questions = Question.objects.all().filter(topic=13).filter(type=2)
  1601. # Filter for difficulty if specified
  1602. if request.GET.__contains__('difficulty'):
  1603. difficulty = request.GET.get('difficulty')
  1604.  
  1605. # Only filter if input is an int!
  1606. try:
  1607. difficulty = int(difficulty)
  1608. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1609. except exceptions.ValueError:
  1610. pass
  1611. 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})
  1612. if theme_id:
  1613. selected_theme = Theme.objects.all().filter(subject=request.site.id).get(id=int(theme_id))
  1614.  
  1615. if theme_id:
  1616. # Retrieve questions for this topic
  1617. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(theme=theme_id).filter(type=2)
  1618.  
  1619. # Filter for difficulty if specified
  1620. if request.GET.__contains__('difficulty'):
  1621. difficulty = request.GET.get('difficulty')
  1622.  
  1623. # Only filter if input is an int!
  1624. try:
  1625. difficulty = int(difficulty)
  1626. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1627. except exceptions.ValueError:
  1628. pass
  1629.  
  1630. 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})
  1631.  
  1632. Ann_questions = Question.objects.all().filter(topic=1).filter(type=2)
  1633. pic_questions = Question.objects.all().filter(topic=12).filter(type=2)
  1634. rep_questions = Question.objects.all().filter(topic=11).filter(type=2)
  1635. lett_questions = Question.objects.all().filter(topic=10).filter(type=2)
  1636.  
  1637. sit_questions = Question.objects.all().filter(topic=9).filter(type=2)
  1638. note_questions = Question.objects.all().filter(topic=8).filter(type=2)
  1639. sum_questions = Question.objects.all().filter(topic=7).filter(type=2)
  1640. inst_questions = Question.objects.all().filter(topic=6).filter(type=2)
  1641. rev_questions = Question.objects.all().filter(topic=5).filter(type=2)
  1642. post_questions = Question.objects.all().filter(topic=4).filter(type=2)
  1643. ad_questions = Question.objects.all().filter(topic=3).filter(type=2)
  1644. notice_questions = Question.objects.all().filter(topic=2).filter(type=2)
  1645. em_questions = Question.objects.all().filter(topic=13).filter(type=2)
  1646. 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})
  1647.  
  1648.  
  1649. @login_required
  1650. def progress(request, topic_id=None, theme_id=None):
  1651. # Record usage for stats purpose
  1652. page = "question_management"
  1653. # Never accessed this page before, or last access was more than 10 mins ago
  1654. 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):
  1655. usage = UserUsage(user=request.user, page=page)
  1656. usage.save()
  1657. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  1658. # End usage recording
  1659.  
  1660. # Init
  1661. filtered_questions = None
  1662. selected_topic = None
  1663. selected_theme = None
  1664.  
  1665. # Obtain the list of topics
  1666. topics = Topic.objects.all().filter(subject=request.site.id)
  1667. all_tags = Tag.objects.all().filter(subject=request.site.id)
  1668. themes = Theme.objects.all().filter(subject=request.site.id)
  1669.  
  1670. # int the selected topic
  1671. if topic_id:
  1672. selected_topic = Topic.objects.all().filter(subject=request.site.id).get(id=int(topic_id))
  1673.  
  1674. if topic_id:
  1675. # Retrieve questions for this topic
  1676. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(topic=topic_id).filter(type=2)
  1677.  
  1678. if topic_id:
  1679. # Retrieve questions for this topic
  1680. Ann_questions = Question.objects.all().filter(topic=1).filter(type=2)
  1681. if topic_id:
  1682. # Retrieve questions for this topic
  1683. pic_questions = Question.objects.all().filter(topic=12).filter(type=2)
  1684. if topic_id:
  1685. # Retrieve questions for this topic
  1686. rep_questions = Question.objects.all().filter(topic=11).filter(type=2)
  1687. if topic_id:
  1688. # Retrieve questions for this topic
  1689. lett_questions = Question.objects.all().filter(topic=10).filter(type=2)
  1690. if topic_id:
  1691. # Retrieve questions for this topic
  1692. sit_questions = Question.objects.all().filter(topic=9).filter(type=2)
  1693. if topic_id:
  1694. # Retrieve questions for this topic
  1695. note_questions = Question.objects.all().filter(topic=8).filter(type=2)
  1696. if topic_id:
  1697. # Retrieve questions for this topic
  1698. sum_questions = Question.objects.all().filter(topic=7).filter(type=2)
  1699. if topic_id:
  1700. # Retrieve questions for this topic
  1701. inst_questions = Question.objects.all().filter(topic=6).filter(type=2)
  1702. if topic_id:
  1703. # Retrieve questions for this topic
  1704. rev_questions = Question.objects.all().filter(topic=5).filter(type=2)
  1705. if topic_id:
  1706. # Retrieve questions for this topic
  1707. post_questions = Question.objects.all().filter(topic=4).filter(type=2)
  1708. if topic_id:
  1709. # Retrieve questions for this topic
  1710. ad_questions = Question.objects.all().filter(topic=3).filter(type=2)
  1711. if topic_id:
  1712. # Retrieve questions for this topic
  1713. notice_questions = Question.objects.all().filter(topic=2).filter(type=2)
  1714. if topic_id:
  1715. # Retrieve questions for this topic
  1716. em_questions = Question.objects.all().filter(topic=13).filter(type=2)
  1717. # Filter for difficulty if specified
  1718. if request.GET.__contains__('difficulty'):
  1719. difficulty = request.GET.get('difficulty')
  1720.  
  1721. # Only filter if input is an int!
  1722. try:
  1723. difficulty = int(difficulty)
  1724. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1725. except exceptions.ValueError:
  1726. pass
  1727. 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})
  1728. if theme_id:
  1729. selected_theme = Theme.objects.all().filter(subject=request.site.id).get(id=int(theme_id))
  1730.  
  1731. if theme_id:
  1732. # Retrieve questions for this topic
  1733. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(theme=theme_id).filter(type=2)
  1734.  
  1735. # Filter for difficulty if specified
  1736. if request.GET.__contains__('difficulty'):
  1737. difficulty = request.GET.get('difficulty')
  1738.  
  1739. # Only filter if input is an int!
  1740. try:
  1741. difficulty = int(difficulty)
  1742. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1743. except exceptions.ValueError:
  1744. pass
  1745.  
  1746. 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})
  1747. Ann_questions = Question.objects.all().filter(topic=1).filter(type=2)
  1748. pic_questions = Question.objects.all().filter(topic=12).filter(type=2)
  1749. rep_questions = Question.objects.all().filter(topic=11).filter(type=2)
  1750. lett_questions = Question.objects.all().filter(topic=10).filter(type=2)
  1751.  
  1752. sit_questions = Question.objects.all().filter(topic=9).filter(type=2)
  1753. note_questions = Question.objects.all().filter(topic=8).filter(type=2)
  1754. sum_questions = Question.objects.all().filter(topic=7).filter(type=2)
  1755. inst_questions = Question.objects.all().filter(topic=6).filter(type=2)
  1756. rev_questions = Question.objects.all().filter(topic=5).filter(type=2)
  1757. post_questions = Question.objects.all().filter(topic=4).filter(type=2)
  1758. ad_questions = Question.objects.all().filter(topic=3).filter(type=2)
  1759. notice_questions = Question.objects.all().filter(topic=2).filter(type=2)
  1760. em_questions = Question.objects.all().filter(topic=13).filter(type=2)
  1761. 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})
  1762.  
  1763. @login_required
  1764. def progress_question(request, question_id):
  1765.  
  1766. question = Question.objects.all().filter(subject=request.site.id).get(id=question_id)
  1767. CurrentUserscore= StudentScores.objects.all()
  1768. Userid=request.user
  1769. return render(request, 'progressattempt.html', {'UserScore':CurrentUserscore , 'User':Userid, 'question':question})
  1770.  
  1771.  
  1772. @login_required
  1773. def list_practice_question2(request, topic_id=None, theme_id=None):
  1774. # Record usage for stats purpose
  1775. page = "question_management"
  1776. # Never accessed this page before, or last access was more than 10 mins ago
  1777. 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):
  1778. usage = UserUsage(user=request.user, page=page)
  1779. usage.save()
  1780. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  1781. # End usage recording
  1782.  
  1783. # Init
  1784. filtered_questions = None
  1785. selected_topic = None
  1786. selected_theme = None
  1787.  
  1788. # Obtain the list of topics
  1789. topics = Topic.objects.all().filter(subject=request.site.id)
  1790. all_tags = Tag.objects.all().filter(subject=request.site.id)
  1791. themes = Theme.objects.all().filter(subject=request.site.id)
  1792.  
  1793. # int the selected topic
  1794. if topic_id:
  1795. selected_topic = Topic.objects.all().filter(subject=request.site.id).get(id=int(topic_id))
  1796.  
  1797. if topic_id:
  1798. # Retrieve questions for this topic
  1799. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(topic=topic_id).filter(type=1)
  1800.  
  1801. # Filter for difficulty if specified
  1802. if request.GET.__contains__('difficulty'):
  1803. difficulty = request.GET.get('difficulty')
  1804.  
  1805. # Only filter if input is an int!
  1806. try:
  1807. difficulty = int(difficulty)
  1808. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1809. except exceptions.ValueError:
  1810. pass
  1811. 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})
  1812. if theme_id:
  1813. selected_theme = Theme.objects.all().filter(subject=request.site.id).get(id=int(theme_id))
  1814.  
  1815. if theme_id:
  1816. # Retrieve questions for this topic
  1817. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(theme=theme_id).filter(type=1)
  1818.  
  1819. # Filter for difficulty if specified
  1820. if request.GET.__contains__('difficulty'):
  1821. difficulty = request.GET.get('difficulty')
  1822.  
  1823. # Only filter if input is an int!
  1824. try:
  1825. difficulty = int(difficulty)
  1826. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1827. except exceptions.ValueError:
  1828. pass
  1829.  
  1830. 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})
  1831. 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})
  1832.  
  1833. @user_passes_test(lambda u: u.is_staff)
  1834. def prototype2(request, topic_id=None, theme_id=None):
  1835.  
  1836. # Record usage for stats purpose
  1837. page = "question_management"
  1838. # Never accessed this page before, or last access was more than 10 mins ago
  1839. 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):
  1840. usage = UserUsage(user=request.user, page=page)
  1841. usage.save()
  1842. request.session['user_usage_'+page] = usage.datetime.strftime("%a %b %d %H:%M:%S %Y")
  1843. # End usage recording
  1844.  
  1845. # Init
  1846. filtered_questions = None
  1847. selected_topic = None
  1848. selected_theme = None
  1849.  
  1850. # Obtain the list of topics
  1851. topics = Topic.objects.all().filter(subject=request.site.id)
  1852. themes = Theme.objects.all().filter(subject=request.site.id)
  1853. all_tags = Tag.objects.all().filter(subject=request.site.id)
  1854. Ann_questions = Question.objects.all().filter(topic=1)
  1855. pic_questions = Question.objects.all().filter(topic=12)
  1856. rep_questions = Question.objects.all().filter(topic=11)
  1857. lett_questions = Question.objects.all().filter(topic=10)
  1858.  
  1859. sit_questions = Question.objects.all().filter(topic=9)
  1860. note_questions = Question.objects.all().filter(topic=8)
  1861. sum_questions = Question.objects.all().filter(topic=7)
  1862. inst_questions = Question.objects.all().filter(topic=6)
  1863. rev_questions = Question.objects.all().filter(topic=5)
  1864. post_questions = Question.objects.all().filter(topic=4)
  1865. ad_questions = Question.objects.all().filter(topic=3)
  1866. notice_questions = Question.objects.all().filter(topic=2)
  1867. em_questions = Question.objects.all().filter(topic=13)
  1868. # int the selected topic
  1869. if topic_id:
  1870. selected_topic = Topic.objects.all().filter(subject=request.site.id).get(id=int(topic_id))
  1871.  
  1872.  
  1873. if topic_id:
  1874. # Retrieve questions for this topic
  1875. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(topic=topic_id)
  1876.  
  1877. # Filter for difficulty if specified
  1878. if request.GET.__contains__('difficulty'):
  1879. difficulty = request.GET.get('difficulty')
  1880.  
  1881. # Only filter if input is an int!
  1882. try:
  1883. difficulty = int(difficulty)
  1884. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1885. except exceptions.ValueError:
  1886. pass
  1887.  
  1888. 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})
  1889.  
  1890. if theme_id:
  1891. selected_theme = Theme.objects.all().filter(subject=request.site.id).get(id=int(theme_id))
  1892.  
  1893. if theme_id:
  1894. # Retrieve questions for this topic
  1895. filtered_questions = Question.objects.all().filter(subject=request.site.id).filter(theme=theme_id)
  1896.  
  1897. # Filter for difficulty if specified
  1898. if request.GET.__contains__('difficulty'):
  1899. difficulty = request.GET.get('difficulty')
  1900.  
  1901. # Only filter if input is an int!
  1902. try:
  1903. difficulty = int(difficulty)
  1904. filtered_questions = filtered_questions.filter(difficulty=difficulty)
  1905. except exceptions.ValueError:
  1906. pass
  1907.  
  1908. 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})
  1909.  
  1910. 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})
  1911.  
  1912. @user_passes_test(lambda u: u.is_staff)
  1913. def prototype2a(request):
  1914. # Init
  1915. filtered_questions = Question.objects.all().filter(subject=request.site.id)
  1916.  
  1917. # Obtain the list of topics
  1918. topics = Topic.objects.all().filter(subject=request.site.id)
  1919. all_tags = Tag.objects.all().filter(subject=request.site.id)
  1920.  
  1921. # Filter by tags given from input
  1922. tags = request.GET.getlist("tags")
  1923.  
  1924. print >> sys.stderr, tags
  1925.  
  1926. if tags:
  1927. for tag in tags:
  1928. print >> sys.stderr, tag
  1929. filtered_questions = filtered_questions.filter(tags__name=tag)
  1930. else:
  1931. filtered_questions = None
  1932.  
  1933.  
  1934.  
  1935. return render(request, 'edukts_web/manage.question.list.html', {'topics': topics, 'questions': filtered_questions, 'tags': tags, 'all_tags': all_tags})
  1936.  
  1937. @user_passes_test(lambda u: u.is_staff)
  1938. def preview(request, question_id=None):
  1939. # Init
  1940. selected_question = None
  1941.  
  1942. # Objectify the selected question
  1943. if question_id:
  1944. selected_question = Question.objects.all().filter(subject=request.site.id).get(id=int(question_id))
  1945. # Get correct answer
  1946. #selected_question.answer = selected_question.answers.all()[0]
  1947. #selected_question.answer = selected_question.answers.all()[0]
  1948. #reference
  1949. # Check if question exists otherwise redirect to question list
  1950. if selected_question:
  1951. return render(request, 'edukts_web/manage.question.preview.html', {'question': selected_question})
  1952. else:
  1953. # 404 if question was not found
  1954. raise Http404
  1955.  
  1956. @user_passes_test(lambda u: u.is_staff)
  1957. def testquestion(request, question_id=None):
  1958.  
  1959.  
  1960. if question_id is not None:
  1961. # Get question (or nothing) from orm
  1962. question = Question.objects.all().filter(subject=request.site.id).get(id=question_id)
  1963.  
  1964. if 'answer' in request.POST and request.POST['answer']:
  1965. response = request.POST['answer']
  1966. response = response.replace(' ', '').replace('\\n', '').replace('\\r', '').replace('\\t', '')
  1967.  
  1968. # Get actual answer in string
  1969. answer_text = question.choices[question.answers.all()[0].content.lower()]
  1970. answer_text = answer_text.replace(' ', '').replace('\n', '').replace('\r', '').replace('\t', '')
  1971.  
  1972. print sys.stderr, answer_text
  1973.  
  1974. if re.match('^'+answer_text+'$', response):
  1975. return HttpResponse("Answer is Correct")
  1976. else:
  1977. return HttpResponse("Answer do not Match\nInput: "+ response+ "\nActual: "+ answer_text)
  1978. # Otherwise no answer just return nothing happened!
  1979. else:
  1980. return HttpResponse("Empty Field!")
  1981. raise Http404
  1982.  
  1983. @login_required
  1984. def flag_question(request, question_id):
  1985. "View to allow users to flag/report a problem with the question"
  1986.  
  1987. if request.method == 'POST':
  1988. form = forms.FlagQuestionForm(request.POST)
  1989. if form.is_valid():
  1990. # Get the question from orm
  1991. question = Question.objects.get(id=question_id)
  1992.  
  1993. # Flag question now!
  1994. flag = QuestionFlag(question=question, user=request.user, issue=form.cleaned_data['issue'])
  1995. flag.save()
  1996.  
  1997. return render(request, 'edukts_web/question.flag.html', {'form': form, 'submitted': True})
  1998. else:
  1999. # Display new form for user to fill in
  2000. form = forms.FlagQuestionForm()
  2001.  
  2002. return render(request, 'edukts_web/question.flag.html', {'form': form})
  2003.  
  2004. @user_passes_test(lambda u: u.is_staff)
  2005. def flag_display(request):
  2006. flagged_qns = QuestionFlag.objects.all()
  2007.  
  2008. return render(request, 'edukts_web/control.flaggedquestions.html', {'flagged_qns': flagged_qns})
  2009.  
  2010. @login_required
  2011. def search(request):
  2012. # Init
  2013. filtered_questions = Question.objects.all().filter(subject=request.site.id)
  2014.  
  2015. # Obtain the list of topics
  2016. topics = Topic.objects.all().filter(subject=request.site.id)
  2017. all_tags = Tag.objects.all().filter(subject=request.site.id)
  2018.  
  2019. # Filter by tags given from input
  2020. tags = request.GET.getlist("tags")
  2021.  
  2022. if tags:
  2023. for tag in tags:
  2024. filtered_questions = filtered_questions.filter(tags__name=tag)
  2025.  
  2026. paginator = Paginator(filtered_questions, 5)
  2027.  
  2028. page = request.GET.get('page')
  2029.  
  2030. try:
  2031. questions = paginator.page(page)
  2032. except PageNotAnInteger:
  2033. questions = paginator.page(1)
  2034. except EmptyPage:
  2035. questions = paginator.page(paginator.num_pages)
  2036. else:
  2037. questions = None
  2038.  
  2039. # Remove page number from querystring
  2040. q = request.GET
  2041. z = q.copy()
  2042. try:
  2043. del z['page']
  2044. except KeyError:
  2045. pass
  2046. querystring = '?' + z.urlencode()
  2047.  
  2048. return render(request, 'edukts_web/search.html', {'topics': topics, 'questions': questions, 'tags': tags, 'all_tags': all_tags, 'querystring': querystring})
  2049.  
  2050.  
  2051.  
  2052.  
  2053.  
  2054.  
  2055. ## New edukts views
  2056. @login_required
  2057. def site_selection(request, site_name=None):
  2058. if site_name == None:
  2059. subjects = Subject.objects.all().filter(displayed=True)
  2060.  
  2061. return render(request, 'edukts_web/site-selection.html', {'subjects': subjects})
  2062.  
  2063. # Update session
  2064. site = Subject.objects.all().get(webname=site_name)
  2065. request.session['edukts_site'] = site.id
  2066. return redirect('/')
  2067.  
  2068. @login_required
  2069. def concept_display(request, concept_id):
  2070. this_concept = Concept.objects.all().get(id=concept_id)
  2071. this_video = Video.objects.filter(subject=request.site.id)
  2072.  
  2073. if this_concept.filename == None:
  2074. return render(request, 'edukts_web/conceptvideo.html', {'concept': this_concept, 'video': this_video})
  2075. else:
  2076. return render(request, 'edukts_web/concept.html', {'concept': this_concept})
  2077.  
  2078. @login_required
  2079. def qna_question_new(request):
  2080. # Load empty form for new question
  2081. if request.method == 'GET':
  2082. form = forms.QnaQuestionForm(subject=request.site.id)
  2083.  
  2084. return render(request, 'edukts_web/qna.question.new.html', {'form': form})
  2085.  
  2086. # Process completed form
  2087. elif request.method == 'POST':
  2088. form = forms.QnaQuestionForm(subject=request.site.id, data=request.POST) # Bind form to user data
  2089.  
  2090. if form.is_valid():
  2091. # Insert new QnA question into database
  2092. # TODO: Harden the qna form by rechecking & filtering the data for subject & topic fields to ensure validity
  2093. qna_question = QnaQuestion(title=form.cleaned_data['title'], content=form.cleaned_data['content'], subject=Subject.objects.get(id=request.site.id), user=request.user)
  2094. qna_question.save()
  2095.  
  2096. # QnA Question successfully added
  2097. return redirect('/qna/question/list/')
  2098. # Oops something went wrong in form
  2099. else:
  2100. return render(request, 'edukts_web/qna.question.new.html', {'form': form})
  2101.  
  2102. # Invalid HTTP request
  2103. else:
  2104. raise Http404
  2105.  
  2106. @login_required
  2107. def qna_question_list(request):
  2108. # Get all qna questions and display as a list
  2109. qna_questions = QnaQuestion.objects.filter(subject=request.site.id)
  2110.  
  2111. return render(request, 'edukts_web/qna.question.list.html', {'questions': qna_questions})
  2112.  
  2113. @login_required
  2114. def essay_answer_list(request):
  2115. # Get all qna questions and display as a list
  2116. essay_responses = EssayResponse.objects.filter(user=request.user)
  2117.  
  2118. return render(request, 'edukts_web/essay.response.list.html', {'essays': essay_responses})
  2119.  
  2120. @login_required
  2121. def qna_question_view(request, question_id):
  2122. # Load question and empty answer form for new question
  2123. if request.method == 'GET':
  2124. qna_question = QnaQuestion.objects.get(id=question_id)
  2125. qna_question.content = qna_question.content.replace('\n', '<br>')
  2126.  
  2127. form = forms.QnaAnswerForm()
  2128.  
  2129. return render(request, 'edukts_web/qna.question.view.html', {'question': qna_question, 'form': form})
  2130.  
  2131. # Process completed form
  2132. elif request.method == 'POST':
  2133. qna_question = QnaQuestion.objects.get(id=question_id)
  2134. qna_question.content = qna_question.content.replace('\n', '<br>')
  2135.  
  2136. form = forms.QnaAnswerForm(data=request.POST) # Bind form to user data
  2137.  
  2138. if form.is_valid():
  2139. # Insert new QnA answer into database
  2140. qna_answer = QnaAnswer(question=qna_question, content=form.cleaned_data['content'], user=request.user)
  2141. qna_answer.save()
  2142.  
  2143. # QnA Answer successfully added
  2144. return HttpResponseRedirect('')
  2145. # Oops something went wrong in form
  2146. else:
  2147. return render(request, 'edukts_web/qna.question.view.html', {'question': qna_question, 'form': form})
  2148.  
  2149. # Invalid HTTP request
  2150. else:
  2151. raise Http404
  2152.  
  2153. @login_required
  2154. def essay_response_view(request, question_id):
  2155. # Load question and empty answer form for new question
  2156. if request.method == 'GET':
  2157. essay_response = EssayResponse.objects.get(id=question_id)
  2158. question = Question.objects.get(id=essay_response.question_id)
  2159. essay_response.content = essay_response.content.replace('\n', '<br>')
  2160. return render(request, 'edukts_web/essay.response.view.html', {'essayresponse': essay_response, 'question': question})
  2161.  
  2162. # Process completed form
  2163. elif request.method == 'POST':
  2164. qna_question = QnaQuestion.objects.get(id=question_id)
  2165. qna_question.content = qna_question.content.replace('\n', '<br>')
  2166.  
  2167. form = forms.QnaAnswerForm(data=request.POST) # Bind form to user data
  2168.  
  2169. if form.is_valid():
  2170. # Insert new QnA answer into database
  2171. qna_answer = QnaAnswer(question=qna_question, content=form.cleaned_data['content'], user=request.user)
  2172. qna_answer.save()
  2173.  
  2174. # QnA Answer successfully added
  2175. return HttpResponseRedirect('')
  2176. # Oops something went wrong in form
  2177. else:
  2178. return render(request, 'edukts_web/qna.question.view.html', {'question': qna_question, 'form': form})
  2179.  
  2180. # Invalid HTTP request
  2181. else:
  2182. raise Http404
  2183.  
  2184. @login_required
  2185. def temp_tutor_notice_new(request, looking):
  2186. looking = int(looking)
  2187. # Load empty form for tutor notice
  2188. if request.method == 'GET':
  2189. form = forms.TempTutoringForm()
  2190.  
  2191. if looking == 1:
  2192. looking = True
  2193. else:
  2194. looking = False
  2195.  
  2196. return render(request, 'edukts_web/tutor.new.html', {'form': form, 'looking': looking})
  2197.  
  2198. # Process completed form
  2199. elif request.method == 'POST':
  2200. form = forms.TempTutoringForm(data=request.POST) # Bind form to user data
  2201.  
  2202. if form.is_valid():
  2203. # Flip the looking around
  2204. if looking == 1:
  2205. looking = 0
  2206. else:
  2207. looking = 1
  2208.  
  2209. # Insert new QnA question into database
  2210. # TODO: Harden the qna form by rechecking & filtering the data for subject & topic fields to ensure validity
  2211. qna_question = TempTutorNotice(title=form.cleaned_data['title'], content=form.cleaned_data['content'], user=request.user, looking=looking)
  2212. qna_question.save()
  2213.  
  2214. # QnA Question successfully added
  2215. return redirect('/tutor/list/' + str(looking) + '/')
  2216. # Oops something went wrong in form
  2217. else:
  2218. if looking == 1:
  2219. looking = True
  2220. else:
  2221. looking = False
  2222.  
  2223. return render(request, 'edukts_web/tutor.new.html', {'form': form, 'looking': looking})
  2224.  
  2225. # Invalid HTTP request
  2226. else:
  2227. raise Http404
  2228.  
  2229. @login_required
  2230. def temp_tutor_notice_list(request, looking):
  2231. looking = int(looking)
  2232. # Get all tutor notice and display as a list
  2233. tutor_notices = TempTutorNotice.objects.filter(looking=looking)
  2234.  
  2235. if looking == 1:
  2236. looking = True
  2237. else:
  2238. looking = False
  2239.  
  2240. return render(request, 'edukts_web/tutor.list.html', {'tutor_notices': tutor_notices, 'looking': looking})
  2241.  
  2242. @login_required
  2243. def temp_tutor_notice_view(request, notice_id):
  2244. tutor_notice = TempTutorNotice.objects.get(id=notice_id)
  2245. tutor_notice.content = tutor_notice.content.replace('\n', '<br>')
  2246.  
  2247. return render(request, 'edukts_web/tutor.view.html', {'notice': tutor_notice})
  2248.  
  2249.  
  2250. def handle_uploaded_file(f, fileurl):
  2251. with open(fileurl, 'wb+') as destination:
  2252. for chunk in f.chunks():
  2253. destination.write(chunk)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement