Changeset - 0529498575ce
[Not reviewed]
default
0 5 0
Mads Kiilerich - 11 years ago 2014-07-18 19:22:01
madski@unity3d.com
notifications: insert 'References' mail headers to help MUA threading

gmail is however fubar.
5 files changed with 28 insertions and 13 deletions:
0 comments (0 inline, 0 general)
kallithea/lib/celerylib/tasks.py
Show inline comments
 
@@ -257,7 +257,7 @@ def get_commits_stats(repo_name, ts_min_
 

	
 
@task(ignore_result=True)
 
@dbsession
 
def send_email(recipients, subject, body='', html_body=''):
 
def send_email(recipients, subject, body='', html_body='', headers=None):
 
    """
 
    Sends an email with defined parameters from the .ini files.
 

	
 
@@ -304,7 +304,7 @@ def send_email(recipients, subject, body
 
    try:
 
        m = SmtpMailer(mail_from, user, passwd, mail_server, smtp_auth,
 
                       mail_port, ssl, tls, debug=debug)
 
        m.send(recipients, subject, body, html_body)
 
        m.send(recipients, subject, body, html_body, headers=headers)
 
    except:
 
        log.error('Mail sending failed')
 
        log.error(traceback.format_exc())
kallithea/lib/rcmail/smtp_mailer.py
Show inline comments
 
@@ -61,13 +61,13 @@ class SmtpMailer(object):
 
        self.auth = smtp_auth
 

	
 
    def send(self, recipients=[], subject='', body='', html='',
 
             attachment_files=None):
 
             attachment_files=None, headers=None):
 

	
 
        if isinstance(recipients, basestring):
 
            recipients = [recipients]
 
        headers = {
 
            'Date': formatdate(time.time())
 
        }
 
        if headers is None:
 
            headers = {}
 
        headers.setdefault('Date', formatdate(time.time()))
 
        msg = Message(subject, recipients, body, html, self.mail_from,
 
                      recipients_separator=", ", extra_headers=headers)
 
        raw_msg = msg.to_message()
kallithea/model/comment.py
Show inline comments
 
@@ -82,7 +82,11 @@ class ChangesetCommentsModel(BaseModel):
 
            cs = repo.scm_instance.get_changeset(revision)
 
            desc = "%s" % (cs.short_id)
 

	
 
            _url = h.url('changeset_home',
 
            revision_url = h.url('changeset_home',
 
                repo_name=repo.repo_name,
 
                revision=revision,
 
                qualified=True,)
 
            comment_url = h.url('changeset_home',
 
                repo_name=repo.repo_name,
 
                revision=revision,
 
                anchor='comment-%s' % comment.comment_id,
 
@@ -91,7 +95,7 @@ class ChangesetCommentsModel(BaseModel):
 
            subj = safe_unicode(
 
                h.link_to('Re changeset: %(desc)s %(line)s' % \
 
                          {'desc': desc, 'line': line},
 
                          _url)
 
                          comment_url)
 
            )
 
            # get the current participants of this changeset
 
            recipients = ChangesetComment.get_users(revision=revision)
 
@@ -106,20 +110,25 @@ class ChangesetCommentsModel(BaseModel):
 
                'cs_comment_user': h.person(user),
 
                'cs_target_repo': h.url('summary_home', repo_name=repo.repo_name,
 
                                        qualified=True),
 
                'cs_comment_url': _url,
 
                'cs_comment_url': comment_url,
 
                'raw_id': revision,
 
                'message': cs.message,
 
                'repo_name': repo.repo_name,
 
                'short_id': h.short_id(revision),
 
                'branch': cs.branch,
 
                'comment_username': user.username,
 
                'threading': [revision_url, comment_url], # TODO: url to line number
 
            }
 
        #pull request
 
        elif pull_request:
 
            notification_type = Notification.TYPE_PULL_REQUEST_COMMENT
 
            desc = comment.pull_request.title
 
            _org_ref_type, org_ref_name, _org_rev = comment.pull_request.org_ref.split(':')
 
            _url = h.url('pullrequest_show',
 
            pr_url = h.url('pullrequest_show',
 
                repo_name=pull_request.other_repo.repo_name,
 
                pull_request_id=pull_request.pull_request_id,
 
                qualified=True,)
 
            comment_url = h.url('pullrequest_show',
 
                repo_name=pull_request.other_repo.repo_name,
 
                pull_request_id=pull_request.pull_request_id,
 
                anchor='comment-%s' % comment.comment_id,
 
@@ -130,7 +139,7 @@ class ChangesetCommentsModel(BaseModel):
 
                          {'desc': desc,
 
                           'pr_id': comment.pull_request.pull_request_id,
 
                           'line': line},
 
                          _url)
 
                          comment_url)
 
            )
 
            # get the current participants of this pull request
 
            recipients = ChangesetComment.get_users(pull_request_id=
 
@@ -147,7 +156,7 @@ class ChangesetCommentsModel(BaseModel):
 
                'pr_id': pull_request.pull_request_id,
 
                'status_change': status_change,
 
                'closing_pr': closing_pr,
 
                'pr_comment_url': _url,
 
                'pr_comment_url': comment_url,
 
                'pr_comment_user': h.person(user),
 
                'pr_target_repo': h.url('summary_home',
 
                                   repo_name=pull_request.other_repo.repo_name,
 
@@ -155,6 +164,7 @@ class ChangesetCommentsModel(BaseModel):
 
                'repo_name': pull_request.other_repo.repo_name,
 
                'ref': org_ref_name,
 
                'comment_username': user.username,
 
                'threading': [pr_url, comment_url], # TODO: url to line number
 
            }
 

	
 
        return subj, body, recipients, notification_type, email_kwargs
kallithea/model/notification.py
Show inline comments
 
@@ -114,6 +114,10 @@ class NotificationModel(BaseModel):
 
        #don't send email to person who created this comment
 
        rec_objs = set(recipients_objs).difference(set([created_by_obj]))
 

	
 
        headers = None
 
        if 'threading' in email_kwargs:
 
            headers = {'References': ' '.join('<%s>' % x for x in email_kwargs['threading'])}
 

	
 
        # send email with notification to all other participants
 
        for rec in rec_objs:
 
            email_body = None  # we set body to none, we just send HTML emails
 
@@ -131,7 +135,7 @@ class NotificationModel(BaseModel):
 
                                .get_email_tmpl(type_, **kwargs)
 

	
 
            run_task(tasks.send_email, [rec.email], email_subject, email_body,
 
                     email_body_html)
 
                     email_body_html, headers)
 

	
 
        return notif
 

	
kallithea/model/pull_request.py
Show inline comments
 
@@ -144,6 +144,7 @@ class PullRequestModel(BaseModel):
 
            'pr_id': pr.pull_request_id,
 
            'ref': org_ref_name,
 
            'pr_username': pr.author.username,
 
            'threading': [pr_url],
 
            }
 
        NotificationModel().create(created_by=pr.author, subject=subject, body=body,
 
                                   recipients=reviewers,
0 comments (0 inline, 0 general)