cmsmanage/paperwork/admin.py

184 lines
4.7 KiB
Python

from django.core import mail
from django.contrib import admin, messages
from django.db.models.functions import Now
from .models import (
CmsRedRiverVeteransScholarship,
Department,
CertificationDefinition,
Certification,
CertificationVersion,
InstructorOrVendor,
SpecialProgram,
Waiver,
)
from .certification_emails import all_certification_emails
@admin.register(Department)
class Department(admin.ModelAdmin):
search_fields = ["name"]
list_display = [
"name",
"parent",
"has_mailing_list",
"list_moderator_flag",
"list_reply_to_address",
]
class CertificationVersionInline(admin.TabularInline):
model = CertificationVersion
extra = 1
readonly_fields = (
"semantic_version",
"is_latest",
"is_current",
)
@admin.register(CertificationDefinition)
class CertificationDefinitionAdmin(admin.ModelAdmin):
search_fields = ["certification_name"]
list_display = [
"certification_name",
"department",
"latest_version__version",
]
list_filter = ["department"]
inlines = [CertificationVersionInline]
@admin.display(description="Latest Version")
def latest_version__version(self, obj):
return obj.latest_version().version
@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="Current", boolean=True)
def certification_version__is_current(self, obj):
return obj.certification_version.is_current()
@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_version__is_current",
"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"]
list_display = [
"name",
"instructor_agreement_date",
"w9_date",
"phone",
"email_address",
]
@admin.register(SpecialProgram)
class SpecialProgramAdmin(admin.ModelAdmin):
search_fields = ["program_name"]
list_display = [
"program_name",
"discount_percent",
"discount_code",
"membership_code",
"start_date",
"end_date",
"program_amount",
"program_status",
]
@admin.register(Waiver)
class WaiverAdmin(admin.ModelAdmin):
search_fields = ["name"]
list_display = [
"name",
"date",
"emergency_contact_name",
"emergency_contact_number",
"waiver_version",
"guardian_name",
"guardian_relation",
"guardian_date",
]
admin.site.register(CmsRedRiverVeteransScholarship)