You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
6.4 KiB

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" <rk-orga@samuelzielke.de>'
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'<span style="color: {color}; font-size: 16px;">●</span>')
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('<path:object_id>/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'<a class="button" href="send_email/">E-Mail senden</a>'
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'<span style="color: {color}; font-size: 16px;">●</span>'
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'<span style="color: {color}; font-size: 16px;">●</span>')
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)

Powered by TurnKey Linux.