diff --git a/kfet/forms.py b/kfet/forms.py index 963e4254..26774b1c 100644 --- a/kfet/forms.py +++ b/kfet/forms.py @@ -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( diff --git a/kfet/models.py b/kfet/models.py index deee76eb..c9de48bc 100644 --- a/kfet/models.py +++ b/kfet/models.py @@ -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}) diff --git a/kfet/tests/test_forms.py b/kfet/tests/test_forms.py new file mode 100644 index 00000000..e946d39d --- /dev/null +++ b/kfet/tests/test_forms.py @@ -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), [('', '---------')])