Skip to content

Commit

Permalink
Merge pull request #4715 from mirumee/4007/use_search_in_consistent_way
Browse files Browse the repository at this point in the history
Filtering: use search in a consistent way
  • Loading branch information
maarcingebala committed Sep 10, 2019
2 parents e27a609 + 445d590 commit c7c1416
Show file tree
Hide file tree
Showing 21 changed files with 632 additions and 37 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ All notable, unreleased changes to this project will be documented in this file.
- Distinguish OrderLine product name and variant name - #4702 by @fowczarek
- Fix for Digital products - update order status after automatic fulfillment - #4709 by @korycins
- Add redirectUrl to staff and user create mutations - #4717 by @fowczarek
- Filtering: use search in a consistent way. Add sort by product type name and publication status to products query. - #4715 by @fowczarek

## 2.8.0

Expand Down
6 changes: 3 additions & 3 deletions saleor/extensions/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,14 +218,14 @@ def get_plugin_configuration(self, plugin_name) -> "PluginConfiguration":
return plugin.get_plugin_configuration(plugin_configurations_qs)

def get_plugin_configurations(self) -> List["PluginConfiguration"]:
plugin_configurations = []
plugin_configuration_ids = []
plugin_configurations_qs = PluginConfiguration.objects.all()
for plugin in self.plugins:
plugin_configuration = plugin.get_plugin_configuration(
plugin_configurations_qs
)
plugin_configurations.append(plugin_configuration)
return plugin_configurations
plugin_configuration_ids.append(plugin_configuration.pk)
return PluginConfiguration.objects.filter(pk__in=plugin_configuration_ids)


def get_extensions_manager(
Expand Down
25 changes: 25 additions & 0 deletions saleor/graphql/extensions/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import django_filters

from ...extensions.models import PluginConfiguration
from ..core.types import FilterInputObjectType
from ..utils import filter_by_query_param


def filter_plugin_search(qs, _, value):
plugin_fields = ["name", "description"]
qs = filter_by_query_param(qs, value, plugin_fields)
return qs


class PluginFilter(django_filters.FilterSet):
active = django_filters.BooleanFilter()
search = django_filters.CharFilter(method=filter_plugin_search)

class Meta:
model = PluginConfiguration
fields = ["active", "search"]


class PluginFilterInput(FilterInputObjectType):
class Meta:
filterset_class = PluginFilter
7 changes: 5 additions & 2 deletions saleor/graphql/extensions/schema.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import graphene

from ..core.fields import PrefetchingConnectionField
from ..core.fields import FilterInputConnectionField
from .filters import PluginFilterInput
from ..decorators import permission_required
from .mutations import PluginUpdate
from .resolvers import resolve_plugin, resolve_plugins
Expand All @@ -13,7 +14,9 @@ class ExtensionsQueries(graphene.ObjectType):
id=graphene.Argument(graphene.ID, required=True),
description="Lookup a plugin by ID.",
)
plugins = PrefetchingConnectionField(Plugin, description="List of plugins")
plugins = FilterInputConnectionField(
Plugin, filter=PluginFilterInput(), description="List of plugins"
)

@permission_required("extensions.manage_plugins")
def resolve_plugin(self, info, **data):
Expand Down
43 changes: 43 additions & 0 deletions saleor/graphql/menu/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import django_filters

from ...menu.models import Menu, MenuItem
from ..core.types import FilterInputObjectType
from ..utils import filter_by_query_param


def filter_menu_search(qs, _, value):
menu_fields = ["name"]
qs = filter_by_query_param(qs, value, menu_fields)
return qs


def filter_menu_item_search(qs, _, value):
menu_item_fields = ["name"]
qs = filter_by_query_param(qs, value, menu_item_fields)
return qs


class MenuFilter(django_filters.FilterSet):
search = django_filters.CharFilter(method=filter_menu_search)

class Meta:
model = Menu
fields = ["search"]


class MenuItemFilter(django_filters.FilterSet):
search = django_filters.CharFilter(method=filter_menu_item_search)

class Meta:
model = MenuItem
fields = ["search"]


class MenuFilterInput(FilterInputObjectType):
class Meta:
filterset_class = MenuFilter


class MenuItemFilterInput(FilterInputObjectType):
class Meta:
filterset_class = MenuItemFilter
9 changes: 6 additions & 3 deletions saleor/graphql/menu/schema.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import graphene

from ..core.fields import PrefetchingConnectionField
from ..core.fields import FilterInputConnectionField
from ..descriptions import DESCRIPTIONS
from ..translations.mutations import MenuItemTranslate
from .bulk_mutations import MenuBulkDelete, MenuItemBulkDelete
from .filters import MenuFilterInput, MenuItemFilterInput
from .mutations import (
AssignNavigation,
MenuCreate,
Expand All @@ -25,19 +26,21 @@ class MenuQueries(graphene.ObjectType):
name=graphene.Argument(graphene.String, description="Menu name."),
description="Lookup a menu by ID or name.",
)
menus = PrefetchingConnectionField(
menus = FilterInputConnectionField(
Menu,
query=graphene.String(description=DESCRIPTIONS["menu"]),
filter=MenuFilterInput(),
description="List of the shop's menus.",
)
menu_item = graphene.Field(
MenuItem,
id=graphene.Argument(graphene.ID, required=True),
description="Lookup a menu item by ID.",
)
menu_items = PrefetchingConnectionField(
menu_items = FilterInputConnectionField(
MenuItem,
query=graphene.String(description=DESCRIPTIONS["menu_item"]),
filter=MenuItemFilterInput(),
description="List of the shop's menu items.",
)

Expand Down
19 changes: 17 additions & 2 deletions saleor/graphql/order/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,27 @@ def filter_created_range(qs, _, value):
return qs


def filter_order_search(qs, _, value):
order_fields = [
"pk",
"discount_name",
"translated_discount_name",
"user_email",
"user__first_name",
"user__last_name",
]
qs = filter_by_query_param(qs, value, order_fields)
return qs


class DraftOrderFilter(django_filters.FilterSet):
customer = django_filters.CharFilter(method=filter_customer)
created = ObjectTypeFilter(input_class=DateRangeInput, method=filter_created_range)
search = django_filters.CharFilter(method=filter_order_search)

class Meta:
model = Order
fields = ["customer", "created"]
fields = ["customer", "created", "search"]


class OrderFilter(DraftOrderFilter):
Expand All @@ -71,7 +85,8 @@ class OrderFilter(DraftOrderFilter):
status = ListObjectTypeFilter(input_class=OrderStatusFilter, method=filter_status)
customer = django_filters.CharFilter(method=filter_customer)
created = ObjectTypeFilter(input_class=DateRangeInput, method=filter_created_range)
search = django_filters.CharFilter(method=filter_order_search)

class Meta:
model = Order
fields = ["payment_status", "status", "customer", "created"]
fields = ["payment_status", "status", "customer", "created", "search"]
24 changes: 24 additions & 0 deletions saleor/graphql/page/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import django_filters

from ...page.models import Page
from ..core.types import FilterInputObjectType
from ..utils import filter_by_query_param


def filter_page_search(qs, _, value):
page_fields = ["content", "slug", "title"]
qs = filter_by_query_param(qs, value, page_fields)
return qs


class PageFilter(django_filters.FilterSet):
search = django_filters.CharFilter(method=filter_page_search)

class Meta:
model = Page
fields = ["search"]


class PageFilterInput(FilterInputObjectType):
class Meta:
filterset_class = PageFilter
6 changes: 4 additions & 2 deletions saleor/graphql/page/schema.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import graphene

from ..core.fields import PrefetchingConnectionField
from ..core.fields import FilterInputConnectionField
from ..descriptions import DESCRIPTIONS
from ..translations.mutations import PageTranslate
from .bulk_mutations import PageBulkDelete, PageBulkPublish
from .filters import PageFilterInput
from .mutations import PageCreate, PageDelete, PageUpdate
from .resolvers import resolve_page, resolve_pages
from .types import Page
Expand All @@ -16,9 +17,10 @@ class PageQueries(graphene.ObjectType):
slug=graphene.String(),
description="Lookup a page by ID or by slug.",
)
pages = PrefetchingConnectionField(
pages = FilterInputConnectionField(
Page,
query=graphene.String(description=DESCRIPTIONS["page"]),
filter=PageFilterInput(),
description="List of the shop's pages.",
)

Expand Down
6 changes: 6 additions & 0 deletions saleor/graphql/product/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ class ProductOrderField(graphene.Enum):
PRICE = "price_amount"
MINIMAL_PRICE = "minimal_variant_price_amount"
DATE = "updated_at"
TYPE = "product_type__name"
PUBLISHED = "is_published"

@property
def description(self):
Expand All @@ -39,6 +41,10 @@ def description(self):
return "Sort products by a minimal price of a product's variant."
if self == ProductOrderField.DATE:
return "Sort products by update date."
if self == ProductOrderField.TYPE:
return "Sort products by type."
if self == ProductOrderField.PUBLISHED:
return "Sort products by publication status."
raise ValueError("Unsupported enum value: %s" % self.value)


Expand Down
17 changes: 16 additions & 1 deletion saleor/graphql/product/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.db.models import Q, Sum
from graphene_django.filter import GlobalIDFilter, GlobalIDMultipleChoiceFilter

from ...product.models import Attribute, Collection, Product, ProductType
from ...product.models import Attribute, Category, Collection, Product, ProductType
from ...search.backends import picker
from ..core.filters import EnumFilter, ListObjectTypeFilter, ObjectTypeFilter
from ..core.types import FilterInputObjectType
Expand Down Expand Up @@ -231,6 +231,16 @@ class Meta:
fields = ["published", "search"]


class CategoryFilter(django_filters.FilterSet):
search = django_filters.CharFilter(
method=filter_fields_containing_value("slug", "name", "description")
)

class Meta:
model = Category
fields = ["search"]


class ProductTypeFilter(django_filters.FilterSet):
search = django_filters.CharFilter(method=filter_fields_containing_value("name"))

Expand Down Expand Up @@ -274,6 +284,11 @@ class Meta:
filterset_class = CollectionFilter


class CategoryFilterInput(FilterInputObjectType):
class Meta:
filterset_class = CategoryFilter


class ProductTypeFilterInput(FilterInputObjectType):
class Meta:
filterset_class = ProductTypeFilter
Expand Down
4 changes: 3 additions & 1 deletion saleor/graphql/product/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from .enums import StockAvailability
from .filters import (
AttributeFilterInput,
CategoryFilterInput,
CollectionFilterInput,
ProductFilterInput,
ProductTypeFilterInput,
Expand Down Expand Up @@ -156,9 +157,10 @@ class ProductQueries(graphene.ObjectType):
id=graphene.Argument(graphene.ID, required=True),
description="Lookup an attribute by ID.",
)
categories = PrefetchingConnectionField(
categories = FilterInputConnectionField(
Category,
query=graphene.String(description=DESCRIPTIONS["category"]),
filter=CategoryFilterInput(),
level=graphene.Argument(graphene.Int),
description="List of the shop's categories.",
)
Expand Down

0 comments on commit c7c1416

Please sign in to comment.