class OrderStatusListView(PicotableListView): model = OrderStatus default_columns = [ Column("identifier", _("Identifier"), linked=True, filter_config=TextFilter(operator="startswith")), Column("name", _("Name"), linked=True, filter_config=TextFilter(operator="startswith", filter_field="translations__name")), Column("public_name", _("Public Name"), linked=False, filter_config=TextFilter(operator="startswith", filter_field="translations__name")), Column("role", _("Role"), linked=False, filter_config=ChoicesFilter(choices=OrderStatusRole.choices)), Column("default", _("Default"), linked=False, filter_config=ChoicesFilter([(False, _("yes")), (True, _("no"))])), Column("is_active", _("Active"), linked=False, filter_config=ChoicesFilter([(False, _("yes")), (True, _("no"))])), ]
class TaskListView(PicotableListView): model = Task default_columns = [ Column("name", _("Name"), sort_field="name", display="name", filter_config=TextFilter(filter_field="name", placeholder=_("Filter by name..."))), Column("priority", _("Priority")), Column("creator", _("Creator"), filter_config=TextFilter( filter_field="creator__name", placeholder=_("Filter by creator..."))), Column("status", _("Status"), filter_config=ChoicesFilter(TaskStatus.choices)), Column("comments", _("Comments"), sort_field="comments", display="get_comments_count") ] def get_comments_count(self, instance, **kwargs): return instance.comments.for_contact( get_person_contact(self.request.user)).count() def get_queryset(self): return Task.objects.for_shop(get_shop(self.request))
class AttributeListView(PicotableListView): model = Attribute default_columns = [ Column("identifier", _("Identifier"), filter_config=TextFilter( filter_field="identifier", placeholder=_("Filter by identifier..."))), Column("name", _("Name"), sort_field="translations__name", display="name", filter_config=TextFilter(filter_field="translations__name", placeholder=_("Filter by name..."))), Column("type", _("Type"), filter_config=ChoicesFilter(AttributeType.choices)), Column("visibility_mode", _("Visibility Mode"), filter_config=ChoicesFilter(AttributeVisibility.choices)), Column("searchable", _("Searchable")), Column("n_product_types", _("Used in # Product Types")), ] toolbar_buttons_provider_key = "attribute_list_toolbar_provider" mass_actions_provider_key = "attribute_list_mass_actions_provider" def get_queryset(self): return Attribute.objects.all().annotate( n_product_types=Count("product_types"))
class UserListView(PicotableListView): model = settings.AUTH_USER_MODEL default_columns = [ Column("username", _(u"Username"), filter_config=TextFilter()), Column("email", _(u"Email"), filter_config=TextFilter()), Column("first_name", _(u"First Name"), filter_config=TextFilter()), Column("last_name", _(u"Last Name"), filter_config=TextFilter()), Column( "is_active", _(u"Active"), filter_config=ChoicesFilter([(False, _("no")), (True, _("yes"))], default=True), ), Column("is_staff", _(u"Access to Admin Panel"), filter_config=true_or_false_filter), ] toolbar_buttons_provider_key = "user_list_toolbar_provider" mass_actions_provider_key = "user_list_mass_actions_provider" def get_model(self): return get_user_model() def get_queryset(self): model = self.get_model() qs = self.get_model().objects.all() if "date_joined" in [f.name for f in model._meta.get_fields()]: qs = qs.order_by("-date_joined") # non superusers can't see superusers if not self.request.user.is_superuser: qs = qs.filter(is_superuser=False) return qs def get_context_data(self, **kwargs): context = super(UserListView, self).get_context_data(**kwargs) context["title"] = force_text( self.get_model()._meta.verbose_name_plural).title() return context def get_object_abstract(self, instance, item): bits = filter(None, [ _("First Name: %s") % (getattr(instance, 'first_name', None) or "\u2014"), _("Last Name: %s") % (getattr(instance, 'last_name', None) or "\u2014"), _("Active") if instance.is_active else _(u"Inactive"), _("Email: %s") % (getattr(instance, 'email', None) or "\u2014"), _("Access to Admin Panel") if getattr(instance, 'is_staff', None) else None, _("Superuser (Full rights)") if getattr(instance, 'is_superuser', None) else None ]) return [{ "text": instance.get_username() or _("User"), "class": "header" }, { "text": ", ".join([force_text(bit) for bit in bits]) }]
class ProductListView(PicotableListView): model = Product columns = [ Column("sku", _(u"SKU"), display="sku", filter_config=TextFilter(placeholder=_("Filter by SKU..."))), Column("name", _(u"Name"), sort_field="translations__name", display="name", filter_config=TextFilter(filter_field="translations__name", placeholder=_("Filter by name..."))), Column("barcode", _(u"Barcode"), display="barcode", filter_config=TextFilter(_("Filter by barcode..."))), Column("type", _(u"Type")), Column("mode", _(u"Mode"), filter_config=ChoicesFilter(ProductMode.choices)), Column("category", _(u"Primary Category"), filter_config=ChoicesFilter(Category.objects.all(), "category")), ] def get_queryset(self): filter = self.get_filter() shop_id = filter.get("shop") qs = Product.objects.all_except_deleted() q = Q() for mode in filter.get("modes", []): q |= Q(mode=mode) manufacturer_ids = filter.get("manufacturers") if manufacturer_ids: q |= Q(manufacturer_id__in=manufacturer_ids) qs = qs.filter(q) if shop_id: qs = qs.filter(shop_products__shop_id=int(shop_id)) return qs def get_object_abstract(self, instance, item): return [{ "text": "%s" % instance, "class": "header" }, { "title": _(u"Barcode"), "text": item["barcode"] }, { "title": _(u"SKU"), "text": item["sku"] }, { "title": _(u"Type"), "text": item["type"] }, { "title": _(u"Primary Category"), "text": item["category"] }]
class StocksListView(PicotableListView): template_name = "shuup/simple_supplier/admin/base_picotable.jinja" model = Product default_columns = [ Column( "sku", _("SKU"), sort_field="product__sku", display="product__sku", linked=True, filter_config=TextFilter(filter_field="product__sku", placeholder=_("Filter by SKU...")) ), Column( "name", _("Name"), sort_field="product__translations__name", display="product__name", linked=True, filter_config=TextFilter(filter_field="product__translations__name", placeholder=_("Filter by name...")) ), Column( "supplier", _("Supplier"), display="supplier", linked=False, filter_config=ChoicesFilter(Supplier.objects.enabled().filter(module_identifier="simple_supplier")) ), Column( "stock_information", _("Stock information"), display="get_stock_information", linked=False, sortable=False, raw=True ), Column( "adjust_stock", _("Adjust stock"), display="get_stock_adjustment_form", sortable=False, linked=False, raw=True ) ] def __init__(self): super(StocksListView, self).__init__() self.columns = self.default_columns def get_object_abstract(self, instance, item): item.update({"_linked_in_mobile": False, "_url": ""}) return [ {"text": item.get("name"), "class": "header"}, {"title": "", "text": item.get("sku")}, {"title": "", "text": " ", "raw": item.get("stock_information")}, {"title": "", "text": " ", "raw": item.get("adjust_stock")}, ] def get_queryset(self): return StockCount.objects.filter( supplier__module_identifier="simple_supplier", supplier__enabled=True, supplier__stock_managed=True, product__deleted=False ).order_by("product__id") def get_context_data(self, **kwargs): context = super(PicotableListView, self).get_context_data(**kwargs) context["toolbar"] = None context["title"] = _("Stock management") return context def get_stock_information(self, instance): return get_stock_information_html(instance.supplier, instance.product) def get_stock_adjustment_form(self, instance): return get_stock_adjustment_div(self.request, instance.supplier, instance.product)
class OrderStatusListView(PicotableListView): model = OrderStatus default_columns = [ Column("identifier", _("Identifier"), linked=True, filter_config=TextFilter(operator="startswith")), Column( "name", _("Name"), linked=True, filter_config=TextFilter(operator="startswith", filter_field="translations__name"), ), Column( "public_name", _("Public Name"), linked=False, filter_config=TextFilter(operator="startswith", filter_field="translations__name"), ), Column("role", _("Role"), linked=False, filter_config=ChoicesFilter(choices=OrderStatusRole.choices)), Column("default", _("Default"), linked=False, filter_config=ChoicesFilter([(False, _("yes")), (True, _("no"))])), Column( "allowed_next_statuses", _("Allowed Next Status"), linked=False, display="get_allowed_next_statuses_display", ), Column( "visible_for_customer", _("Visible For Customer"), linked=False, filter_config=ChoicesFilter([(False, _("yes")), (True, _("no"))]), ), Column("is_active", _("Active"), linked=False, filter_config=ChoicesFilter([(False, _("yes")), (True, _("no"))])), ] def get_allowed_next_statuses_display(self, instance): order_status_names = [ order_status.name for order_status in instance.allowed_next_statuses.all() ] return ", ".join(order_status_names) if order_status_names else _( "No allowed next status.")
class UserListView(PicotableListView): model = settings.AUTH_USER_MODEL default_columns = [ Column("username", _(u"Username"), filter_config=TextFilter()), Column("email", _(u"Email"), filter_config=TextFilter()), Column("first_name", _(u"First Name"), filter_config=TextFilter()), Column("last_name", _(u"Last Name"), filter_config=TextFilter()), Column("is_active", _(u"Active"), filter_config=ChoicesFilter([(False, _("no")), (True, _("yes"))], default=True)), Column("is_staff", _(u"Staff"), filter_config=true_or_false_filter), Column("is_superuser", _(u"Superuser"), filter_config=true_or_false_filter), ] def get_model(self): return get_user_model() def get_queryset(self): model = self.get_model() qs = self.get_model().objects.all() if "date_joined" in model._meta.get_all_field_names(): qs = qs.order_by("-date_joined") return qs def get_context_data(self, **kwargs): context = super(UserListView, self).get_context_data(**kwargs) context["title"] = force_text( self.get_model()._meta.verbose_name_plural).title() return context def get_object_abstract(self, instance, item): bits = filter(None, [ _("First Name: %s") % (getattr(instance, 'first_name', None) or "\u2014"), _("Last Name: %s") % (getattr(instance, 'last_name', None) or "\u2014"), _("Active") if instance.is_active else _(u"Inactive"), _("Email: %s") % (getattr(instance, 'email', None) or "\u2014"), _("Staff") if getattr(instance, 'is_staff', None) else None, _("Superuser") if getattr(instance, 'is_superuser', None) else None ]) return [{ "text": instance.get_username() or _("User"), "class": "header" }, { "text": ", ".join([force_text(bit) for bit in bits]) }]
class TaskListView(PicotableListView): model = Task default_columns = [ Column( "name", _("Name"), sort_field="name", display="name", filter_config=TextFilter(filter_field="name", placeholder=_("Filter by name...")), ), Column( "creator", _("Creator"), display="get_creator_name_display", filter_config=TextFilter(filter_field="creator__name", placeholder=_("Filter by creator...")), ), Column("status", _("Status"), filter_config=ChoicesFilter(TaskStatus.choices), class_name="text-center"), Column("priority", _("Priority"), display="get_priority_display", class_name="text-center"), Column("comments", _("Comments"), sort_field="comments", display="get_comments_count", class_name="text-center"), ] toolbar_buttons_provider_key = "task_list_toolbar_provider" mass_actions_provider_key = "task_list_actions_provider" def get_comments_count(self, instance, **kwargs): return instance.comments.for_contact( get_person_contact(self.request.user)).count() def get_queryset(self): return Task.objects.for_shop(get_shop(self.request)) def get_creator_name_display(self, instance, **kwargs): if not len(instance.creator.name): return "No name set (id: %d)" % instance.creator.id return instance.creator.name def get_priority_display(self, instance, **kwargs): return "%s" % instance.priority
class APIAccessListView(PicotableListView): model = APIAccess default_columns = [ Column("name", _("Name"), sort_field="name", display="name", filter_config=TextFilter(filter_field="name", placeholder=_("Filter by name..."))), Column("key", _("Key"), filter_config=TextFilter(filter_field="key", placeholder=_("Filter by key..."))), Column("enabled", _("Enabled")) ]
class ContactGroupListView(PicotableListView): model = ContactGroup default_columns = [ Column( "name", _("Name"), sort_field="translations__name", display="name", filter_config=TextFilter(filter_field="translations__name", placeholder=_("Filter by name...")), ), Column("n_members", _("Number of Members")), ] toolbar_buttons_provider_key = "contact_group_list_toolbar_provider" mass_actions_provider_key = "contact_group_list_mass_actions_provider" def get_queryset(self): return ContactGroup.objects.all_except_defaults().annotate( n_members=Count("members")) def get_context_data(self, **kwargs): context = super(ContactGroupListView, self).get_context_data(**kwargs) if self.request.user.is_superuser: settings_button = SettingsActionButton.for_model( ContactGroup, return_url="contact_group") else: settings_button = None context["toolbar"] = Toolbar([ NewActionButton("shuup_admin:contact_group.new"), settings_button ], view=self) return context
class CampaignListView(PicotableListView): default_columns = [ Column( "name", _(u"Title"), sort_field="name", display="name", linked=True, filter_config=TextFilter(operator="startswith") ), Column("start_datetime", _("Starts")), Column("end_datetime", _("Ends")), Column("active", _("Active"), filter_config=ChoicesFilter(choices=[(0, _("No")), (1, _("Yes"))])), ] def start_datetime(self, instance, *args, **kwargs): if not instance.start_datetime: return "" return self._formatted_datetime(instance.start_datetime) def end_datetime(self, instance, *args, **kwargs): if not instance.end_datetime: return "" return self._formatted_datetime(instance.end_datetime) def _formatted_datetime(self, dt): return format_datetime(localtime(dt), locale=get_current_babel_locale()) def get_object_abstract(self, instance, item): return [ {"text": "%s" % (instance or _("CatalogCampaign")), "class": "header"}, ]
class PageListView(PicotableListView): url_identifier = "simple_cms.page" model = Page default_columns = [ Column("title", _(u"Title"), sort_field="translations__title", display="title", linked=True, filter_config=TextFilter(operator="startswith", filter_field="translations__title")), Column("available_from", _(u"Available from")), Column("available_to", _(u"Available to")), Column("created_by", _(u"Created by")), Column("created_on", _(u"Date created")), ] def get_object_abstract(self, instance, item): return [{ "text": "%s" % (instance or _("Page")), "class": "header" }, { "title": _(u"Available from"), "text": item.get("available_from") }, { "title": _(u"Available to"), "text": item.get("available_to") } if instance.available_to else None] def get_queryset(self): return super(PageListView, self).get_queryset().for_shop( get_shop(self.request)).filter(deleted=False)
class FontFamilyListView(PicotableListView): url_identifier = "typography_font" model = FontFamily default_columns = [ Column("name", _("Name"), sort_field="name", display="name", filter_config=TextFilter(filter_field="name", placeholder=_("Filter by name..."))), Column("woff", _("Woff"), display="format_woff"), Column("woff2", _("Woff2"), display="format_woff2"), Column("ttf", _("TTF"), display="format_ttf"), Column("svg", _("SVG"), display="format_svg"), Column("eot", _("EOT"), display="format_eot") ] def format_eot(self, instance): return instance.eot.label if instance.eot else "" def format_ttf(self, instance): return instance.ttf.label if instance.ttf else "" def format_woff(self, instance): return instance.woff.label if instance.woff else "" def format_woff2(self, instance): return instance.woff2.label if instance.woff2 else "" def format_svg(self, instance): return instance.svg.label if instance.svg else "" def get_queryset(self): return FontFamily.objects.filter(shop=get_shop(self.request))
class CouponListView(PicotableListView): model = Coupon default_columns = [ Column("code", _(u"Code"), sort_field="code", display="code", linked=True, filter_config=TextFilter(operator="startswith")), Column("usages", _("Usages"), display="get_usages"), Column("usage_limit_customer", _("Usages Limit per contact")), Column("usage_limit", _("Usage Limit")), Column("active", _("Active")), Column("created_by", _(u"Created by")), Column("created_on", _(u"Date created")), ] def get_usages(self, instance, *args, **kwargs): return instance.usages.count() def get_context_data(self, **kwargs): context = super(CouponListView, self).get_context_data(**kwargs) if self.request.user.is_superuser: settings_button = SettingsActionButton.for_model( self.model, return_url="coupon") else: settings_button = None context["toolbar"] = Toolbar([ NewActionButton("shuup_admin:coupon.new", text=_("Create new Coupon")), settings_button ]) return context
class PermissionGroupListView(PicotableListView): model = PermissionGroup default_columns = [ Column("name", _(u"Name"), sort_field="name", display="name", filter_config=TextFilter(filter_field="name", placeholder=_("Filter by name..."))), ] toolbar_buttons_provider_key = "permission_group_list_toolbar_provider" def get_context_data(self, **kwargs): context = super(PermissionGroupListView, self).get_context_data(**kwargs) context["title"] = _("Permission Groups") if self.request.user.is_superuser: settings_button = SettingsActionButton.for_model( self.model, return_url="permission_group") else: settings_button = None context["toolbar"] = Toolbar([ NewActionButton("shuup_admin:permission_group.new", text=_("Create new Permission Group")), settings_button ], view=self) return context
class ServiceProviderListView(PicotableListView): model = ServiceProvider default_columns = [ Column( "name", _("Name"), sort_field="base_translations__name", filter_config=TextFilter(filter_field="base_translations__name", placeholder=_("Filter by name...")), ), Column("type", _("Type"), display="get_type_display", sortable=False), ] toolbar_buttons_provider_key = "service_provider_list_toolbar_provider" mass_actions_provider_key = "service_provider_mass_actions_provider" def get_type_display(self, instance): return instance._meta.verbose_name.capitalize() def get_object_abstract(self, instance, item): return [ { "text": "%s" % instance, "class": "header" }, { "text": self.get_type_display(instance) }, ]
class CouponCodeListView(PicotableListView): model = CouponCode url_identifier = "discounts_coupon_codes" default_columns = [ Column( "code", _("Code"), sort_field="code", display="code", linked=True, filter_config=TextFilter(operator="startswith"), ), Column("usages", _("Usages"), display="get_usages"), Column("usage_limit_customer", _("Usages Limit per contact")), Column("usage_limit", _("Usage Limit")), Column("active", _("Active")), Column("created_by", _("Created by")), Column("created_on", _("Date created")), ] def get_usages(self, instance, *args, **kwargs): return instance.usages.count() def get_queryset(self): return CouponCode.objects.filter(shops=get_shop(self.request))
class ServiceListView(PicotableListView): model = None # Override in subclass columns = [] base_columns = [ Column("name", _("Name"), sort_field="translations__name", filter_config=TextFilter(filter_field="translations__name", placeholder=_("Filter by name..."))), Column( "choice_identifier", _(u"Service choice"), display="format_service_choice", sortable=False, ), Column("enabled", _(u"Enabled"), filter_config=true_or_false_filter), Column("shop", _(u"Shop")) ] def get_object_abstract(self, instance, item): return [ { "text": "%s" % instance, "class": "header" }, ] def format_service_choice(self, instance, *args, **kwargs): if instance.provider: for choice in instance.provider.get_service_choices(): if choice.identifier == instance.choice_identifier: return str(choice.name)
class ShopListView(PicotableListView): model = Shop default_columns = [ Column("logo", _(u"Logo"), display="logo", class_name="text-center", raw=True, ordering=1, sortable=False), Column("name", _(u"Name"), sort_field="translations__name", display="name", filter_config=TextFilter(filter_field="translations__name", placeholder=_("Filter by name..."))), Column("domain", _(u"Domain")), Column("identifier", _(u"Identifier")), Column("status", _(u"Status"), filter_config=ChoicesFilter(choices=ShopStatus.choices)), ] def get_queryset(self): if self.request.user.is_superuser: return super(ShopListView, self).get_queryset() else: return Shop.objects.get_for_user(self.request.user) def get_toolbar(self): if ShuupSettings.get_setting("SHUUP_ENABLE_MULTIPLE_SHOPS"): return super(ShopListView, self).get_toolbar() else: return Toolbar([])
class PageListView(PicotableListView): model = Page columns = [ Column("title", _(u"Title"), sort_field="translations__title", display="title", linked=True, filter_config=TextFilter(operator="startswith")), Column("available_from", _(u"Available from")), Column("available_to", _(u"Available to")), Column("created_by", _(u"Created by")), Column("created_on", _(u"Date created")), ] def get_object_abstract(self, instance, item): return [{ "text": "%s" % (instance or _("Page")), "class": "header" }, { "title": _(u"Available from"), "text": item["available_from"] }, { "title": _(u"Available to"), "text": item["available_to"] } if instance.available_to else None]
def _get_translated_column(self, model, field, known_names, identifier): field_name = field.verbose_name.title() if identifier: field_name = "%s %s" % (identifier.replace( "_", " ").capitalize(), field_name) # take the first extension, usually we should not have more then one translation_rel_name = model._parler_meta._extensions[0].rel_name if model != self.model: filter_field = "%s__%s__%s" % ( identifier, translation_rel_name, field.name) if identifier else field.name else: filter_field = "%s__%s" % (translation_rel_name, field.name) display = "%s__%s" % (identifier, field.name) if identifier else field.name column = Column( "%s_%s" % ((identifier if identifier else model.__name__.lower()), field.name), field_name, sort_field=display, display=display, filter_config=TextFilter(filter_field=filter_field, placeholder=field_name), ) return self.handle_special_column(field, column)[0]
class SupplierListView(PicotableListView): model = Supplier default_columns = [ Column("name", _(u"Name"), sort_field="name", display="name", filter_config=TextFilter(filter_field="name", placeholder=_("Filter by name..."))), Column("type", _(u"Type")), Column("module_identifier", _(u"Module"), display="get_module_display", sortable=True) ] def get_module_display(self, instance): return instance.module.name or _( "No %s module") % self.model._meta.verbose_name def get_toolbar(self): if settings.SHUUP_ENABLE_MULTIPLE_SUPPLIERS: return super(SupplierListView, self).get_toolbar() else: return Toolbar([])
class SupplierListView(PicotableListView): model = Supplier default_columns = [ Column("name", _(u"Name"), sort_field="name", display="name", filter_config=TextFilter(filter_field="name", placeholder=_("Filter by name..."))), Column("type", _(u"Type")), Column("module_identifier", _(u"Module"), display="get_module_display", sortable=True) ] toolbar_buttons_provider_key = "supplier_list_toolbar_provider" mass_actions_provider_key = "supplier_list_mass_actions_provider" def get_queryset(self): return Supplier.objects.filter( Q(shops=get_shop(self.request)) | Q(shops__isnull=True)).not_deleted() def get_module_display(self, instance): return instance.module.name or _( "No %s module") % self.model._meta.verbose_name def get_toolbar(self): if settings.SHUUP_ENABLE_MULTIPLE_SUPPLIERS: return super(SupplierListView, self).get_toolbar() else: return Toolbar.for_view(self)
def test_picotable_correctly_sorts_translated_fields(rf, admin_user, regular_user): """ Make sure that translated fields, such as product names, are correctly sorted """ populate_if_required() columns = [ Column("id", "Id", filter_config=Filter(), display=instance_id), Column("name", "Name", sort_field="translations__name", filter_config=TextFilter(filter_field="translations__name")), ] pico = get_pico(rf, admin_user, model=Product, columns=columns) # Verify ascending sort sorted_products = pico.get_data({ "perPage": 100, "page": 1, "sort": "+name" }) sorted_names = [p["name"] for p in sorted_products["items"]] assert sorted_names == sorted(sorted_names) # Verify descending sort sorted_products = pico.get_data({ "perPage": 100, "page": 1, "sort": "-name" }) sorted_names = [p["name"] for p in sorted_products["items"]] assert sorted_names == sorted(sorted_names, reverse=True)
class AvailabilityExceptionListView(PicotableListView): model = AvailabilityException url_identifier = "discounts_availability_exception" default_columns = [ Column( "name", _("Exception Name"), sort_field="name", display="name", filter_config=TextFilter(filter_field="name", placeholder=_("Filter by name...")) ), Column( "start_datetime", _("Start Date and Time"), display="format_start_datetime", filter_config=DateRangeFilter() ), Column( "end_datetime", _("End Date and Time"), display="format_end_datetime", filter_config=DateRangeFilter() ) ] def get_queryset(self): return AvailabilityException.objects.filter(shops=get_shop(self.request)) def format_start_datetime(self, instance, *args, **kwargs): return get_locally_formatted_datetime(instance.start_datetime) if instance.start_datetime else "" def format_end_datetime(self, instance, *args, **kwargs): return get_locally_formatted_datetime(instance.end_datetime) if instance.end_datetime else ""
def get_pico(rf, admin_user, model=None, columns=None): shop = get_default_shop() model = model or get_user_model() columns = columns or [ Column("id", "Id", filter_config=Filter(), display=instance_id), Column("username", "Username", sortable=False, filter_config=MultiFieldTextFilter( filter_fields=("username", "email"), operator="iregex")), Column("email", "Email", sortable=False, filter_config=TextFilter()), Column("is_superuser", "Is Superuser", display="superuser_display", filter_config=ChoicesFilter(choices=false_and_true())), Column("is_active", "Is Active", filter_config=ChoicesFilter( choices=false_and_true)), # `choices` callable Column("date_joined", "Date Joined", filter_config=DateRangeFilter()) ] admin_user.is_staff = True admin_user.save() shop.staff_members.add(admin_user) request = apply_request_middleware(rf.get("/"), user=admin_user) return Picotable(request=request, columns=columns, mass_actions=[], queryset=model.objects.all(), context=PicoContext(request))
class SnippetListView(PicotableListView): model = Snippet default_columns = [ Column( "location", _("Location"), sort_field="location", filter_config=TextFilter( filter_field="location", placeholder=_("Filter by location...") ) ), Column("snippet_type", _("Type"), sort_field="snippet_type"), Column("themes", _("Themes"), display="get_themes") ] def get_themes(self, value): return ", ".join([ force_text(theme.name) for theme in get_provide_objects("xtheme") if theme.identifier in value.themes ]) def get_queryset(self): return Snippet.objects.filter(shop=get_shop(self.request))
def _get_column(self, model, field, known_names, identifier): if not self._valid_field(field.name): return None field_name = field.verbose_name.title() if identifier: field_name = "%s %s" % (identifier.replace( "_", " ").capitalize(), field_name) display = "%s__%s" % (identifier, field.name) if identifier else field.name column = Column( "%s_%s" % ((identifier if identifier else model.__name__.lower()), field.name), field_name, display=display) column, is_special = self.handle_special_column(field, column) if not is_special: if isinstance(field, CharField): column.filter_config = TextFilter(filter_field=field.name, placeholder=field_name) if isinstance(field, EnumIntegerField): column.filter_config = ChoicesFilter(field.choices) if isinstance(field, BooleanField): column.filter_config = true_or_false_filter return column
class CurrencyListView(PicotableListView): model = Currency default_columns = [ Column("name", _("Name"), display="get_currency_display", sortable=False), Column("code", _(u"Code"), sort_field="code", filter_config=TextFilter( filter_field="code", placeholder=_("Filter by code"), )), Column( "decimal_places", _("Decimal places"), display="format_decimal_places", ) ] def format_decimal_places(self, instance): return "{0}".format(instance.decimal_places) def get_currency_display(self, instance): locale = get_current_babel_locale() return locale.currencies.get(instance.code, instance.code)