diff options
author | Mario César <mariocesar.c50@gmail.com> | 2016-03-07 04:49:00 -0400 |
---|---|---|
committer | Mario César <mariocesar.c50@gmail.com> | 2016-03-07 04:49:00 -0400 |
commit | dad351666a61bdb94fe4d6b610d08f579ec0d3c6 (patch) | |
tree | fd81e656a1813e7e9aeb5d4bb504be8e6fa696fe /payments | |
parent | 915f278f827a7527bec89a26d13b4645ff4d261e (diff) | |
download | django-payments-taler-dad351666a61bdb94fe4d6b610d08f579ec0d3c6.tar.gz django-payments-taler-dad351666a61bdb94fe4d6b610d08f579ec0d3c6.tar.bz2 django-payments-taler-dad351666a61bdb94fe4d6b610d08f579ec0d3c6.zip |
Use default manager instead of a harcoded `objects` reference to updates the payment token, and a more pythonic retrie for tokens
Diffstat (limited to 'payments')
-rw-r--r-- | payments/models.py | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/payments/models.py b/payments/models.py index 4d9e95a..5b68289 100644 --- a/payments/models.py +++ b/payments/models.py @@ -115,14 +115,20 @@ class BasePayment(models.Model): if commit: self.save() - def save(self, *args, **kwargs): + def save(self, **kwargs): if not self.token: - for _i in range(100): - token = str(uuid4()) - if not type(self).objects.filter(token=token).exists(): - self.token = token - break - return super(BasePayment, self).save(*args, **kwargs) + tries = {} # Stores a set of tried values + while True: + token = uuid4().hex + if token in tries and len(tries) >= 100: # After 100 tries we are impliying an infinite loop + raise SystemExit('A possible infinite loop was detected') + else: + if not self._default_manager.filter(token=token).exists(): + self.token = token + break + tries.add(token) + + return super(BasePayment, self).save(**kwargs) def __unicode__(self): return self.variant |