def check_credit(self, reserve = False, num_msgs = 1): # # Checks if there are enough credit to send the number of messages specified # in the num_msgs argument # sem = Sem("singular_account_%d" % self.id) real_credit = self.get_real_credit() if real_credit < num_msgs: sem.destroy() raise OutOfCredit() msg = None if real_credit - num_msgs < settings.CRITICAL_CREDIT_LIMIT <= real_credit: msg = settings.CRITICAL_CREDIT_LIMIT elif real_credit - num_msgs < settings.MINIMAL_CREDIT_LIMIT <= real_credit: msg = settings.MINIMAL_CREDIT_LIMIT if msg: msg = "¡There are left than %d credits on %s account! Please purchase more credit." % (msg, self) send_mail( '[SingularMS] Warning: raise less than a minimal credit on %s account.' % self, msg, settings.FROM_EMAIL_ADDRESS, settings.EMAIL_CREDIT_LIMIT, fail_silently=False) if reserve: self._reserve_credit(num_msgs) # Freeing semaphore sem.destroy()
def spend_credit(self, credits, use_available = True): """ Decrement credit and/or reserved WARNING: This method is not thread safe """ log.debug("Spending credit") sem = Sem("singular_account_%d" % self.id) reserved_credits_remaining = credits available_credits_remaining = credits for p in self.purchase_set.filter(available__gt = 0).order_by('-reserved'): credits_unreserved = p.unreserve(reserved_credits_remaining) reserved_credits_remaining -= credits_unreserved log.debug("Reversed credits: %d", credits_unreserved) if use_available: if not credits_unreserved: credits_spent = p.spend(available_credits_remaining) else: credits_spent = p.spend(credits_unreserved) available_credits_remaining -= credits_spent log.debug("Spent credits: %d", credits_spent) if (not reserved_credits_remaining) and \ (not use_available or not available_credits_remaining): break # Freeing semaphore sem.destroy() if reserved_credits_remaining: log.warning("Reversed credit process not susccessfully ended: %d credits left", reserved_credits_remaining) if available_credits_remaining and use_available: log.error("Trying to spend %s credits that I dont have.", available_credits_remaining) raise OutOfCredit("No available credit")