from django import forms 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 django.utils.timezone import now from datetime import timedelta 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): class Meta: model = MainDB.contributors # Register your models here. @admin.register(MainDB.contributors) # class DeinModellAdmin(ImportExportModelAdmin): # pass # Damit hast du Import/Export-Funktionalität im Django Admin class MainDB_contributorsAdmin(ExportMixin, ImportMixin, admin.ModelAdmin): resource_class = contributorsResource list_display = ('full_name', 'actual', 'get_emailstate', 'da_approval', 'leader', 'tage_anzeige', 'get_deparment', 'gender', 'birthday_year', 'get_congregation', 'mobilnumber', 'email') list_filter = ('gender', 'roles', 'deparment', 'da_approval', 'actual', 'email_sent_at') search_fields = ('name', 'firstname', 'congregation__title', 'deparment__title', 'mobilnumber', 'email', 'jwpub') actions = [send_custom_email] def get_emailstate(self, obj): if obj.email_sent_at != None: color = 'green' if obj.email_sent_at < now() - timedelta(days=30): color = 'gold' else: color = 'red' return format_html(f'') get_emailstate.short_description = "E-Mail" get_emailstate.admin_order_field = "email_sent_at" 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 get_congregation.short_description = 'Versammlung' get_congregation.admin_order_field = 'congregation__title' def get_deparment(self, obj): # Gebe eine durch Komma getrennte Liste der Namen der contributors zurück return ", ".join([str(deparment) for deparment in obj.deparment.all()]) get_deparment.short_description = 'Abteilung' # Optional: Benennung der Spalte get_deparment.admin_order_field = 'deparment__title' # Methode, um nur das Jahr des Birthdays anzuzeigen def birthday_year(self, obj): year = obj.birthday.year if obj.birthday != None else 0 return int(datetime.strftime(date.today(), "%Y")) - year birthday_year.short_description = 'Alter' birthday_year.admin_order_field = 'birthday' # Teamleiter ansicht def leader(self, obj): if obj.teamleader: color = "green" elif not obj.teamleader and obj.second_teamleader: color = "gold" else: color = "gray" status = f'' return format_html(status) # Verfügbarkeit anzeigen def tage_anzeige(self, obj): """ Kompakte Anzeige mit 2er-Gruppen in farbigen Punkten """ tage_pairs = [ ("MiV", "MiN"), ("DoV", "DoN"), ("FrV", "FrN"), ("SaV", "SaN"), ("SoV", "SoN"), ("Abbau", None) # Extra2 hat keinen Partner, wird einzeln bewertet ] symbols = [] for tag1, tag2 in tage_pairs: active1 = obj.tage & obj.TAGE[tag1] active2 = obj.TAGE.get(tag2, 0) and obj.tage & obj.TAGE[tag2] if tag2 else None # Sicherstellen, dass None nicht bewertet wird if tag2 is None: # Falls nur ein Eintrag in der Gruppe existiert color = "green" if active1 else "red" # Entweder Grün oder Rot else: if active1 and active2: color = "green" # 🟢 beide aktiv elif active1 or active2: color = "gold" # 🟡 nur einer aktiv else: color = "red" # 🔴 beide inaktiv symbols.append(f'') return format_html(" ".join(symbols)) tage_anzeige.admin_order_field = 'tage' admin.site.register(MainDB.department) @admin.register(MainDB.congregation) class MainDB_congregationAdmin(admin.ModelAdmin): list_display = ('id', 'title') admin.site.register(MainDB.role)