summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatryk Zawadzki <patrys@room-303.com>2014-06-10 14:12:01 +0200
committerPatryk Zawadzki <patrys@room-303.com>2014-06-10 14:12:01 +0200
commit1d476a9ab6d810ee8e55acb96a0032cdca974bcf (patch)
tree68319ed32fa68d7963e1453693bfd95383ee3e2e
parentd48af9c8e9741a9514cd2523fb4dc7f460dfb5b5 (diff)
downloaddjango-payments-taler-1d476a9ab6d810ee8e55acb96a0032cdca974bcf.tar.gz
django-payments-taler-1d476a9ab6d810ee8e55acb96a0032cdca974bcf.tar.bz2
django-payments-taler-1d476a9ab6d810ee8e55acb96a0032cdca974bcf.zip
Accept spaces and dashes in card numbers, recognize Maestro
-rw-r--r--payments/__init__.py13
-rw-r--r--payments/fields.py1
-rw-r--r--payments/models.py2
-rw-r--r--payments/widgets.py9
4 files changed, 17 insertions, 8 deletions
diff --git a/payments/__init__.py b/payments/__init__.py
index 67531e5..e9ee12a 100644
--- a/payments/__init__.py
+++ b/payments/__init__.py
@@ -134,12 +134,13 @@ def get_payment_model():
CARD_TYPES = [
- ('^4[0-9]{12}(?:[0-9]{3})?$', 'visa', 'VISA'),
- ('^5[1-5][0-9]{14}$', 'mastercard', 'MasterCard'),
- ('^6(?:011|5[0-9]{2})[0-9]{12}$', 'discover', 'Discover'),
- ('^3[47][0-9]{13}$', 'amex', 'American Express'),
- ('^(?:(?:2131|1800|35\d{3})\d{11})$', 'jcb', 'JCB'),
- ('^(?:3(?:0[0-5]|[68][0-9])[0-9]{11})$', 'diners', 'Diners Club')]
+ (r'^4[0-9]{12}(?:[0-9]{3})?$', 'visa', 'VISA'),
+ (r'^5[1-5][0-9]{14}$', 'mastercard', 'MasterCard'),
+ (r'^6(?:011|5[0-9]{2})[0-9]{12}$', 'discover', 'Discover'),
+ (r'^3[47][0-9]{13}$', 'amex', 'American Express'),
+ (r'^(?:(?:2131|1800|35\d{3})\d{11})$', 'jcb', 'JCB'),
+ (r'^(?:3(?:0[0-5]|[68][0-9])[0-9]{11})$', 'diners', 'Diners Club'),
+ (r'^(?:5[0678]\d\d|6304|6390|67\d\d)\d{8,15}$', 'maestro', 'Maestro')]
def get_credit_card_issuer(number):
diff --git a/payments/fields.py b/payments/fields.py
index 1552853..9a704ea 100644
--- a/payments/fields.py
+++ b/payments/fields.py
@@ -24,6 +24,7 @@ class CreditCardNumberField(forms.CharField):
super(CreditCardNumberField, self).__init__(*args, **kwargs)
def validate(self, value):
+ value = re.sub('[\s-]+', '', value)
card_type, issuer_name = get_credit_card_issuer(value)
if value in validators.EMPTY_VALUES and self.required:
raise forms.ValidationError(self.error_messages['required'])
diff --git a/payments/models.py b/payments/models.py
index b582984..81eb120 100644
--- a/payments/models.py
+++ b/payments/models.py
@@ -51,6 +51,8 @@ class BasePayment(models.Model):
billing_postcode = models.CharField(max_length=256, blank=True)
billing_country_code = models.CharField(max_length=2, blank=True)
billing_country_area = models.CharField(max_length=256, blank=True)
+ billing_email = models.EmailField(blank=True)
+ customer_ip_address = models.IPAddressField(blank=True)
extra_data = models.TextField(blank=True, default='')
token = models.CharField(max_length=36, blank=True, default='')
captured_amount = models.DecimalField(
diff --git a/payments/widgets.py b/payments/widgets.py
index 7b80ae2..e135675 100644
--- a/payments/widgets.py
+++ b/payments/widgets.py
@@ -9,8 +9,13 @@ class CreditCardNumberWidget(TextInput):
def render(self, name, value, attrs=None):
if value:
value = re.sub('[\s-]', '', value)
- value = ' '.join([value[i: i + 4]
- for i in range(0, len(value), 4)])
+ if len(value) == 16:
+ value = ' '.join([value[0:4], value[4:8],
+ value[8:12], value[12:16]])
+ elif len(value) == 15:
+ value = ' '.join([value[0:4], value[4:10], value[10:15]])
+ elif len(value) == 14:
+ value = ' '.join([value[0:4], value[4:10], value[10:14]])
return super(CreditCardNumberWidget, self).render(name, value, attrs)