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): self.currency = currency self.excl_tax = excl_tax 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, 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 ) def __radd__(self, other): if other == 0: return self else: return self.__add__(other)