diff --git a/AKPlanning/settings.py b/AKPlanning/settings.py index 11d1348867306f65cb288d0d3d0563eecef290f8..3202b7d3e5fae76eedc4b801da00cdd06a12114b 100644 --- a/AKPlanning/settings.py +++ b/AKPlanning/settings.py @@ -218,4 +218,8 @@ CSP_IMG_SRC = ("'self'", "data:") CSP_FRAME_SRC = ("'self'", ) CSP_FONT_SRC = ("'self'", "data:", "fonts.gstatic.com") +# Emails +SEND_MAILS = True +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' + include(optional("settings/*.py")) diff --git a/AKPlanning/settings_production.py b/AKPlanning/settings_production.py index 83d7842d50fe525d3f86aa6b1c5fd145ddda417a..bf84d435232e27c0b1c7c48f8c7477a9de6da87f 100644 --- a/AKPlanning/settings_production.py +++ b/AKPlanning/settings_production.py @@ -35,4 +35,8 @@ DATABASES = { } } +### EMAILS ### +SEND_MAILS = True +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + # TODO: caching diff --git a/AKSubmission/models.py b/AKSubmission/models.py index 6b2021999398416a78191ac543b7e0e34d86bc2c..cd8a855b735c823a304a3b78c68f28efd42dc9a9 100644 --- a/AKSubmission/models.py +++ b/AKSubmission/models.py @@ -1 +1,42 @@ -# Create your models here. +from django.apps import apps +from django.conf import settings +from django.core.mail import EmailMessage +from django.db.models.signals import post_save +from django.dispatch import receiver +from django.urls import reverse_lazy + +from AKModel.models import AKOrgaMessage, AKSlot + + +@receiver(post_save, sender=AKOrgaMessage) +def orga_message_saved_handler(sender, instance: AKOrgaMessage, created, **kwargs): + # React to newly created Orga message by sending an email + + if created and settings.SEND_MAILS: + host = 'https://' + settings.ALLOWED_HOSTS[0] if len(settings.ALLOWED_HOSTS) > 0 else 'http://127.0.0.1:8000' + url = f"{host}{reverse_lazy('submit:ak_detail', kwargs={'pk': instance.ak.pk, 'event_slug': instance.ak.event.slug})}" + + mail = EmailMessage( + f"[AKPlanning] New message for AK '{instance.ak}' ({instance.ak.event})", + f"{instance.text}\n\n{url}", + settings.DEFAULT_FROM_EMAIL, + [instance.ak.event.contact_email] + ) + mail.send(fail_silently=True) + + +@receiver(post_save, sender=AKSlot) +def slot_created_handler(sender, instance: AKSlot, created, **kwargs): + # React to slots that are created after the plan was already published by sending an email + + if created and settings.SEND_MAILS and apps.is_installed("AKPlan") and not instance.event.plan_hidden and instance.room is None and instance.start is None: + host = 'https://' + settings.ALLOWED_HOSTS[0] if len(settings.ALLOWED_HOSTS) > 0 else 'http://127.0.0.1:8000' + url = f"{host}{reverse_lazy('submit:ak_detail', kwargs={'pk': instance.ak.pk, 'event_slug': instance.ak.event.slug})}" + + mail = EmailMessage( + f"[AKPlanning] New slot for AK '{instance.ak}' ({instance.ak.event}) added", + f"New slot requested.\n\nAK: {instance.ak}\nDuration: {instance.duration}\n\n{url}", + settings.DEFAULT_FROM_EMAIL, + [instance.ak.event.contact_email] + ) + mail.send(fail_silently=True)