Refs #82 -- Make order expiry more clear (#116)

This commit is contained in:
Raphael Michel
2016-05-07 17:03:32 +02:00
parent c9350dde40
commit 944b5db0bf
14 changed files with 126 additions and 21 deletions

View File

@@ -531,7 +531,6 @@ class Quota(LoggedModel):
return OrderPosition.objects.filter(
self._position_lookup, order__status=Order.STATUS_PENDING,
order__expires__gte=now()
).distinct().count()
def count_paid_orders(self):

View File

@@ -4,7 +4,6 @@ import string
from datetime import datetime
from decimal import Decimal
from django import forms
from django.db import models
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
@@ -204,6 +203,13 @@ class Order(LoggedModel):
return True
return False # nothing there to modify
@property
def is_expired_by_time(self):
return (
self.status == Order.STATUS_PENDING and self.expires < now()
and not self.event.settings.get('payment_term_expire_automatically')
)
def _can_be_paid(self) -> Union[bool, str]:
error_messages = {
'late': _("The payment is too late to be accepted."),
@@ -212,7 +218,7 @@ class Order(LoggedModel):
if self.event.settings.get('payment_term_last') \
and now() > self.event.settings.get('payment_term_last'):
return error_messages['late']
if now() < self.expires:
if self.status == self.STATUS_PENDING:
return True
if not self.event.settings.get('payment_term_accept_late'):
return error_messages['late']

View File

@@ -2,6 +2,7 @@ from datetime import datetime, timedelta
from django.conf import settings
from django.db import transaction
from django.dispatch import receiver
from django.utils.timezone import now
from django.utils.translation import ugettext as _
from typing import List
@@ -19,7 +20,7 @@ from pretix.base.services.invoices import (
)
from pretix.base.services.mail import mail
from pretix.base.signals import (
order_paid, order_placed, register_payment_providers,
order_paid, order_placed, periodic_task, register_payment_providers,
)
from pretix.multidomain.urlreverse import build_absolute_uri
@@ -253,7 +254,7 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str],
event = Event.objects.get(id=event)
responses = register_payment_providers.send(event)
pprov = None
for receiver, response in responses:
for rec, response in responses:
provider = response(event)
if provider.identifier == payment_provider:
pprov = provider
@@ -316,6 +317,20 @@ def perform_order(event: str, payment_provider: str, positions: List[str],
raise OrderError(error_messages['busy'])
@receiver(signal=periodic_task)
def expire_orders(sender, **kwargs):
eventcache = {}
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)
eventcache[o.event.pk] = expire
if expire:
o.status = Order.STATUS_EXPIRED
o.log_action('pretix.event.order.expired')
o.save()
if settings.HAS_CELERY:
from pretix.celery import app

View File

@@ -49,6 +49,10 @@ DEFAULTS = {
'default': None,
'type': datetime,
},
'payment_term_expire_automatically': {
'default': 'True',
'type': bool
},
'payment_term_accept_late': {
'default': 'True',
'type': bool