From 26c54fe1f76fc053e78c97a040282c103c5ef8cb Mon Sep 17 00:00:00 2001 From: Samuel Zielke Date: Wed, 26 Mar 2025 16:14:04 +0100 Subject: [PATCH] =?UTF-8?q?E-Mail=20senden=20erm=C3=B6gliche=20und=20Felde?= =?UTF-8?q?r=20anpassen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/admin.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++++- main/models.py | 3 ++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/main/admin.py b/main/admin.py index 3302586..04ef2af 100644 --- a/main/admin.py +++ b/main/admin.py @@ -1,11 +1,44 @@ from django import forms -from django.contrib import admin +from django.contrib import admin, messages import main.models as MainDB from datetime import date, datetime from django.utils.html import format_html from import_export import resources from import_export.admin import ExportMixin, ImportMixin, ImportExportModelAdmin +from django.core.mail import send_mail +from django.template.loader import render_to_string +from django.utils.html import strip_tags +from django.utils.timezone import now +from django.shortcuts import redirect +from django.urls import path + +from .models import contributors + +# Admin-Action für den Versand der E-Mail +def send_custom_email(modeladmin, request, queryset): + for obj in queryset: + subject = "Helfer - Regionalkongress 2025 " + + myVar = [role.name for role in obj.roles.all()] + myVar = myVar[0] if len(myVar) > 0 else "Leer" + html_message = render_to_string("main/email_invite.html", {"firstname": obj.firstname, + "year": obj.birthday.year if obj.birthday != None else "Leer", + "congr": obj.congregation.title if obj.congregation != None else "Leer", + "role": myVar}) + plain_message = strip_tags(html_message) + from_email = '"Samuel Zielke" ' + recipient_list = [obj.email] + + try: + send_mail(subject, plain_message, from_email, recipient_list, html_message=html_message) + obj.email_sent_at = now() + obj.save() + messages.success(request, f"E-Mail an {obj.email} gesendet.") + except Exception as e: + messages.error(request, f"Fehler beim Senden der E-Mail an {obj.email}: {e}") + +send_custom_email.short_description = "Einladungs E-Mail senden" class contributorsResource(resources.ModelResource): @@ -25,6 +58,25 @@ class MainDB_contributorsAdmin(ExportMixin, ImportMixin, admin.ModelAdmin): list_filter = ('gender', 'roles', 'deparment', 'da_approval', 'actual') search_fields = ('name', 'firstname', 'congregation__title', 'deparment__title', 'mobilnumber', 'email', 'jwpub') + + actions = [send_custom_email] + + def get_urls(self): + urls = super().get_urls() + custom_urls = [ + path('/send_email/', self.admin_site.admin_view(self.send_email_view), name='send_email') + ] + return custom_urls + urls + + def send_email_view(self, request, object_id): + obj = self.get_object(request, object_id) + send_custom_email(self, request, [obj]) + return redirect(request.META.get('HTTP_REFERER', 'admin:index')) + + def email_button(self, obj): + return f'E-Mail senden' + email_button.allow_tags = True + email_button.short_description = "E-Mail senden" def get_congregation(self, obj): return obj.congregation diff --git a/main/models.py b/main/models.py index 5292900..5a8d515 100644 --- a/main/models.py +++ b/main/models.py @@ -68,7 +68,7 @@ class contributors(models.Model): firstname = models.CharField(("vorname"), max_length=50) birthday = models.DateField(("geburtstag"), auto_now=False, auto_now_add=False, blank=True, null=True) congregation = models.ForeignKey("main.congregation", verbose_name=("Versammlung"), on_delete=models.SET_NULL, null=True, blank=True) - roles = models.ManyToManyField("main.role", verbose_name=("role"), null=True, blank=True) + roles = models.ManyToManyField("main.role", verbose_name=("Vorrecht"), null=True, blank=True) pioneer = models.BooleanField(("pionier"), default=False) svd = models.BooleanField(("s.v.d."), default=False) gender = models.CharField("Geschlecht",max_length=20, choices=[("M", "Männlich"), ("W", "Weiblich")]) @@ -82,6 +82,7 @@ class contributors(models.Model): jwpub = models.EmailField(("JWPUB"), max_length=254, null=True, blank=True) notes = models.CharField(("Bemerkung"), max_length=255, null=True, blank=True) actual = models.BooleanField(("Aktuell"), default=False) + email_sent_at = models.DateTimeField(("E-Mail versende"), null=True, blank=True) class Meta: verbose_name = ("Helfer")