mirror of
https://github.com/pretix/pretix.git
synced 2026-05-07 15:34:02 +00:00
New implementation of sales channels (#4111)
Co-authored-by: Martin Gross <gross@rami.io>
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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())),
|
||||
),
|
||||
]
|
||||
|
||||
110
src/pretix/base/migrations/0265_saleschannel_and_more.py
Normal file
110
src/pretix/base/migrations/0265_saleschannel_and_more.py
Normal 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")},
|
||||
),
|
||||
]
|
||||
84
src/pretix/base/migrations/0266_saleschannel_migrate_data.py
Normal file
84
src/pretix/base/migrations/0266_saleschannel_migrate_data.py
Normal 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),
|
||||
]
|
||||
46
src/pretix/base/migrations/0267_remove_old_sales_channels.py
Normal file
46
src/pretix/base/migrations/0267_remove_old_sales_channels.py
Normal 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",
|
||||
),
|
||||
),
|
||||
]
|
||||
Reference in New Issue
Block a user