human
Complete this python program:
def assign_rating_to_exploration(user_id, exploration_id, new_rating):
assistant
#Here is the Python program you requested.

    """Records the rating awarded by the user to the exploration in both the
    user-specific data and exploration summary.
    This function validates the exploration id but not the user id.
    Args:
    user_id: str. The id of the user assigning the rating.
    exploration_id: str. The id of the exploration that is
    assigned a rating.
    new_rating: int. Value of assigned rating, should be between
    1 and 5 inclusive.
    """
    if (not isinstance(new_rating, int)):
        raise ValueError(('Expected    the    rating    to    be    an    integer,    received    %s' % new_rating))
    if (new_rating not in ALLOWED_RATINGS):
        raise ValueError(('Expected    a    rating    1-5,    received    %s.' % new_rating))
    try:
        exp_services.get_exploration_by_id(exploration_id)
    except:
        raise Exception(('Invalid    exploration    id    %s' % exploration_id))
    def _update_user_rating():
        exp_user_data_model = user_models.ExplorationUserDataModel.get(user_id, exploration_id)
        if exp_user_data_model:
            old_rating = exp_user_data_model.rating
        else:
            old_rating = None
            exp_user_data_model = user_models.ExplorationUserDataModel.create(user_id, exploration_id)
        exp_user_data_model.rating = new_rating
        exp_user_data_model.rated_on = datetime.datetime.utcnow()
        exp_user_data_model.put()
        return old_rating
    old_rating = transaction_services.run_in_transaction(_update_user_rating)
    exploration_summary = exp_services.get_exploration_summary_by_id(exploration_id)
    if (not exploration_summary.ratings):
        exploration_summary.ratings = feconf.get_empty_ratings()
    exploration_summary.ratings[str(new_rating)] += 1
    if old_rating:
        exploration_summary.ratings[str(old_rating)] -= 1
    event_services.RateExplorationEventHandler.record(exploration_id, user_id, new_rating, old_rating)
    exploration_summary.scaled_average_rating = exp_services.get_scaled_average_rating(exploration_summary.ratings)
    exp_services.save_exploration_summary(exploration_summary)