def accept_suggestion(suggestion, reviewer_id, commit_message, review_message): """Accepts the given suggestion after validating it. Args: suggestion: Suggestion. The suggestion to be accepted. reviewer_id: str. The ID of the reviewer accepting the suggestion. commit_message: str. The commit message. review_message: str. The message provided by the reviewer while accepting the suggestion. Raises: Exception. The suggestion is already handled. Exception. The suggestion is not valid. Exception. The commit message is empty. """ if suggestion.is_handled: raise Exception( 'The suggestion with id %s has already been accepted/rejected.' % (suggestion.suggestion_id)) if not commit_message or not commit_message.strip(): raise Exception('Commit message cannot be empty.') suggestion.pre_accept_validate() html_string = ''.join(suggestion.get_all_html_content_strings()) error_list = ( html_validation_service. validate_math_tags_in_html_with_attribute_math_content(html_string)) if len(error_list) > 0: raise Exception( 'Invalid math tags found in the suggestion with id %s.' % (suggestion.suggestion_id)) author_name = user_services.get_username(suggestion.author_id) commit_message = get_commit_message_for_suggestion(author_name, commit_message) mark_review_completed(suggestion, suggestion_models.STATUS_ACCEPTED, reviewer_id) suggestion.accept(commit_message) thread_id = suggestion.suggestion_id feedback_services.create_message(thread_id, reviewer_id, feedback_models.STATUS_CHOICES_FIXED, None, review_message) if feconf.ENABLE_RECORDING_OF_SCORES: increment_score_for_user( suggestion.author_id, suggestion.score_category, suggestion_models.INCREMENT_SCORE_OF_AUTHOR_BY) if feconf.SEND_SUGGESTION_REVIEW_RELATED_EMAILS: scores = get_all_scores_of_user(suggestion.author_id) if (suggestion.score_category in scores and scores[suggestion.score_category] >= feconf.MINIMUM_SCORE_REQUIRED_TO_REVIEW): if not check_if_email_has_been_sent_to_user( suggestion.author_id, suggestion.score_category): email_manager.send_mail_to_onboard_new_reviewers( suggestion.author_id, suggestion.score_category) mark_email_has_been_sent_to_user(suggestion.author_id, suggestion.score_category)
def accept_suggestion(suggestion, reviewer_id, commit_message, review_message): """Accepts the given suggestion after validating it. Args: suggestion: Suggestion. The suggestion to be accepted. reviewer_id: str. The ID of the reviewer accepting the suggestion. commit_message: str. The commit message. review_message: str. The message provided by the reviewer while accepting the suggestion. Raises: Exception: The suggestion is already handled. Exception: The suggestion is not valid. Exception: The commit message is empty. """ if suggestion.is_handled: raise Exception('The suggestion has already been accepted/rejected.') if not commit_message or not commit_message.strip(): raise Exception('Commit message cannot be empty.') suggestion.pre_accept_validate() author_name = user_services.get_username(suggestion.author_id) commit_message = get_commit_message_for_suggestion( author_name, commit_message) mark_review_completed( suggestion, suggestion_models.STATUS_ACCEPTED, reviewer_id) suggestion.accept(commit_message) thread_id = suggestion.suggestion_id if not constants.ENABLE_GENERALIZED_FEEDBACK_THREADS: thread_id = thread_id[thread_id.find('.') + 1:] feedback_services.create_message( thread_id, reviewer_id, feedback_models.STATUS_CHOICES_FIXED, None, review_message) if feconf.ENABLE_RECORDING_OF_SCORES: increment_score_for_user( suggestion.author_id, suggestion.score_category, suggestion_models.INCREMENT_SCORE_OF_AUTHOR_BY) if feconf.SEND_SUGGESTION_REVIEW_RELATED_EMAILS: scores = get_all_scores_of_user(suggestion.author_id) if ( suggestion.score_category in scores and scores[suggestion.score_category] >= feconf.MINIMUM_SCORE_REQUIRED_TO_REVIEW): if check_if_email_has_been_sent_to_user( suggestion.author_id, suggestion.score_category): email_manager.send_mail_to_onboard_new_reviewers( suggestion.author_id, suggestion.score_category) mark_email_has_been_sent_to_user( suggestion.author_id, suggestion.score_category)
def accept_suggestion(suggestion_id, reviewer_id, commit_message, review_message): """Accepts the suggestion with the given suggestion_id after validating it. Args: suggestion_id: str. The id of the suggestion to be accepted. reviewer_id: str. The ID of the reviewer accepting the suggestion. commit_message: str. The commit message. review_message: str. The message provided by the reviewer while accepting the suggestion. Raises: Exception. The suggestion is already handled. Exception. The suggestion is not valid. Exception. The commit message is empty. """ if not commit_message or not commit_message.strip(): raise Exception('Commit message cannot be empty.') suggestion = get_suggestion_by_id(suggestion_id) if suggestion is None: raise Exception( 'You cannot accept the suggestion with id %s because it does ' 'not exist.' % (suggestion_id)) if suggestion.is_handled: raise Exception('The suggestion with id %s has already been accepted/' 'rejected.' % (suggestion_id)) suggestion.pre_accept_validate() html_string = ''.join(suggestion.get_all_html_content_strings()) error_list = ( html_validation_service. validate_math_tags_in_html_with_attribute_math_content(html_string)) if len(error_list) > 0: raise Exception( 'Invalid math tags found in the suggestion with id %s.' % (suggestion.suggestion_id)) suggestion.set_suggestion_status_to_accepted() suggestion.set_final_reviewer_id(reviewer_id) author_name = user_services.get_username(suggestion.author_id) commit_message = get_commit_message_for_suggestion(author_name, commit_message) suggestion.accept(commit_message) _update_suggestion(suggestion) # Update the community contribution stats so that the number of suggestions # of this type that are in review decreases by one, since this # suggestion is no longer in review. _update_suggestion_counts_in_community_contribution_stats([suggestion], -1) feedback_services.create_message(suggestion_id, reviewer_id, feedback_models.STATUS_CHOICES_FIXED, None, review_message) # When recording of scores is enabled, the author of the suggestion gets an # increase in their score for the suggestion category. if feconf.ENABLE_RECORDING_OF_SCORES: user_id = suggestion.author_id score_category = suggestion.score_category # Get user proficiency domain object. user_proficiency = _get_user_proficiency(user_id, score_category) # Increment the score of the author due to their suggestion being # accepted. user_proficiency.increment_score( suggestion_models.INCREMENT_SCORE_OF_AUTHOR_BY) # Emails are sent to onboard new reviewers. These new reviewers are # created when the score of the user passes the minimum score required # to review. if feconf.SEND_SUGGESTION_REVIEW_RELATED_EMAILS: if user_proficiency.can_user_review_category() and ( not user_proficiency.onboarding_email_sent): email_manager.send_mail_to_onboard_new_reviewers( user_id, score_category) user_proficiency.mark_onboarding_email_as_sent() # Need to update the corresponding user proficiency model after we # updated the domain object. _update_user_proficiency(user_proficiency)