from django.utils.html import escape
from django.utils.translation import gettext_lazy as _
from shuup.admin.shop_provider import get_shop
from shuup.admin.utils.picotable import (
ChoicesFilter,
Column,
DateRangeFilter,
MultiFieldTextFilter,
RangeFilter,
TextFilter,
)
from shuup.admin.utils.views import PicotableListView
from shuup.front.models import StoredBasket
from shuup.utils.i18n import format_money, get_locally_formatted_datetime
[docs]
class CartListView(PicotableListView):
model = StoredBasket
default_columns = [
Column("key", _("Key"), filter_config=TextFilter(filter_field="key")),
Column(
"updated_on",
_("Last updated on"),
display="format_updated_date",
filter_config=DateRangeFilter(),
),
Column(
"finished",
_("Completed"),
display="format_finished_status",
filter_config=ChoicesFilter(
[(True, _("yes")), (False, _("no"))],
filter_field="finished",
default=False,
),
),
Column(
"shop",
_("Shop"),
filter_config=TextFilter(filter_field="shop__translations__public_name"),
),
Column(
"supplier",
_("Supplier"),
filter_config=TextFilter(filter_field="supplier__name"),
),
Column(
"customer",
_("Customer"),
filter_config=MultiFieldTextFilter(filter_fields=("customer__email", "customer__name")),
),
Column("product_count", _("Product count"), filter_config=RangeFilter()),
Column(
"taxful_total_price",
_("Total"),
sort_field="taxful_total_price_value",
display="format_taxful_total_price",
class_name="text-right",
filter_config=RangeFilter(field_type="number", filter_field="taxful_total_price_value"),
),
]
toolbar_buttons_provider_key = "cart_list_toolbar_provider"
mass_actions_provider_key = "cart_list_actions_provider"
[docs]
def __init__(self):
super().__init__()
self.columns = self.default_columns
[docs]
def get_queryset(self):
"""
Ignore potentially active carts, displaying only those not updated for at least 2 hours.
"""
shop = get_shop(self.request)
filters = {"product_count__gte": 0, "persistent": False, "shop": shop}
return super().get_queryset().filter(**filters)
[docs]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = _("Carts")
return context
[docs]
def get_object_abstract(self, instance, item):
return [
{"text": f"{instance}", "class": "header"},
{"title": _("Created on"), "text": item.get("created_on")},
{"title": _("Last updated on"), "text": item.get("updated_on")},
{"title": _("Ordered"), "text": item.get("finished")},
{"title": _("Total"), "text": item.get("taxful_total_price")},
]