class OrderListView(PicotableListView): model = Order columns = [ Column("identifier", _(u"Order"), linked=True, filter_config=TextFilter(operator="startswith")), Column("order_date", _(u"Order Date"), display="format_order_date", filter_config=DateRangeFilter()), Column( "customer", _(u"Customer"), filter_config=MultiFieldTextFilter(filter_fields=("customer__email", "customer__name")) ), Column("status", _(u"Status"), filter_config=ChoicesFilter(choices=OrderStatus.objects.all())), Column("payment_status", _(u"Payment Status"), filter_config=ChoicesFilter(choices=PaymentStatus.choices)), Column("shipping_status", _(u"Shipping Status"), filter_config=ChoicesFilter(choices=ShippingStatus.choices)), Column( "taxful_total_price", _(u"Total"), display="format_taxful_total_price", class_name="text-right", filter_config=RangeFilter(field_type="number") ), ] def get_queryset(self): return super(OrderListView, self).get_queryset().exclude(deleted=True) def format_order_date(self, instance, *args, **kwargs): return format_datetime(localtime(instance.order_date), locale=get_current_babel_locale()) def format_taxful_total_price(self, instance, *args, **kwargs): return escape(format_home_currency(instance.taxful_total_price)) def get_object_abstract(self, instance, item): return [ {"text": "%s" % instance, "class": "header"}, {"title": _(u"Total"), "text": item["taxful_total_price"]}, {"title": _(u"Status"), "text": item["status"]} ]
class ContactListView(PicotableListView): model = Contact columns = [ Column("name", _(u"Name"), linked=True, filter_config=TextFilter()), Column("type", _(u"Type"), display="get_type_display", sortable=False), # TODO: Add a filter Column("email", _(u"Email"), filter_config=TextFilter()), Column("phone", _(u"Phone"), filter_config=TextFilter()), Column("is_active", _(u"Active"), filter_config=ChoicesFilter([(False, _("no")), (True, _("yes"))], default=True)), Column("n_orders", _(u"# Orders"), class_name="text-right", filter_config=RangeFilter(step=1)), Column("groups", _("Groups"), filter_config=ChoicesFilter(ContactGroup.objects.all(), "groups")) ] def get_queryset(self): groups = self.get_filter().get("groups") query = Q(groups__in=groups) if groups else Q() return super(ContactListView, self).get_queryset().filter(query).annotate( n_orders=Count("customer_orders")) def get_type_display(self, instance): if isinstance(instance, PersonContact): return _(u"Person") elif isinstance(instance, CompanyContact): return _(u"Company") else: return _(u"Contact") def get_object_abstract(self, instance, item): """ :type instance: shoop.core.models.Contact """ bits = filter(None, [ item["type"], _("Active") if instance.is_active else _("Inactive"), _("Email: %s") % (instance.email or "\u2014"), _("Phone: %s") % (instance.phone or "\u2014"), _("%d orders") % instance.n_orders, ]) return [{ "text": instance.name or _("Contact"), "class": "header" }, { "text": ", ".join(bits) }]
class CartListView(PicotableListView): model = StoredBasket columns = [ Column("created_on", _(u"Created on"), display="format_created_date", filter_config=DateRangeFilter()), Column("updated_on", _(u"Last updated on"), display="format_updated_date", filter_config=DateRangeFilter()), Column("finished", _("Abandoned"), display="format_abandoned_status", filter_config=ChoicesFilter([(False, _("yes")), (True, _("no"))])), Column("shop", _("Shop"), filter_config=ChoicesFilter(choices=Shop.objects.all())), Column("product_count", _("Product count"), filter_config=RangeFilter()), Column("customer", _(u"Customer"), filter_config=MultiFieldTextFilter( filter_fields=("customer__email", "customer__name"))), Column("orderer", _(u"Orderer"), filter_config=MultiFieldTextFilter( filter_fields=("orderer__email", "orderer__name"))), Column("taxful_total_price", _(u"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")), ] def get_queryset(self): """ Ignore potentially active carts, displaying only those not updated for at least 2 hours. """ cutoff = now() - datetime.timedelta(hours=2) filters = {"updated_on__lt": cutoff, "product_count__gte": 0} return super(CartListView, self).get_queryset().filter(**filters) def format_abandoned_status(self, instance, *args, **kwargs): return "yes" if not instance.finished else "no" def format_created_date(self, instance, *args, **kwargs): return get_locally_formatted_datetime(instance.created_on) def format_updated_date(self, instance, *args, **kwargs): return get_locally_formatted_datetime(instance.updated_on) def format_taxful_total_price(self, instance, *args, **kwargs): return escape(format_money(instance.taxful_total_price)) def get_context_data(self, **kwargs): context = super(CartListView, self).get_context_data(**kwargs) context["title"] = _("Carts") return context def get_object_abstract(self, instance, item): return [ { "text": "%s" % instance, "class": "header" }, { "title": _(u"Created on"), "text": item["created_on"] }, { "title": _(u"Last updated on"), "text": item["updated_on"] }, { "title": _(u"Ordered"), "text": item["finished"] }, { "title": _(u"Total"), "text": item["taxful_total_price"] }, ]