Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
    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")