Source code for shoop.campaigns.models.basket_effects
# This file is part of Shoop.
#
# Copyright (c) 2012-2016, Shoop Ltd. All rights reserved.
#
# This source code is licensed under the AGPLv3 license found in the
# LICENSE file in the root directory of this source tree.
from django.db import models
from django.utils.translation import ugettext_lazy as _
from shoop.admin.forms.fields import PercentageField
from shoop.core.fields import MoneyValueField
from shoop.core.models import PolymorphicShoopModel
[docs]class BasketDiscountEffect(PolymorphicShoopModel):
identifier = None
model = None
admin_form_class = None
campaign = models.ForeignKey("BasketCampaign", related_name="discount_effects", verbose_name=_("campaign"))
[docs] def apply_for_basket(self, order_source):
"""
Applies the effect based on given `order_source`
:return: amount of discount to accumulate for the product
:rtype: Price
"""
raise NotImplementedError("Not implemented!")
[docs]class BasketDiscountAmount(BasketDiscountEffect):
identifier = "discount_amount_effect"
name = _("Discount amount value")
discount_amount = MoneyValueField(
default=None, blank=True, null=True,
verbose_name=_("discount amount"),
help_text=_("Flat amount of discount."))
@property
def description(self):
return _("Give discount amount.")
@property
def value(self):
return self.discount_amount
@value.setter
def value(self, value):
self.discount_amount = value
[docs] def apply_for_basket(self, order_source):
return order_source.create_price(self.value)
[docs]class BasketDiscountPercentage(BasketDiscountEffect):
identifier = "discount_percentage_effect"
name = _("Discount amount percentage")
admin_form_class = PercentageField
discount_percentage = models.DecimalField(
max_digits=6, decimal_places=5, blank=True, null=True,
verbose_name=_("discount percentage"),
help_text=_("The discount percentage for this campaign."))
@property
def description(self):
return _("Give percentage discount.")
@property
def value(self):
return self.discount_percentage
@value.setter
def value(self, value):
self.discount_percentage = value
[docs] def apply_for_basket(self, order_source):
return (order_source.total_price_of_products * self.value)