diff --git a/src/make_testdata.py b/src/make_testdata.py index bf997683a8..9e2e59f619 100644 --- a/src/make_testdata.py +++ b/src/make_testdata.py @@ -13,9 +13,11 @@ from pretix.base.models import * # NOQA if Organizer.objects.exists(): print("There already is data in your DB!") sys.exit(0) -user = User.objects.get( - identifier='admin@localhost', -) +user = User.objects.get_or_create( + email='admin@localhost', +)[0] +user.set_password('admin') +user.save() organizer = Organizer.objects.create( name='MRMCD e.V', slug='mrmcd' ) diff --git a/src/pretix/base/migrations/0001_initial.py b/src/pretix/base/migrations/0001_initial.py index 198e94e2f4..ef4253f7eb 100644 --- a/src/pretix/base/migrations/0001_initial.py +++ b/src/pretix/base/migrations/0001_initial.py @@ -1,26 +1,18 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import uuid + import django.core.validators import django.db.models.deletion import versions.models from django.conf import settings -from django.contrib.auth.hashers import make_password from django.db import migrations, models import pretix.base.i18n import pretix.base.models -def initial_user(apps, schema_editor): - User = apps.get_model("pretixbase", "User") - user = User(identifier='admin@localhost', email='admin@localhost') - user.is_staff = True - user.is_superuser = True - user.password = make_password('admin') - user.save() - - class Migration(migrations.Migration): dependencies = [ @@ -31,38 +23,58 @@ class Migration(migrations.Migration): migrations.CreateModel( name='User', fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, verbose_name='last login', null=True)), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('identifier', models.CharField(max_length=255, unique=True)), - ('username', models.CharField(max_length=120, blank=True, help_text='Letters, digits and ./+/-/_ only.', null=True)), - ('email', models.EmailField(max_length=254, blank=True, verbose_name='E-mail', db_index=True, null=True)), - ('givenname', models.CharField(max_length=255, blank=True, verbose_name='Given name', null=True)), - ('familyname', models.CharField(max_length=255, blank=True, verbose_name='Family name', null=True)), - ('is_active', models.BooleanField(default=True, verbose_name='Is active')), - ('is_staff', models.BooleanField(default=False, verbose_name='Is site admin')), + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('password', models.CharField(verbose_name='password', max_length=128)), + ('last_login', models.DateTimeField(verbose_name='last login', blank=True, null=True)), + ('is_superuser', models.BooleanField(verbose_name='superuser status', help_text='Designates that this user has all permissions without explicitly assigning them.', default=False)), + ('email', models.EmailField(verbose_name='E-mail', null=True, unique=True, db_index=True, max_length=254, blank=True)), + ('givenname', models.CharField(verbose_name='Given name', blank=True, null=True, max_length=255)), + ('familyname', models.CharField(verbose_name='Family name', blank=True, null=True, max_length=255)), + ('is_active', models.BooleanField(verbose_name='Is active', default=True)), + ('is_staff', models.BooleanField(verbose_name='Is site admin', default=False)), ('date_joined', models.DateTimeField(verbose_name='Date joined', auto_now_add=True)), - ('locale', models.CharField(max_length=50, choices=[('en', 'English'), ('de', 'German')], default='en', verbose_name='Language')), - ('timezone', models.CharField(max_length=100, default='UTC', verbose_name='Timezone')), + ('locale', models.CharField(verbose_name='Language', choices=[('en', 'English'), ('de', 'German'), ('de-informal', 'German (informal)')], default='en', max_length=50)), + ('timezone', models.CharField(verbose_name='Timezone', default='UTC', max_length=100)), + ('groups', models.ManyToManyField(verbose_name='groups', related_query_name='user', help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', to='auth.Group', blank=True)), + ('user_permissions', models.ManyToManyField(verbose_name='user permissions', related_query_name='user', help_text='Specific permissions for this user.', related_name='user_set', to='auth.Permission', blank=True)), ], options={ 'verbose_name_plural': 'Users', 'verbose_name': 'User', }, ), + migrations.CreateModel( + name='CachedFile', + fields=[ + ('id', models.UUIDField(primary_key=True, default=uuid.uuid4, serialize=False)), + ('expires', models.DateTimeField(blank=True, null=True)), + ('date', models.DateTimeField(blank=True, null=True)), + ('filename', models.CharField(max_length=255)), + ('type', models.CharField(max_length=255)), + ('file', models.FileField(upload_to=pretix.base.models.cachedfile_name, blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='CachedTicket', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('provider', models.CharField(max_length=255)), + ('cachedfile', models.ForeignKey(to='pretixbase.CachedFile')), + ], + ), migrations.CreateModel( name='CartPosition', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Price')), + ('session', models.CharField(verbose_name='Session', blank=True, null=True, max_length=255)), + ('price', models.DecimalField(verbose_name='Price', max_digits=10, decimal_places=2)), ('datetime', models.DateTimeField(verbose_name='Date', auto_now_add=True)), ('expires', models.DateTimeField(verbose_name='Expiration date')), - ('attendee_name', models.CharField(max_length=255, blank=True, verbose_name='Attendee name', help_text='Empty, if this product is not an admission ticket', null=True)), + ('attendee_name', models.CharField(verbose_name='Attendee name', blank=True, help_text='Empty, if this product is not an admission ticket', null=True, max_length=255)), ], options={ 'verbose_name_plural': 'Cart positions', @@ -73,40 +85,49 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Event', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('name', pretix.base.i18n.I18nCharField(max_length=200, verbose_name='Name')), - ('slug', models.SlugField(validators=[django.core.validators.RegexValidator(regex='^[a-zA-Z0-9.-]+$', message='The slug may only contain letters, numbers, dots and dashes.')], help_text='Should be short, only contain lowercase letters and numbers, and must be unique among your events. This is being used in addresses and bank transfer references.', verbose_name='Slug')), - ('currency', models.CharField(max_length=10, default='EUR', verbose_name='Default currency')), + ('name', pretix.base.i18n.I18nCharField(verbose_name='Name', max_length=200)), + ('slug', models.SlugField(verbose_name='Slug', help_text='Should be short, only contain lowercase letters and numbers, and must be unique among your events. This is being used in addresses and bank transfer references.', validators=[django.core.validators.RegexValidator(message='The slug may only contain letters, numbers, dots and dashes.', regex='^[a-zA-Z0-9.-]+$')])), + ('currency', models.CharField(verbose_name='Default currency', default='EUR', max_length=10)), ('date_from', models.DateTimeField(verbose_name='Event start time')), - ('date_to', models.DateTimeField(blank=True, verbose_name='Event end time', null=True)), - ('presale_end', models.DateTimeField(blank=True, verbose_name='End of presale', help_text='No products will be sold after this date.', null=True)), - ('presale_start', models.DateTimeField(blank=True, verbose_name='Start of presale', help_text='No products will be sold before this date.', null=True)), - ('plugins', models.TextField(blank=True, verbose_name='Plugins', null=True)), + ('date_to', models.DateTimeField(verbose_name='Event end time', blank=True, null=True)), + ('presale_end', models.DateTimeField(verbose_name='End of presale', blank=True, help_text='No products will be sold after this date.', null=True)), + ('presale_start', models.DateTimeField(verbose_name='Start of presale', blank=True, help_text='No products will be sold before this date.', null=True)), + ('plugins', models.TextField(verbose_name='Plugins', blank=True, null=True)), ], options={ 'verbose_name_plural': 'Events', - 'ordering': ('date_from', 'name'), 'verbose_name': 'Event', + 'ordering': ('date_from', 'name'), }, ), + migrations.CreateModel( + name='EventLock', + fields=[ + ('event', models.CharField(primary_key=True, serialize=False, max_length=36)), + ('date', models.DateTimeField(auto_now=True)), + ('token', models.UUIDField(default=uuid.uuid4)), + ], + ), migrations.CreateModel( name='EventPermission', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('can_change_settings', models.BooleanField(default=True, verbose_name='Can change event settings')), - ('can_change_items', models.BooleanField(default=True, verbose_name='Can change product settings')), - ('can_view_orders', models.BooleanField(default=True, verbose_name='Can view orders')), - ('can_change_orders', models.BooleanField(default=True, verbose_name='Can change orders')), + ('can_change_settings', models.BooleanField(verbose_name='Can change event settings', default=True)), + ('can_change_items', models.BooleanField(verbose_name='Can change product settings', default=True)), + ('can_view_orders', models.BooleanField(verbose_name='Can view orders', default=True)), + ('can_change_permissions', models.BooleanField(verbose_name='Can change permissions', default=True)), + ('can_change_orders', models.BooleanField(verbose_name='Can change orders', default=True)), ('event', versions.models.VersionedForeignKey(to='pretixbase.Event')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='event_perms')), + ('user', models.ForeignKey(related_name='event_perms', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name_plural': 'Event permissions', @@ -116,14 +137,14 @@ class Migration(migrations.Migration): migrations.CreateModel( name='EventSetting', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), ('key', models.CharField(max_length=255)), ('value', models.TextField()), - ('object', versions.models.VersionedForeignKey(to='pretixbase.Event', related_name='setting_objects')), + ('object', versions.models.VersionedForeignKey(related_name='setting_objects', to='pretixbase.Event')), ], options={ 'abstract': False, @@ -132,53 +153,55 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Item', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('name', pretix.base.i18n.I18nCharField(max_length=255, verbose_name='Item name')), - ('active', models.BooleanField(default=True, verbose_name='Active')), - ('short_description', pretix.base.i18n.I18nTextField(blank=True, verbose_name='Short description', help_text='This is shown below the product name in lists.', null=True)), - ('long_description', pretix.base.i18n.I18nTextField(blank=True, verbose_name='Long description', null=True)), - ('default_price', models.DecimalField(blank=True, verbose_name='Default price', max_digits=7, decimal_places=2, null=True)), - ('tax_rate', models.DecimalField(blank=True, verbose_name='Taxes included in percent', max_digits=7, decimal_places=2, null=True)), - ('admission', models.BooleanField(default=False, help_text='Whether or not buying this product allows a person to enter your event', verbose_name='Is an admission ticket')), + ('name', pretix.base.i18n.I18nCharField(verbose_name='Item name', max_length=255)), + ('active', models.BooleanField(verbose_name='Active', default=True)), + ('description', pretix.base.i18n.I18nTextField(verbose_name='Description', blank=True, help_text='This is shown below the product name in lists.', null=True)), + ('default_price', models.DecimalField(verbose_name='Default price', max_digits=7, null=True, decimal_places=2)), + ('tax_rate', models.DecimalField(verbose_name='Taxes included in percent', blank=True, max_digits=7, null=True, decimal_places=2)), + ('admission', models.BooleanField(verbose_name='Is an admission ticket', help_text='Whether or not buying this product allows a person to enter your event', default=False)), + ('position', models.IntegerField(default=0)), + ('picture', models.ImageField(upload_to=pretix.base.models.itempicture_upload_to, verbose_name='Product picture', blank=True, null=True)), ], options={ 'verbose_name_plural': 'Products', 'verbose_name': 'Product', + 'ordering': ('category__position', 'category', 'position'), }, ), migrations.CreateModel( name='ItemCategory', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('name', pretix.base.i18n.I18nCharField(max_length=255, verbose_name='Category name')), + ('name', pretix.base.i18n.I18nCharField(verbose_name='Category name', max_length=255)), ('position', models.IntegerField(default=0)), - ('event', versions.models.VersionedForeignKey(to='pretixbase.Event', related_name='categories')), + ('event', versions.models.VersionedForeignKey(related_name='categories', to='pretixbase.Event')), ], options={ 'verbose_name_plural': 'Product categories', - 'ordering': ('position', 'id'), 'verbose_name': 'Product category', + 'ordering': ('position', 'version_birth_date'), }, ), migrations.CreateModel( name='ItemVariation', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('active', models.BooleanField(default=True, verbose_name='Active')), - ('default_price', models.DecimalField(blank=True, verbose_name='Default price', max_digits=7, decimal_places=2, null=True)), - ('item', versions.models.VersionedForeignKey(to='pretixbase.Item', related_name='variations')), + ('active', models.BooleanField(verbose_name='Active', default=True)), + ('default_price', models.DecimalField(verbose_name='Default price', blank=True, max_digits=7, null=True, decimal_places=2)), + ('item', versions.models.VersionedForeignKey(related_name='variations', to='pretixbase.Item')), ], options={ 'verbose_name_plural': 'Product variations', @@ -188,42 +211,45 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Order', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('code', models.CharField(max_length=16, verbose_name='Order code')), - ('status', models.CharField(max_length=3, choices=[('n', 'pending'), ('p', 'paid'), ('e', 'expired'), ('c', 'cancelled'), ('r', 'refunded')], verbose_name='Status')), + ('code', models.CharField(verbose_name='Order code', max_length=16)), + ('status', models.CharField(verbose_name='Status', choices=[('n', 'pending'), ('p', 'paid'), ('e', 'expired'), ('c', 'cancelled'), ('r', 'refunded')], max_length=3)), + ('email', models.EmailField(verbose_name='E-mail', blank=True, null=True, max_length=254)), + ('locale', models.CharField(verbose_name='Locale', blank=True, null=True, max_length=32)), + ('secret', models.CharField(max_length=32, default=pretix.base.models.generate_secret)), ('datetime', models.DateTimeField(verbose_name='Date')), ('expires', models.DateTimeField(verbose_name='Expiration date')), - ('payment_date', models.DateTimeField(blank=True, verbose_name='Payment date', null=True)), - ('payment_provider', models.CharField(max_length=255, blank=True, verbose_name='Payment provider', null=True)), - ('payment_fee', models.DecimalField(decimal_places=2, max_digits=10, default=0, verbose_name='Payment method fee')), - ('payment_info', models.TextField(blank=True, verbose_name='Payment information', null=True)), - ('payment_manual', models.BooleanField(default=False, verbose_name='Payment state was manually modified')), - ('total', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Total amount')), - ('event', versions.models.VersionedForeignKey(to='pretixbase.Event', related_name='orders', verbose_name='Event')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='User', related_name='orders', blank=True, null=True)), + ('payment_date', models.DateTimeField(verbose_name='Payment date', blank=True, null=True)), + ('payment_provider', models.CharField(verbose_name='Payment provider', blank=True, null=True, max_length=255)), + ('payment_fee', models.DecimalField(verbose_name='Payment method fee', max_digits=10, default=0, decimal_places=2)), + ('payment_info', models.TextField(verbose_name='Payment information', blank=True, null=True)), + ('payment_manual', models.BooleanField(verbose_name='Payment state was manually modified', default=False)), + ('total', models.DecimalField(verbose_name='Total amount', max_digits=10, decimal_places=2)), + ('event', versions.models.VersionedForeignKey(verbose_name='Event', related_name='orders', to='pretixbase.Event')), ], options={ 'verbose_name_plural': 'Orders', 'verbose_name': 'Order', + 'ordering': ('-datetime',), }, ), migrations.CreateModel( name='OrderPosition', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Price')), - ('attendee_name', models.CharField(max_length=255, blank=True, verbose_name='Attendee name', help_text='Empty, if this product is not an admission ticket', null=True)), - ('item', versions.models.VersionedForeignKey(to='pretixbase.Item', verbose_name='Item')), - ('order', versions.models.VersionedForeignKey(to='pretixbase.Order', related_name='positions', verbose_name='Order')), - ('variation', versions.models.VersionedForeignKey(to='pretixbase.ItemVariation', verbose_name='Variation', blank=True, null=True)), + ('price', models.DecimalField(verbose_name='Price', max_digits=10, decimal_places=2)), + ('attendee_name', models.CharField(verbose_name='Attendee name', blank=True, help_text='Empty, if this product is not an admission ticket', null=True, max_length=255)), + ('item', versions.models.VersionedForeignKey(verbose_name='Item', related_name='positions', to='pretixbase.Item')), + ('order', versions.models.VersionedForeignKey(verbose_name='Order', related_name='positions', to='pretixbase.Order')), + ('variation', versions.models.VersionedForeignKey(verbose_name='Variation', to='pretixbase.ItemVariation', null=True, blank=True)), ], options={ 'verbose_name_plural': 'Order positions', @@ -234,31 +260,31 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Organizer', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('name', models.CharField(max_length=200, verbose_name='Name')), - ('slug', models.SlugField(unique=True, verbose_name='Slug')), + ('name', models.CharField(verbose_name='Name', max_length=200)), + ('slug', models.SlugField(verbose_name='Slug', help_text='Should be short, only contain lowercase letters and numbers, and must be unique among your events. This is being used in addresses and bank transfer references.', validators=[django.core.validators.RegexValidator(message='The slug may only contain letters, numbers, dots and dashes.', regex='^[a-zA-Z0-9.-]+$')])), ], options={ 'verbose_name_plural': 'Organizers', - 'ordering': ('name',), 'verbose_name': 'Organizer', + 'ordering': ('name',), }, ), migrations.CreateModel( name='OrganizerPermission', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('can_create_events', models.BooleanField(default=True, verbose_name='Can create events')), + ('can_create_events', models.BooleanField(verbose_name='Can create events', default=True)), ('organizer', versions.models.VersionedForeignKey(to='pretixbase.Organizer')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='organizer_perms')), + ('user', models.ForeignKey(related_name='organizer_perms', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name_plural': 'Organizer permissions', @@ -268,14 +294,14 @@ class Migration(migrations.Migration): migrations.CreateModel( name='OrganizerSetting', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), ('key', models.CharField(max_length=255)), ('value', models.TextField()), - ('object', versions.models.VersionedForeignKey(to='pretixbase.Organizer', related_name='setting_objects')), + ('object', versions.models.VersionedForeignKey(related_name='setting_objects', to='pretixbase.Organizer')), ], options={ 'abstract': False, @@ -284,13 +310,13 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Property', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('name', pretix.base.i18n.I18nCharField(max_length=250, verbose_name='Property name')), - ('event', versions.models.VersionedForeignKey(to='pretixbase.Event', related_name='properties')), + ('name', pretix.base.i18n.I18nCharField(verbose_name='Property name', max_length=250)), + ('event', versions.models.VersionedForeignKey(related_name='properties', to='pretixbase.Event')), ], options={ 'verbose_name_plural': 'Product properties', @@ -300,33 +326,34 @@ class Migration(migrations.Migration): migrations.CreateModel( name='PropertyValue', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('value', pretix.base.i18n.I18nCharField(max_length=250, verbose_name='Value')), + ('value', pretix.base.i18n.I18nCharField(verbose_name='Value', max_length=250)), ('position', models.IntegerField(default=0)), - ('prop', versions.models.VersionedForeignKey(to='pretixbase.Property', related_name='values')), + ('prop', versions.models.VersionedForeignKey(related_name='values', to='pretixbase.Property')), ], options={ 'verbose_name_plural': 'Property values', - 'ordering': ('position',), 'verbose_name': 'Property value', + 'ordering': ('position', 'version_birth_date'), }, ), migrations.CreateModel( name='Question', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), ('question', pretix.base.i18n.I18nTextField(verbose_name='Question')), - ('type', models.CharField(max_length=5, choices=[('N', 'Number'), ('S', 'Text (one line)'), ('T', 'Multiline text'), ('B', 'Yes/No')], verbose_name='Question type')), - ('required', models.BooleanField(default=False, verbose_name='Required question')), - ('event', versions.models.VersionedForeignKey(to='pretixbase.Event', related_name='questions')), + ('type', models.CharField(verbose_name='Question type', choices=[('N', 'Number'), ('S', 'Text (one line)'), ('T', 'Multiline text'), ('B', 'Yes/No')], max_length=5)), + ('required', models.BooleanField(verbose_name='Required question', default=False)), + ('event', versions.models.VersionedForeignKey(related_name='questions', to='pretixbase.Event')), + ('items', versions.models.VersionedManyToManyField(verbose_name='Products', blank=True, help_text='This question will be asked to buyers of the selected products', related_name='questions', to='pretixbase.Item')), ], options={ 'verbose_name_plural': 'Questions', @@ -336,15 +363,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='QuestionAnswer', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), ('answer', models.TextField()), - ('cartposition', models.ForeignKey(to='pretixbase.CartPosition', null=True, blank=True, related_name='answers')), - ('orderposition', models.ForeignKey(to='pretixbase.OrderPosition', null=True, blank=True, related_name='answers')), - ('question', versions.models.VersionedForeignKey(to='pretixbase.Question', related_name='answers')), + ('cartposition', models.ForeignKey(related_name='answers', to='pretixbase.CartPosition', null=True, blank=True)), + ('orderposition', models.ForeignKey(related_name='answers', to='pretixbase.OrderPosition', null=True, blank=True)), + ('question', versions.models.VersionedForeignKey(related_name='answers', to='pretixbase.Question')), ], options={ 'abstract': False, @@ -353,17 +380,16 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Quota', fields=[ - ('id', models.CharField(max_length=36, serialize=False, primary_key=True)), + ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), - ('name', models.CharField(max_length=200, verbose_name='Name')), + ('name', models.CharField(verbose_name='Name', max_length=200)), ('size', models.PositiveIntegerField(verbose_name='Total capacity')), - ('locked', models.DateTimeField(blank=True, null=True)), - ('event', versions.models.VersionedForeignKey(to='pretixbase.Event', related_name='quotas', verbose_name='Event')), - ('items', versions.models.VersionedManyToManyField(blank=True, related_name='quotas', to='pretixbase.Item', verbose_name='Item')), - ('variations', pretix.base.models.VariationsField(blank=True, related_name='quotas', to='pretixbase.ItemVariation', verbose_name='Variations')), + ('event', versions.models.VersionedForeignKey(verbose_name='Event', related_name='quotas', to='pretixbase.Event')), + ('items', versions.models.VersionedManyToManyField(verbose_name='Item', blank=True, related_name='quotas', to='pretixbase.Item')), + ('variations', pretix.base.models.VariationsField(verbose_name='Variations', blank=True, related_name='quotas', to='pretixbase.ItemVariation')), ], options={ 'verbose_name_plural': 'Quotas', @@ -373,81 +399,56 @@ class Migration(migrations.Migration): migrations.AddField( model_name='organizer', name='permitted', - field=models.ManyToManyField(through='pretixbase.OrganizerPermission', to=settings.AUTH_USER_MODEL, related_name='organizers'), + field=models.ManyToManyField(through='pretixbase.OrganizerPermission', related_name='organizers', to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='itemvariation', name='values', - field=versions.models.VersionedManyToManyField(to='pretixbase.PropertyValue', related_name='variations'), + field=versions.models.VersionedManyToManyField(related_name='variations', to='pretixbase.PropertyValue'), ), migrations.AddField( model_name='item', name='category', - field=versions.models.VersionedForeignKey(on_delete=django.db.models.deletion.PROTECT, to='pretixbase.ItemCategory', verbose_name='Category', related_name='items', blank=True, null=True), + field=versions.models.VersionedForeignKey(verbose_name='Category', related_name='items', to='pretixbase.ItemCategory', null=True, blank=True, on_delete=django.db.models.deletion.PROTECT), ), migrations.AddField( model_name='item', name='event', - field=versions.models.VersionedForeignKey(on_delete=django.db.models.deletion.PROTECT, to='pretixbase.Event', related_name='items', verbose_name='Event'), + field=versions.models.VersionedForeignKey(verbose_name='Event', related_name='items', to='pretixbase.Event', on_delete=django.db.models.deletion.PROTECT), ), migrations.AddField( model_name='item', name='properties', - field=versions.models.VersionedManyToManyField(blank=True, related_name='items', to='pretixbase.Property', help_text="The selected properties will be available for the user to select. After saving this field, move to the 'Variations' tab to configure the details.", verbose_name='Properties'), - ), - migrations.AddField( - model_name='item', - name='questions', - field=versions.models.VersionedManyToManyField(blank=True, related_name='items', to='pretixbase.Question', help_text='The user will be asked to fill in answers for the selected questions', verbose_name='Questions'), + field=versions.models.VersionedManyToManyField(verbose_name='Properties', blank=True, help_text="The selected properties will be available for the user to select. After saving this field, move to the 'Variations' tab to configure the details.", related_name='items', to='pretixbase.Property'), ), migrations.AddField( model_name='event', name='organizer', - field=versions.models.VersionedForeignKey(on_delete=django.db.models.deletion.PROTECT, to='pretixbase.Organizer', related_name='events'), + field=versions.models.VersionedForeignKey(related_name='events', to='pretixbase.Organizer', on_delete=django.db.models.deletion.PROTECT), ), migrations.AddField( model_name='event', name='permitted', - field=models.ManyToManyField(through='pretixbase.EventPermission', to=settings.AUTH_USER_MODEL, related_name='events'), + field=models.ManyToManyField(through='pretixbase.EventPermission', related_name='events', to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='cartposition', name='event', - field=versions.models.VersionedForeignKey(to='pretixbase.Event', verbose_name='Event'), + field=versions.models.VersionedForeignKey(verbose_name='Event', to='pretixbase.Event'), ), migrations.AddField( model_name='cartposition', name='item', - field=versions.models.VersionedForeignKey(to='pretixbase.Item', verbose_name='Item'), - ), - migrations.AddField( - model_name='cartposition', - name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='User', blank=True, null=True), + field=versions.models.VersionedForeignKey(verbose_name='Item', to='pretixbase.Item'), ), migrations.AddField( model_name='cartposition', name='variation', - field=versions.models.VersionedForeignKey(to='pretixbase.ItemVariation', verbose_name='Variation', blank=True, null=True), + field=versions.models.VersionedForeignKey(verbose_name='Variation', to='pretixbase.ItemVariation', null=True, blank=True), ), migrations.AddField( - model_name='user', - name='event', - field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='pretixbase.Event', null=True, blank=True, related_name='users'), + model_name='cachedticket', + name='order', + field=versions.models.VersionedForeignKey(to='pretixbase.Order'), ), - migrations.AddField( - model_name='user', - name='groups', - field=models.ManyToManyField(to='auth.Group', help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', blank=True, related_query_name='user', verbose_name='groups'), - ), - migrations.AddField( - model_name='user', - name='user_permissions', - field=models.ManyToManyField(to='auth.Permission', help_text='Specific permissions for this user.', related_name='user_set', blank=True, related_query_name='user', verbose_name='user permissions'), - ), - migrations.AlterUniqueTogether( - name='user', - unique_together=set([('event', 'username')]), - ), - migrations.RunPython(initial_user), ] diff --git a/src/pretix/base/migrations/0002_auto_20150524_1148.py b/src/pretix/base/migrations/0002_auto_20150524_1148.py deleted file mode 100644 index fdf6989dfc..0000000000 --- a/src/pretix/base/migrations/0002_auto_20150524_1148.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='organizer', - name='slug', - field=models.SlugField(verbose_name='Slug'), - ), - ] diff --git a/src/pretix/base/migrations/0003_auto_20150602_2232.py b/src/pretix/base/migrations/0003_auto_20150602_2232.py deleted file mode 100644 index ef04f23575..0000000000 --- a/src/pretix/base/migrations/0003_auto_20150602_2232.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import django.core.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0002_auto_20150524_1148'), - ] - - operations = [ - migrations.AlterModelOptions( - name='item', - options={'verbose_name_plural': 'Products', 'ordering': ('category__position', 'category', 'position'), 'verbose_name': 'Product'}, - ), - migrations.AddField( - model_name='item', - name='position', - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name='organizer', - name='slug', - field=models.SlugField(help_text='Should be short, only contain lowercase letters and numbers, and must be unique among your events. This is being used in addresses and bank transfer references.', validators=[django.core.validators.RegexValidator(message='The slug may only contain letters, numbers, dots and dashes.', regex='^[a-zA-Z0-9.-]+$')], verbose_name='Slug'), - ), - ] diff --git a/src/pretix/base/migrations/0004_eventpermission_can_change_permissions.py b/src/pretix/base/migrations/0004_eventpermission_can_change_permissions.py deleted file mode 100644 index 40697eb93d..0000000000 --- a/src/pretix/base/migrations/0004_eventpermission_can_change_permissions.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0003_auto_20150602_2232'), - ] - - operations = [ - migrations.AddField( - model_name='eventpermission', - name='can_change_permissions', - field=models.BooleanField(default=True, verbose_name='Can change permissions'), - ), - ] diff --git a/src/pretix/base/migrations/0005_item_picture.py b/src/pretix/base/migrations/0005_item_picture.py deleted file mode 100644 index 98a228bbbe..0000000000 --- a/src/pretix/base/migrations/0005_item_picture.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0004_eventpermission_can_change_permissions'), - ] - - operations = [ - migrations.AddField( - model_name='item', - name='picture', - field=models.ImageField(upload_to='', null=True, verbose_name='Product picture', blank=True), - ), - ] diff --git a/src/pretix/base/migrations/0006_auto_20150726_1420.py b/src/pretix/base/migrations/0006_auto_20150726_1420.py deleted file mode 100644 index e45bee5f3f..0000000000 --- a/src/pretix/base/migrations/0006_auto_20150726_1420.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - -import pretix.base.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0005_item_picture'), - ] - - operations = [ - migrations.AlterField( - model_name='item', - name='picture', - field=models.ImageField(upload_to=pretix.base.models.itempicture_upload_to, null=True, verbose_name='Product picture', blank=True), - ), - ] diff --git a/src/pretix/base/migrations/0007_auto_20150726_1430.py b/src/pretix/base/migrations/0007_auto_20150726_1430.py deleted file mode 100644 index ae2bb15590..0000000000 --- a/src/pretix/base/migrations/0007_auto_20150726_1430.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0006_auto_20150726_1420'), - ] - - operations = [ - migrations.AlterField( - model_name='item', - name='default_price', - field=models.DecimalField(verbose_name='Default price', default=0, decimal_places=2, max_digits=7), - preserve_default=False, - ), - ] diff --git a/src/pretix/base/migrations/0008_auto_20150804_1357.py b/src/pretix/base/migrations/0008_auto_20150804_1357.py deleted file mode 100644 index a644943439..0000000000 --- a/src/pretix/base/migrations/0008_auto_20150804_1357.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0007_auto_20150726_1430'), - ] - - operations = [ - migrations.AlterModelOptions( - name='order', - options={'verbose_name_plural': 'Orders', 'verbose_name': 'Order', 'ordering': ('-datetime',)}, - ), - migrations.AlterField( - model_name='item', - name='default_price', - field=models.DecimalField(max_digits=7, decimal_places=2, verbose_name='Default price', null=True), - ), - ] diff --git a/src/pretix/base/migrations/0009_auto_20150915_2003.py b/src/pretix/base/migrations/0009_auto_20150915_2003.py deleted file mode 100644 index 36e7142af8..0000000000 --- a/src/pretix/base/migrations/0009_auto_20150915_2003.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import versions.models -from django.db import migrations, models - -import pretix.base.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0008_auto_20150804_1357'), - ] - - operations = [ - migrations.CreateModel( - name='CachedFile', - fields=[ - ('id', models.UUIDField(primary_key=True, serialize=False)), - ('expires', models.DateTimeField(null=True, blank=True)), - ('date', models.DateTimeField(null=True, blank=True)), - ('filename', models.CharField(max_length=255)), - ('file', models.FileField(null=True, upload_to=pretix.base.models.cachedfile_name, blank=True)), - ], - ), - migrations.CreateModel( - name='CachedTicket', - fields=[ - ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)), - ('provider', models.CharField(max_length=255)), - ('cachedfile', models.ForeignKey(to='pretixbase.CachedFile')), - ('order', models.ForeignKey(to='pretixbase.Order')), - ], - ), - migrations.AlterModelOptions( - name='itemcategory', - options={'verbose_name_plural': 'Product categories', 'ordering': ('position', 'version_birth_date'), 'verbose_name': 'Product category'}, - ), - migrations.AlterModelOptions( - name='propertyvalue', - options={'verbose_name_plural': 'Property values', 'ordering': ('position', 'version_birth_date'), 'verbose_name': 'Property value'}, - ), - migrations.AlterField( - model_name='orderposition', - name='item', - field=versions.models.VersionedForeignKey(to='pretixbase.Item', verbose_name='Item', related_name='positions'), - ), - migrations.AlterField( - model_name='user', - name='locale', - field=models.CharField(choices=[('en', 'English'), ('de', 'German'), ('de-informal', 'German (informal)')], max_length=50, default='en', verbose_name='Language'), - ), - migrations.AddField( - model_name='order', - name='tickets', - field=models.ManyToManyField(to='pretixbase.CachedFile', through='pretixbase.CachedTicket'), - ), - ] diff --git a/src/pretix/base/migrations/0010_cachedfile_type.py b/src/pretix/base/migrations/0010_cachedfile_type.py deleted file mode 100644 index db12c7c4d8..0000000000 --- a/src/pretix/base/migrations/0010_cachedfile_type.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0009_auto_20150915_2003'), - ] - - operations = [ - migrations.AddField( - model_name='cachedfile', - name='type', - field=models.CharField(default='text/plain', max_length=255), - preserve_default=False, - ), - ] diff --git a/src/pretix/base/migrations/0011_auto_20150915_2020.py b/src/pretix/base/migrations/0011_auto_20150915_2020.py deleted file mode 100644 index 6d7df2d2e7..0000000000 --- a/src/pretix/base/migrations/0011_auto_20150915_2020.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import uuid - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0010_cachedfile_type'), - ] - - operations = [ - migrations.AlterField( - model_name='cachedfile', - name='id', - field=models.UUIDField(serialize=False, primary_key=True, default=uuid.uuid4), - ), - ] diff --git a/src/pretix/base/migrations/0012_remove_order_tickets.py b/src/pretix/base/migrations/0012_remove_order_tickets.py deleted file mode 100644 index a5851352a5..0000000000 --- a/src/pretix/base/migrations/0012_remove_order_tickets.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0011_auto_20150915_2020'), - ] - - operations = [ - migrations.RemoveField( - model_name='order', - name='tickets', - ), - ] diff --git a/src/pretix/base/migrations/0013_auto_20150916_0941.py b/src/pretix/base/migrations/0013_auto_20150916_0941.py deleted file mode 100644 index f68f4b63d1..0000000000 --- a/src/pretix/base/migrations/0013_auto_20150916_0941.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import versions.models -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0012_remove_order_tickets'), - ] - - operations = [ - migrations.AlterField( - model_name='cachedticket', - name='order', - field=versions.models.VersionedForeignKey(to='pretixbase.Order'), - ), - ] diff --git a/src/pretix/base/migrations/0014_auto_20150916_1319.py b/src/pretix/base/migrations/0014_auto_20150916_1319.py deleted file mode 100644 index f717ce38e0..0000000000 --- a/src/pretix/base/migrations/0014_auto_20150916_1319.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0013_auto_20150916_0941'), - ] - - operations = [ - migrations.CreateModel( - name='EventLock', - fields=[ - ('event', models.CharField(primary_key=True, max_length=36, serialize=False)), - ('date', models.DateTimeField(auto_now=True)), - ], - ), - migrations.RemoveField( - model_name='quota', - name='locked', - ), - ] diff --git a/src/pretix/base/migrations/0015_auto_20150916_2219.py b/src/pretix/base/migrations/0015_auto_20150916_2219.py deleted file mode 100644 index 7fd26f839e..0000000000 --- a/src/pretix/base/migrations/0015_auto_20150916_2219.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - -import pretix.base.models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0014_auto_20150916_1319'), - ] - - operations = [ - migrations.AddField( - model_name='cartposition', - name='session', - field=models.CharField(max_length=255, verbose_name='Session', null=True, blank=True), - ), - migrations.AddField( - model_name='order', - name='secret', - field=models.CharField(max_length=32, default=pretix.base.models.generate_secret), - ), - migrations.AlterField( - model_name='user', - name='email', - field=models.EmailField(max_length=254, verbose_name='E-mail', blank=True, db_index=True, unique=True, null=True), - ), - migrations.AlterUniqueTogether( - name='user', - unique_together=set([]), - ), - migrations.RemoveField( - model_name='user', - name='event', - ), - migrations.RemoveField( - model_name='user', - name='identifier', - ), - migrations.RemoveField( - model_name='user', - name='username', - ), - ] diff --git a/src/pretix/base/migrations/0016_order_guest_email.py b/src/pretix/base/migrations/0016_order_guest_email.py deleted file mode 100644 index fef35d8b06..0000000000 --- a/src/pretix/base/migrations/0016_order_guest_email.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0015_auto_20150916_2219'), - ] - - operations = [ - migrations.AddField( - model_name='order', - name='guest_email', - field=models.EmailField(max_length=254, verbose_name='E-mail', blank=True, null=True), - ), - ] diff --git a/src/pretix/base/migrations/0017_order_guest_locale.py b/src/pretix/base/migrations/0017_order_guest_locale.py deleted file mode 100644 index 79a63f7e2b..0000000000 --- a/src/pretix/base/migrations/0017_order_guest_locale.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0016_order_guest_email'), - ] - - operations = [ - migrations.AddField( - model_name='order', - name='guest_locale', - field=models.CharField(max_length=32, null=True, blank=True, verbose_name='Locale'), - ), - ] diff --git a/src/pretix/base/migrations/0018_eventlock_token.py b/src/pretix/base/migrations/0018_eventlock_token.py deleted file mode 100644 index d25722191d..0000000000 --- a/src/pretix/base/migrations/0018_eventlock_token.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import uuid - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0017_order_guest_locale'), - ] - - operations = [ - migrations.AddField( - model_name='eventlock', - name='token', - field=models.UUIDField(default=uuid.uuid4), - ), - ] diff --git a/src/pretix/base/migrations/0019_auto_20151004_1233.py b/src/pretix/base/migrations/0019_auto_20151004_1233.py deleted file mode 100644 index 01b8f6d85a..0000000000 --- a/src/pretix/base/migrations/0019_auto_20151004_1233.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0018_eventlock_token'), - ] - - operations = [ - migrations.RenameField( - model_name='order', - old_name='guest_email', - new_name='email', - ), - migrations.RenameField( - model_name='order', - old_name='guest_locale', - new_name='locale', - ), - migrations.RemoveField( - model_name='cartposition', - name='user', - ), - migrations.RemoveField( - model_name='order', - name='user', - ), - ] diff --git a/src/pretix/base/migrations/0020_auto_20151005_2119.py b/src/pretix/base/migrations/0020_auto_20151005_2119.py deleted file mode 100644 index 86d03417df..0000000000 --- a/src/pretix/base/migrations/0020_auto_20151005_2119.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - -import pretix.base.i18n - - -class Migration(migrations.Migration): - dependencies = [ - ('pretixbase', '0019_auto_20151004_1233'), - ] - - operations = [ - migrations.RemoveField( - model_name='item', - name='long_description', - ), - migrations.RenameField( - model_name='item', - old_name='short_description', - new_name='description' - ), - migrations.AlterField( - model_name='item', - name='description', - field=pretix.base.i18n.I18nTextField(null=True, verbose_name='Description', blank=True, - help_text='This is shown below the product name in lists.'), - ), - ] diff --git a/src/pretix/base/models.py b/src/pretix/base/models.py index ca43350f5d..7396d45ed4 100644 --- a/src/pretix/base/models.py +++ b/src/pretix/base/models.py @@ -647,72 +647,6 @@ class PropertyValue(Versionable): return self.sortkey < other.sortkey -class Question(Versionable): - """ - A question is an input field that can be used to extend a ticket - by custom information, e.g. "Attendee age". A question can allow one o several - input types, currently: - - * a number (``TYPE_NUMBER``) - * a one-line string (``TYPE_STRING``) - * a multi-line string (``TYPE_TEXT``) - * a boolean (``TYPE_BOOLEAN``) - - :param event: The event this question belongs to - :type event: Event - :param question: The question text. This will be displayed next to the input field. - :type question: str - :param type: One of the above types - :param required: Whether answering this question is required for submiting an order including - items associated with this question. - :type required: bool - """ - TYPE_NUMBER = "N" - TYPE_STRING = "S" - TYPE_TEXT = "T" - TYPE_BOOLEAN = "B" - TYPE_CHOICES = ( - (TYPE_NUMBER, _("Number")), - (TYPE_STRING, _("Text (one line)")), - (TYPE_TEXT, _("Multiline text")), - (TYPE_BOOLEAN, _("Yes/No")), - ) - - event = VersionedForeignKey( - Event, - related_name="questions", - ) - question = I18nTextField( - verbose_name=_("Question"), - ) - type = models.CharField( - max_length=5, - choices=TYPE_CHOICES, - verbose_name=_("Question type"), - ) - required = models.BooleanField( - default=False, - verbose_name=_("Required question"), - ) - - class Meta: - verbose_name = _("Question") - verbose_name_plural = _("Questions") - - def __str__(self): - return str(self.question) - - def delete(self, *args, **kwargs): - super().delete(*args, **kwargs) - if self.event: - self.event.get_cache().clear() - - def save(self, *args, **kwargs): - super().save(*args, **kwargs) - if self.event: - self.event.get_cache().clear() - - def itempicture_upload_to(instance, filename): return '%s/%s/item-%s.%s' % ( instance.event.organizer.slug, instance.event.slug, instance.identity, @@ -735,16 +669,13 @@ class Item(Versionable): :type name: str :param active: Whether this item is being sold :type active: bool - :param short_description: A short description - :type short_description: str - :param long_description: A long description - :type long_description: str + :param description: A short description + :type description: str :param default_price: The item's default price :type default_price: decimal.Decimal :param tax_rate: The VAT tax that is included in this item's price (in %) :type tax_rate: decimal.Decimal :param properties: A set of ``Property`` objects that should be applied to this item - :param questions: A set of ``Question`` objects that should be applied to this item :param admission: ``True``, if this item allows persons to enter the event (as opposed to e.g. merchandise) :type admission: bool :param picture: A product picture to be shown next to the product description. @@ -798,16 +729,6 @@ class Item(Versionable): '\'Variations\' tab to configure the details.' ) ) - questions = VersionedManyToManyField( - Question, - related_name='items', - verbose_name=_("Questions"), - blank=True, - help_text=_( - 'The user will be asked to fill in answers for the ' - 'selected questions' - ) - ) admission = models.BooleanField( verbose_name=_("Is an admission ticket"), help_text=_( @@ -1173,6 +1094,80 @@ class VariationsField(VersionedManyToManyField): return super(RelatedField, self).formfield(**defaults) +class Question(Versionable): + """ + A question is an input field that can be used to extend a ticket + by custom information, e.g. "Attendee age". A question can allow one o several + input types, currently: + + * a number (``TYPE_NUMBER``) + * a one-line string (``TYPE_STRING``) + * a multi-line string (``TYPE_TEXT``) + * a boolean (``TYPE_BOOLEAN``) + + :param event: The event this question belongs to + :type event: Event + :param question: The question text. This will be displayed next to the input field. + :type question: str + :param type: One of the above types + :param required: Whether answering this question is required for submiting an order including + items associated with this question. + :type required: bool + :param items: A set of ``Items`` objects that this question should be applied to + """ + TYPE_NUMBER = "N" + TYPE_STRING = "S" + TYPE_TEXT = "T" + TYPE_BOOLEAN = "B" + TYPE_CHOICES = ( + (TYPE_NUMBER, _("Number")), + (TYPE_STRING, _("Text (one line)")), + (TYPE_TEXT, _("Multiline text")), + (TYPE_BOOLEAN, _("Yes/No")), + ) + + event = VersionedForeignKey( + Event, + related_name="questions" + ) + question = I18nTextField( + verbose_name=_("Question") + ) + type = models.CharField( + max_length=5, + choices=TYPE_CHOICES, + verbose_name=_("Question type") + ) + required = models.BooleanField( + default=False, + verbose_name=_("Required question") + ) + items = VersionedManyToManyField( + Item, + related_name='questions', + verbose_name=_("Products"), + blank=True, + help_text=_('This question will be asked to buyers of the selected products') + ) + + class Meta: + verbose_name = _("Question") + verbose_name_plural = _("Questions") + + def __str__(self): + return str(self.question) + + def delete(self, *args, **kwargs): + super().delete(*args, **kwargs) + if self.event: + self.event.get_cache().clear() + + def save(self, *args, **kwargs): + super().save(*args, **kwargs) + if self.event: + self.event.get_cache().clear() + + class BaseRestriction(Versionable): """ A restriction is the abstract concept of a rule that limits the availability diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 07a9e4a5c3..a2e898edc1 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -1,5 +1,6 @@ import copy +from django import forms from django.db import models from django.forms import BooleanField from django.utils.translation import ugettext_lazy as _ @@ -40,6 +41,10 @@ class PropertyValueForm(TolerantFormsetModelForm): class QuestionForm(VersionedModelForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['items'].queryset = self.instance.event.items.current.all() + class Meta: model = Question localized_fields = '__all__' @@ -47,7 +52,11 @@ class QuestionForm(VersionedModelForm): 'question', 'type', 'required', + 'items' ] + widgets = { + 'items': forms.CheckboxSelectMultiple + } class QuotaForm(I18nModelForm): @@ -116,7 +125,6 @@ class ItemFormGeneral(VersionedModelForm): super().__init__(*args, **kwargs) self.fields['category'].queryset = self.instance.event.categories.current.all() self.fields['properties'].queryset = self.instance.event.properties.current.all() - self.fields['questions'].queryset = self.instance.event.questions.current.all() class Meta: model = Item @@ -126,13 +134,11 @@ class ItemFormGeneral(VersionedModelForm): 'name', 'active', 'admission', - 'short_description', - 'long_description', + 'description', 'picture', 'default_price', 'tax_rate', 'properties', - 'questions', ] diff --git a/src/pretix/control/templates/pretixcontrol/item/index.html b/src/pretix/control/templates/pretixcontrol/item/index.html index b2ce0be7ef..ea1de1d3b6 100644 --- a/src/pretix/control/templates/pretixcontrol/item/index.html +++ b/src/pretix/control/templates/pretixcontrol/item/index.html @@ -21,7 +21,6 @@
{% trans "Advanced settings" %} {% bootstrap_field form.properties layout="horizontal" %} - {% bootstrap_field form.questions layout="horizontal" %}
-
- + + {% endblock %} diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 5054b7c335..543e829f59 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -466,6 +466,11 @@ class QuestionCreate(EventPermissionRequiredMixin, CreateView): permission = 'can_change_items' context_object_name = 'question' + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs['instance'] = Question(event=self.request.event) + return kwargs + def get_success_url(self) -> str: return reverse('control:event.items.questions', kwargs={ 'organizer': self.request.event.organizer.slug, @@ -473,7 +478,6 @@ class QuestionCreate(EventPermissionRequiredMixin, CreateView): }) def form_valid(self, form): - form.instance.event = self.request.event messages.success(self.request, _('The new question has been created.')) return super().form_valid(form) diff --git a/src/pretix/plugins/timerestriction/migrations/0001_initial.py b/src/pretix/plugins/timerestriction/migrations/0001_initial.py index 3e1ff4be60..7dbaade259 100644 --- a/src/pretix/plugins/timerestriction/migrations/0001_initial.py +++ b/src/pretix/plugins/timerestriction/migrations/0001_initial.py @@ -20,14 +20,14 @@ class Migration(migrations.Migration): ('id', models.CharField(primary_key=True, serialize=False, max_length=36)), ('identity', models.CharField(max_length=36)), ('version_start_date', models.DateTimeField()), - ('version_end_date', models.DateTimeField(blank=True, null=True, default=None)), + ('version_end_date', models.DateTimeField(blank=True, default=None, null=True)), ('version_birth_date', models.DateTimeField()), ('timeframe_from', models.DateTimeField(verbose_name='Start of time frame')), ('timeframe_to', models.DateTimeField(verbose_name='End of time frame')), - ('price', models.DecimalField(max_digits=7, verbose_name='Price in time frame', decimal_places=2, null=True, blank=True)), - ('event', versions.models.VersionedForeignKey(to='pretixbase.Event', related_name='restrictions_timerestriction_timerestriction', verbose_name='Event')), - ('item', versions.models.VersionedForeignKey(to='pretixbase.Item', related_name='restrictions_timerestriction_timerestriction', verbose_name='Item', null=True, blank=True)), - ('variations', pretix.base.models.VariationsField(related_name='restrictions_timerestriction_timerestriction', to='pretixbase.ItemVariation', verbose_name='Variations', blank=True)), + ('price', models.DecimalField(verbose_name='Price in time frame', blank=True, max_digits=7, null=True, decimal_places=2)), + ('event', versions.models.VersionedForeignKey(verbose_name='Event', related_name='restrictions_timerestriction_timerestriction', to='pretixbase.Event')), + ('item', versions.models.VersionedForeignKey(verbose_name='Item', related_name='restrictions_timerestriction_timerestriction', to='pretixbase.Item', null=True, blank=True)), + ('variations', pretix.base.models.VariationsField(verbose_name='Variations', blank=True, related_name='restrictions_timerestriction_timerestriction', to='pretixbase.ItemVariation')), ], options={ 'verbose_name_plural': 'Restrictions',