1515from import_export .resources import ModelResource
1616
1717from conferences .models .conference_voucher import ConferenceVoucher
18+ from conferences .vouchers import create_conference_voucher
1819from countries import countries
1920from countries .filters import CountryFilter
2021from custom_admin .admin import (
4950
5051logger = logging .getLogger (__name__ )
5152
53+
5254EXPORT_GRANTS_FIELDS = (
5355 "name" ,
5456 "full_name" ,
@@ -299,18 +301,7 @@ def send_reply_email_waiting_list_update(modeladmin, request, queryset):
299301@validate_single_conference_selection
300302@transaction .atomic
301303def create_grant_vouchers (modeladmin , request , queryset ):
302- conference = queryset .first ().conference
303- existing_vouchers_by_user_id = {
304- voucher .user_id : voucher
305- for voucher in ConferenceVoucher .objects .for_conference (conference ).filter (
306- user_id__in = queryset .values_list ("user_id" , flat = True ),
307- )
308- }
309-
310- vouchers_to_create = []
311- vouchers_to_update = []
312-
313- for grant in queryset .order_by ("id" ):
304+ for grant in queryset .order_by ("id" ).select_related ("user" , "conference" ):
314305 if grant .status != Grant .Status .confirmed :
315306 messages .error (
316307 request ,
@@ -319,45 +310,56 @@ def create_grant_vouchers(modeladmin, request, queryset):
319310 )
320311 continue
321312
322- existing_voucher = existing_vouchers_by_user_id .get (grant .user_id )
313+ if not grant .user_id :
314+ messages .error (
315+ request ,
316+ f"Grant for { grant .name } has no user linked; can't create a voucher." ,
317+ )
318+ continue
319+
320+ existing = (
321+ ConferenceVoucher .objects .for_conference (grant .conference )
322+ .for_user (grant .user )
323+ .first ()
324+ )
323325
324- if not existing_voucher :
326+ if not existing :
327+ create_conference_voucher (
328+ conference = grant .conference ,
329+ user = grant .user ,
330+ voucher_type = ConferenceVoucher .VoucherType .GRANT ,
331+ )
325332 create_addition_admin_log_entry (
326333 request .user ,
327334 grant ,
328335 change_message = "Created voucher for this grant." ,
329336 )
337+ continue
330338
331- vouchers_to_create .append (
332- ConferenceVoucher (
333- conference_id = grant .conference_id ,
334- user_id = grant .user_id ,
335- voucher_code = ConferenceVoucher .generate_code (),
336- voucher_type = ConferenceVoucher .VoucherType .GRANT ,
337- )
338- )
339+ if existing .voucher_type in (
340+ ConferenceVoucher .VoucherType .GRANT ,
341+ ConferenceVoucher .VoucherType .SPEAKER ,
342+ ):
339343 continue
340344
341- if existing_voucher .voucher_type == ConferenceVoucher .VoucherType .CO_SPEAKER :
345+ if existing .voucher_type == ConferenceVoucher .VoucherType .CO_SPEAKER :
342346 messages .warning (
343347 request ,
344- f"Grant for { grant .name } already has a Co-Speaker voucher. Upgrading to a Grant voucher." ,
348+ f"Grant for { grant .name } already has a Co-Speaker voucher. "
349+ "Upgrading to a Grant voucher." ,
345350 )
346351 create_change_admin_log_entry (
347352 request .user ,
348- existing_voucher ,
353+ existing ,
349354 change_message = "Upgraded Co-Speaker voucher to Grant voucher." ,
350355 )
351356 create_change_admin_log_entry (
352357 request .user ,
353358 grant ,
354359 change_message = "Updated existing Co-Speaker voucher to grant." ,
355360 )
356- existing_voucher .voucher_type = ConferenceVoucher .VoucherType .GRANT
357- vouchers_to_update .append (existing_voucher )
358-
359- ConferenceVoucher .objects .bulk_create (vouchers_to_create , ignore_conflicts = True )
360- ConferenceVoucher .objects .bulk_update (vouchers_to_update , ["voucher_type" ])
361+ existing .voucher_type = ConferenceVoucher .VoucherType .GRANT
362+ existing .save (update_fields = ["voucher_type" ])
361363
362364 messages .success (request , "Vouchers created!" )
363365
0 commit comments