Advertisement
shubhamgoyal

Untitled

Feb 16th, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.92 KB | None | 0 0
  1. from django.shortcuts import render
  2. from .models import UserState, StateTransition, QuestionType, ConfigType
  3. from django.db.models import Q
  4. from .models import *
  5. from django.views.decorators.csrf import csrf_exempt, csrf_protect
  6. from rest_framework.decorators import api_view, permission_classes,\
  7. authentication_classes, renderer_classes
  8. from rest_framework.renderers import JSONRenderer
  9. from django.http import JsonResponse
  10. from rest_framework import status
  11. from tutor.constants import *
  12. from .parse_chaining import parse_prolog_output
  13. from .utils import call_prolog
  14. import json
  15. import logging
  16. import traceback
  17.  
  18. logger = logging.getLogger('api')
  19.  
  20. def current_user_state(user, subtopic):
  21. logger.info("------Entered current_user_state------")
  22. logger.info("user = {}".format(user, ))
  23. logger.info("subtopic = {}".format(subtopic, ))
  24. user_state = UserState.objects.filter(user = user, subtopic = subtopic).first()
  25. logger.info("user states from db - {}".format(UserState.objects.filter(user = user, subtopic = subtopic), ))
  26. logger.ingo("user_state = {}".format(user_state, ))
  27. if user_state:
  28. return user_state
  29. else:
  30. return None
  31.  
  32. def subtopic_selection_handler(data, user):
  33. logger.info("------Entered subtopic_selection_handler------")
  34. logger.info("data = {}".format(data, ))
  35. logger.info("user = {}".format(user, ))
  36. try:
  37. video = {}
  38. subtopic = Subtopic.objects.get(pk=int(data['subtopic_id']))
  39. logger.info("subtopic = {}".format(subtopic, ))
  40. user_state = current_user_state(user, subtopic)
  41. logger.info("user_state = {}".format(user_state, ))
  42. state = user_state.state.name
  43. logger.info("state = {}".format(state, ))
  44. if state == 'SHOW_VIDEO': # to display video
  45. logger.info("state == SHOW_VIDEO")
  46. video_obj = Video.objects.filter(subtopic=subtopic).first()
  47. logger.info("video_obj = {}".format(video_obj, ))
  48. if video_obj:
  49. video = video_obj.media
  50. logger.info("video = {}".format(video, ))
  51. return {}, video
  52. if state in COMPLETED_STATES:
  53. logger.info("Working with UI for state {} ".format(state,))
  54. return {}, video
  55. elif state in ['INIT', 'POOR', 'COMPLETED']:
  56. logger.info("state = {}".format(state, ))
  57. process_pid = prolog_process(user_state, 'new', user_state.question_type, user_state.config_type)
  58. logger.info("process_pid = {}".format(process_pid, ))
  59. question, resp = get_question_for_user(user_state, subtopic)
  60. logger.info("question = {}".format(question, ))
  61. logger.info("resp = {}".format(resp, ))
  62. concept = get_next_concept(user_state, question)
  63. logger.info("concept = {}".format(concept, ))
  64. update_user_state_for_initial(user_state, question, concept)
  65. logger.info("user_state = {}".format(user_state, ))
  66. resp["concepts_used"] = concept
  67. logger.info("resp = {}", resp)
  68. return resp, video, user_state.user_progress
  69. elif state == 'BROKEN_DOWN_POOR':
  70. logger.info("state == BROKEN_DOWN_POOR")
  71. process_pid = prolog_process(user_state, 'similar', user_state.question_type, user_state.config_type)
  72. logger.info("process_pid = {}".format(process_pid, ))
  73. question, resp = get_question_for_user(user_state, subtopic)
  74. logger.info("question = {}".format(question, ))
  75. logger.info("resp = {}".format(resp, ))
  76. concept = get_next_concept(user_state, question)
  77. logger.info("concept = {}".format(concept, ))
  78. update_user_state_for_initial(user_state, question, concept)
  79. logger.info("user_state = {}".format(user_state, ))
  80. else:
  81. logger.info("Entered else")
  82. user_question = user_state.question
  83. logger.info("user_question = {}".format(user_question, ))
  84. resp = user_question.question_json(user_state)
  85. logger.info("resp = {}".format(resp, ))
  86. resp["concepts_used"] = user_state.current_concept
  87. logger.info("resp = {}".format(resp, ))
  88. return resp, video, user_state.user_progress
  89. except:
  90. logger.info("Exception in subtopic selection: "+str(traceback.format_exc()))
  91.  
  92. def update_user_state_for_initial(user_state, question, concept):
  93. logger.info("------Entered update_user_state_for_initial------")
  94. state = State.objects.filter(name ='NEW').first()
  95. logger.info("state = {}".format(state, ))
  96. user_state.question = question
  97. logger.info("user_state.question = {}".format(user_state.question, ))
  98. user_state.current_concept = concept
  99. logger.info("user_state.current_concept = {}".format(user_state.current_concept, ))
  100. user_state.state = state
  101. logger.info("user_state.state = {}".format(user_state.state, ))
  102. user_state.save()
  103. logger.info("user_state = {}".format(user_state, ))
  104. return user_state
  105.  
  106. def get_question_for_user(user_state, subtopic):
  107. logger.info("------Entered get_question_for_user------")
  108. logger.info("user_state = {}".format(user_state, ))
  109. logger.info("subtopic = {}".format(subtopic, ))
  110. try:
  111. questions = Question.objects.filter(subtopic=subtopic, user=user_state.user, isattempt=False)
  112. logger.info("questions = {}".format(questions, ))
  113. for ques in questions:
  114. logger.info("ques = {}".format(ques, ))
  115. if user_state.config_type.prolog_identifier in eval(ques.config_type) and\
  116. user_state.question_type.prolog_identifier in eval(ques.question_type):
  117. logger.info("Entered if")
  118. logger.info("Question for user is: {}".format(ques.id))
  119. resp = ques.question_json(user_state)
  120. logger.info("resp = {}".format(resp, ))
  121. return ques, resp
  122. except:
  123. logger.info("Exception in get user question: "+str(traceback.format_exc()))
  124.  
  125. def prolog_process(user_state, query_state, question_type, config_type):
  126. logger.info("------Entered prolog_process------")
  127. try:
  128. logger.info("Process Prolog method for state{} ".format(user_state.state.name,))
  129. output_file = str(user_state.user.id)+'_'+str(user_state.subtopic.prolog_identifier)+'_output_file.txt'
  130. logger.info("output_file = {}".format(output_file, ))
  131. # Working code for prolog
  132. call_prolog(user_state.user, user_state.topic.prolog_identifier,\
  133. user_state.subtopic.prolog_identifier, question_type.prolog_identifier,\
  134. config_type.prolog_identifier, query_state, output_file)
  135. logger.info("Going to reading file {} ".format(output_file,))
  136. #parse_prolog_output(output_file, user_state.subtopic) # TODO change to output file
  137. parse_prolog_output('read_file.txt', user_state.subtopic, user_state.user.id) # Sample File
  138. logger.info("Going to reading file ")
  139. except:
  140. logger.info("Exception in prolog_process: "+str(traceback.format_exc()))
  141.  
  142. def user_action_hanlder(data, user):
  143. logger.info("------Entered user_action_hanlder------")
  144. try:
  145. video = {}
  146. subtopic = Subtopic.objects.get(pk=int(data['subtopic_id']))
  147. logger.info("subtopic = {}".format(subtopic, ))
  148. user_state = current_user_state(user, subtopic)
  149. logger.info("user_state = {}".format(user_state, ))
  150. subtopic_over = is_subtopics_over(subtopic, user_state)
  151. logger.info("user_action_hanlder - subtopic_over = {}".format(subtopic_over, ))
  152. topic_over = is_topics_over(subtopic, user_state.user)
  153. logger.info("topic_over = {}".format(topic_over, ))
  154. breakdown_over = is_breakdown_over(subtopic, user_state)
  155. logger.info("breakdown_over = {}".format(breakdown_over, ))
  156.  
  157. if subtopic_over:
  158. logger.info("Entered if subtopic_over")
  159. user_state.state = State.objects.filter(name='COMPLETED').first()
  160. logger.info("user_state.state = {}".format(user_state.state, ))
  161. subtopic.subtopic_completed = True
  162. logger.info("subtopic.subtopic_completed = True")
  163. if topic_over:
  164. logger.info("Entered if topic_over")
  165. user_state.topic_completed = True
  166. logger.info("user_state.topic_completed = True")
  167. logger.info("user_state = {}".format(user_state, ))
  168. user_state.save()
  169. logger.info("user_state = {}".format(user_state, ))
  170. create_user_history(user_state, data, 'completed')
  171. return {}, "UI Completed", user_state.state.name
  172.  
  173. new_state, query_action = get_next_state(user_state)
  174. logger.info("new_state = {}".format(new_state, ))
  175. logger.info("query_action = {}".format(query_action, ))
  176.  
  177. if new_state.name == 'BROKEN_DOWN_POOR':
  178. logger.info("new_state.name == BROKEN_DOWN_POOR")
  179.  
  180. subtopic = QuestionType.objects.filter(prolog_identifier=user_state.question_type)
  181. logger.info("subtopic = {}".format(subtopic, ))
  182. new_subtopic_userstate = UserState.objects.filtet(subtopic = subtopic).first()
  183. logger.info("new_subtopic_userstate = {}".format(new_subtopic_userstate, ))
  184.  
  185. if new_subtopic_userstate.id == user_state.id:
  186. logger.info("Entered if new_subtopic_userstate.id == user_state.id")
  187. user_state_new.question = user_state.breakdown_ques
  188. logger.info("user_state_new.question = {}".format(user_state_new.question, ))
  189. user_state_new.breakdown_ques = None
  190. logger.format("user_state_new.breakdown_ques = None")
  191. user_state_new.config_type = user_state.breakdown_ques.user_ct
  192. logger.format("user_state_new.config_type = {}".format(user_state_new.config_type, ))
  193. user_state_new.question_type = user_state.breakdown_ques.user_qt
  194. logger.format("user_state_new.question_type = {}".format(user_state_new.question_type, ))
  195. user_state.breakdown_ques = None
  196. logger.info("user_state.breakdown_ques = None")
  197. user_state.save()
  198. logger.info("user_state = {}".format(user_state, ))
  199. user_state_new.save()
  200. logger.info("user_state_new = {}".format(user_state_new, ))
  201. create_user_history(user_state_new, data)
  202. else:
  203. logger.info("Entered else")
  204. state = State.objects.get(name='POOR')
  205. logger.info("state = {}".format(state, ))
  206. user_state.state = state
  207. logger.info("user_state.state = ".format(user_state.state, ))
  208. user_state.video_seen = False
  209. logger.info("user_state.video_seen = False")
  210. user_state.breakdown_ques = None
  211. logger.info("user_state.breakdown_ques = None")
  212. user_state.save()
  213. logger.info("user_state = {}".format(user_state, ))
  214. create_user_history(user_state, data)
  215. return {}, {}, new_state.name
  216.  
  217. elif new_state.name in COMPLETED_STATES:
  218. logger.info("Entered elif new_state.name in COMPLETED_STATES")
  219. logger.info("Working with UI for state {} ".format(new_state,))
  220. video_obj = Video.objects.filter(subtopic=subtopic).first()
  221. logger.info(" video_obj = {}".format(video_obj, ))
  222. if video_obj:
  223. logger.info("Entered if video_obj")
  224. video = video_obj.media
  225. logger.info("video = {}".format(video, ))
  226. user_state.video = video_obj
  227. logger.info("user_state.video = {}".format(user_state.video, ))
  228. user_state.state = new_state
  229. logger.info("user_state.state = {}".format(user_state.state, ))
  230. user_state.doubt_click = False
  231. logger.info("user_state.doubt_click = False")
  232. user_state.doubt_text = None
  233. logger.info("user_state.doubt_text = None")
  234. user_state.error_click = False
  235. logger.info("user_state.error_click = False")
  236. user_state.error_text = None
  237. logger.info("user_state.error_text = None")
  238. create_user_history(user_state, data)
  239. user_state.save()
  240. logger.info("user_state = {}".format(user_state, ))
  241. return {}, video, new_state.name
  242.  
  243. elif new_state.name in ['POOR', 'COMPLETED']:
  244. logger.info("Entered elif new_state.name in ['POOR', 'COMPLETED']")
  245. user_state.video = None
  246. logger.info("user_state.video = None")
  247. user_state.state = new_state
  248. logger.info("user_state.state = {}".format(user_state.state, ))
  249. user_state.video_seen = False
  250. logger.info("user_state.video_seen = False")
  251. user_state.save()
  252. logger.info("user_state = {}".format(user_state, ))
  253. create_user_history(user_state, data)
  254. return {}, {}, new_state.name
  255.  
  256. query_string = get_prolog_query_string(new_state) # to get new or similar
  257. logger.info("query_string = {}".format(query_string, ))
  258. qt, ct = get_config_values(query_action, user_state)
  259. logger.info("qt = {}".format(qt, ))
  260. logger.info("ct = {}".format(ct, ))
  261. question, resp = get_next_question(user_state, new_state, qt, ct, query_string)
  262. logger.info("question = {}".format(question, ))
  263. logger.info("resp = {}".format(resp, ))
  264. concept = get_next_concept(user_state, question)
  265. logger.info("concept = {}".format(concept, ))
  266.  
  267. user_state = update_user_state(data, user_state, new_state, question,\
  268. concept, qt, ct, topic_over, subtopic_over)
  269. logger.info("user_state = {}".format(user_state, ))
  270. return resp, user_state.video_seen, user_state.state.name
  271. except:
  272. logger.info("Exception in action handler: "+str(traceback.format_exc()))
  273. return None, None, None
  274.  
  275. def video_handler(data, user):
  276. logger.info("------Entered video_handler------")
  277. logger.info("data = {}".format(data, ))
  278. logger.info("user = {}".format(user, ))
  279. try:
  280. video = {}
  281. subtopic = Subtopic.objects.get(pk=int(data['subtopic_id']))
  282. logger.info("subtopic = {}".format(subtopic, ))
  283. user_state = current_user_state(user, subtopic)
  284. logger.info("user_state = {}".format(user_state, ))
  285. state = State.objects.filter(name='SHOW_VIDEO').first()
  286. logger.info("state = {}".format(state, ))
  287. user_state.state = state
  288. logger.info("user_state.state = {}".format(user_state.state, ))
  289. user_state.video_seen = False if data['video_seen'] == 'false' else True
  290. logger.info("user_state.video_seen = {}".format(user_state.video_seen, ))
  291. user_state.save()
  292. logger.info("user_state = {}".format(user_state, ))
  293. created = create_user_history(user_state, data, 'video')
  294. logger.info("created = {}".format(created, ))
  295. new_state, query_action = get_next_state(user_state)
  296. logger.info("new_state = {}".format(new_state, ))
  297. logger.info("query_action = {}".format(query_action, ))
  298.  
  299. if new_state.name in ['COMPLETED']:
  300. logger.info("Entered if new_state.name in ['COMPLETED']")
  301. logger.info("Working with UI for state {} ".format(new_state,))
  302. video_obj = Video.objects.filter(subtopic=subtopic).first()
  303. logger.info("video_obj = {}".format(video_obj, ))
  304. if video_obj:
  305. logger.info("Entered if video_obj")
  306. video = video_obj.media
  307. logger.info("video = {}".format(video, ))
  308. return {}, video, new_state.name
  309.  
  310. query_string = get_prolog_query_string(new_state) # to get new or similar
  311. logger.info("query_string = {}".format(query_string, ))
  312. qt, ct = get_config_values(query_action, user_state)
  313. logger.info("qt = {}".format(qt, ))
  314. logger.info("ct = {}".format(ct, ))
  315. question, resp = get_next_question(user_state, new_state, qt, ct, query_string)
  316. logger.format("question = {}".format(question, ))
  317. logger.format("resp = {}".format(resp, ))
  318. concept = get_next_concept(user_state, question)
  319. logger.info("concept = {}".format(concept, ))
  320. user_state = update_user_state(data, user_state, new_state, question, concept, qt, ct)
  321. logger.info("user_state = {}".format(user_state, ))
  322. return resp, user_state.video_seen, user_state.state.name
  323. except:
  324. logger.info("Exception in action handler: "+str(traceback.format_exc()))
  325. return None, None, None
  326.  
  327. def get_prolog_query_string(new_state):
  328. logger.info("------Entered get_prolog_query_string------")
  329. try:
  330. if new_state.name in PROLOG_NEW_STATE:
  331. logger.info("Entered if new_state.name in PROLOG_NEW_STATE")
  332. return 'new'
  333. elif new_state.name in PROLOG_SIMILAR_STATE:
  334. logger.info("Entered elif new_state.name in PROLOG_SIMILAR_STATE")
  335. return 'similar'
  336. else:
  337. logger.info("Entered else")
  338. return 'new'
  339. except:
  340. logger.info("Exception in get_prolog_query_string: "+str(traceback.format_exc()))
  341. return 'new'
  342.  
  343. def get_config_values(query_action, user_state):
  344. logger.info("------Entered get_config_values------")
  345. logger.info("query_action = {}".format(query_action, ))
  346. logger.info("user_state = {}".format(user_state, ))
  347. if query_action.name in CONFIG_CHANGE_TYPE:
  348. logger.info("Entered if query_action.name in CONFIG_CHANGE_TYPE")
  349. if user_state.iscomplex:
  350. logger.info("Entered if user_state.iscomplex")
  351. config_type = user_state.breakdown_ques.user_ct
  352. logger.info("config_type = {}".format(config_type, ))
  353. question_type = user_state.breakdown_ques.user_qt
  354. logger.info("question_type = {}".format(question_type, ))
  355. else:
  356. logger.info("Entered else")
  357. config_type = user_state.config_type
  358. logger.info("config_type = {}".format(config_type, ))
  359. question_type = user_state.question_type
  360. logger.info("question_type = {}".format(question_type, ))
  361.  
  362. user_state.video_seen = False
  363. logger.info("user_state.video_seen = False")
  364. user_state.save()
  365. logger.info("user_state = {}".format(user_state, ))
  366.  
  367. config_list = list(ConfigType.objects.filter(question_type=question_type))
  368. logger.info("config_list = {}".format(config_list, ))
  369. try:
  370. ct_index = config_list.index(config_type)
  371. logger.info("ct_index = {}".format(ct_index, ))
  372. next_ct = config_list[ct_index+1]
  373. logger.info("next_ct = {}".format(next_ct, ))
  374. return user_state.question_type, next_ct
  375. except:
  376. qt_list = list(QuestionType.objects.filter(subtopic=user_state.subtopic))
  377. logger.info("qt_list = {}".format(qt_list, ))
  378. try:
  379. qt_index = qt_list.index(question_type)
  380. logger.info("qt_index = {}".format(qt_index, ))
  381. next_qt = qt_list[qt_index+1]
  382. logger.info("next_qt = {}".format(next_qt, ))
  383. ct = ConfigType.objects.filter(question_type=next_qt).first()
  384. logger.info("ct = {}".format(ct, ))
  385. return next_qt, ct
  386. except:
  387. logger.info("Exception in get configs: "+str(traceback.format_exc()))
  388. return None, None
  389. elif query_action.name == 'CT_BROKEN_DOWN_QUESTION':
  390. logger.info("Entered elif query_action.name == 'CT_BROKEN_DOWN_QUESTION'")
  391. breakdown_ques = user_state.breakdown_ques
  392. logger.info("breakdown_ques = {}".format(breakdown_ques, ))
  393. concepts = eval(breakdown_ques.concepts_used)
  394. logger.info("concepts = {}".format(concepts, ))
  395. indx = index(user_state.question.current_concept)
  396. logger.info("indx = {}".format(indx, ))
  397. new_qid = concepts[indx+1][0]
  398. logger.info("new_qid = {}".format(new_qid, ))
  399. new_question = Question.objects.get(pk=int(new_qid))
  400. logger.info("new_question = {}".format(new_question, ))
  401. return new_question.config_type[0], new_question.question_type[0]
  402. else:
  403. logger.info("Entered else")
  404. return user_state.question_type, user_state.config_type
  405.  
  406. def get_next_question(user_state, new_state, question_type, config_type, query_string):
  407. logger.info("------Entered get_next_question------")
  408. logger.info("user_state = {}".format(user_state, ))
  409. logger.info("new_state = {}".format(new_state, ))
  410. logger.info("question_type = {}".format(question_type, ))
  411. logger.info("config_type = {}".format(config_type, ))
  412. logger.info("query_string = {}".format(query_string, ))
  413. if user_state.iscomplex:
  414. logger.info("Entered if user_state.iscomplex")
  415. if new_state.name == 'BROKEN_DOWN_QUESTION':
  416. logger.info("Entered if new_state.name == 'BROKEN_DOWN_QUESTION'")
  417. breakdown_ques = user_state.breakdown_ques
  418. logger.info("breakdown_ques = {}".format(breakdown_ques, ))
  419. concepts = eval(breakdown_ques.concepts_used)
  420. logger.info("concepts = {}".format(concepts, ))
  421. new_qid = concepts[0][1]
  422. logger.info("new_qid = {}".format(new_qid, ))
  423. new_question = Question.objects.get(pk=int(new_qid))
  424. logger.info("new_question = {}".format(new_question, ))
  425. resp = new_question.question_json(user_state)
  426. logger.info("resp = {}".format(resp, ))
  427. return new_question, resp
  428. elif new_state.name == 'NEXT_BROKEN_DOWN_QUESTION':
  429. logger.format("Entered elif new_state.name == 'NEXT_BROKEN_DOWN_QUESTION'")
  430. process_id = prolog_process(user_state, query_string, question_type, config_type)
  431. logger.info("process_id = {}".format(process_id, ))
  432. question, resp = get_question_for_user(user_state, user_state.subtopic)
  433. logger.info("question = {}".format(question, ))
  434. logger.info("resp = {}".format(resp, ))
  435. return question, resp
  436. else:
  437. logger.info("Entered else")
  438. process_id = prolog_process(user_state, query_string, question_type, config_type)
  439. logger.info("process_id = {}".format(process_id, ))
  440. question, resp = get_question_for_user(user_state, user_state.subtopic)
  441. logger.info("question = {}".format(question, ))
  442. logger.info("resp = {}".format(resp, ))
  443. return question, resp
  444.  
  445. def update_user_state(data, user_state, new_state, question, concept,\
  446. qt, ct, topic_over=False, subtopic_over=False):
  447. logger.info("------Entered update_user_state------")
  448. logger.info("data = {}".format(data, ))
  449. logger.info("user_state = {}".format(user_state, ))
  450. logger.info("new_state = {}".format(new_state, ))
  451. logger.info("question = {}".format(question, ))
  452. logger.info("concept = {}".format(concept, ))
  453. logger.info("qt = {}".format(qt, ))
  454. logger.info("ct = {}".format(ct, ))
  455. logger.info("topic_over = {}".format(topic_over, ))
  456. logger.info("subtopic_over = {}".format(subtopic_over, ))
  457. try:
  458. breakdown = is_breakdown_over(user_state.subtopic, user_state)
  459. logger.info("breakdown = {}".format(breakdown, ))
  460. if breakdown and new_state.state == 'NEXT_BROKEN_DOWN_QUESTION':
  461. logger.info("if breakdown and new_state.state == 'NEXT_BROKEN_DOWN_QUESTION':")
  462. user_state.breakdown_ques = None
  463. logger.info("user_state.breakdown_ques = None")
  464. user_state.video_seen = False
  465. logger.info("user_state.video_seen = False")
  466.  
  467. user_state.state = new_state
  468. logger.info("user_state.state = {}".format(user_state.state, ))
  469. user_state.question = question
  470. logger.info("user_state.question = {}".format(user_state.question, ))
  471. user_state.config_type = ct
  472. logger.info("user_state.config_type = {}".format(user_state.config_type, ))
  473. user_state.question_type = qt
  474. logger.info("user_state.question_type = {}".format(user_state.question_type, ))
  475.  
  476. user_state.topic_over = topic_over
  477. logger.info("user_state.topic_over = {}".format(user_state.topic_over, ))
  478. user_state.subtopic_over = subtopic_over
  479. logger.info("user_state.subtopic_over = {}".format(user_state.subtopic_over, ))
  480. user_state.concept = concept
  481. logger.info("user_state.concept = {}".format(user_state.concept, ))
  482. user_state.state = new_state
  483. logger.info("user_state.state = {}".format(user_state.state, ))
  484. user_state.doubt_click = False
  485. logger.info("user_state.doubt_click = False")
  486. user_state.doubt_text = None
  487. logger.info("user_state.doubt_text = None")
  488. user_state.error_click = False
  489. logger.info("user_state.error_click = False")
  490. user_state.error_text = None
  491. logger.info("user_state.error_text = None")
  492. if question.qid == -1:
  493. logger.info("Entered if question.qid == -1")
  494. user_state.breakdown_ques = question
  495. logger.info("user_state.breakdown_ques = {}".format(user_state.breakdown_ques, ))
  496. user_state.iscomplex = True
  497. logger.info("user_state.iscomplex = True")
  498. question.user_ct = ct
  499. logger.info("question.user_ct = {}".format(question.user_ct, ))
  500. question.user_qt = qt
  501. logger.info("question.user_qt = {}".format(question.user_qt, ))
  502. question.save()
  503. logger.info("question = {}".format(question, ))
  504. user_state.save()
  505. logger.info("user_state = {}".format(user_state, ))
  506. return user_state
  507. except:
  508. logger.info("Exception in update user state: "+str(traceback.format_exc()))
  509.  
  510. def is_breakdown_over(subtopic, user_state):
  511. logger.info("------Entered is_breakdown_over------")
  512. logger.info("subtopic = {}".format(subtopic, ))
  513. logger.info("user_state = {}".format(user_state, ))
  514. try:
  515. breakdown_ques = user_state.breakdown_ques
  516. logger.info("breakdown_ques = {}".format(breakdown_ques, ))
  517. if not breakdown_ques:
  518. logger.info("Entered if not breakdown_ques")
  519. return False
  520. concepts = eval(breakdown_ques.concepts_used)
  521. logger.info("concepts = {}".format(concepts, ))
  522.  
  523. current_concept = user_state.current_concept
  524. logger.info("current_concept = {}".format(current_concept, ))
  525. for concept in concepts:
  526. logger.info("concept = {}".format(concept, )
  527. if concept[0] == current_concept:
  528. logger.info("Entered if concept[0] == current_concept")
  529. index = concepts.index(concept)
  530. logger.info("index = {}".format(index, ))
  531. new_concept = concepts[index+1][0]
  532. logger.info("new_concept = {}".format(new_concept, ))
  533. return False
  534. except:
  535. logger.info("Exception in is_breakdown_over: "+str(traceback.format_exc()))
  536. return True
  537.  
  538. def is_subtopics_over(subtopic, user_state):
  539. logger.info("------Entered is_subtopics_over------")
  540. logger.info("subtopic = {}".format(subtopic, ))
  541. logger.info("user_state = {}".format(user_state, ))
  542. try:
  543. if user_state.iscomplex:
  544. logger.info("Entered if user_state.iscomplex")
  545. breakdown_over = is_breakdown_over(subtopic, user_state)
  546. logger.info("breakdown_over = {}".format(breakdown_over, ))
  547. if not breakdown_over:
  548. logger.format("Entered if not breakdown_over")
  549. return False
  550. last_qt = QuestionType.objects.filter(subtopic=subtopic).last()
  551. logger.info("last_qt = {}".format(last_qt, ))
  552. last_ct = ConfigType.objects.filter(question_type = last_qt).last()
  553. logger.info("last_ct = {}".format(last_ct, ))
  554. return True if (user_state.question_type.id == last_qt.id) and (user_state.config_type.id == last_ct.id) and user_state.question.answer_correct(user_state) else False
  555. except:
  556. logger.info("Exception in is_subtopics_over: "+str(traceback.format_exc()))
  557.  
  558. def is_topics_over(subtopic, user):
  559. logger.info("------Entered is_topics_over------")
  560. logger.info("subtopic = {}".format(subtopic, ))
  561. logger.info("user = {}".format(user, ))
  562. try:
  563. subtopics = Subtopic.objects.filter(topic=subtopic.topic)
  564. logger.info("subtopics = {}".format(subtopics, ))
  565. userstates = UserState.objects.filter(user_id=user.id, subtopic__topic=subtopic.topic, state__name='COMPLETED')
  566. logger.info("userstates = {}".format(userstates, ))
  567. return True if len(subtopics) == len(userstates) else False
  568. except:
  569. logger.info("Exception in is_topics_over: "+str(traceback.format_exc()))
  570.  
  571. def get_next_concept(user_state, question):
  572. logger.info("------Entered get_next_concept------")
  573. logger.info("user_state = {}".format(user_state, ))
  574. logger.info("question = {}".format(question, ))
  575. try:
  576. concepts = eval(question.concepts_used)
  577. logger.info("concepts = {}".format(concepts, ))
  578. if len(concepts) == 1:
  579. logger.info("Entered if len(concepts) == 1")
  580. return concepts[0][0]
  581. else:
  582. logger.info("Entered else")
  583. current_concept = user_state.current_concept
  584. logger.info("current_concept = ".format(current_concept, ))
  585. for concept in concepts:
  586. logger.info("concept = {}".format(concept, ))
  587. if concept[0] == current_concept:
  588. logger.info("Entered if concept[0] == current_concept")
  589. index = concepts.index(concept)
  590. logger.info("index = {}".format(index, ))
  591. new_concept = concepts[index+1][0]
  592. logger.info("new_concept = {}".format(new_concept, ))
  593. return new_concept
  594. except:
  595. logger.info("Exception in get_next_concept: "+str(traceback.format_exc()))
  596.  
  597.  
  598. # To get Next State of user
  599. def get_next_state(user_state):
  600. logger.info("------Entered get_next_state------")
  601. logger.info("user_state = {}".format(user_state, ))
  602. try:
  603. search_filter = {}
  604. if user_state.state.name == 'SHOW_VIDEO':
  605. logger.info("if user_state.state.name == 'SHOW_VIDEO'")
  606. user_response = 'video_seen'
  607. logger.info("user_response = 'video_seen'")
  608. else:
  609. logger.info("Entered else")
  610. answer_status = user_state.question.answer_correct(user_state)
  611. logger.info("answer_status = {}".format(answer_status, ))
  612. user_response = 'right' if answer_status else 'wrong'
  613. logger.info("user_response = {}".format(user_response, ))
  614.  
  615. search_filter['initial_state'] = user_state.state
  616. logger.info("search_filter['initial_state'] = {}".format(search_filter['initial_state'], ))
  617. search_filter['user_response'] = user_response
  618. logger.info("search_filter['user_response'] = {}".format(search_filter['user_response'], ))
  619. search_filter['video_seen'] = user_state.video_seen
  620. logger.info("search_filter['video_seen'] = {}".format(search_filter['video_seen'], ))
  621. search_filter['iscomplex'] = user_state.iscomplex
  622. logger.info("search_filter['iscomplex'] = {}".format(search_filter['iscomplex'], ))
  623. search_filter['isbreakdown'] = user_state.isbreakdown
  624. logger.info("search_filter['isbreakdown'] = {}".format(search_filter['isbreakdown'], ))
  625. logger.info("search_filter to get next state: "+str(search_filter))
  626. user_response = user_state.question.answer_correct(user_state)
  627. logger.info("user_response = {}".format(user_response, ))
  628. transition_state = StateTransition.objects.filter(**search_filter).first()
  629. logger.info("transition_state = {}".format(transition_state, ))
  630. if transition_state:
  631. logger.info("Entered if transition_state")
  632. logger.info("Old state is {}, new state is {} CCT is for user {} ".format(user_state.state,\
  633. transition_state.final_state.name, transition_state.config_change_type, user_state.user.id))
  634. return transition_state.final_state, transition_state.config_change_type
  635. else:
  636. logger.info("Entered else")
  637. return None, None
  638. except:
  639. logger.info("Exception in get next state: "+str(traceback.format_exc()))
  640. return None, None
  641.  
  642. def get_subtopic_details(data, user):
  643. logger.info("------Entered get_subtopic_details------")
  644. logger.info("data = {}".format(data, ))
  645. logger.info("user = {}".format(user, ))
  646. detail_list = []
  647. try:
  648. topic = Topic.objects.get(pk=int(data['topic_id']))
  649. logger.info("topic = {}".format(topic, ))
  650. subtopics = Subtopic.objects.filter(topic=topic).order_by('id')
  651. logger.info("subtopics = {}".format(subtopics, ))
  652.  
  653. for subtopic in subtopics:
  654. logger.info("subtopic = {}".format(subtopic, ))
  655. user_state = UserState.objects.filter(user=user, subtopic=subtopic, topic=topic).first()
  656. logger.info("user_state = {}".format(user_state, ))
  657. if not user_state:
  658. logger.info("if not user_state")
  659. question_type = QuestionType.objects.filter(subtopic=subtopic).first()
  660. logger.info("question_type = {}".format(question_type, ))
  661. config_type = ConfigType.objects.filter(question_type=question_type).first()
  662. logger.info("config_type = {}".format(config_type, ))
  663. state = State.objects.filter(name='INIT').first()
  664. logger.info("state = {}".format(state, ))
  665. user_state, created = UserState.objects.get_or_create(subtopic=subtopic, state=state, user=user,\
  666. topic=topic, config_type=config_type, question_type=question_type)
  667. logger.info("user_state = {}".format(user_state, ))
  668. logger.info("created = {}".format(created, ))
  669.  
  670. detail_list.append(subtopic_json_details(user.id, user_state))
  671. logger.info("detail_list = {}".format(detail_list, ))
  672. logger.info("Response of Working with UI for state {} ".format(detail_list,))
  673. return detail_list, user_state.user_progress
  674. except:
  675. logger.info("Response of Working with UI for state {} ".format(detail_list,))
  676. return detail_list, user_state.user_progress
  677.  
  678. def subtopic_json_details(user_id, user_state):
  679. logger.info("------Entered subtopic_json_details------")
  680. logger.info("user_id = {}".format(user_id, ))
  681. logger.info("user_state = {}".format(user_state, ))
  682. subtopic_dict = {}
  683. try:
  684. subtopic_over = is_subtopics_over(user_state.subtopic, user_state)
  685. logger.info("subtopic_over = {}".format(subtopic_over, ))
  686. topic_over = is_topics_over(user_state.subtopic, user_state.user)
  687. logger.info("topic_over = {}".format(topic_over, ))
  688. video = Video.objects.filter(subtopic=user_state.subtopic).first()
  689. logger.info("video = {}".format(video, ))
  690. subtopic_dict['user_id'] = user_id
  691. logger.info("subtopic_dict['user_id'] = {}".format(subtopic_dict['user_id'], ))
  692. subtopic_dict["hint"] = user_state.hint
  693. #subtopic_dict["subtopic_over"] = subtopic_over
  694. #subtopic_dict["topic_over"] = topic_over
  695. subtopic_dict['video'] = video.media if video else None
  696. logger.info("subtopic_dict['video'] = ".format(subtopic_dict['video'], ))
  697. subtopic_dict['state'] = user_state.state.name
  698. logger.info("subtopic_dict['state'] = {}".format(subtopic_dict['state'], ))
  699. subtopic_dict['progress'] = user_state.user_progress
  700. logger.info("subtopic_dict['progress'] = {}".format(subtopic_dict['progress'], ))
  701. subtopic_dict['iscomplex'] = user_state.iscomplex
  702. logger.info("subtopic_dict['iscomplex'] = {}".format(subtopic_dict['iscomplex'], ))
  703. subtopic_dict['subtopic_id'] = user_state.subtopic.id
  704. logger.info("subtopic_dict['subtopic_id'] = {}".format(subtopic_dict['subtopic_id'], ))
  705. subtopic_dict['isbreakdown'] = user_state.isbreakdown
  706. logger.info("subtopic_dict['isbreakdown'] = ".format(subtopic_dict['isbreakdown'], ))
  707. subtopic_dict['concept'] = user_state.current_concept
  708. logger.info("subtopic_dict['concept'] = {}".format(subtopic_dict['concept'], ))
  709. subtopic_dict['config_type'] = user_state.config_type.id
  710. logger.info("subtopic_dict['config_type'] = {}".format(subtopic_dict['config_type'], ))
  711. subtopic_dict['topic_id'] = user_state.subtopic.topic.id
  712. logger.info("subtopic_dict['topic_id'] = {}".format(subtopic_dict['topic_id'], ))
  713. subtopic_dict['user_response'] = user_state.user_response
  714. logger.info("subtopic_dict['user_response'] = {}".format(subtopic_dict['user_response'], ))
  715. subtopic_dict['question_type'] = user_state.question_type.id
  716. logger.info("subtopic_dict['question_type'] = {}".format(subtopic_dict['question_type'], ))
  717. subtopic_dict['subtopic_name'] = user_state.subtopic.display_name
  718. logger.info("subtopic_dict['subtopic_name'] = {}".format(subtopic_dict['subtopic_name'], ))
  719. subtopic_dict['qid'] = user_state.question.id if user_state.question else None
  720. logger.info("subtopic_dict['qid'] = {}".format(subtopic_dict['qid'], ))
  721.  
  722. return subtopic_dict
  723. except:
  724. return subtopic_dict
  725.  
  726. def create_user_history(user_state, data, qtype=None):
  727. logger.info("------Entered create_user_history------")
  728. logger.info("user_state = {}".format(user_state, ))
  729. logger.info("data = {}".format(data, ))
  730. logger.info("qtype = {}".format(qtype, ))
  731. try:
  732. if qtype:
  733. logger.info("Entered if qtype")
  734. #hint = user_state.hint
  735. iscomplex = user_state.iscomplex
  736. logger.info("iscomplex = {}".format(iscomplex, ))
  737. isbreakdown = user_state.isbreakdown
  738. logger.info("isbreakdown = {}".format(isbreakdown, ))
  739. video_seen = user_state.video_seen
  740. logger.info("video_seen = {}".format(video_seen, ))
  741. user_response = user_state.user_response
  742. logger.info("user_response = {}".format(user_response, ))
  743. else:
  744. logger.info("Entered else")
  745. logger.info("data = {}".format(data, ))
  746. user_response = data['user_response']
  747. logger.info("user_response = {}".format(user_response, ))
  748. #hint = False if data['hint'] == 'false' else True
  749. iscomplex = False if data['complex'] == 'false' else True
  750. logger.info("iscomplex = {}".format(iscomplex, ))
  751. isbreakdown = False if data['breakdown'] == 'false' else True
  752. logger.info("isbreakdown = {}".format(isbreakdown, ))
  753. #video_seen = False if data['video_seen'] == 'false' else True
  754.  
  755. UserHistory.objects.create(user=user_state.user, topic=user_state.topic, subtopic=user_state.subtopic,\
  756. question=user_state.question, state=user_state.state, config_type=user_state.config_type,\
  757. question_type=user_state.question_type, current_concept=user_state.current_concept,\
  758. iscomplex=user_state.iscomplex, isbreakdown=isbreakdown,\
  759. topic_completed=user_state.topic_completed, video_seen=user_state.video_seen,\
  760. subtopic_completed=user_state.subtopic_completed, user_response=user_response,\
  761. user_progress=user_state.user_progress, doubt_click=user_state.doubt_click,\
  762. doubt_text=user_state.doubt_text, error_click=user_state.error_click,\
  763. error_text=user_state.error_text)
  764. logger.info("User history created for user {} ".format(user_state.user.id,))
  765. return True
  766. except:
  767. logger.info("Exception in create_user_history: "+str(traceback.format_exc()))
  768. return False
  769.  
  770. def user_response_handler(data, user):
  771. logger.info("------Entered user_response_handler------")
  772. logger.info("data = {}".format(data, ))
  773. logger.info("user = {}".format(user, ))
  774. try:
  775. subtopic = Subtopic.objects.get(pk=int(data['subtopic_id']))
  776. logger.info("subtopic = {}".format(subtopic, ))
  777.  
  778. user_state = current_user_state(user, subtopic)
  779. logger.info("user_state = {}".format(user_state, ))
  780.  
  781. #user_state.hint = False if data['hint'] == 'false' else True
  782. user_state.iscomplex = False if data['complex'] == 'false' else True
  783. logger.info("user_state.iscomplex = {}".format(user_state.iscomplex, ))
  784. user_state.isbreakdown = False if data['breakdown'] == 'false' else True
  785. logger.info("user_state.isbreakdown = {}".format(user_state.isbreakdown, ))
  786. #user_state.video_seen = False if data['video_seen'] == 'false' else True
  787. user_state.user_response = data['user_response']
  788. logger.info("user_state.user_response = {}".format(user_state.user_response, ))
  789.  
  790. user_state.save()
  791. logger.info("user_state = {}".format(user_state, ))
  792.  
  793. old_ques = Question.objects.get(pk=user_state.question.id)
  794. logger.info("old_ques = {}".format(old_ques, ))
  795. old_ques.isattempt=True
  796. logger.info("old_ques.isattempt = {}".format(old_ques.isattempt, ))
  797. old_ques.save()
  798. logger.info("old_ques = {}".format(old_ques, ))
  799.  
  800. create_user_history(user_state, data)
  801. if user_state.user_response is not None and user_state.user_response == 'not_interested':
  802. logger.info("Entered if user_state.user_response is not None and user_state.user_response == 'not_interested'")
  803. return "Could not solve."
  804. else:
  805. logger.info("Entered else")
  806. return user_state.question.answer_correct(user_state)
  807.  
  808. except Exception as e:
  809. logger.info("Exception in user_response_handler: "+str(traceback.format_exc()))
  810. return False
  811.  
  812. def doubt_error_hanlder(data, user):
  813. logger.info("------Entered doubt_error_hanlder------")
  814. try:
  815. subtopic = Subtopic.objects.get(pk=int(data['subtopic_id']))
  816. logger.info("subtopic = {}".format(subtopic, ))
  817. user_state = current_user_state(user, subtopic)
  818. logger.info("user_state = {}".format(user_state, ))
  819. click_type = data['type']
  820. logger.info("click_type = {}".format(click_type, ))
  821. clicked = False if data['clicked'] in ['false', False] else True
  822. logger.info("clicked = {}".format(clicked, ))
  823. if click_type == 'doubt':
  824. logger.info("Entered if click_type == 'doubt'")
  825. user_state.doubt_click = clicked
  826. logger.info("user_state.doubt_click = {}".format(user_state.doubt_click, ))
  827. user_state.doubt_text = data['text']
  828. logger.info("user_state.doubt_text = {}".format(user_state.doubt_text, ))
  829. user_state.save()
  830. logger.info("user_state = {}".format(user_state, ))
  831. create_user_history(user_state, data, qtype='history')
  832. return True, "successfully update"
  833. elif click_type == 'error':
  834. logger.info("Entered elif click_type == 'error'")
  835. user_state.error_click = clicked
  836. logger.info("user_state.error_click = {}".format(user_state.error_click, ))
  837. user_state.error_text = data['text']
  838. logger.info("user_state.error_text = {}".format(user_state.error_text, ))
  839. create_user_history(user_state, data, qtype='history')
  840. user_state.save()
  841. logger.info("user_state = {}".format(user_state, ))
  842. return True, "successfully update"
  843. else:
  844. logger.info("Entered else")
  845. return False, "Not Updated"
  846. except:
  847. logger.info("Exception in doubt_error_hanlder: "+str(traceback.format_exc()))
  848. return False, "Error"
  849.  
  850. def get_test_detail(topic_id, user, test_type):
  851. logger.info("------Entered get_test_detail------")
  852. logger.info("topic_id = {}".format(topic_id, ))
  853. logger.info("user = {}".format(user, ))
  854. logger.info("test_type = {}".format(test_type, ))
  855. try:
  856. if test_type not in ['paper', 'mock']:
  857. logger.info("Entered if test_type not in ['paper', 'mock']")
  858. return False, "failed"
  859. topic = Topic.objects.get(pk=topic_id)
  860. logger.info("topic = {}".format(topic, ))
  861. total_subtopics = Subtopic.objects.filter(topic_id=topic)
  862. logger.info("total_subtopics = {}".format(total_subtopics, ))
  863. completed = UserState.objects.filter(topic=topic, topic_completed=True)
  864. logger.info("completed = {}".format(completed, ))
  865. resp = True if len(total_subtopics) == len(completed) else False
  866. logger.info("resp = {}".format(resp, ))
  867. return resp, "success"
  868. except:
  869. logger.info("Exception in get_test_detail: "+str(traceback.format_exc()))
  870. return False, "failed"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement