roundabout,
created on Friday, 21 June 2024, 14:52:24 (1718981544),
received on Wednesday, 31 July 2024, 06:54:49 (1722408889)
Author identity: vlad <vlad.muntoiu@gmail.com>
7df77751f6636f9b0d2f90849ee6d427313522c9
celery_tasks.py
@@ -14,20 +14,34 @@ from datetime import datetime
@shared_task(ignore_result=False)
def send_notification(user_notification_id):
from models import UserNotification
from models import UserNotification, Commit
user_notification = db.session.get(UserNotification, user_notification_id)
user = user_notification.user
notification = user_notification.notification
if user.email:
with (SMTP(config.MAIL_SERVER) as mail):
if notification.data.get("type") == "welcome":
message = email_send.make_multipart_message(
"Welcome, {username}".format(username=user.username),
config.NOTIFICATION_EMAIL,
user.email,
"welcome",
username=user.username)
match notification.data.get("type"):
case "welcome":
message = email_send.make_multipart_message(
"Welcome, {username}".format(username=user.username),
config.NOTIFICATION_EMAIL,
user.email,
"welcome",
username=user.username)
case "commit":
commit = db.session.get(Commit, notification.data.get("commit"))
line_separator = "\n\n" # hack so it works in older Pythons
newline = "\n"
message = email_send.make_multipart_message(
f"[commit in {notification.data.get('repo')}] {commit.message.partition(line_separator)[0].replace(newline, ' ')}",
config.NOTIFICATION_EMAIL,
user.email,
"commit",
username=user.username,
commit=commit,
url="https://" if config.suggest_https else "http://" + config.BASE_DOMAIN + "/repo/" + notification.data.get("repo") + "/commit/" + notification.data.get("commit")
)
mail.sendmail(config.NOTIFICATION_EMAIL, user.email, message)
config.py
@@ -173,3 +173,4 @@ To adjust your email notification preferences, log in to your account in a brows
"""
www_protocol = f"http{'s' if suggest_https else ''}"
url_prefix = f"{www_protocol}://{BASE_DOMAIN}" + (f":{port}" if port not in {80, 443} else "")
email_templates/commit.html
@@ -5,11 +5,11 @@
Commited by <a href="/{{ commit.owner.username }}">{{ commit.owner.username }}</a>
</p>
<h2>
<a href="{{ repo + '/commit/' + commit.sha }}">
<a href="{{ config.url_prefix }}{{ repo + '/commit/' + commit.sha }}">
{{ commit.message | split("\n\n", 1) | first | markdown }}
</a>
</h2>
<p>
<article>
{{ commit.message | split("\n\n", 1) | last | markdown }}
</p>
</article>
{% endblock %}
email_templates/forum.html
@@ -0,0 +1,12 @@
{% extends "mail.html" %}
{% block content %}
<h1>
<a href="{{ config.url_prefix }}{{ post.repo.route }}/forum/{{ post.id }}">
New forum post in {{ post.repo.route }}: {{ post.subject }}
</a>
</h1>
<p>By {{ post.owner.username }}</p>
<article>
{{ post.message }}
</article>
{% endblock %}
email_templates/forum.txt
@@ -0,0 +1,9 @@
{% extends "mail.txt" %}
{% block content %}
# New forum post in {{ post.repo.route }}: {{ post.subject }}
<{{ config.url_prefix }}{{ post.repo.route }}/forum/{{ post.id }}>
<p>By {{ post.owner.username }}</p>
{{ post.message }}
{% endblock %}
models.py
@@ -282,6 +282,18 @@ with (app.app_context()):
self.root = None
repo.last_post_id += 1
notification = Notification({"type": "post", "repo": repo.route, "post": self.identifier})
db.session.add(notification)
db.session.commit() # save the notification to get the ID
# Send a notification to all users who have enabled forum notifications for this repo
for relationship in RepoFavourite.query.filter_by(repo_route=repo.route, notify_forum=True).all():
user = relationship.user
user_notification = UserNotification(user, notification, 1)
db.session.add(user_notification)
db.session.commit()
celery_tasks.send_notification.apply_async(args=[user_notification.id])
def update_date(self):
self.last_updated = datetime.now()
with db.session.no_autoflush: