Example #1
0
class Discount(TendenciBaseModel):
    discount_code = models.CharField(
        max_length=100,
        unique=True,
        help_text=_('Discount codes must be unique.'))
    start_dt = models.DateTimeField(_('Start Date/Time'))
    end_dt = models.DateTimeField(_('Start Date/Time'))
    apps = models.ManyToManyField(
        ContentType,
        verbose_name=_('Applications'),
        help_text=_('Select the applications that can use this discount.'))
    never_expires = models.BooleanField(
        _('Never Expires'),
        help_text=_('Check this box to make the discount code never expire.'),
        default=False)
    value = models.DecimalField(
        _('Discount Value'),
        max_digits=10,
        decimal_places=2,
        help_text=_('Enter discount value as a positive number.'))
    cap = models.IntegerField(
        _('Maximum Uses'),
        help_text=_('Enter 0 for unlimited discount code uses.'),
        default=0)

    perms = GenericRelation(ObjectPermission,
                            object_id_field="object_id",
                            content_type_field="content_type")

    objects = DiscountManager()

    class Meta:
        #         permissions = (("view_discount",_("Can view discount")),)
        app_label = 'discounts'

    def num_of_uses(self):
        return self.discountuse_set.count()

    def available(self):
        """
        Determines if this discount has is still usable based on its
        cap.
        """
        if self.num_of_uses() > self.cap and self.cap != 0:
            return False
        if datetime.now() > self.end_dt and not self.never_expires:
            return False
        return True

    def available_for(self, count):
        """
        Determines if count number of uses is still available.
        """
        if (self.num_of_uses() + count) > self.cap and self.cap != 0:
            return False
        if datetime.now() > self.end_dt and not self.never_expires:
            return False
        return True

    def __str__(self):
        return self.discount_code

    def get_absolute_url(self):
        return reverse('discount.detail', args=[self.pk])

    @staticmethod
    def has_valid_discount(**kwargs):
        now = datetime.now()
        model = kwargs.pop('model', None)
        discount_exists = Discount.objects.filter(
            Q(never_expires=True)
            | Q(start_dt__lt=now, end_dt__gte=now)).filter(
                apps__model=model).exists()
        return discount_exists

    def delete(self, *args, **kwargs):
        # Append id to the discount_code to avoid IntegrityError when the discount_code
        # is used again later
        self.discount_code = '{0}-{1}'.format(self.discount_code, self.id)
        super(Discount, self).delete(*args, **kwargs)
Example #2
0
class Discount(TendenciBaseModel):
    class Meta:
        permissions = (("view_discount", "Can view discount"), )

    discount_code = models.CharField(
        max_length=100,
        unique=True,
        help_text=_('Discount codes must be unique.'))
    start_dt = models.DateTimeField(_('Start Date/Time'))
    end_dt = models.DateTimeField(_('Start Date/Time'))
    never_expires = models.BooleanField(
        _('Never Expires'),
        help_text=_('Check this box to make the discount code never expire.'))
    value = models.DecimalField(
        _('Discount Value'),
        max_digits=10,
        decimal_places=2,
        help_text=_('Enter discount value as a positive number.'))
    cap = models.IntegerField(
        _('Maximum Uses'),
        help_text=_('Enter 0 for unlimited discount code uses.'))

    perms = generic.GenericRelation(ObjectPermission,
                                    object_id_field="object_id",
                                    content_type_field="content_type")

    objects = DiscountManager()

    def num_of_uses(self):
        return self.discountuse_set.count()

    def available(self):
        """
        Determines if this discount has is still usable based on its
        cap.
        """
        if self.num_of_uses() > self.cap and self.cap != 0:
            return False
        if datetime.now() > self.end_dt and not self.never_expires:
            return False
        return True

    def available_for(self, count):
        """
        Determines if count number of uses is still available.
        """
        if (self.num_of_uses() + count) > self.cap and self.cap != 0:
            return False
        if datetime.now() > self.end_dt and not self.never_expires:
            return False
        return True

    def __unicode__(self):
        return self.discount_code

    @models.permalink
    def get_absolute_url(self):
        return ('discount.detail', [self.pk])

    @staticmethod
    def has_valid_discount(**kwargs):
        now = datetime.now()
        discount_exists = Discount.objects.filter(
            Q(never_expires=True)
            | Q(start_dt__lt=now, end_dt__gte=now)).exists()
        return discount_exists