From 0cb9388cde5791726e989aa17b4a1d6980010fa1 Mon Sep 17 00:00:00 2001 From: Hugo Levy-Falk Date: Mon, 30 Sep 2019 11:33:01 +0200 Subject: [PATCH] Fix #191 --- cotisations/migrations/0039_freepayment.py | 28 +++++++++ cotisations/payment_methods/__init__.py | 5 +- cotisations/payment_methods/free/__init__.py | 27 ++++++++ cotisations/payment_methods/free/models.py | 61 +++++++++++++++++++ .../templates/cotisations/facture.html | 3 - cotisations/views.py | 2 +- 6 files changed, 120 insertions(+), 6 deletions(-) create mode 100644 cotisations/migrations/0039_freepayment.py create mode 100644 cotisations/payment_methods/free/__init__.py create mode 100644 cotisations/payment_methods/free/models.py diff --git a/cotisations/migrations/0039_freepayment.py b/cotisations/migrations/0039_freepayment.py new file mode 100644 index 00000000..127f80e1 --- /dev/null +++ b/cotisations/migrations/0039_freepayment.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.23 on 2019-09-30 09:19 +from __future__ import unicode_literals + +import cotisations.payment_methods.mixins +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cotisations', '0038_auto_20181231_1657'), + ] + + operations = [ + migrations.CreateModel( + name='FreePayment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('payment', models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='payment_method', to='cotisations.Paiement')), + ], + options={ + 'verbose_name': 'Free payment', + }, + bases=(cotisations.payment_methods.mixins.PaymentMethodMixin, models.Model), + ), + ] diff --git a/cotisations/payment_methods/__init__.py b/cotisations/payment_methods/__init__.py index 1efde30b..3071b9c0 100644 --- a/cotisations/payment_methods/__init__.py +++ b/cotisations/payment_methods/__init__.py @@ -127,11 +127,12 @@ method to your model, where `form` is an instance of """ -from . import comnpay, cheque, balance, note_kfet, urls +from . import comnpay, cheque, balance, note_kfet, free, urls PAYMENT_METHODS = [ comnpay, cheque, balance, - note_kfet + note_kfet, + free ] diff --git a/cotisations/payment_methods/free/__init__.py b/cotisations/payment_methods/free/__init__.py new file mode 100644 index 00000000..1a7168a9 --- /dev/null +++ b/cotisations/payment_methods/free/__init__.py @@ -0,0 +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 © 2019 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. +""" +from . import models +NAME = "FREE" + +PaymentMethod = models.FreePayment diff --git a/cotisations/payment_methods/free/models.py b/cotisations/payment_methods/free/models.py new file mode 100644 index 00000000..46ecca87 --- /dev/null +++ b/cotisations/payment_methods/free/models.py @@ -0,0 +1,61 @@ +# -*- 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.utils.translation import ugettext_lazy as _ +from django.contrib import messages + + +from cotisations.models import Paiement +from cotisations.payment_methods.mixins import PaymentMethodMixin + + +class FreePayment(PaymentMethodMixin, models.Model): + """ + The model allowing you to bypass payment if the invoice is free. + """ + + class Meta: + verbose_name = _("Free payment") + + payment = models.OneToOneField( + Paiement, + on_delete=models.CASCADE, + related_name='payment_method', + editable=False + ) + + def end_payment(self, invoice, request): + """Ends the payment normally. + """ + return invoice.paiement.end_payment( + invoice, + request, + use_payment_method=False + ) + + def check_price(self, price, user, *args, **kwargs): + """Checks that the price meets the requirement to be paid with user + balance. + """ + return ( + price == 0, + _("You cannot validate this invoice for free.") + ) diff --git a/cotisations/templates/cotisations/facture.html b/cotisations/templates/cotisations/facture.html index 65b05199..4f42f8e8 100644 --- a/cotisations/templates/cotisations/facture.html +++ b/cotisations/templates/cotisations/facture.html @@ -44,9 +44,6 @@ with this program; if not, write to the Free Software Foundation, Inc., {% blocktrans %}Current balance: {{ balance }} €{% endblocktrans %}

{% endif %} -{% if factureform %} -{% bootstrap_form_errors factureform %} -{% endif %} {% if discount_form %} {% bootstrap_form_errors discount_form %} {% endif %} diff --git a/cotisations/views.py b/cotisations/views.py index b6d5a8a6..0e7212fa 100644 --- a/cotisations/views.py +++ b/cotisations/views.py @@ -123,7 +123,7 @@ def new_facture(request, user, userid): if invoice_form.is_valid() and article_formset.is_valid(): new_invoice_instance = invoice_form.save(commit=False) articles = article_formset - # Check if at leat one article has been selected + # Check if at least one article has been selected if any(art.cleaned_data for art in articles): # Building a purchase for each article sold purchases = []