Skip to content

Commit a9ad901

Browse files
committed
cospeakers support
1 parent 6d57c51 commit a9ad901

File tree

3 files changed

+90
-12
lines changed

3 files changed

+90
-12
lines changed

backend/schedule/models.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,12 +309,13 @@ def speakers(self):
309309
if self.submission_id:
310310
speakers.append(self.submission.speaker)
311311

312-
speakers.extend([speaker.user for speaker in self.additional_speakers.all()])
313-
314312
if self.keynote_id:
315-
for speaker_keynote in self.keynote.speakers.all():
313+
for speaker_keynote in self.keynote.speakers.order_by("id").all():
316314
speakers.append(speaker_keynote.user)
317315

316+
speakers.extend(
317+
[speaker.user for speaker in self.additional_speakers.order_by("id").all()]
318+
)
318319
return speakers
319320

320321
def clean(self):

backend/schedule/tasks.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -381,24 +381,45 @@ def process_schedule_items_videos_to_upload():
381381
@app.task
382382
def create_and_send_voucher_to_speaker(schedule_item_id: int):
383383
schedule_item = ScheduleItem.objects.get(id=schedule_item_id)
384+
speakers = schedule_item.speakers
384385

385-
if not schedule_item.submission_id:
386+
if not speakers:
386387
return
387388

389+
speaker = speakers[0]
390+
co_speaker = speakers[1] if len(speakers) > 1 else None
391+
392+
_send_conference_voucher(
393+
speaker,
394+
schedule_item.conference,
395+
ConferenceVoucher.VoucherType.SPEAKER,
396+
)
397+
398+
if co_speaker:
399+
_send_conference_voucher(
400+
co_speaker,
401+
schedule_item.conference,
402+
ConferenceVoucher.VoucherType.CO_SPEAKER,
403+
)
404+
405+
406+
def _send_conference_voucher(user, conference, voucher_type):
388407
conference_voucher = (
389-
ConferenceVoucher.objects.for_conference(schedule_item.conference)
390-
.for_user(schedule_item.submission.speaker)
391-
.first()
408+
ConferenceVoucher.objects.for_conference(conference).for_user(user).first()
392409
)
393410

394411
if conference_voucher:
395-
# Speaker already has a voucher
412+
logger.info(
413+
"User %s already has a voucher for conference %s, not creating a new one",
414+
user.id,
415+
conference.id,
416+
)
396417
return
397418

398419
conference_voucher = create_conference_voucher(
399-
conference=schedule_item.conference,
400-
user=schedule_item.submission.speaker,
401-
voucher_type=ConferenceVoucher.VoucherType.SPEAKER,
420+
conference=conference,
421+
user=user,
422+
voucher_type=voucher_type,
402423
)
403424

404425
send_conference_voucher_email.delay(conference_voucher_id=conference_voucher.id)

backend/schedule/tests/test_tasks.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
upload_schedule_item_video,
2525
)
2626
from schedule.tests.factories import (
27+
ScheduleItemAdditionalSpeakerFactory,
2728
ScheduleItemFactory,
2829
ScheduleItemSentForVideoUploadFactory,
2930
)
@@ -762,6 +763,61 @@ def test_create_and_send_voucher_to_speaker(mocker):
762763
mock_send_email.delay.assert_called_once()
763764

764765

766+
def test_create_and_send_voucher_to_speaker_to_speaker_and_co_speakers(mocker):
767+
mock_create = mocker.patch(
768+
"conferences.vouchers.create_voucher", return_value={"id": 123}
769+
)
770+
mock_send_email = mocker.patch("schedule.tasks.send_conference_voucher_email")
771+
772+
schedule_item = ScheduleItemFactory(
773+
type=ScheduleItem.TYPES.talk,
774+
)
775+
additional_speaker_1 = ScheduleItemAdditionalSpeakerFactory(
776+
scheduleitem=schedule_item
777+
).user
778+
additional_speaker_2 = ScheduleItemAdditionalSpeakerFactory(
779+
scheduleitem=schedule_item
780+
).user
781+
782+
create_and_send_voucher_to_speaker(schedule_item.id)
783+
784+
speaker_voucher = (
785+
ConferenceVoucher.objects.for_conference(schedule_item.conference)
786+
.filter(
787+
user=schedule_item.submission.speaker,
788+
voucher_type=ConferenceVoucher.VoucherType.SPEAKER,
789+
)
790+
.get()
791+
)
792+
793+
co_speaker_voucher = (
794+
ConferenceVoucher.objects.for_conference(schedule_item.conference)
795+
.filter(
796+
user=additional_speaker_1,
797+
voucher_type=ConferenceVoucher.VoucherType.CO_SPEAKER,
798+
)
799+
.get()
800+
)
801+
802+
assert not (
803+
ConferenceVoucher.objects.for_conference(schedule_item.conference)
804+
.filter(
805+
user=additional_speaker_2,
806+
voucher_type=ConferenceVoucher.VoucherType.CO_SPEAKER,
807+
)
808+
.exists()
809+
)
810+
811+
assert mock_create.call_count == 2
812+
mock_send_email.delay.assert_has_calls(
813+
[
814+
mock.call(conference_voucher_id=speaker_voucher.id),
815+
mock.call(conference_voucher_id=co_speaker_voucher.id),
816+
],
817+
any_order=True,
818+
)
819+
820+
765821
def test_create_and_send_voucher_to_speaker_works_if_existing_voucher_is_for_different_conf(
766822
mocker,
767823
):
@@ -808,7 +864,7 @@ def test_create_and_send_voucher_to_speaker_does_nothing_if_voucher_exists(mocke
808864
mock_send_email.delay.assert_not_called()
809865

810866

811-
def test_create_and_send_voucher_to_speaker_does_nothing_if_schedule_item_does_not_have_submission(
867+
def test_create_and_send_voucher_to_speaker_does_nothing_if_schedule_item_does_not_hav_speakers(
812868
mocker,
813869
):
814870
mock_create = mocker.patch("conferences.vouchers.create_voucher")

0 commit comments

Comments
 (0)