diff --git a/backend/api/conferences/types.py b/backend/api/conferences/types.py
index 70b9df3a90..2f1076cd67 100644
--- a/backend/api/conferences/types.py
+++ b/backend/api/conferences/types.py
@@ -378,7 +378,7 @@ def is_running(self, info: Info) -> bool:
@strawberry.field
def sponsor_benefits(self) -> list[SponsorBenefit]:
- benefits = self.sponsor_benefits.all()
+ benefits = self.sponsor_benefits.order_by("order").all()
return [
SponsorBenefit(
@@ -391,9 +391,13 @@ def sponsor_benefits(self) -> list[SponsorBenefit]:
@strawberry.field
def sponsor_levels(self) -> list[SponsorLevel]:
- levels = SponsorLevelModel.objects.filter(conference=self).prefetch_related(
- "sponsorlevelbenefit_set",
- "sponsorlevelbenefit_set__benefit",
+ levels = (
+ SponsorLevelModel.objects.filter(conference=self)
+ .prefetch_related(
+ "sponsorlevelbenefit_set",
+ "sponsorlevelbenefit_set__benefit",
+ )
+ .order_by("order")
)
return [
@@ -416,7 +420,7 @@ def sponsor_levels(self) -> list[SponsorLevel]:
@strawberry.field
def sponsor_special_options(self) -> list[SponsorSpecialOption]:
- options = self.sponsor_special_options.all()
+ options = self.sponsor_special_options.order_by("order").all()
return [
SponsorSpecialOption(
diff --git a/backend/sponsors/admin.py b/backend/sponsors/admin.py
index 52aa50766b..6055c8e4b4 100644
--- a/backend/sponsors/admin.py
+++ b/backend/sponsors/admin.py
@@ -22,9 +22,12 @@ class SponsorAdmin(OrderedModelAdmin):
@admin.register(SponsorBenefit)
-class SponsorBenefitAdmin(admin.ModelAdmin):
- list_display = ("name", "conference", "category")
- list_filter = ("category",)
+class SponsorBenefitAdmin(OrderedModelAdmin, admin.ModelAdmin):
+ list_display = ("name", "conference", "category", "order", "move_up_down_links")
+ list_filter = (
+ "conference",
+ "category",
+ )
class SponsorLevelBenefitInline(admin.TabularInline):
@@ -43,8 +46,8 @@ class SponsorLevelAdmin(OrderedModelAdmin):
@admin.register(SponsorSpecialOption)
-class SponsorSpecialOptionAdmin(admin.ModelAdmin):
- list_display = ("name", "conference", "price")
+class SponsorSpecialOptionAdmin(OrderedModelAdmin, admin.ModelAdmin):
+ list_display = ("name", "conference", "price", "move_up_down_links")
list_filter = ("conference",)
diff --git a/backend/sponsors/management/commands/fill_sponsor_data.py b/backend/sponsors/management/commands/fill_sponsor_data.py
index 005963ed2a..b012b61aa8 100644
--- a/backend/sponsors/management/commands/fill_sponsor_data.py
+++ b/backend/sponsors/management/commands/fill_sponsor_data.py
@@ -25,43 +25,43 @@ def handle(self, *args, **kwargs):
levels = [
{
"name": "Keystone",
- "price": "€ 10,000",
+ "price": 10_000,
"slots": 1,
"highlight_color": "blue",
},
{
"name": "Gold",
- "price": "€ 7,000",
+ "price": 7_000,
"slots": 2,
"highlight_color": "yellow",
},
{
"name": "Silver",
- "price": "€ 5,000",
+ "price": 5_000,
"slots": 5,
"highlight_color": "gray",
},
{
"name": "Bronze",
- "price": "€ 3,000",
+ "price": 3_000,
"slots": 0,
"highlight_color": "brown",
},
{
"name": "Patron",
- "price": "€ 1,000",
+ "price": 2_000,
"slots": 0,
"highlight_color": "purple",
},
{
"name": "Startup",
- "price": "€ 500",
+ "price": 500,
"slots": 0,
"highlight_color": "green",
},
{
"name": "Diversity",
- "price": "€ 1,000",
+ "price": 1_000,
"slots": 0,
"highlight_color": "pink",
},
diff --git a/backend/sponsors/migrations/0014_alter_sponsorbenefit_options_and_more.py b/backend/sponsors/migrations/0014_alter_sponsorbenefit_options_and_more.py
new file mode 100644
index 0000000000..9ef28857bc
--- /dev/null
+++ b/backend/sponsors/migrations/0014_alter_sponsorbenefit_options_and_more.py
@@ -0,0 +1,33 @@
+# Generated by Django 5.1.1 on 2024-11-09 18:30
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('sponsors', '0013_sponsorlevel_price_sponsorlevel_slots_and_more'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='sponsorbenefit',
+ options={'ordering': ('order',), 'verbose_name': 'sponsor benefit', 'verbose_name_plural': 'sponsor benefits'},
+ ),
+ migrations.AlterModelOptions(
+ name='sponsorspecialoption',
+ options={'ordering': ('order',), 'verbose_name': 'special option', 'verbose_name_plural': 'special options'},
+ ),
+ migrations.AddField(
+ model_name='sponsorbenefit',
+ name='order',
+ field=models.PositiveIntegerField(db_index=True, default=0, editable=False, verbose_name='order'),
+ preserve_default=False,
+ ),
+ migrations.AddField(
+ model_name='sponsorspecialoption',
+ name='order',
+ field=models.PositiveIntegerField(db_index=True, default=0, editable=False, verbose_name='order'),
+ preserve_default=False,
+ ),
+ ]
diff --git a/backend/sponsors/models.py b/backend/sponsors/models.py
index 76667575a6..4aaee220c8 100644
--- a/backend/sponsors/models.py
+++ b/backend/sponsors/models.py
@@ -71,13 +71,7 @@ class Meta(OrderedModel.Meta):
unique_together = ["name", "conference"]
-class SponsorBenefit(TimeStampedModel):
- conference = models.ForeignKey(
- "conferences.Conference",
- on_delete=models.CASCADE,
- related_name="sponsor_benefits",
- )
-
+class SponsorBenefit(OrderedModel, TimeStampedModel):
class Category(models.TextChoices):
CONTENT = "content", _("Sponsored Content")
BOOTH = "booth", _("Booth")
@@ -86,11 +80,19 @@ class Category(models.TextChoices):
RECRUITING = "recruiting", _("Recruiting")
ATTENDEE_INTERACTION = "attendee_interaction", _("Attendee Interaction")
+ conference = models.ForeignKey(
+ "conferences.Conference",
+ on_delete=models.CASCADE,
+ related_name="sponsor_benefits",
+ )
+
name = I18nCharField(_("name"), max_length=100)
category = models.CharField(_("category"), max_length=100, choices=Category.choices)
description = I18nTextField(_("description"), blank=True)
- class Meta:
+ order_with_respect_to = "conference"
+
+ class Meta(OrderedModel.Meta):
unique_together = ["name", "conference"]
verbose_name = _("sponsor benefit")
verbose_name_plural = _("sponsor benefits")
@@ -119,7 +121,7 @@ def __str__(self):
return f"{self.sponsor_level} - {self.benefit} ({self.value})"
-class SponsorSpecialOption(models.Model):
+class SponsorSpecialOption(OrderedModel, models.Model):
conference = models.ForeignKey(
"conferences.Conference",
on_delete=models.CASCADE,
@@ -128,8 +130,9 @@ class SponsorSpecialOption(models.Model):
name = models.CharField(_("name"), max_length=255)
description = models.TextField(_("description"))
price = models.DecimalField(_("price"), max_digits=10, decimal_places=2)
+ order_with_respect_to = "conference"
- class Meta:
+ class Meta(OrderedModel.Meta):
verbose_name = _("special option")
verbose_name_plural = _("special options")
unique_together = ["name", "conference"]
diff --git a/frontend/src/components/brochure/index.tsx b/frontend/src/components/brochure/index.tsx
index 1443466f72..36e6f169fa 100644
--- a/frontend/src/components/brochure/index.tsx
+++ b/frontend/src/components/brochure/index.tsx
@@ -55,12 +55,12 @@ export function Brochure({
/>
- {compile(whySponsor.text).tree} -
++ {compile(whySponsor.text).tree} +
+