Merge branch 'master' into aureplop/cof-tests_event
This commit is contained in:
commit
bf464f9378
22 changed files with 2049 additions and 49 deletions
|
@ -296,17 +296,17 @@ class KPsulAccountForm(forms.ModelForm):
|
|||
|
||||
class KPsulCheckoutForm(forms.Form):
|
||||
checkout = forms.ModelChoiceField(
|
||||
queryset=(
|
||||
Checkout.objects
|
||||
.filter(
|
||||
is_protected=False,
|
||||
valid_from__lte=timezone.now(),
|
||||
valid_to__gte=timezone.now(),
|
||||
)
|
||||
),
|
||||
queryset=None,
|
||||
widget=forms.Select(attrs={'id': 'id_checkout_select'}),
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Create the queryset on form instanciation to use the current time.
|
||||
self.fields['checkout'].queryset = (
|
||||
Checkout.objects.is_valid().filter(is_protected=False))
|
||||
|
||||
|
||||
class KPsulOperationForm(forms.ModelForm):
|
||||
article = forms.ModelChoiceField(
|
||||
|
|
|
@ -341,6 +341,13 @@ class AccountNegative(models.Model):
|
|||
return self.start + kfet_config.overdraft_duration
|
||||
|
||||
|
||||
class CheckoutQuerySet(models.QuerySet):
|
||||
|
||||
def is_valid(self):
|
||||
now = timezone.now()
|
||||
return self.filter(valid_from__lte=now, valid_to__gte=now)
|
||||
|
||||
|
||||
class Checkout(models.Model):
|
||||
created_by = models.ForeignKey(
|
||||
Account, on_delete = models.PROTECT,
|
||||
|
@ -353,6 +360,8 @@ class Checkout(models.Model):
|
|||
default = 0)
|
||||
is_protected = models.BooleanField(default = False)
|
||||
|
||||
objects = CheckoutQuerySet.as_manager()
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('kfet.checkout.read', kwargs={'pk': self.pk})
|
||||
|
||||
|
@ -362,6 +371,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,
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
{% block header-title %}Création d'un compte{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
<script src="{% static "autocomplete_light/autocomplete.js" %}" type="text/javascript"></script>
|
||||
<script src="{% static "vendor/jquery.autocomplete-light/3.5.0/dist/jquery.autocomplete-light.min.js" %}" type="text/javascript"></script>
|
||||
{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
|
|
48
kfet/tests/test_forms.py
Normal file
48
kfet/tests/test_forms.py
Normal file
|
@ -0,0 +1,48 @@
|
|||
import datetime
|
||||
from unittest import mock
|
||||
|
||||
from django.test import TestCase
|
||||
from django.utils import timezone
|
||||
|
||||
from kfet.forms import KPsulCheckoutForm
|
||||
from kfet.models import Checkout
|
||||
|
||||
from .utils import create_user
|
||||
|
||||
|
||||
class KPsulCheckoutFormTests(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.now = timezone.now()
|
||||
|
||||
user = create_user()
|
||||
|
||||
self.c1 = Checkout.objects.create(
|
||||
name='C1', balance=10,
|
||||
created_by=user.profile.account_kfet,
|
||||
valid_from=self.now,
|
||||
valid_to=self.now + datetime.timedelta(days=1),
|
||||
)
|
||||
|
||||
self.form = KPsulCheckoutForm()
|
||||
|
||||
def test_checkout(self):
|
||||
checkout_f = self.form.fields['checkout']
|
||||
self.assertListEqual(list(checkout_f.choices), [
|
||||
('', '---------'),
|
||||
(self.c1.pk, 'C1'),
|
||||
])
|
||||
|
||||
@mock.patch('django.utils.timezone.now')
|
||||
def test_checkout_valid(self, mock_now):
|
||||
"""
|
||||
Checkout are filtered using the current datetime.
|
||||
Regression test for #184.
|
||||
"""
|
||||
self.now += datetime.timedelta(days=2)
|
||||
mock_now.return_value = self.now
|
||||
|
||||
form = KPsulCheckoutForm()
|
||||
|
||||
checkout_f = form.fields['checkout']
|
||||
self.assertListEqual(list(checkout_f.choices), [('', '---------')])
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -245,13 +245,7 @@ class ViewTestCaseMixin(TestCaseMixin):
|
|||
self.register_user(label, user)
|
||||
|
||||
if self.auth_user:
|
||||
# The wrapper is a sanity check.
|
||||
self.assertTrue(
|
||||
self.client.login(
|
||||
username=self.auth_user,
|
||||
password=self.auth_user,
|
||||
)
|
||||
)
|
||||
self.client.force_login(self.users[self.auth_user])
|
||||
|
||||
def tearDown(self):
|
||||
del self.users_base
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue