Refactor mark_paid out of models

This commit is contained in:
Raphael Michel
2015-06-03 13:58:03 +02:00
parent 49ea85caee
commit fc907a2ec7
9 changed files with 79 additions and 203 deletions

View File

@@ -0,0 +1,58 @@
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.mail 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