Source code for shuup.admin.modules.contacts.views.list

from django.db.models import Count, Q
from django.utils.translation import gettext_lazy as _

from shuup.admin.modules.contacts.utils import request_limited
from shuup.admin.shop_provider import get_shop
from shuup.admin.toolbar import NewActionButton, SettingsActionButton, Toolbar
from shuup.admin.utils.picotable import ChoicesFilter, Column, RangeFilter, Select2Filter, TextFilter
from shuup.admin.utils.views import PicotableListView
from shuup.core.models import CompanyContact, Contact, ContactGroup, PersonContact, Shop
from shuup.utils.django_compat import force_text, reverse


[docs] class ContactTypeFilter(ChoicesFilter):
[docs] def __init__(self): super().__init__( choices=[ ("person", _("Person")), ("company", _("Company")), ("staff", _("Staff")), ], default="_all", )
[docs] def filter_queryset(self, queryset, column, value, context): if value == "_all": return queryset.exclude(PersonContact___user__is_staff=True) elif value == "person": return queryset.exclude(PersonContact___user__is_staff=True).instance_of(PersonContact) elif value == "company": return queryset.instance_of(CompanyContact) elif value == "staff": return queryset.filter(PersonContact___user__is_staff=True) return queryset
[docs] class ContactListView(PicotableListView): model = Contact default_columns = [ Column("name", _("Name"), linked=True, filter_config=TextFilter()), Column( "type", _("Type"), display="get_type_display", sortable=False, filter_config=ContactTypeFilter(), ), Column("email", _("Email"), filter_config=TextFilter()), Column("phone", _("Phone"), filter_config=TextFilter()), Column( "is_active", _("Active"), filter_config=ChoicesFilter([(False, _("no")), (True, _("yes"))], default=True), ), Column( "n_orders", _("# Orders"), class_name="text-right", filter_config=RangeFilter(step=1), ), Column( "groups", _("Groups"), filter_config=Select2Filter("get_groups"), display="get_groups_display", ), Column( "shops", _("Shops"), filter_config=Select2Filter("get_shops"), display="get_shops_display", ), Column( "registration_shop", _("Registered in"), filter_config=Select2Filter("get_shops"), ), ] mass_actions = [ "shuup.admin.modules.contacts.mass_actions:EditContactsAction", "shuup.admin.modules.contacts.mass_actions:EditContactGroupsAction", "shuup.admin.modules.contacts.mass_actions:ExportContactsCSVAction", ] toolbar_buttons_provider_key = "contact_list_toolbar_provider" mass_actions_provider_key = "contact_list_mass_actions_provider"
[docs] def __init__(self): super().__init__() picture_column = [column for column in self.columns if column.id == "contact_picture"] if picture_column: picture_column[0].raw = True
[docs] def get_groups(self): return list(ContactGroup.objects.translated().all_except_defaults().values_list("id", "translations__name"))
[docs] def get_shops(self): return list( Shop.objects.get_for_user(self.request.user).translated().values_list("id", "translations__public_name") )
[docs] def get_toolbar(self): if self.request.user.is_superuser: settings_button = SettingsActionButton.for_model(Contact, return_url="contact") else: settings_button = None return Toolbar( [ NewActionButton.for_model( PersonContact, url=reverse("shuup_admin:contact.new") + "?type=person", ), NewActionButton.for_model( CompanyContact, extra_css_class="btn-info", url=reverse("shuup_admin:contact.new") + "?type=company", ), settings_button, ], view=self, )
[docs] def get_queryset(self): qs = super().get_queryset() groups = self.get_filter().get("groups") query = Q(groups__in=groups) if groups else Q() # non superusers can't see superusers contacts if not self.request.user.is_superuser: qs = qs.exclude(PersonContact___user__is_superuser=True) if self.request.GET.get("shop"): qs = qs.filter(shops__in=Shop.objects.get_for_user(self.request.user).filter(pk=self.request.GET["shop"])) elif request_limited(self.request): shop = get_shop(self.request) qs = qs.filter(shops=shop) return qs.filter(query).annotate(n_orders=Count("customer_orders")).order_by("-created_on")
[docs] def get_type_display(self, instance): if isinstance(instance, PersonContact): return _("Person") elif isinstance(instance, CompanyContact): return _("Company") else: return _("Contact")
[docs] def get_groups_display(self, instance): groups = [group.name for group in instance.groups.all_except_defaults()] return ", ".join(groups) if groups else _("No group")
[docs] def get_shops_display(self, instance): user = self.request.user shops = [shop.name for shop in instance.shops.get_for_user(user=user)] return ", ".join(shops) if shops else _("No shops")
[docs] def get_object_abstract(self, instance, item): """ :type instance: shuup.core.models.Contact """ bits = filter( None, [ self.get_type_display(instance), _("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([force_text(bit) for bit in bits])}, ]