from django.core import mail from django.contrib import admin, messages from django.db.models.functions import Now from .models import ( CmsRedRiverVeteransScholarship, CertificationDefinition, Certification, CertificationVersion, InstructorOrVendor, SpecialProgram, Waiver, ) from .certification_emails import all_certification_emails class CertificationVersionInline(admin.TabularInline): model = CertificationVersion extra = 1 @admin.register(CertificationVersion) class CertificationVersionAdmin(admin.ModelAdmin): search_fields = ["definition__certification_name", "version"] list_display = ["definition", "version"] list_filter = ["definition__department", "definition__certification_name"] @admin.register(CertificationDefinition) class CertificationDefinitionAdmin(admin.ModelAdmin): search_fields = ["certification_name"] list_display = ["certification_name", "department"] list_filter = ["department"] inlines = [CertificationVersionInline] @admin.register(Certification) class CertificationAdmin(admin.ModelAdmin): search_fields = [ "name", "certification_version__definition__certification_name", "certification_version__definition__department", ] autocomplete_fields = ["member"] exclude = ["shop_lead_notified"] @admin.display( description="Certification Name", ordering="certification_version__definition__certification_name", ) def certification_name(self, obj): return obj.certification_version.definition.certification_name @admin.display( description="Certification Version", ordering="certification_version__version" ) def certification_version_version(self, obj): return obj.certification_version.version @admin.display( description="Department", ordering="certification_version__definition__department", ) def certification_department(self, obj): return obj.certification_version.definition.department list_display = [ "certification_name", "name", "certification_version_version", "certification_department", "date", "shop_lead_notified", "certified_by", ] list_display_links = [ "certification_name", "name", ] list_filter = [ "certification_version__definition__department", ("shop_lead_notified", admin.EmptyFieldListFilter), ] actions = ["send_notifications"] @admin.action( description="Notify Shop Leads and Members of selected certifications" ) def send_notifications(self, request, queryset): try: emails = list(all_certification_emails(queryset)) with mail.get_connection() as conn: conn.send_messages(emails) for cert in queryset: cert.shop_lead_notified = Now() cert.save() self.message_user( request, f"{len(emails)} notifications sent for {len(queryset)} certifications", messages.SUCCESS, ) except Exception as e: self.message_user( request, f"Failed to send notifications! {e}", messages.ERROR, ) raise @admin.register(InstructorOrVendor) class InstructorOrVendorAdmin(admin.ModelAdmin): search_fields = ["name"] @admin.register(SpecialProgram) class SpecialProgramAdmin(admin.ModelAdmin): search_fields = ["program_name"] @admin.register(Waiver) class WaiverAdmin(admin.ModelAdmin): search_fields = ["name"] admin.site.register(CmsRedRiverVeteransScholarship)