From 478f56d94b6db8a185bbd0dd821147c06a2bfafc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 16 Jan 2018 15:59:17 +0100 Subject: [PATCH] kfet -- Create initial statement on checkout save - Why? Because it should be the actual behavior. - To allow using arithmetic operations with values of DecimalField when object are not retrieved from DB, some strings are replaced by Decimal or int. If you wonder why it's not automatically done, see: https://code.djangoproject.com/ticket/27825 --- kfet/models.py | 16 ++++++++++++++++ kfet/tests/test_models.py | 37 ++++++++++++++++++++++++++++++++++++- kfet/tests/test_views.py | 19 ++++++++++++------- kfet/views.py | 10 +--------- 4 files changed, 65 insertions(+), 17 deletions(-) diff --git a/kfet/models.py b/kfet/models.py index deee76eb..3f38cc44 100644 --- a/kfet/models.py +++ b/kfet/models.py @@ -362,6 +362,22 @@ class Checkout(models.Model): def __str__(self): return self.name + def save(self, *args, **kwargs): + created = self.pk is None + + ret = super().save(*args, **kwargs) + + if created: + self.statements.create( + amount_taken=0, + balance_old=self.balance, + balance_new=self.balance, + by=self.created_by, + ) + + return ret + + class CheckoutTransfer(models.Model): from_checkout = models.ForeignKey( Checkout, on_delete = models.PROTECT, diff --git a/kfet/tests/test_models.py b/kfet/tests/test_models.py index ea132acd..727cac4e 100644 --- a/kfet/tests/test_models.py +++ b/kfet/tests/test_models.py @@ -1,7 +1,12 @@ +import datetime + from django.contrib.auth import get_user_model from django.test import TestCase +from django.utils import timezone -from kfet.models import Account +from kfet.models import Account, Checkout + +from .utils import create_user User = get_user_model() @@ -23,3 +28,33 @@ class AccountTests(TestCase): with self.assertRaises(Account.DoesNotExist): Account.objects.get_by_password('bernard') + + +class CheckoutTests(TestCase): + + def setUp(self): + self.now = timezone.now() + + self.u = create_user() + self.u_acc = self.u.profile.account_kfet + + self.c = Checkout( + created_by=self.u_acc, + valid_from=self.now, + valid_to=self.now + datetime.timedelta(days=1), + ) + + def test_initial_statement(self): + """A statement is added with initial balance on creation.""" + self.c.balance = 10 + self.c.save() + + st = self.c.statements.get() + self.assertEqual(st.balance_new, 10) + self.assertEqual(st.amount_taken, 0) + self.assertEqual(st.amount_error, 0) + + # Saving again doesn't create a new statement. + self.c.save() + + self.assertEqual(self.c.statements.count(), 1) diff --git a/kfet/tests/test_views.py b/kfet/tests/test_views.py index 41ed8b5c..40f895a1 100644 --- a/kfet/tests/test_views.py +++ b/kfet/tests/test_views.py @@ -746,12 +746,16 @@ class CheckoutReadViewTests(ViewTestCaseMixin, TestCase): def setUp(self): super().setUp() - self.checkout = Checkout.objects.create( - name='Checkout', - created_by=self.accounts['team'], - valid_from=self.now, - valid_to=self.now + timedelta(days=5), - ) + + with mock.patch('django.utils.timezone.now') as mock_now: + mock_now.return_value = self.now + + self.checkout = Checkout.objects.create( + name='Checkout', balance=Decimal('10'), + created_by=self.accounts['team'], + valid_from=self.now, + valid_to=self.now + timedelta(days=1), + ) def test_ok(self): r = self.client.get(self.url) @@ -794,7 +798,7 @@ class CheckoutUpdateViewTests(ViewTestCaseMixin, TestCase): name='Checkout', valid_from=self.now, valid_to=self.now + timedelta(days=5), - balance='3.14', + balance=Decimal('3.14'), is_protected=False, created_by=self.accounts['team'], ) @@ -864,6 +868,7 @@ class CheckoutStatementListViewTests(ViewTestCaseMixin, TestCase): self.assertQuerysetEqual( r.context['checkoutstatements'], map(repr, expected_statements), + ordered=False, ) diff --git a/kfet/views.py b/kfet/views.py index 1fe9ac22..2b69684d 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -528,15 +528,7 @@ class CheckoutCreate(SuccessMessageMixin, CreateView): # Creating form.instance.created_by = self.request.user.profile.account_kfet - checkout = form.save() - - # Création d'un relevé avec balance initiale - CheckoutStatement.objects.create( - checkout = checkout, - by = self.request.user.profile.account_kfet, - balance_old = checkout.balance, - balance_new = checkout.balance, - amount_taken = 0) + form.save() return super(CheckoutCreate, self).form_valid(form)