diff --git a/rhodecode/lib/audit_logger.py b/rhodecode/lib/audit_logger.py index 7ffb8e83..c503f6c0 100644 --- a/rhodecode/lib/audit_logger.py +++ b/rhodecode/lib/audit_logger.py @@ -27,6 +27,9 @@ from rhodecode.lib.str_utils import safe_str log = logging.getLogger(__name__) +PR_IDS_REVIEWER_ROLE = "pull_request_ids_reviewer_role" +PR_IDS_OBSERVER_ROLE = "pull_request_ids_observer_role" + # action as key, and expected action_data as value ACTIONS_V1 = { "user.login.success": {"user_agent": ""}, @@ -63,7 +66,7 @@ ACTIONS_V1 = { "repo.edit.permissions.branch": {}, "repo.archive": {"old_data": {}}, "repo.delete": {"old_data": {}}, - "review.delete": {"review.role": "", "pull_request": {}, "prev_user": {}}, + "review.delete": {PR_IDS_OBSERVER_ROLE: [], PR_IDS_REVIEWER_ROLE: [], "prev_user": {}}, "repo.archive.download": {"user_agent": "", "archive_name": "", "archive_spec": "", "archive_cached": ""}, "repo.permissions.branch_rule.create": {}, "repo.permissions.branch_rule.edit": {}, diff --git a/rhodecode/model/user.py b/rhodecode/model/user.py index 636c119f..ae7f2cf9 100644 --- a/rhodecode/model/user.py +++ b/rhodecode/model/user.py @@ -512,30 +512,50 @@ class UserModel(BaseModel): self.sa.add(a) def _delete_from_reviews(self, user: User, reviewer_pull_requests: List[PullRequestReviewers]): + repos_map = {} + for review in reviewer_pull_requests: + repo_id = review.pull_request.target_repo_id + repo_map = repos_map.get(repo_id, {}) + + pull_request_ids_reviewer_role = repo_map.get(audit_logger.PR_IDS_REVIEWER_ROLE, set()) + pull_request_ids_observer_role = repo_map.get(audit_logger.PR_IDS_OBSERVER_ROLE, set()) + if review.role == PullRequestReviewers.ROLE_REVIEWER: - audit_logger.store_web( - "review.delete", - user=get_current_rhodecode_user(), - action_data={ - "review_role": review.role, - "pull_request": { - "id": review.pull_request.pull_request_id, - "title": review.pull_request.title_safe, - }, - "prev_user": { - "username": user.username, - "name": user.name, - "email": user.email, - }, - }, - repo=audit_logger.RepoWrap( - repo_id=review.pull_request.target_repo_id, - repo_name=review.pull_request.target_repo.repo_name, - ), - ) + pull_request_ids_reviewer_role.add(review.pull_request.pull_request_id) + elif review.role == PullRequestReviewers.ROLE_OBSERVER: + pull_request_ids_observer_role.add(review.pull_request.pull_request_id) + + repos_map[repo_id] = { + audit_logger.PR_IDS_REVIEWER_ROLE: pull_request_ids_reviewer_role, + audit_logger.PR_IDS_OBSERVER_ROLE: pull_request_ids_observer_role, + "repo_id": repo_id, + "repo_name": review.pull_request.target_repo.repo_name, + } + self.sa.delete(review) + for repo_id in repos_map: + repo_map = repos_map[repo_id] + + audit_logger.store_web( + "review.delete", + user=get_current_rhodecode_user(), + action_data={ + audit_logger.PR_IDS_OBSERVER_ROLE: list(repo_map.get(audit_logger.PR_IDS_OBSERVER_ROLE, set())), + audit_logger.PR_IDS_REVIEWER_ROLE: list(repo_map.get(audit_logger.PR_IDS_REVIEWER_ROLE, set())), + "prev_user": { + "username": user.username, + "name": user.name, + "email": user.email, + }, + }, + repo=audit_logger.RepoWrap( + repo_id=repo_map["repo_id"], + repo_name=repo_map["repo_name"], + ), + ) + def delete( self, user,