# HG changeset patch # User Mads Kiilerich # Date 2014-08-01 20:28:42 # Node ID 231442b0b6aa7debe5e77a6f8bce8ee45595bed6 # Parent d9948f5ac7af5c55e423c502d7967340eae68610 pull requests: handle @mention in PR description ... but so far without fancy js completion diff --git a/kallithea/controllers/pullrequests.py b/kallithea/controllers/pullrequests.py --- a/kallithea/controllers/pullrequests.py +++ b/kallithea/controllers/pullrequests.py @@ -555,12 +555,15 @@ class PullrequestsController(BaseRepoCon def post(self, repo_name, pull_request_id): repo = RepoModel()._get_repo(repo_name) pull_request = PullRequest.get_or_404(pull_request_id) + old_description = pull_request.description _form = PullRequestPostForm()().to_python(request.POST) pull_request.title = _form['pullrequest_title'] pull_request.description = _form['pullrequest_desc'].strip() or _('No description') + PullRequestModel().mention_from_description(pull_request, old_description) + Session().commit() h.flash(_('Pull request updated'), category='success') diff --git a/kallithea/model/comment.py b/kallithea/model/comment.py --- a/kallithea/model/comment.py +++ b/kallithea/model/comment.py @@ -222,6 +222,7 @@ class ChangesetCommentsModel(BaseModel): pull_request=pull_request, status_change=status_change, closing_pr=closing_pr) + email_kwargs['is_mention'] = False # create notification objects, and emails NotificationModel().create( created_by=user, subject=subj, body=body, @@ -232,7 +233,7 @@ class ChangesetCommentsModel(BaseModel): mention_recipients = set(self._extract_mentions(body))\ .difference(recipients) if mention_recipients: - email_kwargs.update({'pr_mention': True}) + email_kwargs['is_mention'] = True subj = _('[Mention]') + ' ' + subj NotificationModel().create( created_by=user, subject=subj, body=body, diff --git a/kallithea/model/pull_request.py b/kallithea/model/pull_request.py --- a/kallithea/model/pull_request.py +++ b/kallithea/model/pull_request.py @@ -34,9 +34,9 @@ from kallithea.model.meta import Session from kallithea.lib import helpers as h from kallithea.model import BaseModel from kallithea.model.db import PullRequest, PullRequestReviewers, Notification,\ - ChangesetStatus + ChangesetStatus, User from kallithea.model.notification import NotificationModel -from kallithea.lib.utils2 import safe_unicode +from kallithea.lib.utils2 import extract_mentioned_users, safe_unicode log = logging.getLogger(__name__) @@ -106,10 +106,14 @@ class PullRequestModel(BaseModel): comment, pull_request=new ) - self.__add_reviewers(new, reviewers) + + mention_recipients = set(User.get_by_username(username, case_insensitive=True) + for username in extract_mentioned_users(pr.description)) + self.__add_reviewers(new, reviewers, mention_recipients) + return new - def __add_reviewers(self, pr, reviewers): + def __add_reviewers(self, pr, reviewers, mention_recipients=None): #members for member in set(reviewers): _usr = self._get_user(member) @@ -145,11 +149,34 @@ class PullRequestModel(BaseModel): 'ref': org_ref_name, 'pr_username': pr.author.username, 'threading': [pr_url], + 'is_mention': False, } - NotificationModel().create(created_by=pr.author, subject=subject, body=body, - recipients=reviewers, - type_=Notification.TYPE_PULL_REQUEST, - email_kwargs=email_kwargs) + if reviewers: + NotificationModel().create(created_by=pr.author, subject=subject, body=body, + recipients=reviewers, + type_=Notification.TYPE_PULL_REQUEST, + email_kwargs=email_kwargs) + + if mention_recipients: + mention_recipients.discard(None) + mention_recipients.difference_update(reviewers) + if mention_recipients: + email_kwargs['is_mention'] = True + subject = _('[Mention]') + ' ' + subject + + NotificationModel().create(created_by=pr.author, subject=subject, body=body, + recipients=mention_recipients, + type_=Notification.TYPE_PULL_REQUEST, + email_kwargs=email_kwargs) + + def mention_from_description(self, pr, old_description=''): + mention_recipients = set(User.get_by_username(username, case_insensitive=True) + for username in extract_mentioned_users(pr.description)) + mention_recipients.difference_update(User.get_by_username(username, case_insensitive=True) + for username in extract_mentioned_users(old_description)) + + log.debug("Mentioning %s" % mention_recipients) + self.__add_reviewers(pr, [], mention_recipients) def update_reviewers(self, pull_request, reviewers_ids): reviewers_ids = set(reviewers_ids) diff --git a/kallithea/templates/email_templates/changeset_comment.html b/kallithea/templates/email_templates/changeset_comment.html --- a/kallithea/templates/email_templates/changeset_comment.html +++ b/kallithea/templates/email_templates/changeset_comment.html @@ -1,7 +1,11 @@ ## -*- coding: utf-8 -*- <%inherit file="main.html"/> +%if is_mention: +

${_('Comment from %s on %s changeset %s mentioned you') % (cs_comment_user, cs_target_repo, h.short_id(raw_id))}:

+%else:

${_('Comment from %s on %s changeset %s') % (cs_comment_user, cs_target_repo, h.short_id(raw_id))}:

+%endif

${body}

%if status_change: diff --git a/kallithea/templates/email_templates/pull_request.html b/kallithea/templates/email_templates/pull_request.html --- a/kallithea/templates/email_templates/pull_request.html +++ b/kallithea/templates/email_templates/pull_request.html @@ -1,7 +1,11 @@ ## -*- coding: utf-8 -*- <%inherit file="main.html"/> +%if is_mention: +

${_('%s mentioned you on %s pull request "%s"') % (pr_user_created, repo_name, pr_title)}

+%else:

${_('%s requested your review of %s pull request "%s"') % (pr_user_created, repo_name, pr_title)}

+%endif

${_('URL')}: ${pr_url}