Esempio n. 1
0
def suggest_question():
    access_token = session.get("access_token", None)
    if g.user is None or access_token is None:
        abort(404)

    url = request.args.get("question", None)
    if (url is None):
        return jsonify(**{"status": False, "msg": gettext("Wrong params")})

    unquoted = urllib.unquote(url)
    parsed = urlparse(unquoted)

    if parsed.hostname != STACKOVERFLOW_HOSTNAME:
        return jsonify(
            **{
                "status":
                False,
                "msg":
                gettext("Question should be on hostname: %s") %
                STACKOVERFLOW_HOSTNAME
            })

    question_id = -1
    try:
        question_id = int(re.findall('\d+', parsed.path)[0])
    except:
        return jsonify(
            **{
                "status":
                False,
                "msg":
                gettext("Cannot parse question_id. Path: %s, re: %s") %
                (parsed.path, re.findall('\d+', parsed.path))
            })

    if question_id < 0:
        return jsonify(
            **{
                "status": True,
                "msg": gettext("Not valid question_id: %s") %
                (str(question_id))
            })

    url = STACKEXCHANGE_QUESTION_API_ENDPOINT.replace("{id}", str(question_id))
    params = {
        "access_token": access_token,
        "key": STACKEXCHANGE_CLIENT_KEY,
        "site": STACKOVERFLOW_SITE_PARAM,
        "order": "desc",
        "sort": "votes",
    }
    r = requests.get(url, data=params)
    data = json.loads(r.text)

    if data.get("items", None) is None:
        return jsonify(**{
            "status": False,
            "msg": gettext("There are no items: %s") % r.text
        })

    view_count = 0
    q_id = 0
    for item in data["items"]:
        if item.get("view_count", None) is not None:
            view_count = item["view_count"]
        if item.get("question_id", None) is not None:
            q_id = int(item["question_id"])

    if question_id != q_id:
        return jsonify(
            **{
                "status":
                False,
                "msg":
                gettext("Question ids are different: %s != %s, text:  %s") %
                (str(question_id), str(q_id), r.text)
            })

    pg_session = db_session()
    suggested_question_count = pg_session.query(func.count(
        Question.id)).filter(
            and_(Question.question_id == question_id, Question.question_type ==
                 Question.question_type_suggested)).scalar()
    if suggested_question_count > 0:
        return jsonify(
            **{
                "status": False,
                "msg": gettext("The suggestion is already existed in the list")
            })

    question = Question(Question.question_type_suggested,
                        question_id,
                        view_count,
                        suggested_user_id=g.user.id)

    pg_session.add(question)
    pg_session.commit()

    association = pg_session.query(func.count(
        Association.id)).filter(Association.soen_id == question_id).scalar()
    if association > 0:
        question.is_associated = True
        pg_session.commit()
        pg_session.close()
        return jsonify(
            **{
                "status":
                False,
                "msg":
                gettext(
                    "Suggestion was added but the association for it is already existed."
                )
            })

    pg_session.close()

    return jsonify(**{"status": True, "msg": gettext("Suggestion was added")})