diff --git a/src/pretix/base/migrations/0041_auto_20161019_1757.py b/src/pretix/base/migrations/0041_auto_20161019_1757.py new file mode 100644 index 0000000000..e0a5ef6809 --- /dev/null +++ b/src/pretix/base/migrations/0041_auto_20161019_1757.py @@ -0,0 +1,23 @@ +# -*- 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/services/orders.py b/src/pretix/base/services/orders.py index 6fc2b02f81..2a2bd751ea 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -4,19 +4,20 @@ from datetime import datetime, timedelta from decimal import Decimal from typing import List, Optional +import pytz from celery.exceptions import MaxRetriesExceededError from django.db import transaction from django.dispatch import receiver from django.utils.formats import date_format -from django.utils.timezone import now +from django.utils.timezone import make_aware, now from django.utils.translation import ugettext as _ from pretix.base.i18n import ( LazyDate, LazyLocaleException, LazyNumber, language, ) from pretix.base.models import ( - CartPosition, Event, Item, ItemVariation, Order, OrderPosition, - Quota, User, + CartPosition, Event, Item, ItemVariation, Order, OrderPosition, Quota, + User, ) from pretix.base.models.orders import InvoiceAddress from pretix.base.payment import BasePaymentProvider @@ -276,13 +277,15 @@ def _create_order(event: Event, email: str, positions: List[CartPosition], now_d expires = [exp_by_date] if event.settings.get('payment_term_last'): - expires.append(event.settings.get('payment_term_last', as_type=datetime)) + last_date = event.settings.get('payment_term_last', as_type=datetime) + expires.append(make_aware(last_date, pytz.timezone(event.settings.timezone))) + order = Order.objects.create( status=Order.STATUS_PENDING, event=event, email=email, datetime=now_dt, - expires=min(expires), + expires=min(expires).replace(hour=23, minute=59, second=59), locale=locale, total=total, payment_fee=payment_fee, @@ -361,9 +364,8 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str], @receiver(signal=periodic_task) def expire_orders(sender, **kwargs): eventcache = {} - today = now().replace(hour=0, minute=0, second=0) - for o in Order.objects.filter(expires__lt=today, status=Order.STATUS_PENDING).select_related('event'): + for o in Order.objects.filter(expires__lt=now(), status=Order.STATUS_PENDING).select_related('event'): expire = eventcache.get(o.event.pk, None) if expire is None: expire = o.event.settings.get('payment_term_expire_automatically', as_type=bool) diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index e3a784b476..74f2c35c34 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -197,12 +197,12 @@ class PaymentSettingsForm(SettingsForm): label=_('Payment term in days'), help_text=_("The number of days after placing an order the user has to pay to preserve his reservation."), ) - payment_term_last = forms.DateTimeField( + payment_term_last = forms.DateField( label=_('Last date of payments'), help_text=_("The last date any payments are accepted. This has precedence over the number of " "days configured above."), required=False, - widget=forms.DateTimeInput(attrs={'class': 'datetimepicker'}) + widget=forms.DateInput(attrs={'class': 'datepickerfield'}) ) payment_term_weekdays = forms.BooleanField( label=_('Only end payment terms on weekdays'), diff --git a/src/pretix/control/forms/orders.py b/src/pretix/control/forms/orders.py index c335f304dd..bce66953fd 100644 --- a/src/pretix/control/forms/orders.py +++ b/src/pretix/control/forms/orders.py @@ -13,13 +13,14 @@ class ExtendForm(I18nModelForm): model = Order fields = ['expires'] widgets = { - 'expires': forms.DateTimeInput(attrs={'class': 'datetimepicker'}), + 'expires': forms.DateInput(attrs={'class': 'datepickerfield'}), } def clean(self): data = super().clean() if data['expires'] < now(): raise ValidationError(_('The new expiry date needs to be in the future.')) + data['expires'] = data['expires'].replace(hour=23, minute=59, second=59) return data diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 7adc2b6e08..8232a8160f 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -1,8 +1,8 @@ from django.conf.urls import include, url from pretix.control.views import ( - auth, dashboards, event, help, item, main, orders, organizer, - user, vouchers, + auth, dashboards, event, help, item, main, orders, organizer, user, + vouchers, ) urlpatterns = [ diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 8dfc998fd1..4e573b5e08 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -13,8 +13,7 @@ from django.views.generic import DetailView, ListView, TemplateView, View from pretix.base.i18n import language from pretix.base.models import ( - CachedFile, CachedTicket, Invoice, Item, ItemVariation, Order, - Quota, + CachedFile, CachedTicket, Invoice, Item, ItemVariation, Order, Quota, ) from pretix.base.services import tickets from pretix.base.services.export import export diff --git a/src/tests/control/test_items.py b/src/tests/control/test_items.py index 8518f69a9c..c8ec749c98 100644 --- a/src/tests/control/test_items.py +++ b/src/tests/control/test_items.py @@ -6,8 +6,7 @@ from tests.base import SoupTest, extract_form_fields from pretix.base.models import ( Event, EventPermission, Item, ItemCategory, ItemVariation, Order, - OrderPosition, Organizer, OrganizerPermission, Question, - Quota, User, + OrderPosition, Organizer, OrganizerPermission, Question, Quota, User, )