1010
1111from django import forms
1212from django .db .models import F
13+ from django .db import transaction
1314from django .contrib import admin , messages
1415from django .utils .html import mark_safe
1516from django .utils .translation import gettext_lazy as _
@@ -324,42 +325,31 @@ class SubmissionCommentAdmin(admin.ModelAdmin):
324325 list_display = ("submission" , "author" , "text" )
325326
326327
328+ NEW_STATUS_TO_EMAIL_TEMPLATE = {
329+ Submission .STATUS .accepted : EmailTemplateIdentifier .proposal_accepted ,
330+ Submission .STATUS .rejected : EmailTemplateIdentifier .proposal_rejected ,
331+ Submission .STATUS .waiting_list : EmailTemplateIdentifier .proposal_in_waiting_list ,
332+ }
333+
334+
327335@admin .action (description = "Apply and notify status change" )
328336@validate_single_conference_selection
337+ @transaction .atomic
329338def apply_and_notify_status_change (modeladmin , request , queryset ):
330339 conference = queryset .first ().conference
331- count = queryset .count ()
340+ objs = list (queryset .select_related ("speaker" ).prefetch_related ("type" ))
341+ count = len (objs )
332342
333- for submission in queryset . select_related ( "speaker" ). prefetch_related ( "type" ) :
343+ for submission in objs :
334344 submission .status = submission .pending_status
335- submission .save (update_fields = ["status" ])
336-
337- match submission .status :
338- case Submission .STATUS .accepted :
339- template = EmailTemplateIdentifier .proposal_accepted
340- placeholders = {
341- "conference_name" : conference .name .localize ("en" ),
342- "proposal_title" : submission .title .localize ("en" ),
343- "proposal_type" : submission .type .name ,
344- "speaker_name" : get_name (submission .speaker , "there" ),
345- }
346- case Submission .STATUS .rejected :
347- template = EmailTemplateIdentifier .proposal_rejected
348- placeholders = {
349- "conference_name" : conference .name .localize ("en" ),
350- "speaker_name" : get_name (submission .speaker , "there" ),
351- "proposal_title" : submission .title .localize ("en" ),
352- "proposal_type" : submission .type .name ,
353- }
354- case Submission .STATUS .waiting_list :
355- template = EmailTemplateIdentifier .proposal_in_waiting_list
356- placeholders = {
357- "conference_name" : conference .name .localize ("en" ),
358- "speaker_name" : get_name (submission .speaker , "there" ),
359- "proposal_title" : submission .title .localize ("en" ),
360- "proposal_type" : submission .type .name ,
361- }
362-
345+ placeholders = {
346+ "conference_name" : conference .name .localize ("en" ),
347+ "proposal_title" : submission .title .localize ("en" ),
348+ "proposal_type" : submission .type .name ,
349+ "speaker_name" : get_name (submission .speaker , "there" ),
350+ }
351+
352+ template = NEW_STATUS_TO_EMAIL_TEMPLATE [submission .status ]
363353 email_template = EmailTemplate .objects .for_conference (
364354 conference
365355 ).get_by_identifier (template )
@@ -368,6 +358,11 @@ def apply_and_notify_status_change(modeladmin, request, queryset):
368358 placeholders = placeholders ,
369359 )
370360
361+ Submission .objects .bulk_update (
362+ objs ,
363+ ["status" ],
364+ )
365+
371366 messages .add_message (
372367 request ,
373368 messages .SUCCESS ,
0 commit comments