Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from django.shortcuts import render
- from .models import UserState, StateTransition, QuestionType, ConfigType
- from django.db.models import Q
- from .models import *
- from django.views.decorators.csrf import csrf_exempt, csrf_protect
- from rest_framework.decorators import api_view, permission_classes,\
- authentication_classes, renderer_classes
- from rest_framework.renderers import JSONRenderer
- from django.http import JsonResponse
- from rest_framework import status
- from tutor.constants import *
- from .parse_chaining import parse_prolog_output
- from .utils import call_prolog
- import json
- import logging
- import traceback
- logger = logging.getLogger('api')
- def current_user_state(user, subtopic):
- logger.info("------Entered current_user_state------")
- logger.info("user = {}".format(user, ))
- logger.info("subtopic = {}".format(subtopic, ))
- user_state = UserState.objects.filter(user = user, subtopic = subtopic).first()
- logger.info("user states from db - {}".format(UserState.objects.filter(user = user, subtopic = subtopic), ))
- logger.ingo("user_state = {}".format(user_state, ))
- if user_state:
- return user_state
- else:
- return None
- def subtopic_selection_handler(data, user):
- logger.info("------Entered subtopic_selection_handler------")
- logger.info("data = {}".format(data, ))
- logger.info("user = {}".format(user, ))
- try:
- video = {}
- subtopic = Subtopic.objects.get(pk=int(data['subtopic_id']))
- logger.info("subtopic = {}".format(subtopic, ))
- user_state = current_user_state(user, subtopic)
- logger.info("user_state = {}".format(user_state, ))
- state = user_state.state.name
- logger.info("state = {}".format(state, ))
- if state == 'SHOW_VIDEO': # to display video
- logger.info("state == SHOW_VIDEO")
- video_obj = Video.objects.filter(subtopic=subtopic).first()
- logger.info("video_obj = {}".format(video_obj, ))
- if video_obj:
- video = video_obj.media
- logger.info("video = {}".format(video, ))
- return {}, video
- if state in COMPLETED_STATES:
- logger.info("Working with UI for state {} ".format(state,))
- return {}, video
- elif state in ['INIT', 'POOR', 'COMPLETED']:
- logger.info("state = {}".format(state, ))
- process_pid = prolog_process(user_state, 'new', user_state.question_type, user_state.config_type)
- logger.info("process_pid = {}".format(process_pid, ))
- question, resp = get_question_for_user(user_state, subtopic)
- logger.info("question = {}".format(question, ))
- logger.info("resp = {}".format(resp, ))
- concept = get_next_concept(user_state, question)
- logger.info("concept = {}".format(concept, ))
- update_user_state_for_initial(user_state, question, concept)
- logger.info("user_state = {}".format(user_state, ))
- resp["concepts_used"] = concept
- logger.info("resp = {}", resp)
- return resp, video, user_state.user_progress
- elif state == 'BROKEN_DOWN_POOR':
- logger.info("state == BROKEN_DOWN_POOR")
- process_pid = prolog_process(user_state, 'similar', user_state.question_type, user_state.config_type)
- logger.info("process_pid = {}".format(process_pid, ))
- question, resp = get_question_for_user(user_state, subtopic)
- logger.info("question = {}".format(question, ))
- logger.info("resp = {}".format(resp, ))
- concept = get_next_concept(user_state, question)
- logger.info("concept = {}".format(concept, ))
- update_user_state_for_initial(user_state, question, concept)
- logger.info("user_state = {}".format(user_state, ))
- else:
- logger.info("Entered else")
- user_question = user_state.question
- logger.info("user_question = {}".format(user_question, ))
- resp = user_question.question_json(user_state)
- logger.info("resp = {}".format(resp, ))
- resp["concepts_used"] = user_state.current_concept
- logger.info("resp = {}".format(resp, ))
- return resp, video, user_state.user_progress
- except:
- logger.info("Exception in subtopic selection: "+str(traceback.format_exc()))
- def update_user_state_for_initial(user_state, question, concept):
- logger.info("------Entered update_user_state_for_initial------")
- state = State.objects.filter(name ='NEW').first()
- logger.info("state = {}".format(state, ))
- user_state.question = question
- logger.info("user_state.question = {}".format(user_state.question, ))
- user_state.current_concept = concept
- logger.info("user_state.current_concept = {}".format(user_state.current_concept, ))
- user_state.state = state
- logger.info("user_state.state = {}".format(user_state.state, ))
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- return user_state
- def get_question_for_user(user_state, subtopic):
- logger.info("------Entered get_question_for_user------")
- logger.info("user_state = {}".format(user_state, ))
- logger.info("subtopic = {}".format(subtopic, ))
- try:
- questions = Question.objects.filter(subtopic=subtopic, user=user_state.user, isattempt=False)
- logger.info("questions = {}".format(questions, ))
- for ques in questions:
- logger.info("ques = {}".format(ques, ))
- if user_state.config_type.prolog_identifier in eval(ques.config_type) and\
- user_state.question_type.prolog_identifier in eval(ques.question_type):
- logger.info("Entered if")
- logger.info("Question for user is: {}".format(ques.id))
- resp = ques.question_json(user_state)
- logger.info("resp = {}".format(resp, ))
- return ques, resp
- except:
- logger.info("Exception in get user question: "+str(traceback.format_exc()))
- def prolog_process(user_state, query_state, question_type, config_type):
- logger.info("------Entered prolog_process------")
- try:
- logger.info("Process Prolog method for state{} ".format(user_state.state.name,))
- output_file = str(user_state.user.id)+'_'+str(user_state.subtopic.prolog_identifier)+'_output_file.txt'
- logger.info("output_file = {}".format(output_file, ))
- # Working code for prolog
- call_prolog(user_state.user, user_state.topic.prolog_identifier,\
- user_state.subtopic.prolog_identifier, question_type.prolog_identifier,\
- config_type.prolog_identifier, query_state, output_file)
- logger.info("Going to reading file {} ".format(output_file,))
- #parse_prolog_output(output_file, user_state.subtopic) # TODO change to output file
- parse_prolog_output('read_file.txt', user_state.subtopic, user_state.user.id) # Sample File
- logger.info("Going to reading file ")
- except:
- logger.info("Exception in prolog_process: "+str(traceback.format_exc()))
- def user_action_hanlder(data, user):
- logger.info("------Entered user_action_hanlder------")
- try:
- video = {}
- subtopic = Subtopic.objects.get(pk=int(data['subtopic_id']))
- logger.info("subtopic = {}".format(subtopic, ))
- user_state = current_user_state(user, subtopic)
- logger.info("user_state = {}".format(user_state, ))
- subtopic_over = is_subtopics_over(subtopic, user_state)
- logger.info("user_action_hanlder - subtopic_over = {}".format(subtopic_over, ))
- topic_over = is_topics_over(subtopic, user_state.user)
- logger.info("topic_over = {}".format(topic_over, ))
- breakdown_over = is_breakdown_over(subtopic, user_state)
- logger.info("breakdown_over = {}".format(breakdown_over, ))
- if subtopic_over:
- logger.info("Entered if subtopic_over")
- user_state.state = State.objects.filter(name='COMPLETED').first()
- logger.info("user_state.state = {}".format(user_state.state, ))
- subtopic.subtopic_completed = True
- logger.info("subtopic.subtopic_completed = True")
- if topic_over:
- logger.info("Entered if topic_over")
- user_state.topic_completed = True
- logger.info("user_state.topic_completed = True")
- logger.info("user_state = {}".format(user_state, ))
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- create_user_history(user_state, data, 'completed')
- return {}, "UI Completed", user_state.state.name
- new_state, query_action = get_next_state(user_state)
- logger.info("new_state = {}".format(new_state, ))
- logger.info("query_action = {}".format(query_action, ))
- if new_state.name == 'BROKEN_DOWN_POOR':
- logger.info("new_state.name == BROKEN_DOWN_POOR")
- subtopic = QuestionType.objects.filter(prolog_identifier=user_state.question_type)
- logger.info("subtopic = {}".format(subtopic, ))
- new_subtopic_userstate = UserState.objects.filtet(subtopic = subtopic).first()
- logger.info("new_subtopic_userstate = {}".format(new_subtopic_userstate, ))
- if new_subtopic_userstate.id == user_state.id:
- logger.info("Entered if new_subtopic_userstate.id == user_state.id")
- user_state_new.question = user_state.breakdown_ques
- logger.info("user_state_new.question = {}".format(user_state_new.question, ))
- user_state_new.breakdown_ques = None
- logger.format("user_state_new.breakdown_ques = None")
- user_state_new.config_type = user_state.breakdown_ques.user_ct
- logger.format("user_state_new.config_type = {}".format(user_state_new.config_type, ))
- user_state_new.question_type = user_state.breakdown_ques.user_qt
- logger.format("user_state_new.question_type = {}".format(user_state_new.question_type, ))
- user_state.breakdown_ques = None
- logger.info("user_state.breakdown_ques = None")
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- user_state_new.save()
- logger.info("user_state_new = {}".format(user_state_new, ))
- create_user_history(user_state_new, data)
- else:
- logger.info("Entered else")
- state = State.objects.get(name='POOR')
- logger.info("state = {}".format(state, ))
- user_state.state = state
- logger.info("user_state.state = ".format(user_state.state, ))
- user_state.video_seen = False
- logger.info("user_state.video_seen = False")
- user_state.breakdown_ques = None
- logger.info("user_state.breakdown_ques = None")
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- create_user_history(user_state, data)
- return {}, {}, new_state.name
- elif new_state.name in COMPLETED_STATES:
- logger.info("Entered elif new_state.name in COMPLETED_STATES")
- logger.info("Working with UI for state {} ".format(new_state,))
- video_obj = Video.objects.filter(subtopic=subtopic).first()
- logger.info(" video_obj = {}".format(video_obj, ))
- if video_obj:
- logger.info("Entered if video_obj")
- video = video_obj.media
- logger.info("video = {}".format(video, ))
- user_state.video = video_obj
- logger.info("user_state.video = {}".format(user_state.video, ))
- user_state.state = new_state
- logger.info("user_state.state = {}".format(user_state.state, ))
- user_state.doubt_click = False
- logger.info("user_state.doubt_click = False")
- user_state.doubt_text = None
- logger.info("user_state.doubt_text = None")
- user_state.error_click = False
- logger.info("user_state.error_click = False")
- user_state.error_text = None
- logger.info("user_state.error_text = None")
- create_user_history(user_state, data)
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- return {}, video, new_state.name
- elif new_state.name in ['POOR', 'COMPLETED']:
- logger.info("Entered elif new_state.name in ['POOR', 'COMPLETED']")
- user_state.video = None
- logger.info("user_state.video = None")
- user_state.state = new_state
- logger.info("user_state.state = {}".format(user_state.state, ))
- user_state.video_seen = False
- logger.info("user_state.video_seen = False")
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- create_user_history(user_state, data)
- return {}, {}, new_state.name
- query_string = get_prolog_query_string(new_state) # to get new or similar
- logger.info("query_string = {}".format(query_string, ))
- qt, ct = get_config_values(query_action, user_state)
- logger.info("qt = {}".format(qt, ))
- logger.info("ct = {}".format(ct, ))
- question, resp = get_next_question(user_state, new_state, qt, ct, query_string)
- logger.info("question = {}".format(question, ))
- logger.info("resp = {}".format(resp, ))
- concept = get_next_concept(user_state, question)
- logger.info("concept = {}".format(concept, ))
- user_state = update_user_state(data, user_state, new_state, question,\
- concept, qt, ct, topic_over, subtopic_over)
- logger.info("user_state = {}".format(user_state, ))
- return resp, user_state.video_seen, user_state.state.name
- except:
- logger.info("Exception in action handler: "+str(traceback.format_exc()))
- return None, None, None
- def video_handler(data, user):
- logger.info("------Entered video_handler------")
- logger.info("data = {}".format(data, ))
- logger.info("user = {}".format(user, ))
- try:
- video = {}
- subtopic = Subtopic.objects.get(pk=int(data['subtopic_id']))
- logger.info("subtopic = {}".format(subtopic, ))
- user_state = current_user_state(user, subtopic)
- logger.info("user_state = {}".format(user_state, ))
- state = State.objects.filter(name='SHOW_VIDEO').first()
- logger.info("state = {}".format(state, ))
- user_state.state = state
- logger.info("user_state.state = {}".format(user_state.state, ))
- user_state.video_seen = False if data['video_seen'] == 'false' else True
- logger.info("user_state.video_seen = {}".format(user_state.video_seen, ))
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- created = create_user_history(user_state, data, 'video')
- logger.info("created = {}".format(created, ))
- new_state, query_action = get_next_state(user_state)
- logger.info("new_state = {}".format(new_state, ))
- logger.info("query_action = {}".format(query_action, ))
- if new_state.name in ['COMPLETED']:
- logger.info("Entered if new_state.name in ['COMPLETED']")
- logger.info("Working with UI for state {} ".format(new_state,))
- video_obj = Video.objects.filter(subtopic=subtopic).first()
- logger.info("video_obj = {}".format(video_obj, ))
- if video_obj:
- logger.info("Entered if video_obj")
- video = video_obj.media
- logger.info("video = {}".format(video, ))
- return {}, video, new_state.name
- query_string = get_prolog_query_string(new_state) # to get new or similar
- logger.info("query_string = {}".format(query_string, ))
- qt, ct = get_config_values(query_action, user_state)
- logger.info("qt = {}".format(qt, ))
- logger.info("ct = {}".format(ct, ))
- question, resp = get_next_question(user_state, new_state, qt, ct, query_string)
- logger.format("question = {}".format(question, ))
- logger.format("resp = {}".format(resp, ))
- concept = get_next_concept(user_state, question)
- logger.info("concept = {}".format(concept, ))
- user_state = update_user_state(data, user_state, new_state, question, concept, qt, ct)
- logger.info("user_state = {}".format(user_state, ))
- return resp, user_state.video_seen, user_state.state.name
- except:
- logger.info("Exception in action handler: "+str(traceback.format_exc()))
- return None, None, None
- def get_prolog_query_string(new_state):
- logger.info("------Entered get_prolog_query_string------")
- try:
- if new_state.name in PROLOG_NEW_STATE:
- logger.info("Entered if new_state.name in PROLOG_NEW_STATE")
- return 'new'
- elif new_state.name in PROLOG_SIMILAR_STATE:
- logger.info("Entered elif new_state.name in PROLOG_SIMILAR_STATE")
- return 'similar'
- else:
- logger.info("Entered else")
- return 'new'
- except:
- logger.info("Exception in get_prolog_query_string: "+str(traceback.format_exc()))
- return 'new'
- def get_config_values(query_action, user_state):
- logger.info("------Entered get_config_values------")
- logger.info("query_action = {}".format(query_action, ))
- logger.info("user_state = {}".format(user_state, ))
- if query_action.name in CONFIG_CHANGE_TYPE:
- logger.info("Entered if query_action.name in CONFIG_CHANGE_TYPE")
- if user_state.iscomplex:
- logger.info("Entered if user_state.iscomplex")
- config_type = user_state.breakdown_ques.user_ct
- logger.info("config_type = {}".format(config_type, ))
- question_type = user_state.breakdown_ques.user_qt
- logger.info("question_type = {}".format(question_type, ))
- else:
- logger.info("Entered else")
- config_type = user_state.config_type
- logger.info("config_type = {}".format(config_type, ))
- question_type = user_state.question_type
- logger.info("question_type = {}".format(question_type, ))
- user_state.video_seen = False
- logger.info("user_state.video_seen = False")
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- config_list = list(ConfigType.objects.filter(question_type=question_type))
- logger.info("config_list = {}".format(config_list, ))
- try:
- ct_index = config_list.index(config_type)
- logger.info("ct_index = {}".format(ct_index, ))
- next_ct = config_list[ct_index+1]
- logger.info("next_ct = {}".format(next_ct, ))
- return user_state.question_type, next_ct
- except:
- qt_list = list(QuestionType.objects.filter(subtopic=user_state.subtopic))
- logger.info("qt_list = {}".format(qt_list, ))
- try:
- qt_index = qt_list.index(question_type)
- logger.info("qt_index = {}".format(qt_index, ))
- next_qt = qt_list[qt_index+1]
- logger.info("next_qt = {}".format(next_qt, ))
- ct = ConfigType.objects.filter(question_type=next_qt).first()
- logger.info("ct = {}".format(ct, ))
- return next_qt, ct
- except:
- logger.info("Exception in get configs: "+str(traceback.format_exc()))
- return None, None
- elif query_action.name == 'CT_BROKEN_DOWN_QUESTION':
- logger.info("Entered elif query_action.name == 'CT_BROKEN_DOWN_QUESTION'")
- breakdown_ques = user_state.breakdown_ques
- logger.info("breakdown_ques = {}".format(breakdown_ques, ))
- concepts = eval(breakdown_ques.concepts_used)
- logger.info("concepts = {}".format(concepts, ))
- indx = index(user_state.question.current_concept)
- logger.info("indx = {}".format(indx, ))
- new_qid = concepts[indx+1][0]
- logger.info("new_qid = {}".format(new_qid, ))
- new_question = Question.objects.get(pk=int(new_qid))
- logger.info("new_question = {}".format(new_question, ))
- return new_question.config_type[0], new_question.question_type[0]
- else:
- logger.info("Entered else")
- return user_state.question_type, user_state.config_type
- def get_next_question(user_state, new_state, question_type, config_type, query_string):
- logger.info("------Entered get_next_question------")
- logger.info("user_state = {}".format(user_state, ))
- logger.info("new_state = {}".format(new_state, ))
- logger.info("question_type = {}".format(question_type, ))
- logger.info("config_type = {}".format(config_type, ))
- logger.info("query_string = {}".format(query_string, ))
- if user_state.iscomplex:
- logger.info("Entered if user_state.iscomplex")
- if new_state.name == 'BROKEN_DOWN_QUESTION':
- logger.info("Entered if new_state.name == 'BROKEN_DOWN_QUESTION'")
- breakdown_ques = user_state.breakdown_ques
- logger.info("breakdown_ques = {}".format(breakdown_ques, ))
- concepts = eval(breakdown_ques.concepts_used)
- logger.info("concepts = {}".format(concepts, ))
- new_qid = concepts[0][1]
- logger.info("new_qid = {}".format(new_qid, ))
- new_question = Question.objects.get(pk=int(new_qid))
- logger.info("new_question = {}".format(new_question, ))
- resp = new_question.question_json(user_state)
- logger.info("resp = {}".format(resp, ))
- return new_question, resp
- elif new_state.name == 'NEXT_BROKEN_DOWN_QUESTION':
- logger.format("Entered elif new_state.name == 'NEXT_BROKEN_DOWN_QUESTION'")
- process_id = prolog_process(user_state, query_string, question_type, config_type)
- logger.info("process_id = {}".format(process_id, ))
- question, resp = get_question_for_user(user_state, user_state.subtopic)
- logger.info("question = {}".format(question, ))
- logger.info("resp = {}".format(resp, ))
- return question, resp
- else:
- logger.info("Entered else")
- process_id = prolog_process(user_state, query_string, question_type, config_type)
- logger.info("process_id = {}".format(process_id, ))
- question, resp = get_question_for_user(user_state, user_state.subtopic)
- logger.info("question = {}".format(question, ))
- logger.info("resp = {}".format(resp, ))
- return question, resp
- def update_user_state(data, user_state, new_state, question, concept,\
- qt, ct, topic_over=False, subtopic_over=False):
- logger.info("------Entered update_user_state------")
- logger.info("data = {}".format(data, ))
- logger.info("user_state = {}".format(user_state, ))
- logger.info("new_state = {}".format(new_state, ))
- logger.info("question = {}".format(question, ))
- logger.info("concept = {}".format(concept, ))
- logger.info("qt = {}".format(qt, ))
- logger.info("ct = {}".format(ct, ))
- logger.info("topic_over = {}".format(topic_over, ))
- logger.info("subtopic_over = {}".format(subtopic_over, ))
- try:
- breakdown = is_breakdown_over(user_state.subtopic, user_state)
- logger.info("breakdown = {}".format(breakdown, ))
- if breakdown and new_state.state == 'NEXT_BROKEN_DOWN_QUESTION':
- logger.info("if breakdown and new_state.state == 'NEXT_BROKEN_DOWN_QUESTION':")
- user_state.breakdown_ques = None
- logger.info("user_state.breakdown_ques = None")
- user_state.video_seen = False
- logger.info("user_state.video_seen = False")
- user_state.state = new_state
- logger.info("user_state.state = {}".format(user_state.state, ))
- user_state.question = question
- logger.info("user_state.question = {}".format(user_state.question, ))
- user_state.config_type = ct
- logger.info("user_state.config_type = {}".format(user_state.config_type, ))
- user_state.question_type = qt
- logger.info("user_state.question_type = {}".format(user_state.question_type, ))
- user_state.topic_over = topic_over
- logger.info("user_state.topic_over = {}".format(user_state.topic_over, ))
- user_state.subtopic_over = subtopic_over
- logger.info("user_state.subtopic_over = {}".format(user_state.subtopic_over, ))
- user_state.concept = concept
- logger.info("user_state.concept = {}".format(user_state.concept, ))
- user_state.state = new_state
- logger.info("user_state.state = {}".format(user_state.state, ))
- user_state.doubt_click = False
- logger.info("user_state.doubt_click = False")
- user_state.doubt_text = None
- logger.info("user_state.doubt_text = None")
- user_state.error_click = False
- logger.info("user_state.error_click = False")
- user_state.error_text = None
- logger.info("user_state.error_text = None")
- if question.qid == -1:
- logger.info("Entered if question.qid == -1")
- user_state.breakdown_ques = question
- logger.info("user_state.breakdown_ques = {}".format(user_state.breakdown_ques, ))
- user_state.iscomplex = True
- logger.info("user_state.iscomplex = True")
- question.user_ct = ct
- logger.info("question.user_ct = {}".format(question.user_ct, ))
- question.user_qt = qt
- logger.info("question.user_qt = {}".format(question.user_qt, ))
- question.save()
- logger.info("question = {}".format(question, ))
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- return user_state
- except:
- logger.info("Exception in update user state: "+str(traceback.format_exc()))
- def is_breakdown_over(subtopic, user_state):
- logger.info("------Entered is_breakdown_over------")
- logger.info("subtopic = {}".format(subtopic, ))
- logger.info("user_state = {}".format(user_state, ))
- try:
- breakdown_ques = user_state.breakdown_ques
- logger.info("breakdown_ques = {}".format(breakdown_ques, ))
- if not breakdown_ques:
- logger.info("Entered if not breakdown_ques")
- return False
- concepts = eval(breakdown_ques.concepts_used)
- logger.info("concepts = {}".format(concepts, ))
- current_concept = user_state.current_concept
- logger.info("current_concept = {}".format(current_concept, ))
- for concept in concepts:
- logger.info("concept = {}".format(concept, )
- if concept[0] == current_concept:
- logger.info("Entered if concept[0] == current_concept")
- index = concepts.index(concept)
- logger.info("index = {}".format(index, ))
- new_concept = concepts[index+1][0]
- logger.info("new_concept = {}".format(new_concept, ))
- return False
- except:
- logger.info("Exception in is_breakdown_over: "+str(traceback.format_exc()))
- return True
- def is_subtopics_over(subtopic, user_state):
- logger.info("------Entered is_subtopics_over------")
- logger.info("subtopic = {}".format(subtopic, ))
- logger.info("user_state = {}".format(user_state, ))
- try:
- if user_state.iscomplex:
- logger.info("Entered if user_state.iscomplex")
- breakdown_over = is_breakdown_over(subtopic, user_state)
- logger.info("breakdown_over = {}".format(breakdown_over, ))
- if not breakdown_over:
- logger.format("Entered if not breakdown_over")
- return False
- last_qt = QuestionType.objects.filter(subtopic=subtopic).last()
- logger.info("last_qt = {}".format(last_qt, ))
- last_ct = ConfigType.objects.filter(question_type = last_qt).last()
- logger.info("last_ct = {}".format(last_ct, ))
- 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
- except:
- logger.info("Exception in is_subtopics_over: "+str(traceback.format_exc()))
- def is_topics_over(subtopic, user):
- logger.info("------Entered is_topics_over------")
- logger.info("subtopic = {}".format(subtopic, ))
- logger.info("user = {}".format(user, ))
- try:
- subtopics = Subtopic.objects.filter(topic=subtopic.topic)
- logger.info("subtopics = {}".format(subtopics, ))
- userstates = UserState.objects.filter(user_id=user.id, subtopic__topic=subtopic.topic, state__name='COMPLETED')
- logger.info("userstates = {}".format(userstates, ))
- return True if len(subtopics) == len(userstates) else False
- except:
- logger.info("Exception in is_topics_over: "+str(traceback.format_exc()))
- def get_next_concept(user_state, question):
- logger.info("------Entered get_next_concept------")
- logger.info("user_state = {}".format(user_state, ))
- logger.info("question = {}".format(question, ))
- try:
- concepts = eval(question.concepts_used)
- logger.info("concepts = {}".format(concepts, ))
- if len(concepts) == 1:
- logger.info("Entered if len(concepts) == 1")
- return concepts[0][0]
- else:
- logger.info("Entered else")
- current_concept = user_state.current_concept
- logger.info("current_concept = ".format(current_concept, ))
- for concept in concepts:
- logger.info("concept = {}".format(concept, ))
- if concept[0] == current_concept:
- logger.info("Entered if concept[0] == current_concept")
- index = concepts.index(concept)
- logger.info("index = {}".format(index, ))
- new_concept = concepts[index+1][0]
- logger.info("new_concept = {}".format(new_concept, ))
- return new_concept
- except:
- logger.info("Exception in get_next_concept: "+str(traceback.format_exc()))
- # To get Next State of user
- def get_next_state(user_state):
- logger.info("------Entered get_next_state------")
- logger.info("user_state = {}".format(user_state, ))
- try:
- search_filter = {}
- if user_state.state.name == 'SHOW_VIDEO':
- logger.info("if user_state.state.name == 'SHOW_VIDEO'")
- user_response = 'video_seen'
- logger.info("user_response = 'video_seen'")
- else:
- logger.info("Entered else")
- answer_status = user_state.question.answer_correct(user_state)
- logger.info("answer_status = {}".format(answer_status, ))
- user_response = 'right' if answer_status else 'wrong'
- logger.info("user_response = {}".format(user_response, ))
- search_filter['initial_state'] = user_state.state
- logger.info("search_filter['initial_state'] = {}".format(search_filter['initial_state'], ))
- search_filter['user_response'] = user_response
- logger.info("search_filter['user_response'] = {}".format(search_filter['user_response'], ))
- search_filter['video_seen'] = user_state.video_seen
- logger.info("search_filter['video_seen'] = {}".format(search_filter['video_seen'], ))
- search_filter['iscomplex'] = user_state.iscomplex
- logger.info("search_filter['iscomplex'] = {}".format(search_filter['iscomplex'], ))
- search_filter['isbreakdown'] = user_state.isbreakdown
- logger.info("search_filter['isbreakdown'] = {}".format(search_filter['isbreakdown'], ))
- logger.info("search_filter to get next state: "+str(search_filter))
- user_response = user_state.question.answer_correct(user_state)
- logger.info("user_response = {}".format(user_response, ))
- transition_state = StateTransition.objects.filter(**search_filter).first()
- logger.info("transition_state = {}".format(transition_state, ))
- if transition_state:
- logger.info("Entered if transition_state")
- logger.info("Old state is {}, new state is {} CCT is for user {} ".format(user_state.state,\
- transition_state.final_state.name, transition_state.config_change_type, user_state.user.id))
- return transition_state.final_state, transition_state.config_change_type
- else:
- logger.info("Entered else")
- return None, None
- except:
- logger.info("Exception in get next state: "+str(traceback.format_exc()))
- return None, None
- def get_subtopic_details(data, user):
- logger.info("------Entered get_subtopic_details------")
- logger.info("data = {}".format(data, ))
- logger.info("user = {}".format(user, ))
- detail_list = []
- try:
- topic = Topic.objects.get(pk=int(data['topic_id']))
- logger.info("topic = {}".format(topic, ))
- subtopics = Subtopic.objects.filter(topic=topic).order_by('id')
- logger.info("subtopics = {}".format(subtopics, ))
- for subtopic in subtopics:
- logger.info("subtopic = {}".format(subtopic, ))
- user_state = UserState.objects.filter(user=user, subtopic=subtopic, topic=topic).first()
- logger.info("user_state = {}".format(user_state, ))
- if not user_state:
- logger.info("if not user_state")
- question_type = QuestionType.objects.filter(subtopic=subtopic).first()
- logger.info("question_type = {}".format(question_type, ))
- config_type = ConfigType.objects.filter(question_type=question_type).first()
- logger.info("config_type = {}".format(config_type, ))
- state = State.objects.filter(name='INIT').first()
- logger.info("state = {}".format(state, ))
- user_state, created = UserState.objects.get_or_create(subtopic=subtopic, state=state, user=user,\
- topic=topic, config_type=config_type, question_type=question_type)
- logger.info("user_state = {}".format(user_state, ))
- logger.info("created = {}".format(created, ))
- detail_list.append(subtopic_json_details(user.id, user_state))
- logger.info("detail_list = {}".format(detail_list, ))
- logger.info("Response of Working with UI for state {} ".format(detail_list,))
- return detail_list, user_state.user_progress
- except:
- logger.info("Response of Working with UI for state {} ".format(detail_list,))
- return detail_list, user_state.user_progress
- def subtopic_json_details(user_id, user_state):
- logger.info("------Entered subtopic_json_details------")
- logger.info("user_id = {}".format(user_id, ))
- logger.info("user_state = {}".format(user_state, ))
- subtopic_dict = {}
- try:
- subtopic_over = is_subtopics_over(user_state.subtopic, user_state)
- logger.info("subtopic_over = {}".format(subtopic_over, ))
- topic_over = is_topics_over(user_state.subtopic, user_state.user)
- logger.info("topic_over = {}".format(topic_over, ))
- video = Video.objects.filter(subtopic=user_state.subtopic).first()
- logger.info("video = {}".format(video, ))
- subtopic_dict['user_id'] = user_id
- logger.info("subtopic_dict['user_id'] = {}".format(subtopic_dict['user_id'], ))
- subtopic_dict["hint"] = user_state.hint
- #subtopic_dict["subtopic_over"] = subtopic_over
- #subtopic_dict["topic_over"] = topic_over
- subtopic_dict['video'] = video.media if video else None
- logger.info("subtopic_dict['video'] = ".format(subtopic_dict['video'], ))
- subtopic_dict['state'] = user_state.state.name
- logger.info("subtopic_dict['state'] = {}".format(subtopic_dict['state'], ))
- subtopic_dict['progress'] = user_state.user_progress
- logger.info("subtopic_dict['progress'] = {}".format(subtopic_dict['progress'], ))
- subtopic_dict['iscomplex'] = user_state.iscomplex
- logger.info("subtopic_dict['iscomplex'] = {}".format(subtopic_dict['iscomplex'], ))
- subtopic_dict['subtopic_id'] = user_state.subtopic.id
- logger.info("subtopic_dict['subtopic_id'] = {}".format(subtopic_dict['subtopic_id'], ))
- subtopic_dict['isbreakdown'] = user_state.isbreakdown
- logger.info("subtopic_dict['isbreakdown'] = ".format(subtopic_dict['isbreakdown'], ))
- subtopic_dict['concept'] = user_state.current_concept
- logger.info("subtopic_dict['concept'] = {}".format(subtopic_dict['concept'], ))
- subtopic_dict['config_type'] = user_state.config_type.id
- logger.info("subtopic_dict['config_type'] = {}".format(subtopic_dict['config_type'], ))
- subtopic_dict['topic_id'] = user_state.subtopic.topic.id
- logger.info("subtopic_dict['topic_id'] = {}".format(subtopic_dict['topic_id'], ))
- subtopic_dict['user_response'] = user_state.user_response
- logger.info("subtopic_dict['user_response'] = {}".format(subtopic_dict['user_response'], ))
- subtopic_dict['question_type'] = user_state.question_type.id
- logger.info("subtopic_dict['question_type'] = {}".format(subtopic_dict['question_type'], ))
- subtopic_dict['subtopic_name'] = user_state.subtopic.display_name
- logger.info("subtopic_dict['subtopic_name'] = {}".format(subtopic_dict['subtopic_name'], ))
- subtopic_dict['qid'] = user_state.question.id if user_state.question else None
- logger.info("subtopic_dict['qid'] = {}".format(subtopic_dict['qid'], ))
- return subtopic_dict
- except:
- return subtopic_dict
- def create_user_history(user_state, data, qtype=None):
- logger.info("------Entered create_user_history------")
- logger.info("user_state = {}".format(user_state, ))
- logger.info("data = {}".format(data, ))
- logger.info("qtype = {}".format(qtype, ))
- try:
- if qtype:
- logger.info("Entered if qtype")
- #hint = user_state.hint
- iscomplex = user_state.iscomplex
- logger.info("iscomplex = {}".format(iscomplex, ))
- isbreakdown = user_state.isbreakdown
- logger.info("isbreakdown = {}".format(isbreakdown, ))
- video_seen = user_state.video_seen
- logger.info("video_seen = {}".format(video_seen, ))
- user_response = user_state.user_response
- logger.info("user_response = {}".format(user_response, ))
- else:
- logger.info("Entered else")
- logger.info("data = {}".format(data, ))
- user_response = data['user_response']
- logger.info("user_response = {}".format(user_response, ))
- #hint = False if data['hint'] == 'false' else True
- iscomplex = False if data['complex'] == 'false' else True
- logger.info("iscomplex = {}".format(iscomplex, ))
- isbreakdown = False if data['breakdown'] == 'false' else True
- logger.info("isbreakdown = {}".format(isbreakdown, ))
- #video_seen = False if data['video_seen'] == 'false' else True
- UserHistory.objects.create(user=user_state.user, topic=user_state.topic, subtopic=user_state.subtopic,\
- question=user_state.question, state=user_state.state, config_type=user_state.config_type,\
- question_type=user_state.question_type, current_concept=user_state.current_concept,\
- iscomplex=user_state.iscomplex, isbreakdown=isbreakdown,\
- topic_completed=user_state.topic_completed, video_seen=user_state.video_seen,\
- subtopic_completed=user_state.subtopic_completed, user_response=user_response,\
- user_progress=user_state.user_progress, doubt_click=user_state.doubt_click,\
- doubt_text=user_state.doubt_text, error_click=user_state.error_click,\
- error_text=user_state.error_text)
- logger.info("User history created for user {} ".format(user_state.user.id,))
- return True
- except:
- logger.info("Exception in create_user_history: "+str(traceback.format_exc()))
- return False
- def user_response_handler(data, user):
- logger.info("------Entered user_response_handler------")
- logger.info("data = {}".format(data, ))
- logger.info("user = {}".format(user, ))
- try:
- subtopic = Subtopic.objects.get(pk=int(data['subtopic_id']))
- logger.info("subtopic = {}".format(subtopic, ))
- user_state = current_user_state(user, subtopic)
- logger.info("user_state = {}".format(user_state, ))
- #user_state.hint = False if data['hint'] == 'false' else True
- user_state.iscomplex = False if data['complex'] == 'false' else True
- logger.info("user_state.iscomplex = {}".format(user_state.iscomplex, ))
- user_state.isbreakdown = False if data['breakdown'] == 'false' else True
- logger.info("user_state.isbreakdown = {}".format(user_state.isbreakdown, ))
- #user_state.video_seen = False if data['video_seen'] == 'false' else True
- user_state.user_response = data['user_response']
- logger.info("user_state.user_response = {}".format(user_state.user_response, ))
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- old_ques = Question.objects.get(pk=user_state.question.id)
- logger.info("old_ques = {}".format(old_ques, ))
- old_ques.isattempt=True
- logger.info("old_ques.isattempt = {}".format(old_ques.isattempt, ))
- old_ques.save()
- logger.info("old_ques = {}".format(old_ques, ))
- create_user_history(user_state, data)
- if user_state.user_response is not None and user_state.user_response == 'not_interested':
- logger.info("Entered if user_state.user_response is not None and user_state.user_response == 'not_interested'")
- return "Could not solve."
- else:
- logger.info("Entered else")
- return user_state.question.answer_correct(user_state)
- except Exception as e:
- logger.info("Exception in user_response_handler: "+str(traceback.format_exc()))
- return False
- def doubt_error_hanlder(data, user):
- logger.info("------Entered doubt_error_hanlder------")
- try:
- subtopic = Subtopic.objects.get(pk=int(data['subtopic_id']))
- logger.info("subtopic = {}".format(subtopic, ))
- user_state = current_user_state(user, subtopic)
- logger.info("user_state = {}".format(user_state, ))
- click_type = data['type']
- logger.info("click_type = {}".format(click_type, ))
- clicked = False if data['clicked'] in ['false', False] else True
- logger.info("clicked = {}".format(clicked, ))
- if click_type == 'doubt':
- logger.info("Entered if click_type == 'doubt'")
- user_state.doubt_click = clicked
- logger.info("user_state.doubt_click = {}".format(user_state.doubt_click, ))
- user_state.doubt_text = data['text']
- logger.info("user_state.doubt_text = {}".format(user_state.doubt_text, ))
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- create_user_history(user_state, data, qtype='history')
- return True, "successfully update"
- elif click_type == 'error':
- logger.info("Entered elif click_type == 'error'")
- user_state.error_click = clicked
- logger.info("user_state.error_click = {}".format(user_state.error_click, ))
- user_state.error_text = data['text']
- logger.info("user_state.error_text = {}".format(user_state.error_text, ))
- create_user_history(user_state, data, qtype='history')
- user_state.save()
- logger.info("user_state = {}".format(user_state, ))
- return True, "successfully update"
- else:
- logger.info("Entered else")
- return False, "Not Updated"
- except:
- logger.info("Exception in doubt_error_hanlder: "+str(traceback.format_exc()))
- return False, "Error"
- def get_test_detail(topic_id, user, test_type):
- logger.info("------Entered get_test_detail------")
- logger.info("topic_id = {}".format(topic_id, ))
- logger.info("user = {}".format(user, ))
- logger.info("test_type = {}".format(test_type, ))
- try:
- if test_type not in ['paper', 'mock']:
- logger.info("Entered if test_type not in ['paper', 'mock']")
- return False, "failed"
- topic = Topic.objects.get(pk=topic_id)
- logger.info("topic = {}".format(topic, ))
- total_subtopics = Subtopic.objects.filter(topic_id=topic)
- logger.info("total_subtopics = {}".format(total_subtopics, ))
- completed = UserState.objects.filter(topic=topic, topic_completed=True)
- logger.info("completed = {}".format(completed, ))
- resp = True if len(total_subtopics) == len(completed) else False
- logger.info("resp = {}".format(resp, ))
- return resp, "success"
- except:
- logger.info("Exception in get_test_detail: "+str(traceback.format_exc()))
- return False, "failed"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement