You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

35 lines
991 B

  1. """
  2. Common checksum routines.
  3. """
  4. __all__ = ['luhn']
  5. import warnings
  6. from django.utils import six
  7. from django.utils.deprecation import RemovedInDjango110Warning
  8. warnings.warn(
  9. "django.utils.checksums will be removed in Django 1.10. The "
  10. "luhn() function is now included in django-localflavor 1.1+.",
  11. RemovedInDjango110Warning
  12. )
  13. LUHN_ODD_LOOKUP = (0, 2, 4, 6, 8, 1, 3, 5, 7, 9) # sum_of_digits(index * 2)
  14. def luhn(candidate):
  15. """
  16. Checks a candidate number for validity according to the Luhn
  17. algorithm (used in validation of, for example, credit cards).
  18. Both numeric and string candidates are accepted.
  19. """
  20. if not isinstance(candidate, six.string_types):
  21. candidate = str(candidate)
  22. try:
  23. evens = sum(int(c) for c in candidate[-1::-2])
  24. odds = sum(LUHN_ODD_LOOKUP[int(c)] for c in candidate[-2::-2])
  25. return ((evens + odds) % 10 == 0)
  26. except ValueError: # Raised if an int conversion fails
  27. return False