def get_task_status(task_id):
        get_user_cookie(True)

        task = process_audio_stats.AsyncResult(task_id)
        if not task:
            raise NotFoundError()

        response = {"state": task.state, "result": {}}

        if task.state == "PENDING":
            response["current"] = 0
            response["total"] = 100
            response["status"] = "pending"
        elif task.state != "FAILURE":
            response["current"] = task.info.get("current", 0)
            response["total"] = task.info.get("total", 100)
            response["status"] = task.info.get("status", "")

            if "result" in task.info:
                response["result"] = task.info["result"]
        else:
            response["current"] = 100
            response["total"] = 100
            response["status"] = str(task.info)

        return response, 200
Exemple #2
0
    def get_results_user():
        user_id = get_user_cookie()
        if not user_id:
            raise ForbiddenError()

        user_questions = get_questions_for_user(user_id)
        if not user_questions:
            raise NotFoundError()

        aggd = []
        for q in user_questions:
            stats = q["stats"]
            aggd.append(stats)

        num_pauses = 0
        wpm = 0
        for each in aggd:
            num_pauses += int(each["number_of_pauses"])
            wpm += int(each["words_per_min"])

        return {
            "results": {
                "words_per_minute": {
                    "total": wpm,
                    "avg": wpm / len(aggd)
                },
                "number_of_pauses": {
                    "total": num_pauses,
                    "avg": num_pauses / len(aggd),
                },
            },
        }
Exemple #3
0
    def get_user_questions():
        """
        GET /api/questions
        Fetch questions for the current user if cookie is found, else return a 404
        """
        user_id = get_user_cookie(True)

        questions = get_questions_for_user(user_id)
        if not questions:
            raise NotFoundError()

        return {"questions": questions}, 200
Exemple #4
0
    def submit_answer(question_id):
        """
        1. Extract webm audio file and convert to wav file
        2. Upload to a the users folder in cloud storage with name as question id
        """
        user_id = get_user_cookie(True)

        # Extract file and sanity check
        webm_file = request.files["audio"]
        if webm_file.filename.split(".")[1] != "webm":
            raise BadRequestError()

        blob_name = question_id
        gcs_file_path = f"{user_id}/{blob_name}{WEBM_EXT}"
        local_file_path = f"{TMP_DIR}/{blob_name}"
        webm_file_path = f"{local_file_path}{WEBM_EXT}"

        app.logger.info("Saving answer .webm for question[%s] by user[%s]",
                        question_id, user_id)
        webm_file.save(webm_file_path)

        # upload to bucket
        app.logger.info(
            "Uploading answer .webm for question[%s] by user[%s] to %s",
            question_id,
            user_id,
            get_blob_url(GCS_BUCKET, gcs_file_path),
        )
        upload_file(GCS_BUCKET, gcs_file_path, webm_file_path)

        # add file path to question doc in db
        question = add_answer(question_id, gcs_file_path)

        # Trigger task and obtain task id
        process_task = process_audio_stats.delay(question["answer"])
        task_id = process_task.id
        app.logger.info("Triggered processing stats task[%s]", task_id)

        # cleanup webm and wav file in temp directory
        delete_local_file(webm_file_path)
        # delete_local_file(wav_file_path)
        app.logger.info(
            "Cleaned up temp answer files for question[%s] by user[%s]",
            question_id,
            user_id,
        )

        return {
            "question": question,
            "task_id": task_id,
            "poll_url": url_for("get_task_status", task_id=task_id),
        }, 201
Exemple #5
0
    def get_results_question(question_id):
        user_id = get_user_cookie(True)

        question = get_question_by_id(question_id)
        if not question:
            raise NotFoundError()

        if question["user_id"] != user_id:
            app.logger.warning(
                "Revoked unauthorized access to question[%s] by user[%s]",
                question_id,
                user_id,
            )
            raise ForbiddenError()
        return {"result": question["stats"]}, 200
Exemple #6
0
    def get_question(question_id):
        """
        GET /api/questions/<question_id>
        Fetch information about a specific question matching question_id, else return a 404
        """
        user_id = get_user_cookie(True)

        question = get_question_by_id(question_id)
        if not question:
            raise NotFoundError()

        if question["user_id"] != user_id:
            app.logger.warning(
                "Revoked unauthorized access to question[%s] by user[%s]",
                question_id,
                user_id,
            )
            raise ForbiddenError()

        return {"question": question}, 200
Exemple #7
0
    def save_questions():
        """
        POST /api/questions

        Submit up to five questions at a time. Identifies user via cookie
        in the request else creates new user id and sends cookie in response
        """
        user_id = get_user_cookie()
        if not user_id:
            user_id = create_new_user()
            app.logger.info("Created new user[%s]", user_id)
            after_this_request(set_user_cookie(user_id))

        body = request.get_json(force=True)
        questions = body["questions"]
        questions = list(
            map(lambda desc: create_question(desc, user_id), questions))
        question_ids = bulk_create_questions(questions)

        app.logger.info("Created questions%s for user[%s]", str(question_ids),
                        user_id)

        return {"questions": question_ids}, 201