diff --git a/src/pretix/base/migrations/0041_auto_20161019_1757.py b/src/pretix/base/migrations/0041_auto_20161019_1757.py deleted file mode 100644 index e0a5ef6809..0000000000 --- a/src/pretix/base/migrations/0041_auto_20161019_1757.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.2 on 2016-10-19 17:57 -from __future__ import unicode_literals - -from django.db import migrations - - -def forwards(apps, schema_editor): - Order = apps.get_model('pretixbase', 'Order') - for order in Order.objects.all(): - order.expires = order.expires.replace(hour=23, minute=59, second=59) - order.save() - - -class Migration(migrations.Migration): - - dependencies = [ - ('pretixbase', '0040_u2fdevice'), - ] - - operations = [ - migrations.RunPython(forwards) - ] diff --git a/src/pretix/base/migrations/0042_order_expires.py b/src/pretix/base/migrations/0042_order_expires.py new file mode 100644 index 0000000000..df4abf5417 --- /dev/null +++ b/src/pretix/base/migrations/0042_order_expires.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-19 17:57 +from __future__ import unicode_literals + +import pytz +from django.db import migrations +from django.utils import timezone + + +def forwards(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() + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0041_auto_20161018_1654'), + ] + + operations = [ + migrations.RunPython(forwards) + ] diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 2a2bd751ea..e71b1a6ad7 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -264,28 +264,37 @@ def _check_positions(event: Event, now_dt: datetime, positions: List[CartPositio @transaction.atomic def _create_order(event: Event, email: str, positions: List[CartPosition], now_dt: datetime, payment_provider: BasePaymentProvider, locale: str=None, address: int=None): + from datetime import date, time + total = sum([c.price for c in positions]) payment_fee = payment_provider.calculate_fee(total) total += payment_fee - exp_by_date = now_dt + timedelta(days=event.settings.get('payment_term_days', as_type=int)) + tz = pytz.timezone(event.settings.timezone) + exp_by_date = now_dt.astimezone(tz) + timedelta(days=event.settings.get('payment_term_days', as_type=int)) + exp_by_date = exp_by_date.replace(hour=23, minute=59, second=59, microsecond=0) if event.settings.get('payment_term_weekdays'): if exp_by_date.weekday() == 5: exp_by_date += timedelta(days=2) elif exp_by_date.weekday() == 6: exp_by_date += timedelta(days=1) - expires = [exp_by_date] + expires = exp_by_date + if event.settings.get('payment_term_last'): - last_date = event.settings.get('payment_term_last', as_type=datetime) - expires.append(make_aware(last_date, pytz.timezone(event.settings.timezone))) + last_date = make_aware(datetime.combine( + event.settings.get('payment_term_last', as_type=date), + time(hour=23, minute=59, second=59) + ), tz) + if last_date < expires: + expires = last_date order = Order.objects.create( status=Order.STATUS_PENDING, event=event, email=email, datetime=now_dt, - expires=min(expires).replace(hour=23, minute=59, second=59), + expires=expires, locale=locale, total=total, payment_fee=payment_fee,