Source code for oscar.core.prices
class TaxNotKnown(Exception):
"""
Exception for when a tax-inclusive price is requested but we don't know
what the tax applicable is (yet).
"""
[docs]class Price(object):
"""
Simple price class that encapsulates a price and its tax information
Attributes:
incl_tax (Decimal): Price including taxes
excl_tax (Decimal): Price excluding taxes
tax (Decimal): Tax amount
is_tax_known (bool): Whether tax is known
currency (str): 3 character currency code
"""
def __init__(self, currency, excl_tax, incl_tax=None, tax=None, tax_code=None):
self.currency = currency
self.excl_tax = excl_tax
self.tax_code = tax_code
if incl_tax is not None:
self.incl_tax = incl_tax
self.is_tax_known = True
elif tax is not None:
self.incl_tax = excl_tax + tax
self.is_tax_known = True
else:
self.incl_tax = None
self.is_tax_known = False
def _get_tax(self):
return self.incl_tax - self.excl_tax
def _set_tax(self, value):
self.incl_tax = self.excl_tax + value
self.is_tax_known = True
tax = property(_get_tax, _set_tax)
def __repr__(self):
if self.is_tax_known:
return "%s(currency=%r, excl_tax=%r, incl_tax=%r, tax=%r)" % (
self.__class__.__name__,
self.currency,
self.excl_tax,
self.incl_tax,
self.tax,
)
return "%s(currency=%r, excl_tax=%r)" % (
self.__class__.__name__,
self.currency,
self.excl_tax,
)
def __eq__(self, other):
"""
Two price objects are equal if currency, price.excl_tax and tax match.
"""
return (
self.currency == other.currency
and self.excl_tax == other.excl_tax
and self.incl_tax == other.incl_tax
)
def __add__(self, other):
if self.currency != other.currency:
raise ValueError("Cannot add prices with different currencies.")
return Price(
currency=self.currency,
incl_tax=self.incl_tax + other.incl_tax,
excl_tax=self.excl_tax + other.excl_tax,
tax_code=self.tax_code,
)
def __radd__(self, other):
if other == 0:
return self
else:
return self.__add__(other)