160 lines
4.9 KiB
Python
160 lines
4.9 KiB
Python
from flask.ext.mail import Message
|
|
|
|
from app import mail, app, get_app_url
|
|
from jinja2 import Template, Environment, FileSystemLoader, contextfilter
|
|
from data import model
|
|
from util.gravatar import compute_hash
|
|
|
|
def user_reference(username):
|
|
user = model.get_user_or_org(username)
|
|
if not user:
|
|
return username
|
|
|
|
return """
|
|
<span>
|
|
<img src="http://www.gravatar.com/avatar/%s?s=16&d=identicon" style="vertical-align: middle; margin-left: 6px; margin-right: 4px;">
|
|
<b>%s</b>
|
|
</span>""" % (compute_hash(user.email), username)
|
|
|
|
|
|
def repository_reference(pair):
|
|
(namespace, repository) = pair
|
|
|
|
owner = model.get_user(namespace)
|
|
if not owner:
|
|
return "%s/%s" % (namespace, repository)
|
|
|
|
return """
|
|
<span style="white-space: nowrap;">
|
|
<img src="http://www.gravatar.com/avatar/%s?s=16&d=identicon" style="vertical-align: middle; margin-left: 6px; margin-right: 4px;">
|
|
<a href="%s/repository/%s/%s">%s/%s</a>
|
|
</span>
|
|
""" % (compute_hash(owner.email), get_app_url(), namespace, repository, namespace, repository)
|
|
|
|
|
|
def admin_reference(username):
|
|
user = model.get_user(username)
|
|
if not user:
|
|
return 'account settings'
|
|
|
|
if user.organization:
|
|
return """
|
|
<a href="%s/organization/%s/admin">organization's admin setting</a>
|
|
""" % (get_app_url(), username)
|
|
else:
|
|
return """
|
|
<a href="%s/user/">account settings</a>
|
|
""" % (get_app_url())
|
|
|
|
|
|
template_loader = FileSystemLoader(searchpath="emails")
|
|
template_env = Environment(loader=template_loader)
|
|
template_env.filters['user_reference'] = user_reference
|
|
template_env.filters['admin_reference'] = admin_reference
|
|
template_env.filters['repository_reference'] = repository_reference
|
|
|
|
|
|
def send_email(recipient, subject, template_file, parameters):
|
|
app_title = app.config['REGISTRY_TITLE_SHORT']
|
|
app_url = get_app_url()
|
|
|
|
def app_link_handler(url=None, title=None):
|
|
real_url = app_url + '/' + url if url else app_url
|
|
if not title:
|
|
title = real_url if url else app_title
|
|
|
|
return '<a href="%s">%s</a>' % (real_url, title)
|
|
|
|
parameters.update({
|
|
'subject': subject,
|
|
'app_logo': 'https://quay.io/static/img/quay-logo.png', # TODO: make this pull from config
|
|
'app_url': app_url,
|
|
'app_title': app_title,
|
|
'app_link': app_link_handler
|
|
})
|
|
|
|
rendered_html = template_env.get_template(template_file + '.html').render(parameters)
|
|
|
|
msg = Message('[%s] %s' % (app_title, subject), recipients=[recipient])
|
|
msg.html = rendered_html
|
|
mail.send(msg)
|
|
|
|
|
|
def send_password_changed(username, email):
|
|
send_email(email, 'Account password changed', 'passwordchanged', {
|
|
'username': username
|
|
})
|
|
|
|
def send_email_changed(username, old_email, new_email):
|
|
send_email(old_email, 'Account e-mail address changed', 'emailchanged', {
|
|
'username': username,
|
|
'new_email': new_email
|
|
})
|
|
|
|
def send_change_email(username, email, token):
|
|
send_email(email, 'E-mail address change requested', 'changeemail', {
|
|
'username': username,
|
|
'token': token
|
|
})
|
|
|
|
def send_confirmation_email(username, email, token):
|
|
send_email(email, 'Please confirm your e-mail address', 'confirmemail', {
|
|
'username': username,
|
|
'token': token
|
|
})
|
|
|
|
def send_repo_authorization_email(namespace, repository, email, token):
|
|
subject = 'Please verify your e-mail address for repository %s/%s' % (namespace, repository)
|
|
send_email(email, subject, 'repoauthorizeemail', {
|
|
'namespace': namespace,
|
|
'repository': repository,
|
|
'token': token
|
|
})
|
|
|
|
def send_recovery_email(email, token):
|
|
subject = 'Account recovery'
|
|
send_email(email, subject, 'recovery', {
|
|
'email': email,
|
|
'token': token
|
|
})
|
|
|
|
def send_payment_failed(email, username):
|
|
send_email(email, 'Subscription Payment Failure', 'paymentfailure', {
|
|
'username': username
|
|
})
|
|
|
|
def send_org_invite_email(member_name, member_email, orgname, team, adder, code):
|
|
send_email(member_email, 'Invitation to join team', 'teaminvite', {
|
|
'inviter': adder,
|
|
'token': code,
|
|
'organization': orgname,
|
|
'teamname': team
|
|
})
|
|
|
|
|
|
def send_invoice_email(email, contents):
|
|
# Note: This completely generates the contents of the email, so we don't use the
|
|
# normal template here.
|
|
msg = Message('Quay.io payment received - Thank you!', recipients=[email])
|
|
msg.html = contents
|
|
mail.send(msg)
|
|
|
|
|
|
# INTERNAL EMAILS BELOW
|
|
|
|
def send_subscription_change(change_description, customer_id, customer_email, quay_username):
|
|
SUBSCRIPTION_CHANGE_TITLE = 'Subscription Change - {0} {1}'
|
|
SUBSCRIPTION_CHANGE = """
|
|
Change: {0}<br>
|
|
Customer id: <a href="https://manage.stripe.com/customers/{1}">{1}</a><br>
|
|
Customer email: <a href="mailto:{2}">{2}</a><br>
|
|
Quay user or org name: {3}<br>
|
|
"""
|
|
|
|
title = SUBSCRIPTION_CHANGE_TITLE.format(quay_username, change_description)
|
|
msg = Message(title, recipients=['stripe@quay.io'])
|
|
msg.html = SUBSCRIPTION_CHANGE.format(change_description, customer_id, customer_email,
|
|
quay_username)
|
|
mail.send(msg)
|
|
|
|
|