Просмотр исходного кода

Ensure a Bankcard's type isn't lost after saving

Before this change, the type of a bankcard would be clobbered by saving
and reloading.

Fixes #1486, #1487
master
Sergey Maranchuk 11 лет назад
Родитель
Сommit
1e829b18d8

+ 6
- 3
oscar/apps/payment/abstract_models.py Просмотреть файл

@@ -273,9 +273,12 @@ class AbstractBankcard(models.Model):
273 273
         self.issue_number = kwargs.pop('issue_number', None)
274 274
         self.ccv = kwargs.pop('ccv', None)
275 275
         super(AbstractBankcard, self).__init__(*args, **kwargs)
276
-        self.card_type = bankcards.bankcard_type(self.number)
277
-        if self.card_type is None:
278
-            self.card_type = 'Unknown card type'
276
+
277
+        # Initialise the card-type
278
+        if self.id is None:
279
+            self.card_type = bankcards.bankcard_type(self.number)
280
+            if self.card_type is None:
281
+                self.card_type = 'Unknown card type'
279 282
 
280 283
     class Meta:
281 284
         abstract = True

+ 18
- 0
tests/integration/payment/model_tests.py Просмотреть файл

@@ -1,10 +1,12 @@
1 1
 from decimal import Decimal as D
2
+import datetime
2 3
 
3 4
 from django.test import TestCase
4 5
 from django_dynamic_fixture import G
5 6
 
6 7
 from oscar.test import factories
7 8
 from oscar.apps.payment import models
9
+from oscar.apps.payment.models import Bankcard
8 10
 
9 11
 
10 12
 class TestAPaymentSource(TestCase):
@@ -31,3 +33,19 @@ class TestAPaymentSource(TestCase):
31 33
         self.source.allocate(D('100.00'))
32 34
         self.source.debit(D('80.00'))
33 35
         self.source.refund(D('50.00'))
36
+
37
+
38
+class TestBankcard(TestCase):
39
+
40
+    def test_cardtype_persists_after_save(self):
41
+        user = factories.UserFactory()
42
+        end = datetime.date(day=1, month=1, year=2010)
43
+        bankcard = Bankcard(
44
+            user=user, number="5500000000000004", expiry_date=end)
45
+        self.assertEqual('Mastercard', bankcard.card_type)
46
+
47
+        bankcard.save()
48
+        self.assertEqual('Mastercard', bankcard.card_type)
49
+
50
+        reloaded_bankcard = Bankcard.objects.get(id=bankcard.id)
51
+        self.assertEqual('Mastercard', reloaded_bankcard.card_type)

+ 11
- 0
tests/unit/payment/model_tests.py Просмотреть файл

@@ -3,6 +3,7 @@ from decimal import Decimal as D
3 3
 
4 4
 from django.test import TestCase
5 5
 
6
+from oscar.core.compat import get_user_model
6 7
 from oscar.apps.payment.models import Bankcard, Source
7 8
 
8 9
 
@@ -27,6 +28,16 @@ class TestBankcard(TestCase):
27 28
         bankcard = Bankcard(expiry_date=end)
28 29
         self.assertEqual("01/10", bankcard.expiry_month())
29 30
 
31
+    def test_bankcard_card_correct_save(self):
32
+        # issue #1486
33
+        user_klass = get_user_model()
34
+        user = user_klass.objects.create_user('_', 'a@a.com', 'pwd')
35
+        end = datetime.date(day=1, month=1, year=2010)
36
+        bankcard = Bankcard.objects.create(
37
+            user=user, number="5500000000000004", expiry_date=end)
38
+        saved_bankcard = Bankcard.objects.get(id=bankcard.id)
39
+        self.assertEqual('Mastercard', saved_bankcard.card_type)
40
+
30 41
 
31 42
 class TestSource(TestCase):
32 43
 

Загрузка…
Отмена
Сохранить