send request to payment service

This commit is contained in:
Frédéric Péters 2015-03-05 17:02:52 +01:00
parent 9af86cef47
commit 6bd6e68941
5 changed files with 73 additions and 5 deletions

View File

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import jsonfield.fields
class Migration(migrations.Migration):
dependencies = [
('lingo', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Transaction',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('start_date', models.DateTimeField(auto_now_add=True)),
('end_date', models.DateTimeField(null=True)),
('bank_data', jsonfield.fields.JSONField(default=dict, blank=True)),
('order_id', models.CharField(max_length=200)),
('items', models.ManyToManyField(to='lingo.BasketItem', blank=True)),
],
options={
},
bases=(models.Model,),
),
]

View File

@ -70,6 +70,14 @@ class BasketItem(models.Model):
payment_date = models.DateTimeField(null=True)
class Transaction(models.Model):
items = models.ManyToManyField(BasketItem, blank=True)
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)
@register_cell_class
class LingoBasketCell(CellBase):

View File

@ -1,10 +1,11 @@
{% load i18n %}
{% if total %}
<h3>{% trans "Basket" %}</h3>
<form>
<form action="{% url 'lingo-pay' %}" method="POST">
{% csrf_token %}
<ul>
{% for item in items %}
<li><label><input type="checkbox" value="{{ item.id }}" checked/> {{ item.subject }}: {{ item.amount }} €</label> (<a href="{{ item.source_url}}">voir</a>)</li>
<li><label><input type="checkbox" name="item" value="{{ item.id }}" checked/> {{ item.subject }}: {{ item.amount }} €</label> (<a href="{{ item.source_url}}">voir</a>)</li>
{% endfor %}
<li><strong>{% trans "Total:" %}</strong> {{ total }} €</li>
</ul>

View File

@ -16,10 +16,11 @@
from django.conf.urls import patterns, include, url
from .views import RegiesApiView, AddBasketItemApiView
from .views import RegiesApiView, AddBasketItemApiView, PayView
urlpatterns = patterns('',
url('^api/lingo/regies$', RegiesApiView.as_view(), name='api-regies'),
url('^api/lingo/add-basket-item$', AddBasketItemApiView.as_view(),
name='api-add-basket-item'),
url('^lingo/pay$', PayView.as_view(), name='lingo-pay'),
)

View File

@ -18,11 +18,13 @@ from decimal import Decimal
import json
from django.contrib.auth.models import User
from django.http import HttpResponse
from django.http import HttpResponse, HttpResponseRedirect
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import View, ListView
from .models import Regie, BasketItem
import eopayment
from .models import Regie, BasketItem, Transaction
class RegiesApiView(ListView):
model = Regie
@ -78,3 +80,30 @@ class AddBasketItemApiView(View):
response = HttpResponse(content_type='application/json')
response.write(json.dumps({'result': 'success'}))
return response
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
transaction = Transaction()
transaction.save()
transaction.items = items
transaction.save()
total_amount = sum([x.amount for x in items])
regie = items[0].regie
payment = eopayment.Payment(regie.service, regie.service_options)
(order_id, kind, data) = payment.request(total_amount,
next_url=request.build_absolute_uri('/'))
transaction.order_id = order_id
transaction.save()
# XXX: mark basket items as being processed (?)
if kind == eopayment.URL:
return HttpResponseRedirect(data)
raise NotImplementedError()