Ejemplo n.º 1
0
    def test_get(self):
        vote.submit(self.user_1.id, self.review["last_revision"]["id"], True)
        vote_1_data = vote.get(self.user_1.id,
                               self.review["last_revision"]["id"])
        rated_at = vote_1_data.pop("rated_at")
        self.assertDictEqual(
            vote_1_data, {
                "user_id": UUID(self.user_1.id),
                "revision_id": self.review["last_revision"]["id"],
                "vote": True,
            })
        self.assertEqual(type(vote_1_data["user_id"]), UUID)
        self.assertEqual(type(vote_1_data["revision_id"]), int)
        self.assertEqual(type(rated_at), datetime)

        vote.submit(self.user_2.id, self.review["last_revision"]["id"], False)
        vote_2_data = vote.get(self.user_2.id,
                               self.review["last_revision"]["id"])
        vote_2_data.pop("rated_at")
        self.assertDictEqual(
            vote_2_data, {
                "user_id": UUID(self.user_2.id),
                "revision_id": self.review["last_revision"]["id"],
                "vote": False,
            })
Ejemplo n.º 2
0
def review_vote_delete_handler(review_id, user):
    """Delete your vote for a specified review.

    **OAuth scope:** vote

    **Request Example:**

    .. code-block:: bash

        $ curl "https://critiquebrainz.org/ws/1/review/9cb11424-d070-4ac1-8771-a8703ae5cccd/vote" \\
               -X DELETE \\
               -H "Authorization: Bearer <access token>"

    **Response Example:**

    .. code-block:: json

        {
          "message": "Request processed successfully"
        }

    :resheader Content-Type: *application/json*
    """
    review = get_review_or_404(review_id)
    if review["is_hidden"]:
        raise NotFound("Review has been hidden.")
    try:
        vote = db_vote.get(user_id=user.id,
                           revision_id=review["last_revision"]["id"])
    except db_exceptions.NoDataFoundException:
        raise InvalidRequest("Review is not rated yet.")
    db_vote.delete(user_id=vote["user_id"], revision_id=vote["revision_id"])
    return jsonify(message="Request processed successfully")
Ejemplo n.º 3
0
def review_vote_entity_handler(review_id, user):
    """Get your vote for a specified review.

    **Request Example:**

    .. code-block:: bash

        $ curl "https://critiquebrainz.org/ws/1/review/9cb11424-d070-4ac1-8771-a8703ae5cccd/vote" \\
               -X GET \\
               -H "Authorization: Bearer <access token>"

    **Response Example:**

    .. code-block:: json

            {
              "vote": {
                "vote": true,
                "voted_at": "Thu, 22 Dec 2016 11:49:56 GMT"
              }
            }

    **OAuth scope:** vote

    :resheader Content-Type: *application/json*
    """
    review = get_review_or_404(review_id)
    if review["is_hidden"]:
        raise NotFound("Review has been hidden.")
    try:
        vote = db_vote.get(user_id=user.id,
                           revision_id=review["last_revision"]["id"])
    except db_exceptions.NoDataFoundException:
        raise NotFound("Can't find your vote for this review.")
    return jsonify(vote)
Ejemplo n.º 4
0
def entity(id, rev=None):
    review = get_review_or_404(id)
    # Not showing review if it isn't published yet and not viewed by author.
    if review["is_draft"] and not (current_user.is_authenticated
                                   and current_user == review["user"]):
        raise NotFound(gettext("Can't find a review with the specified ID."))
    if review["is_hidden"]:
        if not current_user.is_admin():
            raise Forbidden(
                gettext("Review has been hidden. "
                        "You need to be an administrator to view it."))
        else:
            flash.warn(gettext("Review has been hidden."))

    spotify_mappings = None
    soundcloud_url = None
    if review["entity_type"] == 'release_group':
        spotify_mappings = mbspotify.mappings(str(review["entity_id"]))
        soundcloud_url = soundcloud.get_url(str(review["entity_id"]))
    count = db_revision.get_count(id)
    if not rev:
        rev = count
    if rev < count:
        flash.info(
            gettext(
                'You are viewing an old revision, the review has been updated since then.'
            ))
    elif rev > count:
        raise NotFound(
            gettext("The revision you are looking for does not exist."))

    revision = db_revision.get(id, offset=count - rev)[0]
    if not review[
            "is_draft"] and current_user.is_authenticated:  # if user is logged in, get their vote for this review
        try:
            vote = db_vote.get(user_id=current_user.id,
                               revision_id=revision['id'])
        except db_exceptions.NoDataFoundException:
            vote = None
    else:  # otherwise set vote to None, its value will not be used
        vote = None
    if revision["text"] is None:
        review["text_html"] = None
    else:
        review["text_html"] = markdown(revision['text'], safe_mode="escape")

    user_all_reviews, review_count = db_review.list_reviews(  # pylint: disable=unused-variable
        user_id=review["user_id"],
        sort="random",
        exclude=[review["id"]],
    )
    other_reviews = user_all_reviews[:3]
    avg_rating = get_avg_rating(review["entity_id"], review["entity_type"])
    return render_template('review/entity/%s.html' % review["entity_type"],
                           review=review,
                           spotify_mappings=spotify_mappings,
                           soundcloud_url=soundcloud_url,
                           vote=vote,
                           other_reviews=other_reviews,
                           avg_rating=avg_rating)
Ejemplo n.º 5
0
def review_vote_delete_handler(review_id, user):
    """Delete your vote for a specified review.

    **OAuth scope:** vote

    **Request Example:**

    .. code-block:: bash

        $ curl "https://critiquebrainz.org/ws/1/review/9cb11424-d070-4ac1-8771-a8703ae5cccd/vote" \\
               -X DELETE \\
               -H "Authorization: Bearer <access token>"

    **Response Example:**

    .. code-block:: json

        {
          "message": "Request processed successfully"
        }

    :resheader Content-Type: *application/json*
    """
    review = get_review_or_404(review_id)
    if review["is_hidden"]:
        raise NotFound("Review has been hidden.")
    try:
        vote = db_vote.get(user_id=user.id, revision_id=review["last_revision"]["id"])
    except db_exceptions.NoDataFoundException:
        raise InvalidRequest("Review is not rated yet.")
    db_vote.delete(user_id=vote["user_id"], revision_id=vote["revision_id"])
    return jsonify(message="Request processed successfully")
Ejemplo n.º 6
0
def review_vote_entity_handler(review_id, user):
    """Get your vote for a specified review.

    **Request Example:**

    .. code-block:: bash

        $ curl "https://critiquebrainz.org/ws/1/review/9cb11424-d070-4ac1-8771-a8703ae5cccd/vote" \\
               -X GET \\
               -H "Authorization: Bearer <access token>"

    **Response Example:**

    .. code-block:: json

            {
              "vote": {
                "vote": true,
                "voted_at": "Thu, 22 Dec 2016 11:49:56 GMT"
              }
            }

    **OAuth scope:** vote

    :resheader Content-Type: *application/json*
    """
    review = get_review_or_404(review_id)
    if review["is_hidden"]:
        raise NotFound("Review has been hidden.")
    try:
        vote = db_vote.get(user_id=user.id, revision_id=review["last_revision"]["id"])
    except db_exceptions.NoDataFoundException:
        raise NotFound("Can't find your vote for this review.")
    return jsonify(vote)
Ejemplo n.º 7
0
def vote_delete(id):
    review = get_review_or_404(id)
    if review["is_hidden"] and not current_user.is_admin():
        raise NotFound(gettext("Review has been hidden."))
    try:
        vote = db_vote.get(user_id=current_user.id, revision_id=review["last_revision"]["id"])
        flash.success(gettext("You have deleted your vote for this review!"))
        db_vote.delete(user_id=vote["user_id"], revision_id=vote["revision_id"])
    except db_exceptions.NoDataFoundException:
        flash.error(gettext("This review is not rated yet."))
    return redirect(url_for('.entity', id=id))
Ejemplo n.º 8
0
    def test_get(self):
        vote.submit(self.user_1.id, self.review["last_revision"]["id"], True)
        vote_1_data = vote.get(self.user_1.id, self.review["last_revision"]["id"])
        rated_at = vote_1_data.pop("rated_at")
        self.assertDictEqual(vote_1_data, {
            "user_id": UUID(self.user_1.id),
            "revision_id": self.review["last_revision"]["id"],
            "vote": True,
        })
        self.assertEqual(type(vote_1_data["user_id"]), UUID)
        self.assertEqual(type(vote_1_data["revision_id"]), int)
        self.assertEqual(type(rated_at), datetime)

        vote.submit(self.user_2.id, self.review["last_revision"]["id"], False)
        vote_2_data = vote.get(self.user_2.id, self.review["last_revision"]["id"])
        vote_2_data.pop("rated_at")
        self.assertDictEqual(vote_2_data, {
            "user_id": UUID(self.user_2.id),
            "revision_id": self.review["last_revision"]["id"],
            "vote": False,
        })
Ejemplo n.º 9
0
    def test_get(self):
        vote_1 = Vote.create(self.user_1, self.review, True)
        vote_1_data = vote.get(self.user_1.id, self.review.last_revision.id)
        self.assertDictEqual(
            vote_1_data, {
                "user_id": UUID(vote_1.user_id),
                "revision_id": vote_1.revision_id,
                "vote": True,
                "rated_at": vote_1.rated_at
            })
        self.assertEqual(type(vote_1_data["user_id"]), UUID)
        self.assertEqual(type(vote_1_data["revision_id"]), int)
        self.assertEqual(type(vote_1_data["rated_at"]), datetime)

        vote_2 = Vote.create(self.user_2, self.review, False)
        vote_2_data = vote.get(self.user_2.id, self.review.last_revision.id)
        self.assertDictEqual(
            vote_2_data, {
                "user_id": UUID(vote_2.user_id),
                "revision_id": vote_2.revision_id,
                "vote": False,
                "rated_at": vote_2.rated_at
            })
Ejemplo n.º 10
0
def entity(id, rev=None):
    review = Review.query.get_or_404(str(id))
    # Not showing review if it isn't published yet and not viewed by author.
    if review.is_draft and not (current_user.is_authenticated
                                and current_user == review.user):
        raise NotFound(gettext("Can't find a review with the specified ID."))
    if review.is_hidden:
        if not current_user.is_admin():
            raise Forbidden(
                gettext("Review has been hidden. "
                        "You need to be an administrator to view it."))
        else:
            flash.warn(gettext("Review has been hidden."))

    spotify_mappings = None
    soundcloud_url = None
    if review.entity_type == 'release_group':
        spotify_mappings = mbspotify.mappings(review.entity_id)
        soundcloud_url = soundcloud.get_url(review.entity_id)

    revisions = Revision.query.filter_by(review=review).order_by(
        desc(Revision.timestamp))
    count = revisions.count()
    if not rev:
        rev = count
    if rev < count:
        flash.info(
            gettext(
                'You are viewing an old revision, the review has been updated since then.'
            ))
    elif rev > count:
        raise NotFound(
            gettext("The revision you are looking for does not exist."))

    revision = revisions.offset(count - rev).first()
    if not review.is_draft and current_user.is_authenticated:  # if user is logged in, get their vote for this review
        try:
            vote = db_vote.get(user_id=current_user.id,
                               revision_id=revision.id)
        except db_exceptions.NoDataFoundException:
            vote = None
    else:  # otherwise set vote to None, its value will not be used
        vote = None
    review.text_html = markdown(revision.text, safe_mode="escape")
    return render_template('review/entity/%s.html' % review.entity_type,
                           review=review,
                           spotify_mappings=spotify_mappings,
                           soundcloud_url=soundcloud_url,
                           vote=vote)
Ejemplo n.º 11
0
 def test_get_missing(self):
     with self.assertRaises(exceptions.NoDataFoundException):
         vote.get(self.user_1.id, self.review.last_revision.id)
Ejemplo n.º 12
0
 def test_get_missing(self):
     with self.assertRaises(exceptions.NoDataFoundException):
         vote.get(self.user_1.id, self.review["last_revision"]["id"])