New implementation of sales channels (#4111)

Co-authored-by: Martin Gross <gross@rami.io>
This commit is contained in:
Raphael Michel
2024-06-30 19:24:30 +02:00
committed by GitHub
parent 95511b0330
commit 4fb5c6bef0
174 changed files with 2902 additions and 616 deletions

View File

@@ -2,7 +2,7 @@
from django.db import migrations
from pretix.base.channels import get_all_sales_channels
from pretix.base.channels import get_all_sales_channel_types
def set_sales_channels(apps, schema_editor):
@@ -11,7 +11,7 @@ def set_sales_channels(apps, schema_editor):
# Therefore, for existing events, we enable all sales channels
Event_SettingsStore = apps.get_model('pretixbase', 'Event_SettingsStore')
Event = apps.get_model('pretixbase', 'Event')
all_sales_channels = "[" + ", ".join('"' + sc + '"' for sc in get_all_sales_channels()) + "]"
all_sales_channels = "[" + ", ".join('"' + sc + '"' for sc in get_all_sales_channel_types()) + "]"
batch_size = 1000
Event_SettingsStore.objects.bulk_create([
Event_SettingsStore(

View File

@@ -3,7 +3,7 @@
from django.db import migrations
import pretix.base.models.fields
from pretix.base.channels import get_all_sales_channels
from pretix.base.channels import get_all_sales_channel_types
class Migration(migrations.Migration):
@@ -15,6 +15,6 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='event',
name='sales_channels',
field=pretix.base.models.fields.MultiStringField(default=list(get_all_sales_channels().keys())),
field=pretix.base.models.fields.MultiStringField(default=list(get_all_sales_channel_types().keys())),
),
]

View File

@@ -0,0 +1,110 @@
# Generated by Django 4.2.8 on 2024-03-24 17:43
import django.db.models.deletion
import i18nfield.fields
from django.db import migrations, models
import pretix.base.models.fields
class Migration(migrations.Migration):
dependencies = [
("pretixbase", "0264_order_internal_secret"),
]
operations = [
migrations.CreateModel(
name="SalesChannel",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False
),
),
("label", i18nfield.fields.I18nCharField(max_length=200)),
("identifier", models.CharField(max_length=200)),
("type", models.CharField(max_length=200)),
("position", models.PositiveIntegerField(default=0)),
("configuration", models.JSONField(default=dict)),
],
),
migrations.RenameField(
model_name="checkinlist",
old_name="auto_checkin_sales_channels",
new_name="auto_checkin_sales_channel_types",
),
migrations.AddField(
model_name="discount",
name="all_sales_channels",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="event",
name="all_sales_channels",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="item",
name="all_sales_channels",
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name="itemvariation",
name="all_sales_channels",
field=models.BooleanField(default=True),
),
migrations.RenameField(
model_name="order",
old_name="sales_channel",
new_name="sales_channel_type",
),
migrations.AddField(
model_name="saleschannel",
name="organizer",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="sales_channels",
to="pretixbase.organizer",
),
),
migrations.AddField(
model_name="discount",
name="limit_sales_channels",
field=models.ManyToManyField(to="pretixbase.saleschannel"),
),
migrations.AddField(
model_name="event",
name="limit_sales_channels",
field=models.ManyToManyField(to="pretixbase.saleschannel"),
),
migrations.AddField(
model_name="item",
name="limit_sales_channels",
field=models.ManyToManyField(to="pretixbase.saleschannel"),
),
migrations.AddField(
model_name="itemvariation",
name="limit_sales_channels",
field=models.ManyToManyField(to="pretixbase.saleschannel"),
),
migrations.AddField(
model_name="checkinlist",
name="auto_checkin_sales_channels",
field=models.ManyToManyField(to="pretixbase.saleschannel"),
),
migrations.AddField(
model_name="order",
name="sales_channel",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.PROTECT,
to="pretixbase.saleschannel",
),
),
migrations.AlterUniqueTogether(
name="saleschannel",
unique_together={("organizer", "identifier")},
),
]

View File

@@ -0,0 +1,84 @@
# Generated by Django 4.2.8 on 2024-03-24 17:55
from django.db import migrations
from i18nfield.strings import LazyI18nString
from pretix.base.channels import get_all_sales_channel_types
def create_sales_channels(apps, schema_editor):
channel_types = get_all_sales_channel_types()
type_to_channel = dict()
full_discount_set = set()
full_set = set()
Organizer = apps.get_model("pretixbase", "Organizer")
for o in Organizer.objects.all().iterator():
for i, t in enumerate(channel_types.values()):
if not t.default_created:
continue
type_to_channel[t.identifier, o.pk] = o.sales_channels.get_or_create(
type=t.identifier,
defaults=dict(
position=i,
identifier=t.identifier,
label=LazyI18nString.from_gettext(t.verbose_name),
),
)[0]
full_set.add(t.identifier)
if t.discounts_supported:
full_discount_set.add(t.identifier)
Event = apps.get_model("pretixbase", "Event")
for d in Event.objects.all().iterator():
if set(d.sales_channels) != full_set:
d.all_sales_channels = False
d.save()
for s in d.sales_channels:
d.limit_sales_channels.add(type_to_channel[s, d.organizer_id])
Item = apps.get_model("pretixbase", "Item")
for d in Item.objects.select_related("event").iterator():
if set(d.sales_channels) != full_set:
d.all_sales_channels = False
d.save()
for s in d.sales_channels:
d.limit_sales_channels.add(type_to_channel[s, d.event.organizer_id])
ItemVariation = apps.get_model("pretixbase", "ItemVariation")
for d in ItemVariation.objects.select_related("item__event").iterator():
if set(d.sales_channels) != full_set:
d.all_sales_channels = False
d.save()
for s in d.sales_channels:
d.limit_sales_channels.add(type_to_channel[s, d.item.event.organizer_id])
Discount = apps.get_model("pretixbase", "Discount")
for d in Discount.objects.select_related("event").iterator():
if set(d.sales_channels) != full_discount_set:
d.all_sales_channels = False
d.save()
for s in d.sales_channels:
d.limit_sales_channels.add(type_to_channel[s, d.event.organizer_id])
CheckinList = apps.get_model("pretixbase", "CheckinList")
for c in CheckinList.objects.select_related("event").iterator():
for s in c.auto_checkin_sales_channel_types:
c.auto_checkin_sales_channels.add(type_to_channel[s, c.event.organizer_id])
Order = apps.get_model("pretixbase", "Order")
for (k, orgid), v in type_to_channel.items():
Order.objects.filter(sales_channel_type=k, event__organizer_id=orgid, sales_channel__isnull=True).update(
sales_channel=v
)
class Migration(migrations.Migration):
dependencies = [
("pretixbase", "0265_saleschannel_and_more"),
]
operations = [
migrations.RunPython(create_sales_channels, migrations.RunPython.noop),
]

View File

@@ -0,0 +1,46 @@
# Generated by Django 4.2.8 on 2024-03-25 13:34
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("pretixbase", "0266_saleschannel_migrate_data"),
]
operations = [
migrations.RemoveField(
model_name="checkinlist",
name="auto_checkin_sales_channel_types",
),
migrations.RemoveField(
model_name="discount",
name="sales_channels",
),
migrations.RemoveField(
model_name="event",
name="sales_channels",
),
migrations.RemoveField(
model_name="item",
name="sales_channels",
),
migrations.RemoveField(
model_name="itemvariation",
name="sales_channels",
),
migrations.RemoveField(
model_name="order",
name="sales_channel_type",
),
migrations.AlterField(
model_name="order",
name="sales_channel",
field=models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
to="pretixbase.saleschannel",
),
),
]