diff --git a/src/pretix/base/migrations/0001_squashed_0028_auto_20160816_1242.py b/src/pretix/base/migrations/0001_squashed_0028_auto_20160816_1242.py new file mode 100644 index 0000000000..a47d17b110 --- /dev/null +++ b/src/pretix/base/migrations/0001_squashed_0028_auto_20160816_1242.py @@ -0,0 +1,658 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.4 on 2017-02-03 14:20 +from __future__ import unicode_literals + +import datetime +import uuid +from decimal import Decimal + +import django.core.validators +import django.db.models.deletion +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.base +import pretix.base.models.invoices +import pretix.base.models.items +import pretix.base.models.orders +import pretix.base.models.vouchers + + +def initial_user(apps, schema_editor): + User = apps.get_model("pretixbase", "User") + user = User(email='admin@localhost') + user.is_staff = True + user.is_superuser = True + user.password = make_password('admin') + user.save() + + +class Migration(migrations.Migration): + + replaces = [('pretixbase', '0001_initial'), ('pretixbase', '0002_auto_20160209_0940'), ('pretixbase', '0003_eventpermission_can_change_vouchers'), ('pretixbase', '0004_auto_20160209_1023'), ('pretixbase', '0005_auto_20160211_1459'), ('pretixbase', '0006_auto_20160211_1630'), ('pretixbase', '0007_auto_20160211_1710'), ('pretixbase', '0008_invoiceaddress'), ('pretixbase', '0009_auto_20160222_2002'), ('pretixbase', '0010_orderposition_secret'), ('pretixbase', '0011_auto_20160311_2052'), ('pretixbase', '0012_auto_20160312_1040'), ('pretixbase', '0013_invoice_locale'), ('pretixbase', '0014_invoice_additional_text'), ('pretixbase', '0015_auto_20160312_1924'), ('pretixbase', '0016_voucher_variation'), ('pretixbase', '0017_auto_20160324_1615'), ('pretixbase', '0018_auto_20160326_1104'), ('pretixbase', '0019_auto_20160326_1139'), ('pretixbase', '0020_auto_20160418_2106'), ('pretixbase', '0021_auto_20160418_2117'), ('pretixbase', '0020_auto_20160421_1943'), ('pretixbase', '0022_merge'), ('pretixbase', '0023_auto_20160601_1039'), ('pretixbase', '0024_auto_20160728_1725'), ('pretixbase', '0025_auto_20160802_2202'), ('pretixbase', '0026_order_comment'), ('pretixbase', '0027_auto_20160815_1254'), ('pretixbase', '0028_auto_20160816_1242')] + + initial = True + + dependencies = [ + ('auth', '0006_require_contenttypes_0002'), + ('contenttypes', '0002_remove_content_type_name'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('email', models.EmailField(blank=True, db_index=True, max_length=254, null=True, unique=True, verbose_name='E-mail')), + ('givenname', models.CharField(blank=True, max_length=255, null=True, verbose_name='Given name')), + ('familyname', models.CharField(blank=True, max_length=255, null=True, verbose_name='Family name')), + ('is_active', models.BooleanField(default=True, verbose_name='Is active')), + ('is_staff', models.BooleanField(default=False, verbose_name='Is site admin')), + ('date_joined', models.DateTimeField(auto_now_add=True, verbose_name='Date joined')), + ('locale', models.CharField(choices=[('en', 'English'), ('de', 'German'), ('de-informal', 'German (informal)')], default='en', max_length=50, verbose_name='Language')), + ('timezone', models.CharField(default='UTC', max_length=100, verbose_name='Timezone')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'User', + 'verbose_name_plural': 'Users', + }, + ), + migrations.RunPython( + code=initial_user, + ), + migrations.CreateModel( + name='CachedFile', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, 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(blank=True, null=True, upload_to=pretix.base.models.base.cachedfile_name)), + ], + ), + migrations.CreateModel( + name='CachedTicket', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('provider', models.CharField(max_length=255)), + ('cachedfile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pretixbase.CachedFile')), + ], + ), + migrations.CreateModel( + name='CartPosition', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Price')), + ('attendee_name', models.CharField(blank=True, help_text='Empty, if this product is not an admission ticket', max_length=255, null=True, verbose_name='Attendee name')), + ('voucher_discount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=10)), + ('base_price', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)), + ('cart_id', models.CharField(blank=True, max_length=255, null=True, verbose_name='Cart ID (e.g. session key)')), + ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date')), + ('expires', models.DateTimeField(verbose_name='Expiration date')), + ], + options={ + 'verbose_name': 'Cart position', + 'verbose_name_plural': 'Cart positions', + }, + ), + migrations.CreateModel( + name='Event', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', pretix.base.i18n.I18nCharField(max_length=200, verbose_name='Name')), + ('slug', 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')), + ('currency', models.CharField(default='EUR', max_length=10, verbose_name='Default currency')), + ('date_from', models.DateTimeField(verbose_name='Event start time')), + ('date_to', models.DateTimeField(blank=True, null=True, verbose_name='Event end time')), + ('is_public', models.BooleanField(default=False, help_text="If selected, this event may show up on the ticket system's start page or an organization profile.", verbose_name='Visible in public lists')), + ('presale_end', models.DateTimeField(blank=True, help_text='No products will be sold after this date.', null=True, verbose_name='End of presale')), + ('presale_start', models.DateTimeField(blank=True, help_text='No products will be sold before this date.', null=True, verbose_name='Start of presale')), + ('plugins', models.TextField(blank=True, null=True, verbose_name='Plugins')), + ], + options={ + 'verbose_name': 'Event', + 'ordering': ('date_from', 'name'), + 'verbose_name_plural': 'Events', + }, + bases=(models.Model, pretix.base.models.base.LoggingMixin), + ), + migrations.CreateModel( + name='EventLock', + fields=[ + ('event', models.CharField(max_length=36, primary_key=True, serialize=False)), + ('date', models.DateTimeField(auto_now=True)), + ('token', models.UUIDField(default=uuid.uuid4)), + ], + ), + migrations.CreateModel( + name='EventPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('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_permissions', models.BooleanField(default=True, verbose_name='Can change permissions')), + ('can_change_orders', models.BooleanField(default=True, verbose_name='Can change orders')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_perms', to='pretixbase.Event')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='event_perms', to=settings.AUTH_USER_MODEL)), + ('can_change_vouchers', models.BooleanField(default=True, verbose_name='Can change vouchers')), + ], + options={ + 'verbose_name': 'Event permission', + 'verbose_name_plural': 'Event permissions', + }, + ), + migrations.CreateModel( + name='EventSetting', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(max_length=255)), + ('value', models.TextField()), + ('object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='setting_objects', to='pretixbase.Event')), + ], + ), + migrations.CreateModel( + name='Item', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', pretix.base.i18n.I18nCharField(max_length=255, verbose_name='Item name')), + ('active', models.BooleanField(default=True, verbose_name='Active')), + ('description', pretix.base.i18n.I18nTextField(blank=True, help_text='This is shown below the product name in lists.', null=True, verbose_name='Description')), + ('default_price', models.DecimalField(decimal_places=2, max_digits=7, null=True, verbose_name='Default price')), + ('tax_rate', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, verbose_name='Taxes included in percent')), + ('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')), + ('position', models.IntegerField(default=0)), + ('picture', models.ImageField(blank=True, null=True, upload_to=pretix.base.models.items.itempicture_upload_to, verbose_name='Product picture')), + ('available_from', models.DateTimeField(blank=True, help_text='This product will not be sold before the given date.', null=True, verbose_name='Available from')), + ('available_until', models.DateTimeField(blank=True, help_text='This product will not be sold after the given date.', null=True, verbose_name='Available until')), + ], + options={ + 'verbose_name': 'Product', + 'ordering': ('category__position', 'category', 'position'), + 'verbose_name_plural': 'Products', + }, + bases=(models.Model, pretix.base.models.base.LoggingMixin), + ), + migrations.CreateModel( + name='ItemCategory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', pretix.base.i18n.I18nCharField(max_length=255, verbose_name='Category name')), + ('position', models.IntegerField(default=0)), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='categories', to='pretixbase.Event')), + ('description', pretix.base.i18n.I18nTextField(blank=True, verbose_name='Category description')), + ], + options={ + 'verbose_name': 'Product category', + 'ordering': ('position', 'id'), + 'verbose_name_plural': 'Product categories', + }, + bases=(models.Model, pretix.base.models.base.LoggingMixin), + ), + migrations.CreateModel( + name='ItemVariation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('value', pretix.base.i18n.I18nCharField(max_length=255, verbose_name='Description')), + ('active', models.BooleanField(default=True, verbose_name='Active')), + ('position', models.PositiveIntegerField(default=0, verbose_name='Position')), + ('default_price', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, verbose_name='Default price')), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='variations', to='pretixbase.Item')), + ], + options={ + 'verbose_name': 'Product variation', + 'ordering': ('position', 'id'), + 'verbose_name_plural': 'Product variations', + }, + ), + migrations.CreateModel( + name='LogEntry', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('object_id', models.PositiveIntegerField()), + ('datetime', models.DateTimeField(auto_now_add=True)), + ('action_type', models.CharField(max_length=255)), + ('data', models.TextField(default='{}')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pretixbase.Event')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Order', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=16, verbose_name='Order code')), + ('status', models.CharField(choices=[('n', 'pending'), ('p', 'paid'), ('e', 'expired'), ('c', 'cancelled'), ('r', 'refunded')], max_length=3, verbose_name='Status')), + ('email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='E-mail')), + ('locale', models.CharField(blank=True, max_length=32, null=True, verbose_name='Locale')), + ('secret', models.CharField(default=pretix.base.models.orders.generate_secret, max_length=32)), + ('datetime', models.DateTimeField(verbose_name='Date')), + ('expires', models.DateTimeField(verbose_name='Expiration date')), + ('payment_date', models.DateTimeField(blank=True, null=True, verbose_name='Payment date')), + ('payment_provider', models.CharField(blank=True, max_length=255, null=True, verbose_name='Payment provider')), + ('payment_fee', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Payment method fee')), + ('payment_info', models.TextField(blank=True, null=True, verbose_name='Payment information')), + ('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', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='orders', to='pretixbase.Event', verbose_name='Event')), + ], + options={ + 'verbose_name': 'Order', + 'ordering': ('-datetime',), + 'verbose_name_plural': 'Orders', + }, + bases=(models.Model, pretix.base.models.base.LoggingMixin), + ), + migrations.CreateModel( + name='OrderPosition', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Price')), + ('attendee_name', models.CharField(blank=True, help_text='Empty, if this product is not an admission ticket', max_length=255, null=True, verbose_name='Attendee name')), + ('voucher_discount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=10)), + ('base_price', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='pretixbase.Item', verbose_name='Item')), + ('order', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='positions', to='pretixbase.Order', verbose_name='Order')), + ('variation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='pretixbase.ItemVariation', verbose_name='Variation')), + ], + options={ + 'verbose_name': 'Order position', + 'verbose_name_plural': 'Order positions', + }, + ), + migrations.CreateModel( + name='Organizer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200, verbose_name='Name')), + ('slug', 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')), + ], + options={ + 'verbose_name': 'Organizer', + 'ordering': ('name',), + 'verbose_name_plural': 'Organizers', + }, + bases=(models.Model, pretix.base.models.base.LoggingMixin), + ), + migrations.CreateModel( + name='OrganizerPermission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('can_create_events', models.BooleanField(default=True, verbose_name='Can create events')), + ('organizer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_perms', to='pretixbase.Organizer')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='organizer_perms', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'Organizer permission', + 'verbose_name_plural': 'Organizer permissions', + }, + ), + migrations.CreateModel( + name='OrganizerSetting', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(max_length=255)), + ('value', models.TextField()), + ('object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='setting_objects', to='pretixbase.Organizer')), + ], + ), + migrations.CreateModel( + name='Question', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('question', pretix.base.i18n.I18nTextField(verbose_name='Question')), + ('type', models.CharField(choices=[('N', 'Number'), ('S', 'Text (one line)'), ('T', 'Multiline text'), ('B', 'Yes/No')], max_length=5, verbose_name='Question type')), + ('required', models.BooleanField(default=False, verbose_name='Required question')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='questions', to='pretixbase.Event')), + ('items', models.ManyToManyField(blank=True, help_text='This question will be asked to buyers of the selected products', related_name='questions', to='pretixbase.Item', verbose_name='Products')), + ], + options={ + 'verbose_name': 'Question', + 'verbose_name_plural': 'Questions', + }, + bases=(models.Model, pretix.base.models.base.LoggingMixin), + ), + migrations.CreateModel( + name='QuestionAnswer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('answer', models.TextField()), + ('cartposition', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='pretixbase.CartPosition')), + ('orderposition', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='pretixbase.OrderPosition')), + ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='pretixbase.Question')), + ], + ), + migrations.CreateModel( + name='Quota', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200, verbose_name='Name')), + ('size', models.PositiveIntegerField(blank=True, help_text='Leave empty for an unlimited number of tickets.', null=True, verbose_name='Total capacity')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quotas', to='pretixbase.Event', verbose_name='Event')), + ('items', models.ManyToManyField(blank=True, related_name='quotas', to='pretixbase.Item', verbose_name='Item')), + ('variations', models.ManyToManyField(blank=True, related_name='quotas', to='pretixbase.ItemVariation', verbose_name='Variations')), + ], + options={ + 'verbose_name': 'Quota', + 'verbose_name_plural': 'Quotas', + }, + bases=(models.Model, pretix.base.models.base.LoggingMixin), + ), + migrations.CreateModel( + name='Voucher', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=255, verbose_name='Voucher code')), + ('valid_until', models.DateTimeField(blank=True, null=True, verbose_name='Valid until')), + ('block_quota', models.BooleanField(default=False, help_text="If activated, this voucher will be substracted from the affected product's quotas, such that it is guaranteed that anyone with this voucher code does receive a ticket.", verbose_name='Reserve ticket from quota')), + ('allow_ignore_quota', models.BooleanField(default=False, help_text='If activated, a holder of this voucher code can buy tickets, even if there are none left.', verbose_name='Allow to bypass quota')), + ('price', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Set product price to')), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='vouchers', to='pretixbase.Event', verbose_name='Event')), + ], + options={ + 'verbose_name': 'Voucher', + 'verbose_name_plural': 'Vouchers', + }, + ), + migrations.AddField( + model_name='organizer', + name='permitted', + field=models.ManyToManyField(related_name='organizers', through='pretixbase.OrganizerPermission', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='orderposition', + name='voucher', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pretixbase.Voucher'), + ), + migrations.AddField( + model_name='item', + name='category', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='items', to='pretixbase.ItemCategory', verbose_name='Category'), + ), + migrations.AddField( + model_name='item', + name='event', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='items', to='pretixbase.Event', verbose_name='Event'), + ), + migrations.AddField( + model_name='event', + name='organizer', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='events', to='pretixbase.Organizer'), + ), + migrations.AddField( + model_name='event', + name='permitted', + field=models.ManyToManyField(related_name='events', through='pretixbase.EventPermission', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='cartposition', + name='event', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pretixbase.Event', verbose_name='Event'), + ), + migrations.AddField( + model_name='cartposition', + name='item', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='pretixbase.Item', verbose_name='Item'), + ), + migrations.AddField( + model_name='cartposition', + name='variation', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='pretixbase.ItemVariation', verbose_name='Variation'), + ), + migrations.AddField( + model_name='cartposition', + name='voucher', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pretixbase.Voucher'), + ), + migrations.AddField( + model_name='cachedticket', + name='order', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pretixbase.Order'), + ), + migrations.AddField( + model_name='voucher', + name='item', + field=models.ForeignKey(blank=True, help_text="This product is added to the user's cart if the voucher is redeemed.", null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vouchers', to='pretixbase.Item', verbose_name='Product'), + ), + migrations.AlterField( + model_name='voucher', + name='price', + field=models.DecimalField(blank=True, decimal_places=2, help_text='If empty, the product will cost its normal price.', max_digits=10, null=True, verbose_name='Set product price to'), + ), + migrations.AddField( + model_name='voucher', + name='redeemed', + field=models.BooleanField(default=False, verbose_name='Redeemed'), + ), + migrations.AlterUniqueTogether( + name='voucher', + unique_together=set([('event', 'code')]), + ), + migrations.AlterField( + model_name='voucher', + name='code', + field=models.CharField(default=pretix.base.models.vouchers.generate_code, max_length=255, verbose_name='Voucher code'), + ), + migrations.AddField( + model_name='orderposition', + name='tax_rate', + field=models.DecimalField(decimal_places=2, default=0, max_digits=7, verbose_name='Tax rate'), + preserve_default=False, + ), + migrations.AddField( + model_name='orderposition', + name='tax_value', + field=models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Tax value'), + preserve_default=False, + ), + migrations.AlterField( + model_name='item', + name='tax_rate', + field=models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=7, verbose_name='Taxes included in percent'), + ), + migrations.CreateModel( + name='InvoiceAddress', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('last_modified', models.DateTimeField(auto_now=True)), + ('company', models.CharField(blank=True, max_length=255, verbose_name='Company name')), + ('name', models.CharField(blank=True, max_length=255, verbose_name='Full name')), + ('street', models.TextField(verbose_name='Address')), + ('zipcode', models.CharField(max_length=30, verbose_name='ZIP code')), + ('city', models.CharField(max_length=255, verbose_name='City')), + ('country', models.CharField(max_length=255, verbose_name='Country')), + ('vat_id', models.CharField(blank=True, max_length=255, verbose_name='VAT ID')), + ('order', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='invoice_address', to='pretixbase.Order')), + ], + ), + migrations.AddField( + model_name='event', + name='live', + field=models.BooleanField(default=False, verbose_name='Shop is live'), + ), + migrations.AddField( + model_name='orderposition', + name='secret', + field=models.CharField(db_index=True, default=pretix.base.models.orders.generate_position_secret, max_length=64), + ), + migrations.AddField( + model_name='order', + name='payment_fee_tax_rate', + field=models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Payment method fee tax rate'), + preserve_default=False, + ), + migrations.AddField( + model_name='order', + name='payment_fee_tax_value', + field=models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='Payment method fee tax'), + ), + migrations.CreateModel( + name='Invoice', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('invoice_no', models.PositiveIntegerField(db_index=True)), + ('is_cancelled', models.BooleanField(default=False)), + ('invoice_from', models.TextField()), + ('invoice_to', models.TextField()), + ('date', models.DateField(default=datetime.date.today)), + ('file', models.FileField(blank=True, null=True, upload_to=pretix.base.models.invoices.invoice_filename)), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='invoices', to='pretixbase.Event')), + ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='invoices', to='pretixbase.Order')), + ], + ), + migrations.CreateModel( + name='InvoiceLine', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.TextField()), + ('gross_value', models.DecimalField(decimal_places=2, max_digits=10)), + ('tax_value', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=10)), + ('tax_rate', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=7)), + ('invoice', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lines', to='pretixbase.Invoice')), + ], + ), + migrations.AddField( + model_name='invoice', + name='locale', + field=models.CharField(default='en', max_length=50), + ), + migrations.AddField( + model_name='invoice', + name='additional_text', + field=models.TextField(blank=True), + ), + migrations.RemoveField( + model_name='invoice', + name='is_cancelled', + ), + migrations.AddField( + model_name='invoice', + name='is_cancellation', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='invoice', + name='refers', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='refered', to='pretixbase.Invoice'), + ), + migrations.AlterUniqueTogether( + name='invoice', + unique_together=set([('event', 'invoice_no')]), + ), + migrations.AddField( + model_name='voucher', + name='variation', + field=models.ForeignKey(blank=True, help_text='This variation of the product select above is being used.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='vouchers', to='pretixbase.ItemVariation', verbose_name='Product variation'), + ), + migrations.AlterModelOptions( + name='logentry', + options={'ordering': ('-datetime',)}, + ), + migrations.AddField( + model_name='item', + name='free_price', + field=models.BooleanField(default=False, help_text='If this option is active, your users can choose the price themselves. The price configured above is then interpreted as the minimum price a user has to enter. You could use this e.g. to collect additional donations for your event.', verbose_name='Free price input'), + ), + migrations.CreateModel( + name='QuestionOption', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('answer', pretix.base.i18n.I18nCharField(verbose_name='Answer')), + ], + ), + migrations.AlterField( + model_name='question', + name='type', + field=models.CharField(choices=[('N', 'Number'), ('S', 'Text (one line)'), ('T', 'Multiline text'), ('B', 'Yes/No'), ('C', 'Choose one from a list'), ('M', 'Choose multiple from a list')], max_length=5, verbose_name='Question type'), + ), + migrations.AddField( + model_name='questionoption', + name='question', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='options', to='pretixbase.Question'), + ), + migrations.AddField( + model_name='questionanswer', + name='options', + field=models.ManyToManyField(blank=True, related_name='answers', to='pretixbase.QuestionOption'), + ), + migrations.AddField( + model_name='voucher', + name='quota', + field=models.ForeignKey(blank=True, help_text='If enabled, the voucher is valid for any product affected by this quota.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='quota', to='pretixbase.Quota', verbose_name='Quota'), + ), + migrations.AddField( + model_name='voucher', + name='comment', + field=models.TextField(blank=True, help_text='The text entered in this field will not be visible to the user and is available for your convenience.', verbose_name='Comment'), + ), + migrations.AddField( + model_name='voucher', + name='tag', + field=models.CharField(blank=True, db_index=True, help_text='You can use this field to group multiple vouchers together. If you enter the same value for multiple vouchers, you can get statistics on how many of them have been redeemed etc.', max_length=255, verbose_name='Tag'), + ), + migrations.AddField( + model_name='item', + name='hide_without_voucher', + field=models.BooleanField(default=False, help_text='This product will be hidden from the event page until the user enters a voucher code that is specifically tied to this product (and not via a quota).', verbose_name='This product will only be shown if a voucher matching the product is redeemed.'), + ), + migrations.AddField( + model_name='item', + name='require_voucher', + field=models.BooleanField(default=False, help_text='To buy this product, the user needs a voucher that applies to this product either directly or via a quota.', verbose_name='This product can only be bought using a voucher.'), + ), + migrations.AlterField( + model_name='logentry', + name='datetime', + field=models.DateTimeField(auto_now_add=True, db_index=True), + ), + migrations.AlterField( + model_name='logentry', + name='object_id', + field=models.PositiveIntegerField(db_index=True), + ), + migrations.AlterField( + model_name='order', + name='code', + field=models.CharField(db_index=True, max_length=16, verbose_name='Order code'), + ), + migrations.AlterField( + model_name='order', + name='status', + field=models.CharField(choices=[('n', 'pending'), ('p', 'paid'), ('e', 'expired'), ('c', 'cancelled'), ('r', 'refunded')], db_index=True, max_length=3, verbose_name='Status'), + ), + migrations.AlterField( + model_name='voucher', + name='code', + field=models.CharField(db_index=True, default=pretix.base.models.vouchers.generate_code, max_length=255, verbose_name='Voucher code'), + ), + migrations.AddField( + model_name='order', + name='comment', + field=models.TextField(blank=True, help_text='The text entered in this field will not be visible to the user and is available for your convenience.', verbose_name='Comment'), + ), + migrations.RemoveField( + model_name='cartposition', + name='base_price', + ), + migrations.RemoveField( + model_name='cartposition', + name='voucher_discount', + ), + migrations.RemoveField( + model_name='orderposition', + name='base_price', + ), + migrations.RemoveField( + model_name='orderposition', + name='voucher_discount', + ), + ] diff --git a/src/pretix/base/migrations/0031_auto_20160816_0648_squashed_0048_auto_20161129_1330.py b/src/pretix/base/migrations/0031_auto_20160816_0648_squashed_0048_auto_20161129_1330.py new file mode 100644 index 0000000000..8a4e943d54 --- /dev/null +++ b/src/pretix/base/migrations/0031_auto_20160816_0648_squashed_0048_auto_20161129_1330.py @@ -0,0 +1,212 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.4 on 2017-02-03 14:21 +from __future__ import unicode_literals + +import django.core.validators +import django.db.migrations.operations.special +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + +import pretix.base.validators + + +def preserve_event_settings(apps, schema_editor): + Event = apps.get_model('pretixbase', 'Event') + EventSetting = apps.get_model('pretixbase', 'EventSetting') + for e in Event.objects.all(): + EventSetting.objects.create(object=e, key='mail_days_order_expire_warning', value='0') + + +def forwards42(apps, schema_editor): + Order = apps.get_model('pretixbase', 'Order') + EventSetting = apps.get_model('pretixbase', 'EventSetting') + etz = { + s['object_id']: s['value'] + for s in EventSetting.objects.filter(key='timezone').values('object_id', 'value') + } + for order in Order.objects.all(): + tz = pytz.timezone(etz.get(order.event_id, 'UTC')) + order.expires = order.expires.astimezone(tz).replace(hour=23, minute=59, second=59) + order.save() + + +def forwards44(apps, schema_editor): + CachedTicket = apps.get_model('pretixbase', 'CachedTicket') + CachedTicket.objects.all().delete() + + +class Migration(migrations.Migration): + + replaces = [('pretixbase', '0031_auto_20160816_0648'), ('pretixbase', '0032_question_position'), ('pretixbase', '0033_auto_20160821_2222'), ('pretixbase', '0034_auto_20160830_1952'), ('pretixbase', '0032_item_allow_cancel'), ('pretixbase', '0033_auto_20160822_1044'), ('pretixbase', '0035_merge'), ('pretixbase', '0036_auto_20160902_0755'), ('pretixbase', '0037_invoice_payment_provider_text'), ('pretixbase', '0038_auto_20160924_1448'), ('pretixbase', '0039_user_require_2fa'), ('pretixbase', '0040_u2fdevice'), ('pretixbase', '0041_auto_20161018_1654'), ('pretixbase', '0042_order_expires'), ('pretixbase', '0043_globalsetting'), ('pretixbase', '0044_auto_20161101_1610'), ('pretixbase', '0045_auto_20161108_1542'), ('pretixbase', '0046_order_meta_info'), ('pretixbase', '0047_auto_20161126_1300'), ('pretixbase', '0048_auto_20161129_1330')] + + dependencies = [ + ('pretixbase', '0030_auto_20160816_0646'), + ] + + operations = [ + migrations.RenameField( + model_name='invoice', + old_name='invoice_no_charfield', + new_name='invoice_no', + ), + migrations.AddField( + model_name='invoice', + name='footer_text', + field=models.TextField(blank=True), + ), + migrations.AddField( + model_name='invoice', + name='introductory_text', + field=models.TextField(blank=True), + ), + migrations.AlterUniqueTogether( + name='invoice', + unique_together=set([('event', 'invoice_no')]), + ), + migrations.AddField( + model_name='question', + name='position', + field=models.IntegerField(default=0), + ), + migrations.AlterModelOptions( + name='question', + options={'ordering': ('position', 'id'), 'verbose_name': 'Question', 'verbose_name_plural': 'Questions'}, + ), + migrations.AddField( + model_name='item', + name='allow_cancel', + field=models.BooleanField(default=True, help_text='If you deactivate this, an order including this product might not be cancelled by the user. It may still be cancelled by you.', verbose_name='Allow product to be cancelled'), + ), + migrations.AddField( + model_name='order', + name='expiry_reminder_sent', + field=models.BooleanField(default=False), + ), + migrations.RunPython( + code=preserve_event_settings, + ), + migrations.AddField( + model_name='invoice', + name='payment_provider_text', + field=models.TextField(blank=True), + ), + migrations.AddField( + model_name='eventpermission', + name='can_view_vouchers', + field=models.BooleanField(default=True, verbose_name='Can view vouchers'), + ), + migrations.AlterField( + model_name='item', + name='allow_cancel', + field=models.BooleanField(default=True, help_text='If you deactivate this, an order including this product might not be canceled by the user. It may still be canceled by you.', verbose_name='Allow product to be canceled'), + ), + migrations.AlterField( + model_name='order', + name='status', + field=models.CharField(choices=[('n', 'pending'), ('p', 'paid'), ('e', 'expired'), ('c', 'canceled'), ('r', 'refunded')], db_index=True, max_length=3, verbose_name='Status'), + ), + migrations.AddField( + model_name='user', + name='require_2fa', + field=models.BooleanField(default=False), + ), + migrations.CreateModel( + name='U2FDevice', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text='The human-readable name of this device.', max_length=64)), + ('confirmed', models.BooleanField(default=True, help_text='Is this device ready for use?')), + ('json_data', models.TextField()), + ('user', models.ForeignKey(help_text='The user that this device belongs to.', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AlterField( + model_name='cachedticket', + name='cachedfile', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='pretixbase.CachedFile'), + ), + migrations.RunPython( + code=forwards42, + reverse_code=django.db.migrations.operations.special.RunPython.noop, + ), + migrations.CreateModel( + name='GlobalSetting', + fields=[ + ('key', models.CharField(max_length=255, primary_key=True, serialize=False)), + ('value', models.TextField()), + ], + ), + migrations.RunPython( + code=forwards44, + reverse_code=django.db.migrations.operations.special.RunPython.noop, + ), + migrations.RemoveField( + model_name='cachedticket', + name='order', + ), + migrations.AddField( + model_name='cachedticket', + name='order_position', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='pretixbase.OrderPosition'), + preserve_default=False, + ), + migrations.AlterField( + model_name='cartposition', + name='expires', + field=models.DateTimeField(db_index=True, verbose_name='Expiration date'), + ), + migrations.AlterField( + model_name='voucher', + name='redeemed', + field=models.BooleanField(db_index=True, default=False, verbose_name='Redeemed'), + ), + migrations.AlterField( + model_name='voucher', + name='valid_until', + field=models.DateTimeField(blank=True, db_index=True, null=True, verbose_name='Valid until'), + ), + migrations.AddField( + model_name='order', + name='meta_info', + field=models.TextField(blank=True, null=True, verbose_name='Meta information'), + ), + migrations.AddField( + model_name='voucher', + name='max_usages', + field=models.PositiveIntegerField(default=1, help_text='Number of times this voucher can be redeemed.', verbose_name='Maximum usages'), + ), + migrations.AlterField( + model_name='event', + 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.-]+$'), pretix.base.validators.EventSlugBlacklistValidator()], verbose_name='Slug'), + ), + 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.-]+$'), pretix.base.validators.OrganizerSlugBlacklistValidator()], verbose_name='Slug'), + ), + migrations.AlterField( + model_name='voucher', + name='redeemed', + field=models.PositiveIntegerField(default=0, verbose_name='Redeemed'), + ), + migrations.AddField( + model_name='voucher', + name='price_mode', + field=models.CharField(choices=[('none', 'No effect'), ('set', 'Set product price to'), ('subtract', 'Subtract from product price'), ('percent', 'Reduce product price by (%)')], default='set', max_length=100, verbose_name='Price mode'), + ), + migrations.RenameField( + model_name='voucher', + old_name='price', + new_name='value', + ), + migrations.AlterField( + model_name='voucher', + name='value', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Voucher value'), + ), + ] diff --git a/src/pretix/base/migrations/0050_orderposition_positionid_squashed_0061_event_location.py b/src/pretix/base/migrations/0050_orderposition_positionid_squashed_0061_event_location.py new file mode 100644 index 0000000000..115cd97385 --- /dev/null +++ b/src/pretix/base/migrations/0050_orderposition_positionid_squashed_0061_event_location.py @@ -0,0 +1,219 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.4 on 2017-02-03 14:12 +from __future__ import unicode_literals + +import django.core.validators +import django.db.migrations.operations.special +import django.db.models.deletion +import django.utils.timezone +from django.conf import settings +from django.db import migrations, models + +import pretix.base.i18n +import pretix.base.models.event +import pretix.base.models.orders +import pretix.base.models.organizer +import pretix.base.validators + + +def forwards50(apps, schema_editor): + Order = apps.get_model('pretixbase', 'Order') + for o in Order.objects.all(): + for i, p in enumerate(o.positions.all()): + p.positionid = i + 1 + p.save() + + +def invalidate_ticket_cache(apps, schema_editor): + CachedTicket = apps.get_model('pretixbase', 'CachedTicket') + for ct in CachedTicket.objects.all(): + try: + if ct.cachedfile: + ct.cachedfile.delete() + if ct.cachedfile.file: + ct.cachedfile.file.delete(False) + except models.Model.DoesNotExist: + pass + ct.delete() + + +def merge_names(apps, schema_editor): + User = apps.get_model('pretixbase', 'User') + for u in User.objects.all(): + if u.givenname: + if u.familyname: + u.fullname = u.givenname + " " + u.familyname + else: + u.fullname = u.givenname + elif u.familyname: + u.fullname = u.familyname + u.save() + + +class Migration(migrations.Migration): + + replaces = [('pretixbase', '0050_orderposition_positionid'), ('pretixbase', '0051_auto_20161221_1720'), ('pretixbase', '0052_auto_20161231_1533'), ('pretixbase', '0053_auto_20170104_1252'), ('pretixbase', '0054_auto_20170107_1058'), ('pretixbase', '0055_organizerpermission_can_change_permissions'), ('pretixbase', '0056_auto_20170107_1251'), ('pretixbase', '0057_auto_20170107_1531'), ('pretixbase', '0058_auto_20170107_1533'), ('pretixbase', '0059_cachedcombinedticket'), ('pretixbase', '0060_auto_20170113_1438'), ('pretixbase', '0061_event_location')] + + dependencies = [ + ('pretixbase', '0049_checkin'), + ] + + operations = [ + migrations.AddField( + model_name='orderposition', + name='positionid', + field=models.PositiveIntegerField(default=1), + ), + migrations.RunPython( + code=forwards50, + reverse_code=django.db.migrations.operations.special.RunPython.noop, + ), + migrations.RunPython( + code=invalidate_ticket_cache, + reverse_code=django.db.migrations.operations.special.RunPython.noop, + ), + migrations.RemoveField( + model_name='cachedticket', + name='cachedfile', + ), + migrations.AddField( + model_name='cachedticket', + name='extension', + field=models.CharField(default='', max_length=255), + preserve_default=False, + ), + migrations.AddField( + model_name='cachedticket', + name='file', + field=models.FileField(blank=True, null=True, upload_to=pretix.base.models.orders.cachedticket_name), + ), + migrations.AddField( + model_name='cachedticket', + name='type', + field=models.CharField(default='', max_length=255), + preserve_default=False, + ), + migrations.AlterField( + model_name='checkin', + name='datetime', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.AlterField( + model_name='checkin', + name='position', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checkins', to='pretixbase.OrderPosition'), + ), + migrations.AlterField( + model_name='voucher', + name='price_mode', + field=models.CharField(choices=[('none', 'No effect'), ('set', 'Set product price to'), ('subtract', 'Subtract from product price'), ('percent', 'Reduce product price by (%)')], default='none', max_length=100, verbose_name='Price mode'), + ), + migrations.CreateModel( + name='RequiredAction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('datetime', models.DateTimeField(auto_now_add=True, db_index=True)), + ('done', models.BooleanField(default=False)), + ('action_type', models.CharField(max_length=255)), + ('data', models.TextField(default='{}')), + ], + options={ + 'ordering': ('datetime',), + }, + ), + migrations.AlterField( + model_name='event', + name='slug', + field=models.SlugField(help_text='Should be short, only contain lowercase letters and numbers, and must be unique among your events. This will be used in order codes, invoice numbers, links 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.-]+$'), pretix.base.validators.EventSlugBlacklistValidator()], verbose_name='Short form'), + ), + migrations.AddField( + model_name='requiredaction', + name='event', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pretixbase.Event'), + ), + migrations.AddField( + model_name='requiredaction', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='eventpermission', + name='invite_email', + field=models.EmailField(blank=True, max_length=254, null=True), + ), + migrations.AddField( + model_name='eventpermission', + name='invite_token', + field=models.CharField(blank=True, default=pretix.base.models.event.generate_invite_token, max_length=64, null=True), + ), + migrations.AlterField( + model_name='eventpermission', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='event_perms', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='organizerpermission', + name='can_change_permissions', + field=models.BooleanField(default=True, verbose_name='Can change permissions'), + ), + migrations.AddField( + model_name='organizerpermission', + name='invite_email', + field=models.EmailField(blank=True, max_length=254, null=True), + ), + migrations.AddField( + model_name='organizerpermission', + name='invite_token', + field=models.CharField(blank=True, default=pretix.base.models.organizer.generate_invite_token, max_length=64, null=True), + ), + migrations.AlterField( + model_name='organizerpermission', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='organizer_perms', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='user', + name='fullname', + field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Full name'), + ), + 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.-]+$'), pretix.base.validators.OrganizerSlugBlacklistValidator()], verbose_name='Short form'), + ), + migrations.RunPython( + code=merge_names, + reverse_code=django.db.migrations.operations.special.RunPython.noop, + ), + migrations.RemoveField( + model_name='user', + name='familyname', + ), + migrations.RemoveField( + model_name='user', + name='givenname', + ), + migrations.CreateModel( + name='CachedCombinedTicket', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('provider', models.CharField(max_length=255)), + ('type', models.CharField(max_length=255)), + ('extension', models.CharField(max_length=255)), + ('file', models.FileField(blank=True, null=True, upload_to=pretix.base.models.orders.cachedcombinedticket_name)), + ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pretixbase.Order')), + ('created', models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now)), + ], + ), + migrations.AddField( + model_name='cachedticket', + name='created', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='event', + name='location', + field=pretix.base.i18n.I18nCharField(blank=True, max_length=200, null=True, verbose_name='Location'), + ), + ] diff --git a/src/pretix/base/migrations/0061_event_location.py b/src/pretix/base/migrations/0061_event_location.py index 37894b80e3..70f363b6c5 100644 --- a/src/pretix/base/migrations/0061_event_location.py +++ b/src/pretix/base/migrations/0061_event_location.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from django.db import migrations + import pretix.base.i18n