from decimal import Decimal
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from six import iteritems
from shuup import configuration
from shuup.core.models import ShopProduct
from shuup.utils.i18n import format_money
from .constants import ORDER_MIN_TOTAL_CONFIG_KEY
class OrderSourceMinTotalValidator:
[docs]
@classmethod
def get_validation_errors(cls, order_source):
# check for the minimum sum of order total
min_total = configuration.get(order_source.shop, ORDER_MIN_TOTAL_CONFIG_KEY, Decimal(0))
if order_source.shop.prices_include_tax:
total = order_source.taxful_total_price.value
else:
total = order_source.taxless_total_price.value
if total < min_total:
min_total_price = format_money(order_source.shop.create_price(min_total))
msg = _("The total price should be greater than {} to be ordered.").format(min_total_price)
yield ValidationError(msg, code="order_total_too_low")
class OrderSourceMethodsUnavailabilityReasonsValidator:
[docs]
@classmethod
def get_validation_errors(cls, order_source):
shipping_method = order_source.shipping_method
payment_method = order_source.payment_method
if shipping_method:
for error in shipping_method.get_unavailability_reasons(source=order_source):
yield error
if payment_method:
for error in payment_method.get_unavailability_reasons(source=order_source):
yield error
class OrderSourceSupplierValidator:
[docs]
@classmethod
def get_validation_errors(cls, order_source):
for supplier in order_source._get_suppliers():
for product, quantity in iteritems(order_source._get_products_and_quantities(supplier)):
try:
shop_product = product.get_shop_instance(shop=order_source.shop)
except ShopProduct.DoesNotExist:
msg = _("%s is not available in this shop.") % product.name
yield ValidationError(msg, code="product_not_available_in_shop")
continue
for error in shop_product.get_orderability_errors(
supplier=supplier, quantity=quantity, customer=order_source.customer
):
error.message = f"{product.name}: {error.message}"
yield error