mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-12-27 01:13:46 +00:00
Documentation des paiements personnalisés
This commit is contained in:
parent
cee7d5be7f
commit
8e12fefa2c
16 changed files with 479 additions and 27 deletions
|
@ -1,3 +1,132 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
"""
|
||||||
|
# Custom Payment methods
|
||||||
|
|
||||||
|
When creating an invoice with a classic payment method, the creation view calls
|
||||||
|
the `end_payment` method of the `Payment` object of the invoice. This method
|
||||||
|
checks for a payment method associated to the `Payment` and if nothing is
|
||||||
|
found, adds a message for payment confirmation and redirects the user towards
|
||||||
|
their profil page. This is fine for most of the payment method, but you might
|
||||||
|
want to define custom payment methods. As an example for negociating with an
|
||||||
|
other server for online payment or updating some fields in your models.
|
||||||
|
|
||||||
|
# Defining a custom payment method
|
||||||
|
To define a custom payment method, you can add a Python module to
|
||||||
|
`cotisations/payment_methods/`. This module should be organized like
|
||||||
|
a Django application.
|
||||||
|
As an example, if you want to add the payment method `foo`.
|
||||||
|
|
||||||
|
## Basic
|
||||||
|
|
||||||
|
The first thing to do is to create a `foo` Python module with a `models.py`.
|
||||||
|
|
||||||
|
```
|
||||||
|
payment_methods
|
||||||
|
├── foo
|
||||||
|
│ ├── __init__.py
|
||||||
|
│ └── models.py
|
||||||
|
├── forms.py
|
||||||
|
├── __init__.py
|
||||||
|
├── mixins.py
|
||||||
|
└── urls.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, in `models.py` you could add a model like this :
|
||||||
|
```python
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
from cotisations.models import Paiement
|
||||||
|
from cotisations.payment_methods.mixins import PaymentMethodMixin
|
||||||
|
|
||||||
|
|
||||||
|
# The `PaymentMethodMixin` defines the default `end_payment`
|
||||||
|
class FooPayment(PaymentMethodMixin, models.Model):
|
||||||
|
|
||||||
|
# This field is required, it is used by `Paiement` in order to
|
||||||
|
# determine if a payment method is associated to it.
|
||||||
|
payment = models.OneToOneField(
|
||||||
|
Paiement,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
related_name='payment_method',
|
||||||
|
editable=False
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
And in `__init__.py` :
|
||||||
|
```python
|
||||||
|
from . import models
|
||||||
|
NAME = "FOO" # Name displayed when you crate a payment type
|
||||||
|
PaymentMethod = models.FooPayment # You must define this alias
|
||||||
|
```
|
||||||
|
|
||||||
|
Then you just have to register your payment method in
|
||||||
|
`payment_methods/__init__.py` in the `PAYMENT_METHODS` list :
|
||||||
|
|
||||||
|
```
|
||||||
|
from . import ... # Some existing imports
|
||||||
|
from . import foo
|
||||||
|
|
||||||
|
PAYMENT_METHODS = [
|
||||||
|
# Some already registered payment methods...
|
||||||
|
foo
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
And... that's it, you can use your new payment method after running
|
||||||
|
`makemigrations` and `migrate`.
|
||||||
|
|
||||||
|
But this payment method is not really usefull, since it does noting !
|
||||||
|
|
||||||
|
## A payment method which does something
|
||||||
|
|
||||||
|
You have to redefine the `end_payment` method. Here is its prototype :
|
||||||
|
|
||||||
|
```python
|
||||||
|
def end_payment(self, invoice, request):
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
With `invoice` the invoice being created and `request` the request which
|
||||||
|
created it. This method has to return an HttpResponse-like object.
|
||||||
|
|
||||||
|
## Additional views
|
||||||
|
|
||||||
|
You can add specific urls for your payment method like in any django app. To
|
||||||
|
register these urls, modify `payment_methods/urls.py`.
|
||||||
|
|
||||||
|
## Alter the `Paiement` object after creation
|
||||||
|
|
||||||
|
You can do that by adding a `alter_payment(self, payment)`
|
||||||
|
method to your model.
|
||||||
|
|
||||||
|
## Validate the creation field
|
||||||
|
|
||||||
|
You may want to perform some additionals verifications on the form
|
||||||
|
creating the payment. You can do that by adding a `valid_form(self, form)`
|
||||||
|
method to your model, where `form` is an instance of
|
||||||
|
`cotisations.payment_methods.forms.PaymentMethodForm`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
from . import comnpay, cheque, balance, urls
|
from . import comnpay, cheque, balance, urls
|
||||||
|
|
||||||
PAYMENT_METHODS = [
|
PAYMENT_METHODS = [
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
"""
|
"""
|
||||||
This module contains a method to pay online using user balance.
|
This module contains a method to pay online using user balance.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
@ -16,6 +36,7 @@ class BalancePayment(PaymentMethodMixin, models.Model):
|
||||||
"""
|
"""
|
||||||
payment = models.OneToOneField(
|
payment = models.OneToOneField(
|
||||||
Paiement,
|
Paiement,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
related_name='payment_method',
|
related_name='payment_method',
|
||||||
editable=False
|
editable=False
|
||||||
)
|
)
|
||||||
|
@ -38,6 +59,9 @@ class BalancePayment(PaymentMethodMixin, models.Model):
|
||||||
)
|
)
|
||||||
|
|
||||||
def end_payment(self, invoice, request):
|
def end_payment(self, invoice, request):
|
||||||
|
"""Changes the user's balance to pay the invoice. If it is not
|
||||||
|
possible, shows an error and invalidates the invoice.
|
||||||
|
"""
|
||||||
user = invoice.user
|
user = invoice.user
|
||||||
total_price = invoice.prix_total()
|
total_price = invoice.prix_total()
|
||||||
if float(user.solde) - float(total_price) < self.minimum_balance:
|
if float(user.solde) - float(total_price) < self.minimum_balance:
|
||||||
|
@ -58,6 +82,7 @@ class BalancePayment(PaymentMethodMixin, models.Model):
|
||||||
)
|
)
|
||||||
|
|
||||||
def valid_form(self, form):
|
def valid_form(self, form):
|
||||||
|
"""Checks that there is not already a balance payment method."""
|
||||||
p = Paiement.objects.filter(is_balance=True)
|
p = Paiement.objects.filter(is_balance=True)
|
||||||
if len(p) > 0:
|
if len(p) > 0:
|
||||||
form.add_error(
|
form.add_error(
|
||||||
|
@ -66,4 +91,5 @@ class BalancePayment(PaymentMethodMixin, models.Model):
|
||||||
)
|
)
|
||||||
|
|
||||||
def alter_payment(self, payment):
|
def alter_payment(self, payment):
|
||||||
|
"""Register the payment as a balance payment."""
|
||||||
self.payment.is_balance = True
|
self.payment.is_balance = True
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
"""
|
"""
|
||||||
This module contains a method to pay online using cheque.
|
This module contains a method to pay online using cheque.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,5 +1,24 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.utils.translation import ugettext_lazy as _l
|
|
||||||
|
|
||||||
from re2o.mixins import FormRevMixin
|
from re2o.mixins import FormRevMixin
|
||||||
from cotisations.models import Facture as Invoice
|
from cotisations.models import Facture as Invoice
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
@ -12,10 +32,15 @@ class ChequePayment(PaymentMethodMixin, models.Model):
|
||||||
"""
|
"""
|
||||||
payment = models.OneToOneField(
|
payment = models.OneToOneField(
|
||||||
Paiement,
|
Paiement,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
related_name='payment_method',
|
related_name='payment_method',
|
||||||
editable=False
|
editable=False
|
||||||
)
|
)
|
||||||
|
|
||||||
def end_payment(self, invoice, request):
|
def end_payment(self, invoice, request):
|
||||||
|
"""Invalidates the invoice then redirect the user towards a view asking
|
||||||
|
for informations to add to the invoice before validating it.
|
||||||
|
"""
|
||||||
invoice.valid = False
|
invoice.valid = False
|
||||||
invoice.save()
|
invoice.save()
|
||||||
return redirect(reverse(
|
return redirect(reverse(
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
"""Payment
|
"""Payment
|
||||||
|
|
||||||
Here are defined some views dedicated to cheque payement.
|
Here are defined some views dedicated to cheque payement.
|
||||||
|
@ -17,6 +37,7 @@ from .forms import InvoiceForm
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def cheque(request, invoice_pk):
|
def cheque(request, invoice_pk):
|
||||||
|
"""This view validate an invoice with the data from a cheque."""
|
||||||
invoice = get_object_or_404(Invoice, pk=invoice_pk)
|
invoice = get_object_or_404(Invoice, pk=invoice_pk)
|
||||||
payment_method = getattr(invoice.paiement, 'payment_method', None)
|
payment_method = getattr(invoice.paiement, 'payment_method', None)
|
||||||
if invoice.valid or not isinstance(payment_method, ChequePayment):
|
if invoice.valid or not isinstance(payment_method, ChequePayment):
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
"""
|
"""
|
||||||
This module contains a method to pay online using comnpay.
|
This module contains a method to pay online using comnpay.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -79,14 +79,22 @@ class AESEncryptedField(models.CharField):
|
||||||
def to_python(self, value):
|
def to_python(self, value):
|
||||||
if value is None:
|
if value is None:
|
||||||
return None
|
return None
|
||||||
return decrypt(settings.AES_KEY,
|
try:
|
||||||
binascii.a2b_base64(value)).decode('utf-8')
|
return decrypt(settings.AES_KEY,
|
||||||
|
binascii.a2b_base64(value)).decode('utf-8')
|
||||||
|
except Exception as e:
|
||||||
|
v = decrypt(settings.AES_KEY, binascii.a2b_base64(value))
|
||||||
|
raise ValueError(v)
|
||||||
|
|
||||||
def from_db_value(self, value, *args, **kwargs):
|
def from_db_value(self, value, *args, **kwargs):
|
||||||
if value is None:
|
if value is None:
|
||||||
return value
|
return value
|
||||||
return decrypt(settings.AES_KEY,
|
try:
|
||||||
|
return decrypt(settings.AES_KEY,
|
||||||
binascii.a2b_base64(value)).decode('utf-8')
|
binascii.a2b_base64(value)).decode('utf-8')
|
||||||
|
except Exception as e:
|
||||||
|
v = decrypt(settings.AES_KEY, binascii.a2b_base64(value))
|
||||||
|
raise ValueError(v)
|
||||||
|
|
||||||
def get_prep_value(self, value):
|
def get_prep_value(self, value):
|
||||||
if value is None:
|
if value is None:
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
@ -17,6 +37,7 @@ class ComnpayPayment(PaymentMethodMixin, models.Model):
|
||||||
"""
|
"""
|
||||||
payment = models.OneToOneField(
|
payment = models.OneToOneField(
|
||||||
Paiement,
|
Paiement,
|
||||||
|
on_delete=models.CASCADE,
|
||||||
related_name='payment_method',
|
related_name='payment_method',
|
||||||
editable=False
|
editable=False
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,6 +1,26 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
"""Payment
|
"""Payment
|
||||||
|
|
||||||
Here are defined some views dedicated to online payement.
|
Here are the views needed by comnpay
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
@ -23,7 +43,8 @@ from .models import ComnpayPayment
|
||||||
@login_required
|
@login_required
|
||||||
def accept_payment(request, factureid):
|
def accept_payment(request, factureid):
|
||||||
"""
|
"""
|
||||||
The view called when an online payment has been accepted.
|
The view where the user is redirected when a comnpay payment has been
|
||||||
|
accepted.
|
||||||
"""
|
"""
|
||||||
invoice = get_object_or_404(Facture, id=factureid)
|
invoice = get_object_or_404(Facture, id=factureid)
|
||||||
if invoice.valid:
|
if invoice.valid:
|
||||||
|
@ -55,7 +76,8 @@ def accept_payment(request, factureid):
|
||||||
@login_required
|
@login_required
|
||||||
def refuse_payment(request):
|
def refuse_payment(request):
|
||||||
"""
|
"""
|
||||||
The view called when an online payment has been refused.
|
The view where the user is redirected when a comnpay payment has been
|
||||||
|
refused.
|
||||||
"""
|
"""
|
||||||
messages.error(
|
messages.error(
|
||||||
request,
|
request,
|
||||||
|
@ -72,7 +94,7 @@ def ipn(request):
|
||||||
"""
|
"""
|
||||||
The view called by Comnpay server to validate the transaction.
|
The view called by Comnpay server to validate the transaction.
|
||||||
Verify that we can firmly save the user's action and notify
|
Verify that we can firmly save the user's action and notify
|
||||||
Comnpay with 400 response if not or with a 200 response if yes
|
Comnpay with 400 response if not or with a 200 response if yes.
|
||||||
"""
|
"""
|
||||||
p = Transaction()
|
p = Transaction()
|
||||||
order = ('idTpe', 'idTransaction', 'montant', 'result', 'sec', )
|
order = ('idTpe', 'idTransaction', 'montant', 'result', 'sec', )
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.utils.translation import ugettext_lazy as _l
|
from django.utils.translation import ugettext_lazy as _l
|
||||||
|
@ -6,6 +26,19 @@ from . import PAYMENT_METHODS
|
||||||
from cotisations.utils import find_payment_method
|
from cotisations.utils import find_payment_method
|
||||||
|
|
||||||
def payment_method_factory(payment, *args, creation=True, **kwargs):
|
def payment_method_factory(payment, *args, creation=True, **kwargs):
|
||||||
|
"""This function finds the right payment method form for a given payment.
|
||||||
|
|
||||||
|
If the payment has a payment method, returns a ModelForm of it. Else if
|
||||||
|
it is the creation of the payment, a `PaymentMethodForm`.
|
||||||
|
Else an empty form.
|
||||||
|
|
||||||
|
:param payment: The payment
|
||||||
|
:param *args: arguments passed to the form
|
||||||
|
:param creation: Should be True if you are creating the payment
|
||||||
|
:param **kwargs: passed to the form
|
||||||
|
|
||||||
|
:returns: A form
|
||||||
|
"""
|
||||||
payment_method = kwargs.pop('instance', find_payment_method(payment))
|
payment_method = kwargs.pop('instance', find_payment_method(payment))
|
||||||
if payment_method is not None:
|
if payment_method is not None:
|
||||||
return forms.modelform_factory(type(payment_method), fields='__all__')(
|
return forms.modelform_factory(type(payment_method), fields='__all__')(
|
||||||
|
@ -14,16 +47,14 @@ def payment_method_factory(payment, *args, creation=True, **kwargs):
|
||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
||||||
elif creation:
|
elif creation:
|
||||||
return PaymentMethodForm(payment_method, *args, **kwargs)
|
return PaymentMethodForm(*args, **kwargs)
|
||||||
else:
|
else:
|
||||||
return forms.Form()
|
return forms.Form()
|
||||||
|
|
||||||
|
|
||||||
class PaymentMethodForm(forms.Form):
|
class PaymentMethodForm(forms.Form):
|
||||||
"""A special form which allows you to add a payment method to a `Payment`
|
"""A special form which allows you to add a payment method to a `Payment`
|
||||||
objects if it hasn't one yet, or to edit the existing payment method.
|
object.
|
||||||
|
|
||||||
To do so it replaces itself with a `modelform_factory`.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
payment_method = forms.ChoiceField(
|
payment_method = forms.ChoiceField(
|
||||||
|
@ -35,23 +66,24 @@ class PaymentMethodForm(forms.Form):
|
||||||
required=False
|
required=False
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, payment_method, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(PaymentMethodForm, self).__init__(*args, **kwargs)
|
super(PaymentMethodForm, self).__init__(*args, **kwargs)
|
||||||
if payment_method is None:
|
prefix = kwargs.get('prefix', None)
|
||||||
prefix = kwargs.get('prefix', None)
|
self.fields['payment_method'].choices = [(i,p.NAME) for (i,p) in enumerate(PAYMENT_METHODS)]
|
||||||
self.fields['payment_method'].choices = [(i,p.NAME) for (i,p) in enumerate(PAYMENT_METHODS)]
|
self.fields['payment_method'].choices.insert(0, ('', _l('no')))
|
||||||
self.fields['payment_method'].choices.insert(0, ('', _l('no')))
|
self.fields['payment_method'].widget.attrs = {
|
||||||
self.fields['payment_method'].widget.attrs = {
|
'id': 'paymentMethodSelect'
|
||||||
'id': 'paymentMethodSelect'
|
}
|
||||||
}
|
self.templates = [
|
||||||
self.templates = [
|
forms.modelform_factory(p.PaymentMethod, fields='__all__')(prefix=prefix)
|
||||||
forms.modelform_factory(p.PaymentMethod, fields='__all__')(prefix=prefix)
|
for p in PAYMENT_METHODS
|
||||||
for p in PAYMENT_METHODS
|
]
|
||||||
]
|
|
||||||
else:
|
|
||||||
self.fields = {}
|
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
"""A classic `clean` method, except that it replaces
|
||||||
|
`self.payment_method` by the payment method object if one has been
|
||||||
|
found. Tries to call `payment_method.valid_form` if it exists.
|
||||||
|
"""
|
||||||
super(PaymentMethodForm, self).clean()
|
super(PaymentMethodForm, self).clean()
|
||||||
choice = self.cleaned_data['payment_method']
|
choice = self.cleaned_data['payment_method']
|
||||||
if choice=='':
|
if choice=='':
|
||||||
|
@ -67,6 +99,10 @@ class PaymentMethodForm(forms.Form):
|
||||||
|
|
||||||
|
|
||||||
def save(self, payment, *args, **kwargs):
|
def save(self, payment, *args, **kwargs):
|
||||||
|
"""Saves the payment method.
|
||||||
|
|
||||||
|
Tries to call `payment_method.alter_payment` if it exists.
|
||||||
|
"""
|
||||||
commit = kwargs.pop('commit', True)
|
commit = kwargs.pop('commit', True)
|
||||||
self.payment_method.payment = payment
|
self.payment_method.payment = payment
|
||||||
if hasattr(self.payment_method, 'alter_payment'):
|
if hasattr(self.payment_method, 'alter_payment'):
|
||||||
|
|
|
@ -1,5 +1,27 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
|
||||||
class PaymentMethodMixin:
|
class PaymentMethodMixin:
|
||||||
"""The base class for payment models. They should inherit from this."""
|
"""A simple mixin to avoid redefining end_payment if you don't need to"""
|
||||||
|
|
||||||
def end_payment(self, invoice, request):
|
def end_payment(self, invoice, request):
|
||||||
"""Redefine this method in order to get a different ending to the
|
"""Redefine this method in order to get a different ending to the
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
from django.conf.urls import include, url
|
from django.conf.urls import include, url
|
||||||
from . import comnpay, cheque
|
from . import comnpay, cheque
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,27 @@
|
||||||
|
# -*- mode: python; coding: utf-8 -*-
|
||||||
|
# Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
# se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
# quelques clics.
|
||||||
|
#
|
||||||
|
# Copyright © 2018 Hugo Levy-Falk
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along
|
||||||
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
|
||||||
def find_payment_method(payment):
|
def find_payment_method(payment):
|
||||||
|
"""Finds the payment method associated to the payment if it exists."""
|
||||||
from cotisations.payment_methods import PAYMENT_METHODS
|
from cotisations.payment_methods import PAYMENT_METHODS
|
||||||
for method in PAYMENT_METHODS:
|
for method in PAYMENT_METHODS:
|
||||||
try:
|
try:
|
||||||
|
|
Loading…
Reference in a new issue