Skip to content

Commit

Permalink
Update fields
Browse files Browse the repository at this point in the history
  • Loading branch information
marcoacierno committed Sep 18, 2024
1 parent f84353f commit fcd380b
Show file tree
Hide file tree
Showing 10 changed files with 92 additions and 73 deletions.
49 changes: 15 additions & 34 deletions backend/conferences/admin/actions.py
Original file line number Diff line number Diff line change
@@ -1,69 +1,50 @@
from django.contrib import admin, messages
from conferences.models import ConferenceVoucher
from custom_admin.admin import validate_single_conference_selection
from pretix import create_voucher
from schedule.tasks import send_speaker_voucher_email


@admin.action(description="Send voucher via email")
@validate_single_conference_selection
def send_voucher_via_email(modeladmin, request, queryset):
is_filtered_by_conference = (
queryset.values_list("conference_id").distinct().count() == 1
)

if not is_filtered_by_conference:
messages.error(request, "Please select only one conference")
return

count = 0
for speaker_voucher in queryset.filter(pretix_voucher_id__isnull=False):
send_speaker_voucher_email.delay(speaker_voucher_id=speaker_voucher.id)
for conference_voucher in queryset.filter(pretix_voucher_id__isnull=False):
send_speaker_voucher_email.delay(speaker_voucher_id=conference_voucher.id)
count = count + 1

messages.success(request, f"{count} Voucher emails scheduled!")


@admin.action(description="Create speaker vouchers on Pretix")
@validate_single_conference_selection
def create_speaker_vouchers_on_pretix(modeladmin, request, queryset):
is_filtered_by_conference = (
queryset.values_list("conference_id").distinct().count() == 1
)

if not is_filtered_by_conference:
messages.error(request, "Please select only one conference")
return

conference = queryset.only("conference_id").first().conference

if not conference.pretix_speaker_voucher_quota_id:
if not conference.pretix_conference_voucher_quota_id:
messages.error(
request,
"Please configure the speaker voucher quota ID in the conference settings",
"Please configure the conference voucher quota ID in the conference settings",
)
return

count = 0

for speaker_voucher in queryset.filter(pretix_voucher_id__isnull=True):
if speaker_voucher.voucher_type == ConferenceVoucher.VoucherType.SPEAKER:
price_mode = "set"
value = "0.00"
elif speaker_voucher.voucher_type == ConferenceVoucher.VoucherType.CO_SPEAKER:
price_mode = "percent"
value = "25.00"
for conference_voucher in queryset.filter(pretix_voucher_id__isnull=True):
price_mode, value = conference_voucher.get_voucher_configuration()

pretix_voucher = create_voucher(
conference=speaker_voucher.conference,
code=speaker_voucher.voucher_code,
comment=f"Voucher for user_id={speaker_voucher.user_id}",
conference=conference_voucher.conference,
code=conference_voucher.voucher_code,
comment=f"Voucher for user_id={conference_voucher.user_id}",
tag="speakers",
quota_id=speaker_voucher.conference.pretix_speaker_voucher_quota_id,
quota_id=conference_voucher.conference.pretix_conference_voucher_quota_id,
price_mode=price_mode,
value=value,
)

pretix_voucher_id = pretix_voucher["id"]
speaker_voucher.pretix_voucher_id = pretix_voucher_id
speaker_voucher.save()
conference_voucher.pretix_voucher_id = pretix_voucher_id
conference_voucher.save()
count = count + 1

messages.success(request, f"{count} Vouchers created on Pretix!")
4 changes: 2 additions & 2 deletions backend/conferences/admin/conference.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,8 @@ class ConferenceAdmin(
{"fields": ("pretix_organizer_id", "pretix_event_id", "pretix_event_url")},
),
(
"Speaker Voucher",
{"fields": ("pretix_speaker_voucher_quota_id",)},
"Conference Voucher",
{"fields": ("pretix_conference_voucher_quota_id",)},
),
(
"Slack Integration",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Generated by Django 5.0.8 on 2024-09-18 22:09

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('conferences', '0046_rename_speaker_voucher'),
]

operations = [
migrations.AlterModelOptions(
name='conferencevoucher',
options={'verbose_name': 'Voucher', 'verbose_name_plural': 'Vouchers'},
),
migrations.RenameField(
model_name='conference',
old_name='pretix_speaker_voucher_quota_id',
new_name='pretix_conference_voucher_quota_id',
),
migrations.AlterField(
model_name='conferencevoucher',
name='voucher_code',
field=models.TextField(help_text='Voucher code generated for this user. A user can only have one code associated to them.'),
),
migrations.AlterField(
model_name='conferencevoucher',
name='voucher_type',
field=models.CharField(choices=[('speaker', 'Speaker'), ('co_speaker', 'Co-Speaker'), ('grant', 'Grant')], max_length=20),
),
]
2 changes: 1 addition & 1 deletion backend/conferences/models/conference.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class Conference(GeoLocalizedModel, TimeFramedModel, TimeStampedModel):
_("pretix hotel bed layout question id"), blank=True, null=True
)

pretix_speaker_voucher_quota_id = models.IntegerField(
pretix_conference_voucher_quota_id = models.IntegerField(
_("Pretix speaker voucher quota id"),
blank=True,
null=True,
Expand Down
13 changes: 13 additions & 0 deletions backend/conferences/models/conference_voucher.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,19 @@ class VoucherType(models.TextChoices):
help_text=_("When the email was last sent"), blank=True, null=True
)

def get_voucher_configuration(self):
if self.voucher_type in (
ConferenceVoucher.VoucherType.SPEAKER,
ConferenceVoucher.VoucherType.GRANT,
):
price_mode = "set"
value = "0.00"
elif self.voucher_type == ConferenceVoucher.VoucherType.CO_SPEAKER:
price_mode = "percent"
value = "25.00"

return price_mode, value

@staticmethod
def generate_code() -> str:
charset = list("ABCDEFGHKLMNPQRSTUVWXYZ23456789")
Expand Down
16 changes: 8 additions & 8 deletions backend/conferences/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ def test_send_voucher_via_email(
"conferences.admin.actions.send_speaker_voucher_email"
)

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)
schedule_item_1 = ScheduleItemFactory(
type=ScheduleItem.TYPES.talk,
conference=conference,
Expand Down Expand Up @@ -242,8 +242,8 @@ def test_send_voucher_via_email_requires_filtering_by_conference(
"conferences.admin.actions.send_speaker_voucher_email"
)

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference_2 = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)
conference_2 = ConferenceFactory(pretix_conference_voucher_quota_id=123)

schedule_item_1 = ScheduleItemFactory(
type=ScheduleItem.TYPES.talk,
Expand Down Expand Up @@ -293,7 +293,7 @@ def test_create_speaker_vouchers_on_pretix(rf, mocker):
)
mocker.patch("conferences.admin.actions.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)

voucher_1 = ConferenceVoucherFactory(
conference=conference,
Expand Down Expand Up @@ -371,7 +371,7 @@ def test_create_speaker_vouchers_on_pretix_only_for_missing_ones(rf, mocker):
)
mocker.patch("conferences.admin.actions.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)

voucher_1 = ConferenceVoucherFactory(
conference=conference,
Expand Down Expand Up @@ -420,8 +420,8 @@ def test_create_speaker_vouchers_on_pretix_doesnt_work_with_multiple_conferences
)
mock_messages = mocker.patch("conferences.admin.actions.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference_2 = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)
conference_2 = ConferenceFactory(pretix_conference_voucher_quota_id=123)

voucher_1 = ConferenceVoucherFactory(
conference=conference,
Expand Down Expand Up @@ -469,7 +469,7 @@ def test_create_speaker_vouchers_on_pretix_doesnt_work_without_pretix_config(
)
mock_messages = mocker.patch("conferences.admin.actions.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=None)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=None)

voucher_1 = ConferenceVoucherFactory(
conference=conference,
Expand Down
4 changes: 2 additions & 2 deletions backend/grants/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ def _generate_voucher_code(prefix: str) -> str:
def create_grant_vouchers_on_pretix(modeladmin, request, queryset):
conference = queryset.first().conference

if not conference.pretix_speaker_voucher_quota_id:
if not conference.pretix_conference_voucher_quota_id:
messages.error(
request,
"Please configure the grant voucher quota ID in the conference settings",
Expand All @@ -309,7 +309,7 @@ def create_grant_vouchers_on_pretix(modeladmin, request, queryset):
code=voucher_code,
comment=f"Voucher for user_id={grant.user_id}",
tag="grants",
quota_id=grant.conference.pretix_speaker_voucher_quota_id,
quota_id=grant.conference.pretix_conference_voucher_quota_id,
price_mode="set",
value="0.00",
)
Expand Down
18 changes: 9 additions & 9 deletions backend/grants/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ def test_send_voucher_via_email(
mocker.patch("grants.admin.messages")
mock_send_email = mocker.patch("grants.admin.send_grant_voucher_email")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)

grant = GrantFactory(
status=Grant.Status.confirmed,
Expand All @@ -214,8 +214,8 @@ def test_send_voucher_via_email_requires_filtering_by_conference(
rf,
mocker,
):
conference = ConferenceFactory(pretix_speaker_voucher_quota_id=1234)
conference_2 = ConferenceFactory(pretix_speaker_voucher_quota_id=1234)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=1234)
conference_2 = ConferenceFactory(pretix_conference_voucher_quota_id=1234)
mock_messages = mocker.patch("custom_admin.admin.messages")
mock_send_email = mocker.patch("grants.admin.send_grant_voucher_email")
GrantFactory(
Expand Down Expand Up @@ -254,7 +254,7 @@ def test_create_grant_vouchers_on_pretix(rf, mocker):
)
mock_messages = mocker.patch("grants.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)

grant_1 = GrantFactory(
status=Grant.Status.confirmed,
Expand Down Expand Up @@ -321,7 +321,7 @@ def test_create_grant_vouchers_on_pretix_only_for_missing_ones(rf, mocker):
mocker.patch("grants.admin._generate_voucher_code", return_value="GRANT-123ZYZ")
mocker.patch("grants.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)

grant_1 = GrantFactory(
status=Grant.Status.confirmed,
Expand Down Expand Up @@ -364,8 +364,8 @@ def test_create_grant_vouchers_on_pretix_only_for_missing_ones(rf, mocker):
def test_create_grant_vouchers_on_pretix_doesnt_work_with_multiple_conferences(
rf, mocker
):
conference = ConferenceFactory(pretix_speaker_voucher_quota_id=1234)
conference_2 = ConferenceFactory(pretix_speaker_voucher_quota_id=1234)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=1234)
conference_2 = ConferenceFactory(pretix_conference_voucher_quota_id=1234)
mock_messages = mocker.patch("custom_admin.admin.messages")

mock_create_voucher = mocker.patch(
Expand Down Expand Up @@ -415,7 +415,7 @@ def test_create_grant_vouchers_on_pretix_doesnt_work_without_pretix_config(rf, m
)
mock_messages = mocker.patch("grants.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=None)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=None)

grant_1 = GrantFactory(
status=Grant.Status.confirmed,
Expand Down Expand Up @@ -458,7 +458,7 @@ def test_create_grant_vouchers_only_for_confirmed_grants(rf, mocker):
)
mocker.patch("grants.admin._generate_voucher_code", return_value="GRANT-123ZYZ")
mock_messages = mocker.patch("grants.admin.messages")
conference = ConferenceFactory(pretix_speaker_voucher_quota_id=1223)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=1223)
grant_1 = GrantFactory(
status=Grant.Status.refused,
conference=conference,
Expand Down
9 changes: 1 addition & 8 deletions backend/schedule/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@


@admin.action(description="Mark Speakers to receive Vouchers")
@validate_single_conference_selection
def mark_speakers_to_receive_vouchers(modeladmin, request, queryset):
queryset = queryset.filter(
type__in=[
Expand All @@ -53,14 +54,6 @@ def mark_speakers_to_receive_vouchers(modeladmin, request, queryset):
],
)

is_filtered_by_conference = (
queryset.values_list("conference_id").distinct().count() == 1
)

if not is_filtered_by_conference:
messages.error(request, "Please select only one conference")
return

excluded_speakers = (
queryset.filter(exclude_from_voucher_generation=True)
.values_list("submission__speaker_id", flat=True)
Expand Down
18 changes: 9 additions & 9 deletions backend/schedule/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def test_mark_speakers_to_receive_vouchers(rf, mocker):
)
mocker.patch("schedule.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)
schedule_item_1 = ScheduleItemFactory(
type=ScheduleItem.TYPES.talk,
conference=conference,
Expand Down Expand Up @@ -85,7 +85,7 @@ def test_mark_speakers_to_receive_vouchers_includes_co_speakers(rf, mocker):
)
mocker.patch("schedule.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)
schedule_item_1 = ScheduleItemFactory(
type=ScheduleItem.TYPES.talk,
conference=conference,
Expand Down Expand Up @@ -127,7 +127,7 @@ def test_additional_speakers_without_main_speaker_are_marked_for_a_speaker_vouch
)
mocker.patch("schedule.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)
schedule_item_1 = ScheduleItemFactory(
type=ScheduleItem.TYPES.talk,
conference=conference,
Expand Down Expand Up @@ -163,7 +163,7 @@ def test_speaker_with_both_main_talk_and_co_speaker_gets_a_speaker_voucher(
)
mocker.patch("schedule.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)

schedule_item_2 = ScheduleItemFactory(
type=ScheduleItem.TYPES.talk,
Expand Down Expand Up @@ -210,8 +210,8 @@ def test_mark_speakers_to_receive_vouchers_doesnt_work_with_multiple_conferences
)
mock_messages = mocker.patch("schedule.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference_2 = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)
conference_2 = ConferenceFactory(pretix_conference_voucher_quota_id=123)

ScheduleItemFactory(
type=ScheduleItem.TYPES.talk,
Expand Down Expand Up @@ -248,7 +248,7 @@ def test_mark_speakers_to_receive_vouchers_only_created_once(
)
mocker.patch("schedule.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)
schedule_item_1 = ScheduleItemFactory(
type=ScheduleItem.TYPES.talk,
conference=conference,
Expand Down Expand Up @@ -297,7 +297,7 @@ def test_mark_speakers_to_receive_vouchers_ignores_excluded_speakers(rf, mocker)
)
mocker.patch("schedule.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)
schedule_item_1 = ScheduleItemFactory(
type=ScheduleItem.TYPES.talk,
conference=conference,
Expand Down Expand Up @@ -334,7 +334,7 @@ def test_mark_speakers_to_receive_vouchers_ignores_excluded_speakers_multiple_it
)
mocker.patch("schedule.admin.messages")

conference = ConferenceFactory(pretix_speaker_voucher_quota_id=123)
conference = ConferenceFactory(pretix_conference_voucher_quota_id=123)
schedule_item_1 = ScheduleItemFactory(
type=ScheduleItem.TYPES.talk,
conference=conference,
Expand Down

0 comments on commit fcd380b

Please sign in to comment.