def create(review_id, text=None, rating=None): """Creates a new revision for the given review. Args: review_id (uuid): ID of the review. text (str): Updated/New text part of the review. rating (int): Updated/New rating part of the review """ if text is None and rating is None: raise db_exceptions.BadDataException("Text part and rating part of a revision can not be None simultaneously") if rating not in VALID_RATING_VALUES: raise ValueError("{} is not a valid rating value. It must be on the scale 1-5".format(rating)) # Convert ratings to values on a scale 0-100 rating = RATING_SCALE_0_100.get(rating) with db.engine.connect() as connection: connection.execute(sqlalchemy.text(""" INSERT INTO revision(review_id, timestamp, text, rating) VALUES (:review_id, :timestamp, :text, :rating) """), { "review_id": review_id, "timestamp": datetime.now(), "text": text, "rating": rating, }) # Update average rating if rating part of the review has changed review = db_review.get_by_id(review_id) rev_num = get_revision_number(review["id"], review["last_revision"]["id"]) if rev_num > 1: revisions = get(review["id"], limit=2, offset=0) if revisions[0]["rating"] != revisions[1]["rating"]: db_avg_rating.update(review["entity_id"], review["entity_type"]) elif rating is not None: db_avg_rating.update(review["entity_id"], review["entity_type"])
def update_rating(review_id): # Update average rating if rating part of the review has changed review = db_review.get_by_id(review_id) rev_num = get_revision_number(review["id"], review["last_revision"]["id"]) if rev_num > 1: revisions = get(review["id"], limit=2, offset=0) if revisions[0]["rating"] != revisions[1]["rating"]: db_avg_rating.update(review["entity_id"], review["entity_type"]) else: db_avg_rating.update(review["entity_id"], review["entity_type"])
def delete(review_id): """Delete a review. Args: review_id: ID of the review to be deleted. """ review = get_by_id(review_id) with db.engine.connect() as connection: connection.execute(sqlalchemy.text(""" DELETE FROM review WHERE id = :review_id """), { "review_id": review_id, }) if review["rating"] is not None: db_avg_rating.update(review["entity_id"], review["entity_type"])
def set_hidden_state(review_id, *, is_hidden): """Hide or reveal a review. Args: review_id (uuid): ID of the review the state of which needs to be changed. is_hidden (bool): True if review has to be hidden, False if not. """ review = get_by_id(review_id) with db.engine.connect() as connection: connection.execute(sqlalchemy.text(""" UPDATE review SET is_hidden = :is_hidden WHERE id = :review_id """), { "review_id": review_id, "is_hidden": is_hidden, }) # update the average rating if review["rating"] is not None: db_avg_rating.update(review["entity_id"], review["entity_type"])