Example #1
0
def jsubmit(question_id):

    hs = Historysession.get_current_history_session_by_user_id_quiz_id(current_user.id)
    session_id = hs.hsid

    current_app.logger.debug("jsubmit - " + str(question_id) + ", session_id - " + str(session_id))
    current_app.logger.debug("json in jsubmit - " + str(request.json))
    
    question = Question.get_active_question_by_id(question_id)

    if question:
        if current_user.id == question.user_id:
            schema = {
                    "type" : "object",
                    "properties" : {            
                        "id" : {"type" : "integer", "maxLength" : 8, "optional" : False},
                        "answers" : {"type": "array", "items": { "type" : "object", "properties": {
                                                                  "id" : {"type": "integer", "maxLength": 8, "optional": False},
                                                                  "value" : {"type" : "string", "enum" : ["T", "F", "N"], "optional" : False}
                                                                  }}, "maxItems" : 25, "optional" : True}
                        }
                    }

            v = Draft4Validator(schema)
            errors = sorted(v.iter_errors(request.json), key=lambda e: e.path)
            
            if len(errors) > 0:
                msg = u"Error in json format"
                current_app.logger.warning(msg)
                return jsonify({"status" : "ERROR", "message" : msg})
            else:            
                qid = request.json['id']
                received_answers = request.json['answers']

                correct = True
                for i in range(0, len(received_answers)):
                    item = received_answers[i]
                    aid = item['id']
                    value = item['value']

                    AnswerResult.add_answer_result(session_id, aid, question.revision_id, value)
        
                    correct = correct and (value == question.answers[i].correct)                    
                    
                    current_app.logger.debug("a# = " + str(i) + ", value = " + str(value) + ", answer = " + str(question.answers[i].correct) + ", correct = " + str(correct))

                QuestionResult.add_question_result(session_id, question.qid, question.revision_id, correct)
                db.session.commit()
                
                result = {'jstaus':'OK'}
                return jsonify(result)
        else:
            msg = auth_failure_message + u"submit this question"
            current_app.logger.warning(msg)
            return jsonify({"status" : "ERROR", "message" : msg})
    else:
        return jsonify({"status" : "ERROR"})
Example #2
0
def jget(question_id):
    current_app.logger.debug("jget - " + str(question_id))
    question = Question.get_active_question_by_id(question_id)
    if question:
        if current_user.id == question.user_id:
            result = {'jstaus':'OK'}
            result.update(question.serialize)
            current_app.logger.warning("jget result = " + str(result))
            return jsonify(result)
        else:
            msg = auth_failure_message + u"view this question"
            current_app.logger.warning(msg)
            return jsonify({"status" : "ERROR", "message" : msg})   
    else:
        msg = u"No such question found!"
        current_app.logger.warning(msg)
        return jsonify({"status" : "ERROR", "message" : msg})
Example #3
0
def jupd(question_id):
    current_app.logger.debug("question.jupd. - " + str(question_id))    
    
    question = Question.get_active_question_by_id(question_id)
    
    if question:
        if current_user.id == question.user_id:
            
            current_app.logger.warning(request.json)

            schema = {
                    "type" : "object",
                    "properties" : {            
                        "id" : {"type" : "integer", "maxLength" : 8, "optional" : False},
                        "quizid" : {"type" : "integer", "maxLength" : 8, "optional" : False},
                        "qtext" : {"type" : "string", "maxLength" : 4096, "optional" : False},
                        "answers" : {"type": "array", "items": { "type" : "object", "properties": {"id" : {"type" : "integer", "maxLength" : 8, "optional" : False},
                                                                  "correct" : {"type" : "string", "enum" : ["T", "F"], "optional" : False}
                                                                  }}, "maxItems" : 25, "optional" : True},
                        "lat" : {"type" : "number", "maxLength" : 12, "optional" : False},
                        "lon" : {"type" : "number", "maxLength" : 12, "optional" : False},
                        }
                    }
                
            v = Draft4Validator(schema)
            errors = sorted(v.iter_errors(request.json), key = lambda e: e.path)

            qid = request.json['id']
            qtext = request.json['qtext']
            answers = request.json['answers']
            latitude = request.json['lat']
            longitude = request.json['lon']

            if len(errors) == 0:
                #TODO - allow displaying unallowed tags as non html tags
                #scrubb = scrubber.Scrubber()                
                #qtext = jinja2.Markup(scrubb.scrub(qtext))
                
                current_app.logger.debug("got a question from DB, id = " + str(question_id))
                current_app.logger.debug("id = " + str(qid))
                current_app.logger.debug("qtext = '" + qtext + "'")
                current_app.logger.debug("answers = " + str(answers))
                current_app.logger.debug("latitude = " + str(latitude))
                current_app.logger.debug("longitude = " + str(longitude))

                results = QuestionResult.get_question_results_by_revision_id(question.revision_id)

                if len(results) > 0:
                    Question.update_question_by_id_and_create_revision(question_id, qtext, latitude, longitude)
                else:
                    Question.update_question_by_id(question_id, qtext, latitude, longitude)

                db.session.commit()

                current_app.logger.debug("Status - OK")
                
                result = {'staus':'OK'}
                return jsonify(result)
            else:
                if len(qtext) > 4096:
                    msg = u"Question text is too long. It must be less than 4096 symbols"
                    current_app.logger.warning(msg)
                    return jsonify({"status" : "ERROR", "message" : msg})
                elif len(answers) > 25:
                    msg = u"Number of answers must not be greater than 25"
                    current_app.logger.warning(msg)
                    return jsonify({"status" : "ERROR", "message" : msg})                    
                else:
                    msg = u"Error : "
                    for e in errors:
                        msg = msg + str(list(e.path)[len(list(e.path))-1]) + " - " + e.message.decode("UTF-8")
    
                    current_app.logger.warning(msg)
                    return jsonify({"status" : "ERROR", "message" : msg})
        else:
            msg = auth_failure_message + u"update this question"
            current_app.logger.warning(msg)
            return jsonify({"status" : "ERROR", "message" : msg})            
    else:
        msg = u"No such question found!"
        current_app.logger.warning(msg)
        return jsonify({"status" : "ERROR", "message" : msg})
Example #4
0
def question_edit(question_id):
    question = Question.get_active_question_by_id(question_id)
    if question:
        return render_template('question_edit.html', question = question)
    else:
        return render_template('404.html')