in Allura/allura/model/notification.py [0:0]
def _make_notification(cls, artifact, topic, **kwargs):
'''
Create a Notification instance based on an artifact. Special handling
for comments when topic=='message'
'''
from allura.model import Project
idx = artifact.index() if artifact else None
subject_prefix = '[{}:{}] '.format(
c.project.shortname, c.app.config.options.mount_point)
post = ''
if topic == 'message':
post = kwargs.pop('post')
text = kwargs.get('text') or post.text
file_info = kwargs.pop('file_info', None)
if file_info is not None:
text = "%s\n\n\nAttachments:\n" % text
if not isinstance(file_info, list):
file_info = [file_info]
for attach in file_info:
attach.file.seek(0, 2)
bytecount = attach.file.tell()
attach.file.seek(0)
url = h.absurl('{}attachment/{}'.format(
post.url(), h.urlquote(attach.filename)))
text = "{}\n- [{}]({}) ({}; {})".format(
text, attach.filename, url,
h.do_filesizeformat(bytecount), attach.type)
subject = post.subject or ''
if post.parent_id and not subject.lower().startswith('re:'):
subject = 'Re: ' + subject
author = post.author()
msg_id = kwargs.get('message_id') or artifact.url() + post._id
parent_msg_id = artifact.url() + \
post.parent_id if post.parent_id else artifact.message_id()
d = dict(
_id=msg_id,
from_address=str(
author._id) if author != User.anonymous() else None,
reply_to_address='"{}" <{}>'.format(
subject_prefix, getattr(
artifact, 'email_address', g.noreply)),
subject=subject_prefix + subject,
text=text,
in_reply_to=parent_msg_id,
references=cls._references(artifact, post),
author_id=author._id,
pubdate=datetime.utcnow())
elif topic == 'flash':
n = cls(topic=topic,
text=kwargs['text'],
subject=kwargs.pop('subject', ''))
return n
else:
subject = kwargs.pop('subject', '{} modified by {}'.format(
h.get_first(idx, 'title'), c.user.get_pref('display_name')))
reply_to = '"{}" <{}>'.format(
h.get_first(idx, 'title'),
getattr(artifact, 'email_address', g.noreply))
d = dict(
from_address=reply_to,
reply_to_address=reply_to,
subject=subject_prefix + subject,
text=kwargs.pop('text', subject),
author_id=c.user._id,
pubdate=datetime.utcnow())
if kwargs.get('message_id'):
d['_id'] = kwargs['message_id']
if c.user.get_pref('email_address'):
d['from_address'] = '"{}" <{}>'.format(
c.user.get_pref('display_name'),
c.user.get_pref('email_address'))
elif c.user.email_addresses:
d['from_address'] = '"{}" <{}>'.format(
c.user.get_pref('display_name'),
c.user.email_addresses[0])
if not d.get('text'):
d['text'] = ''
try:
''' Add addional text to the notification e-mail based on the artifact type '''
template = cls.view.get_template(
'mail/' + artifact.type_s + '.txt')
d['text'] += template.render(dict(c=c, g=g,
config=config, data=artifact, post=post, h=h))
except jinja2.TemplateNotFound:
pass
except Exception:
''' Catch any errors loading or rendering the template,
but the notification still gets sent if there is an error
'''
log.warning('Could not render notification template %s' %
artifact.type_s, exc_info=True)
assert d['reply_to_address'] is not None
project = c.project
if d.get('project_id', c.project._id) != c.project._id:
project = Project.query.get(_id=d['project_id'])
if project.notifications_disabled:
log.debug(
'Notifications disabled for project %s, not sending %s(%r)',
project.shortname, topic, artifact)
return None
n = cls(ref_id=artifact.index_id(),
topic=topic,
link=kwargs.pop('link', artifact.url()),
**d)
return n