forked from CGM_Public/pretix_original
60 lines
2.2 KiB
Python
60 lines
2.2 KiB
Python
from django.conf import settings
|
|
from django.core.urlresolvers import reverse
|
|
from django.utils.timezone import now
|
|
from pretix.base.models import Order, Quota
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
|
def mark_order_paid(order, provider=None, info=None, date=None, manual=None, force=False):
|
|
"""
|
|
Marks an order as paid. This clones the order object, sets the payment provider,
|
|
info and date and returns the cloned order object.
|
|
|
|
:param provider: The payment provider that marked this as paid
|
|
:type provider: str
|
|
:param info: The information to store in order.payment_info
|
|
:type info: str
|
|
:param date: The date the payment was received (if you pass ``None``, the current
|
|
time will be used).
|
|
:type date: datetime
|
|
:param force: Whether this payment should be marked as paid even if no remaining
|
|
quota is available (default: ``False``).
|
|
:type force: boolean
|
|
:raises Quota.QuotaExceededException: if the quota is exceeded and ``force`` is ``False``
|
|
"""
|
|
can_be_paid, quotas_locked = order._can_be_paid(keep_locked=True)
|
|
if not force and can_be_paid is not True:
|
|
raise Quota.QuotaExceededException(can_be_paid)
|
|
order = order.clone()
|
|
order.payment_provider = provider or order.payment_provider
|
|
order.payment_info = info or order.payment_info
|
|
order.payment_date = date or now()
|
|
if manual is not None:
|
|
order.payment_manual = manual
|
|
order.status = Order.STATUS_PAID
|
|
order.save()
|
|
|
|
if quotas_locked:
|
|
for quota in quotas_locked:
|
|
quota.release()
|
|
|
|
from pretix.base.services import mail
|
|
|
|
mail(
|
|
order.user, _('Payment received for your order: %(code)s') % {'code': order.code},
|
|
'pretixpresale/email/order_paid.txt',
|
|
{
|
|
'user': order.user,
|
|
'order': order,
|
|
'event': order.event,
|
|
'url': settings.SITE_URL + reverse('presale:event.order', kwargs={
|
|
'event': order.event.slug,
|
|
'organizer': order.event.organizer.slug,
|
|
'order': order.code
|
|
}),
|
|
'downloads': order.event.settings.get('ticket_download', as_type=bool)
|
|
},
|
|
order.event
|
|
)
|
|
return order
|