lingo: transaction handles remote items
This commit is contained in:
parent
1e9925b668
commit
b6a25ca9ea
|
@ -0,0 +1,33 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
from django.conf import settings
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('lingo', '0008_auto_20150908_1538'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='transaction',
|
||||
name='regie',
|
||||
field=models.ForeignKey(to='lingo.Regie', null=True),
|
||||
preserve_default=True,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='transaction',
|
||||
name='remote_items',
|
||||
field=models.CharField(default='', max_length=512),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='transaction',
|
||||
name='user',
|
||||
field=models.ForeignKey(to=settings.AUTH_USER_MODEL, null=True),
|
||||
preserve_default=True,
|
||||
),
|
||||
]
|
|
@ -133,6 +133,10 @@ class Regie(models.Model):
|
|||
return build_remote_item(item.get('data'), self)
|
||||
return {}
|
||||
|
||||
def pay_item(self, request, item):
|
||||
url = self.webservice_url + '/invoice/%s/pay/' % item
|
||||
return self.get_url(request, url)
|
||||
|
||||
def as_api_dict(self):
|
||||
return {'slug': self.slug,
|
||||
'label': self.label,
|
||||
|
@ -183,14 +187,19 @@ class RemoteItem(object):
|
|||
|
||||
|
||||
class Transaction(models.Model):
|
||||
regie = models.ForeignKey(Regie, null=True)
|
||||
items = models.ManyToManyField(BasketItem, blank=True)
|
||||
remote_items = models.CharField(max_length=512)
|
||||
start_date = models.DateTimeField(auto_now_add=True)
|
||||
end_date = models.DateTimeField(null=True)
|
||||
bank_data = JSONField(blank=True)
|
||||
order_id = models.CharField(max_length=200)
|
||||
user = models.ForeignKey(settings.AUTH_USER_MODEL)
|
||||
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True)
|
||||
status = models.IntegerField(null=True)
|
||||
|
||||
def is_remote(self):
|
||||
return self.remote_items != ''
|
||||
|
||||
def is_paid(self):
|
||||
return self.status == eopayment.PAID
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
{% if item.amount %}
|
||||
{% csrf_token %}
|
||||
<input type="hidden" name="regie" value="{{ regie.pk }}" />
|
||||
<input type="hidden" name="item" value="{{ item.pk }}" />
|
||||
<input type="hidden" name="item" value="{{ item.id }}" />
|
||||
<button>{% trans "Pay" %}</button>
|
||||
{% endif %}
|
||||
</form>
|
||||
|
|
|
@ -96,19 +96,41 @@ class AddBasketItemApiView(View):
|
|||
|
||||
class PayView(View):
|
||||
def post(self, request, *args, **kwargs):
|
||||
items = BasketItem.objects.filter(id__in=request.POST.getlist('item'))
|
||||
# XXX: check all items are going to the same regie
|
||||
regie_id = request.POST.get('regie')
|
||||
if regie_id:
|
||||
regie = Regie.objects.get(pk=regie_id)
|
||||
if regie.is_remote():
|
||||
items = []
|
||||
remote_items_data = []
|
||||
# get all items data from regie webservice
|
||||
for item in request.POST.getlist('item'):
|
||||
remote_items_data.append(regie.get_item(request, item))
|
||||
remote_items = ','.join([x.id for x in remote_items_data])
|
||||
else:
|
||||
items = BasketItem.objects.filter(id__in=request.POST.getlist('item'), regie=regie)
|
||||
remote_items = ''
|
||||
else:
|
||||
items = BasketItem.objects.filter(id__in=request.POST.getlist('item'))
|
||||
# XXX: check all items are going to the same regie
|
||||
regie = items[0].regie
|
||||
remote_items = ''
|
||||
|
||||
transaction = Transaction()
|
||||
transaction.user = request.user
|
||||
if request.user.is_authenticated():
|
||||
transaction.user = request.user
|
||||
else:
|
||||
transaction.user = None
|
||||
transaction.save()
|
||||
transaction.regie = regie
|
||||
transaction.items = items
|
||||
transaction.remote_items = remote_items
|
||||
transaction.status = 0
|
||||
transaction.save()
|
||||
|
||||
total_amount = sum([x.amount for x in items])
|
||||
|
||||
regie = items[0].regie
|
||||
if remote_items:
|
||||
total_amount = sum([x.amount for x in remote_items_data])
|
||||
else:
|
||||
total_amount = sum([x.amount for x in items])
|
||||
|
||||
payment = eopayment.Payment(regie.service, regie.service_options)
|
||||
return_url = request.build_absolute_uri(
|
||||
|
@ -148,6 +170,9 @@ class CallbackView(View):
|
|||
transaction.end_date = timezone.now()
|
||||
transaction.save()
|
||||
|
||||
# check if transaction belongs to right regie
|
||||
assert transaction.regie == regie
|
||||
|
||||
if payment_response.result != eopayment.PAID:
|
||||
return HttpResponseRedirect('/')
|
||||
|
||||
|
@ -159,6 +184,10 @@ class CallbackView(View):
|
|||
except:
|
||||
# ignore errors, it will be retried later on if it fails
|
||||
pass
|
||||
|
||||
for item in transaction.remote_items.split(','):
|
||||
regie.pay_item(request, item)
|
||||
|
||||
return HttpResponseRedirect('/')
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue