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
This commit is contained in:
Aurélien Delobelle 2018-01-16 15:59:17 +01:00
parent 44eee9be38
commit 478f56d94b
4 changed files with 65 additions and 17 deletions

View file

@ -362,6 +362,22 @@ class Checkout(models.Model):
def __str__(self): def __str__(self):
return self.name 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): class CheckoutTransfer(models.Model):
from_checkout = models.ForeignKey( from_checkout = models.ForeignKey(
Checkout, on_delete = models.PROTECT, Checkout, on_delete = models.PROTECT,

View file

@ -1,7 +1,12 @@
import datetime
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.test import TestCase 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() User = get_user_model()
@ -23,3 +28,33 @@ class AccountTests(TestCase):
with self.assertRaises(Account.DoesNotExist): with self.assertRaises(Account.DoesNotExist):
Account.objects.get_by_password('bernard') 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)

View file

@ -746,12 +746,16 @@ class CheckoutReadViewTests(ViewTestCaseMixin, TestCase):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
self.checkout = Checkout.objects.create(
name='Checkout', with mock.patch('django.utils.timezone.now') as mock_now:
created_by=self.accounts['team'], mock_now.return_value = self.now
valid_from=self.now,
valid_to=self.now + timedelta(days=5), 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): def test_ok(self):
r = self.client.get(self.url) r = self.client.get(self.url)
@ -794,7 +798,7 @@ class CheckoutUpdateViewTests(ViewTestCaseMixin, TestCase):
name='Checkout', name='Checkout',
valid_from=self.now, valid_from=self.now,
valid_to=self.now + timedelta(days=5), valid_to=self.now + timedelta(days=5),
balance='3.14', balance=Decimal('3.14'),
is_protected=False, is_protected=False,
created_by=self.accounts['team'], created_by=self.accounts['team'],
) )
@ -864,6 +868,7 @@ class CheckoutStatementListViewTests(ViewTestCaseMixin, TestCase):
self.assertQuerysetEqual( self.assertQuerysetEqual(
r.context['checkoutstatements'], r.context['checkoutstatements'],
map(repr, expected_statements), map(repr, expected_statements),
ordered=False,
) )

View file

@ -528,15 +528,7 @@ class CheckoutCreate(SuccessMessageMixin, CreateView):
# Creating # Creating
form.instance.created_by = self.request.user.profile.account_kfet form.instance.created_by = self.request.user.profile.account_kfet
checkout = form.save() 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)
return super(CheckoutCreate, self).form_valid(form) return super(CheckoutCreate, self).form_valid(form)