From dba76fde2cd82b194d1cd762282d4516b3a53e5e Mon Sep 17 00:00:00 2001 From: BranDavidSebastian Date: Tue, 5 Nov 2024 00:50:08 +0200 Subject: [PATCH] #126 new strawberry filters --- OneSila/OneSila/settings/base.py | 2 +- OneSila/OneSila/urls.py | 1 - OneSila/contacts/schema/types/filters.py | 8 --- .../management/commands/generate_schema.py | 1 - OneSila/core/schema/core/types/filters.py | 58 +++++++++---------- OneSila/currencies/schema/types/filters.py | 1 - OneSila/customs/schema/types/filters.py | 1 - OneSila/eancodes/schema/types/filters.py | 1 - OneSila/inventory/schema/types/filters.py | 3 - OneSila/lead_times/schema/types/filters.py | 3 - OneSila/media/schema/types/filters.py | 4 -- OneSila/order_returns/schema/types/filters.py | 3 +- OneSila/orders/schema/types/filters.py | 3 - OneSila/products/schema/types/filters.py | 8 --- .../products/tests/tests_schemas/queries.py | 12 ++++ .../tests/tests_schemas/tests_queries.py | 11 ++++ OneSila/properties/schema/types/filters.py | 4 -- OneSila/purchasing/schema/types/filters.py | 2 - .../sales_channels/schema/types/filters.py | 49 ++++++++-------- OneSila/sales_prices/schema/types/filters.py | 3 - OneSila/taxes/schema/types/filters.py | 1 - OneSila/units/schema/types/filters.py | 1 - requirements.txt | 4 +- 23 files changed, 79 insertions(+), 105 deletions(-) diff --git a/OneSila/OneSila/settings/base.py b/OneSila/OneSila/settings/base.py index bd0e4a51..8d165724 100644 --- a/OneSila/OneSila/settings/base.py +++ b/OneSila/OneSila/settings/base.py @@ -193,7 +193,7 @@ "FIELD_DESCRIPTION_FROM_HELP_TEXT": True, "TYPE_DESCRIPTION_FROM_MODEL_DOCSTRING": True, "MAP_AUTO_ID_AS_GLOBAL_ID": True, - "USE_DEPRECATED_FILTERS": True, + "USE_DEPRECATED_FILTERS": False, } # https://channels.readthedocs.io/en/stable/topics/channel_layers.html diff --git a/OneSila/OneSila/urls.py b/OneSila/OneSila/urls.py index ef0a5578..dbf4238f 100644 --- a/OneSila/OneSila/urls.py +++ b/OneSila/OneSila/urls.py @@ -43,7 +43,6 @@ AsyncGraphQLView.as_view( schema=schema, graphiql=settings.DEBUG, - subscriptions_enabled=True ), name='graphql', ), diff --git a/OneSila/contacts/schema/types/filters.py b/OneSila/contacts/schema/types/filters.py index 3b110980..d898cb80 100644 --- a/OneSila/contacts/schema/types/filters.py +++ b/OneSila/contacts/schema/types/filters.py @@ -8,7 +8,6 @@ @filter(Company) class CompanyFilter(SearchFilterMixin): - search: str | None id: auto name: auto language: auto @@ -21,7 +20,6 @@ class CompanyFilter(SearchFilterMixin): @filter(Supplier) class SupplierFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): - search: str | None id: auto name: auto exclude_demo_data: Optional[bool] @@ -29,7 +27,6 @@ class SupplierFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): @filter(Customer) class CustomerFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): - search: str | None id: auto name: auto exclude_demo_data: Optional[bool] @@ -38,7 +35,6 @@ class CustomerFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): @filter(Person) class PersonFilter(SearchFilterMixin): id: auto - search: str | None active: auto first_name: auto last_name: auto @@ -49,7 +45,6 @@ class PersonFilter(SearchFilterMixin): @filter(Address) class AddressFilter(SearchFilterMixin): id: auto - search: str | None company: CompanyFilter | None is_invoice_address: auto is_shipping_address: auto @@ -58,19 +53,16 @@ class AddressFilter(SearchFilterMixin): @filter(InvoiceAddress) class InvoiceAddressFilter(SearchFilterMixin): id: auto - search: str | None company: CompanyFilter | None @filter(ShippingAddress) class ShippingAddressFilter(SearchFilterMixin): id: auto - search: str | None company: CompanyFilter | None @filter(InventoryShippingAddress) class InventoryShippingAddressFilter(SearchFilterMixin): id: auto - search: str | None company: CompanyFilter | None diff --git a/OneSila/core/management/commands/generate_schema.py b/OneSila/core/management/commands/generate_schema.py index b491096a..38b6892c 100644 --- a/OneSila/core/management/commands/generate_schema.py +++ b/OneSila/core/management/commands/generate_schema.py @@ -133,7 +133,6 @@ def generate_filters(app_name, models): filter_type = [ f"@filter({model})", f"class {model}Filter(SearchFilterMixin):", - f" search: str | None", "", "", ] diff --git a/OneSila/core/schema/core/types/filters.py b/OneSila/core/schema/core/types/filters.py index b74afb02..253cc79d 100644 --- a/OneSila/core/schema/core/types/filters.py +++ b/OneSila/core/schema/core/types/filters.py @@ -1,54 +1,54 @@ from typing import Optional +from asgiref.sync import sync_to_async +from channels.db import database_sync_to_async +from django.db.models import Q from strawberry_django.filters import filter as strawberry_filter -# from strawberry_django import filter_field +from strawberry_django import filter_field as custom_filter from strawberry import UNSET from strawberry import LazyType as lazy from core.managers import QuerySet -# class SearchFilterMixin: -# search: str | None - -# # def filter_search(self, queryset) -> str | None: -# # if self.search not in (None, UNSET): -# # queryset = queryset.search(self.search) - -# # return queryset - -# @filter_field() -# def search(self, queryset: QuerySet, value: str, prefix: str) -> tuple: -# # Docs: https://strawberry.rocks/docs/django/guide/filters -# # FIXME: New style filter Not working..... -# return queryset.search(value) - - class SearchFilterMixin: - search: str | None - def filter_search(self, queryset) -> str | None: - if self.search not in (None, UNSET): - queryset = queryset.search(self.search) + @custom_filter + def search( + self, + queryset: QuerySet, + value: str, + prefix: str + ) -> tuple[QuerySet, Q]: + + if value not in (None, UNSET): + queryset = queryset.search(value) - return queryset + return queryset, Q() class ExcluideDemoDataFilterMixin: - exclude_demo_data: Optional[bool] - def filter_exclude_demo_data(self, queryset): - from django.contrib.contenttypes.models import ContentType - from core.models import DemoDataRelation + @custom_filter + def exclude_demo_data( + self, + queryset: QuerySet, + value: bool, + prefix: str + ) -> tuple[QuerySet, Q]: + + if value: + from django.contrib.contenttypes.models import ContentType + from core.models import DemoDataRelation - if self.exclude_demo_data: supplier_content_type = ContentType.objects.get_for_model(queryset.model) queryset = queryset.exclude( id__in=DemoDataRelation.objects.filter( content_type=supplier_content_type - ).values('object_id') + ).values("object_id") ) - return queryset + return queryset, Q() + def filter(*args, lookups=True, **kwargs): diff --git a/OneSila/currencies/schema/types/filters.py b/OneSila/currencies/schema/types/filters.py index f8385751..1a6564b2 100644 --- a/OneSila/currencies/schema/types/filters.py +++ b/OneSila/currencies/schema/types/filters.py @@ -6,7 +6,6 @@ @filter(Currency) class CurrencyFilter(SearchFilterMixin): - search: str | None id: auto iso_code: auto is_default_currency: auto diff --git a/OneSila/customs/schema/types/filters.py b/OneSila/customs/schema/types/filters.py index 605c02c2..89a94406 100644 --- a/OneSila/customs/schema/types/filters.py +++ b/OneSila/customs/schema/types/filters.py @@ -7,7 +7,6 @@ @filter(HsCode) class HsCodeFilter(SearchFilterMixin): - search: str | None id: auto code: auto name: auto diff --git a/OneSila/eancodes/schema/types/filters.py b/OneSila/eancodes/schema/types/filters.py index ea3d57b7..2618f97a 100644 --- a/OneSila/eancodes/schema/types/filters.py +++ b/OneSila/eancodes/schema/types/filters.py @@ -7,7 +7,6 @@ @filter(EanCode) class EanCodeFilter(SearchFilterMixin): - search: str | None id: auto ean_code: auto internal: auto diff --git a/OneSila/inventory/schema/types/filters.py b/OneSila/inventory/schema/types/filters.py index ff29091a..b5e68ebe 100644 --- a/OneSila/inventory/schema/types/filters.py +++ b/OneSila/inventory/schema/types/filters.py @@ -10,7 +10,6 @@ @filter(InventoryLocation) class InventoryLocationFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): - search: str | None exclude_demo_data: Optional[bool] id: auto name: auto @@ -20,7 +19,6 @@ class InventoryLocationFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): @filter(Inventory) class InventoryFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): - search: str | None exclude_demo_data: Optional[bool] id: auto quantity: auto @@ -30,5 +28,4 @@ class InventoryFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): @filter(InventoryMovement) class InventoryMovementFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): id: auto - search: str | None product: ProductFilter | None \ No newline at end of file diff --git a/OneSila/lead_times/schema/types/filters.py b/OneSila/lead_times/schema/types/filters.py index e2698045..4ef45405 100644 --- a/OneSila/lead_times/schema/types/filters.py +++ b/OneSila/lead_times/schema/types/filters.py @@ -7,19 +7,16 @@ @filter(LeadTime) class LeadTimeFilter(SearchFilterMixin): - search: str | None id: auto @filter(LeadTimeForShippingAddress) class LeadTimeForShippingAddressFilter(SearchFilterMixin): - search: str | None leadtime: LeadTimeFilter | None shippingaddress: ShippingAddressFilter | None @filter(LeadTimeProductOutOfStock) class LeadTimeProductOutOfStockFilter(SearchFilterMixin): - search: str | None leadtime_outofstock: LeadTimeFilter | None product: ProductFilter | None diff --git a/OneSila/media/schema/types/filters.py b/OneSila/media/schema/types/filters.py index ae6cf2d7..7ee651bd 100644 --- a/OneSila/media/schema/types/filters.py +++ b/OneSila/media/schema/types/filters.py @@ -9,27 +9,23 @@ @filter(Media) class MediaFilter(SearchFilterMixin): - search: str | None id: auto type: auto @filter(Image) class ImageFilter(SearchFilterMixin): - search: str | None id: auto image_type: auto @filter(File) class FileFilter(SearchFilterMixin): - search: str | None id: auto @filter(Video) class VideoFilter(SearchFilterMixin): - search: str | None id: auto diff --git a/OneSila/order_returns/schema/types/filters.py b/OneSila/order_returns/schema/types/filters.py index c007e055..83133152 100644 --- a/OneSila/order_returns/schema/types/filters.py +++ b/OneSila/order_returns/schema/types/filters.py @@ -6,11 +6,10 @@ @filter(OrderReturn) class OrderReturnFilter(SearchFilterMixin): - search: str | None status: auto received_on: auto @filter(OrderReturnItem) class OrderReturnItemFilter(SearchFilterMixin): - search: str | None + pass diff --git a/OneSila/orders/schema/types/filters.py b/OneSila/orders/schema/types/filters.py index 45f88482..23dc882c 100644 --- a/OneSila/orders/schema/types/filters.py +++ b/OneSila/orders/schema/types/filters.py @@ -11,7 +11,6 @@ @filter(Order) class OrderFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): - search: str | None exclude_demo_data: Optional[bool] id: auto reference: auto @@ -26,7 +25,6 @@ class OrderFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): @filter(OrderItem) class OrderItemFilter(SearchFilterMixin): - search: str | None id: auto order: OrderFilter | None product: ProductFilter | None @@ -34,6 +32,5 @@ class OrderItemFilter(SearchFilterMixin): @filter(OrderNote) class OrderNoteFilter(SearchFilterMixin): - search: str | None id: auto order: OrderFilter | None diff --git a/OneSila/products/schema/types/filters.py b/OneSila/products/schema/types/filters.py index 940effbf..ce3952e1 100644 --- a/OneSila/products/schema/types/filters.py +++ b/OneSila/products/schema/types/filters.py @@ -11,7 +11,6 @@ @filter(Product) class ProductFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): - search: str | None id: auto sku: auto type: auto @@ -23,7 +22,6 @@ class ProductFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): @filter(BundleProduct) class BundleProductFilter(SearchFilterMixin): - search: str | None id: auto sku: auto vat_rate: Optional[VatRateFilter] @@ -31,7 +29,6 @@ class BundleProductFilter(SearchFilterMixin): @filter(ConfigurableProduct) class ConfigurableProductFilter(SearchFilterMixin): - search: str | None id: auto sku: auto vat_rate: Optional[VatRateFilter] @@ -39,7 +36,6 @@ class ConfigurableProductFilter(SearchFilterMixin): @filter(SimpleProduct) class SimpleProductFilter(SearchFilterMixin): - search: str | None id: auto sku: auto vat_rate: Optional[VatRateFilter] @@ -66,7 +62,6 @@ class BundleVariationFilter: @filter(ManufacturableProduct) class ManufacturableProductFilter(SearchFilterMixin): - search: str | None id: auto sku: auto vat_rate: Optional[VatRateFilter] @@ -74,7 +69,6 @@ class ManufacturableProductFilter(SearchFilterMixin): @filter(DropshipProduct) class DropshipProductFilter(SearchFilterMixin): - search: str | None id: auto sku: auto vat_rate: Optional[VatRateFilter] @@ -82,7 +76,6 @@ class DropshipProductFilter(SearchFilterMixin): @filter(SupplierProduct) class SupplierProductFilter(SearchFilterMixin): - search: str | None id: auto sku: auto supplier: Optional[SupplierFilter] @@ -97,5 +90,4 @@ class BillOfMaterialFilter: @filter(SupplierPrices) class SupplierPricesFilter(SearchFilterMixin): - search: str | None supplier_product: Optional[SupplierProductFilter] diff --git a/OneSila/products/tests/tests_schemas/queries.py b/OneSila/products/tests/tests_schemas/queries.py index 9bb913c8..b00fe609 100644 --- a/OneSila/products/tests/tests_schemas/queries.py +++ b/OneSila/products/tests/tests_schemas/queries.py @@ -21,3 +21,15 @@ } } """ + +PRODUCT_EXCLUDE_DEMO_DATA = """ +query simpleProducts($excludeDemoData: Boolean!) { + simpleProducts(filters:{excludeDemoData:$excludeDemoData}) { + edges { + node { + id + } + } + } +} +""" diff --git a/OneSila/products/tests/tests_schemas/tests_queries.py b/OneSila/products/tests/tests_schemas/tests_queries.py index 4e64d97e..4d194bd0 100644 --- a/OneSila/products/tests/tests_schemas/tests_queries.py +++ b/OneSila/products/tests/tests_schemas/tests_queries.py @@ -21,3 +21,14 @@ def test_search_product(self): variables={"search": 'some product'}, ) self.assertTrue(resp.errors is None) + + + def test_exclude_demo_data_product(self): + from .queries import PRODUCT_EXCLUDE_DEMO_DATA + + resp = self.strawberry_test_client( + query=PRODUCT_EXCLUDE_DEMO_DATA, + variables={"excludeDemoData": True}, + ) + + self.assertTrue(resp.errors is None) \ No newline at end of file diff --git a/OneSila/properties/schema/types/filters.py b/OneSila/properties/schema/types/filters.py index f207ca09..7f0578e2 100644 --- a/OneSila/properties/schema/types/filters.py +++ b/OneSila/properties/schema/types/filters.py @@ -11,7 +11,6 @@ @filter(Property) class PropertyFilter(SearchFilterMixin): - search: str | None id: auto is_public_information: auto is_product_type: auto @@ -20,7 +19,6 @@ class PropertyFilter(SearchFilterMixin): @filter(PropertySelectValue) class PropertySelectValueFilter(SearchFilterMixin): - search: str | None id: auto property: Optional[PropertyFilter] @@ -34,7 +32,6 @@ class PropertySelectValueTranslationFilter: @filter(ProductProperty) class ProductPropertyFilter(SearchFilterMixin): - search: str | None id: auto product: Optional[ProductFilter] property: Optional[PropertyFilter] @@ -63,7 +60,6 @@ class ProductPropertyTextTranslationFilter: class ProductPropertiesRuleFilter: id: auto product_type: Optional[PropertyFilter] - search: str | None @filter(ProductPropertiesRuleItem) diff --git a/OneSila/purchasing/schema/types/filters.py b/OneSila/purchasing/schema/types/filters.py index 3c741d4f..a48c9cfb 100644 --- a/OneSila/purchasing/schema/types/filters.py +++ b/OneSila/purchasing/schema/types/filters.py @@ -12,7 +12,6 @@ @filter(PurchaseOrder) class PurchaseOrderFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): - search: str | None id: auto status: auto supplier: SupplierFilter | None @@ -26,7 +25,6 @@ class PurchaseOrderFilter(SearchFilterMixin, ExcluideDemoDataFilterMixin): @filter(PurchaseOrderItem) class PurchaseOrderItemFilter(SearchFilterMixin): - search: str | None id: auto quantity: auto purchase_order: PurchaseOrderFilter | None diff --git a/OneSila/sales_channels/schema/types/filters.py b/OneSila/sales_channels/schema/types/filters.py index 21bd32b2..92926971 100644 --- a/OneSila/sales_channels/schema/types/filters.py +++ b/OneSila/sales_channels/schema/types/filters.py @@ -9,134 +9,131 @@ @filter(ImportCurrency) class ImportCurrencyFilter(SearchFilterMixin): - search: str | None + pass @filter(ImportImage) class ImportImageFilter(SearchFilterMixin): - search: str | None + pass @filter(ImportProcess) class ImportProcessFilter(SearchFilterMixin): - search: str | None + pass @filter(ImportProduct) class ImportProductFilter(SearchFilterMixin): - search: str | None + pass @filter(ImportProperty) class ImportPropertyFilter(SearchFilterMixin): - search: str | None + pass @filter(ImportPropertySelectValue) class ImportPropertySelectValueFilter(SearchFilterMixin): - search: str | None + pass @filter(ImportVat) class ImportVatFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteCategory) class RemoteCategoryFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteCurrency) class RemoteCurrencyFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteCustomer) class RemoteCustomerFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteImage) class RemoteImageFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteImageProductAssociation) class RemoteImageProductAssociationFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteInventory) class RemoteInventoryFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteLog) class RemoteLogFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteOrder) class RemoteOrderFilter(SearchFilterMixin): - search: str | None + pass @filter(RemotePrice) class RemotePriceFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteProduct) class RemoteProductFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteProductContent) class RemoteProductContentFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteProductProperty) class RemoteProductPropertyFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteProperty) class RemotePropertyFilter(SearchFilterMixin): - search: str | None + pass @filter(RemotePropertySelectValue) class RemotePropertySelectValueFilter(SearchFilterMixin): - search: str | None + pass @filter(RemoteVat) class RemoteVatFilter(SearchFilterMixin): - search: str | None + pass @filter(SalesChannel) class SalesChannelFilter(SearchFilterMixin): - search: str | None + pass @filter(SalesChannelIntegrationPricelist) class SalesChannelIntegrationPricelistFilter(SearchFilterMixin): - search: str | None id: auto @filter(SalesChannelView) class SalesChannelViewFilter(SearchFilterMixin): - search: str | None id: auto @filter(SalesChannelViewAssign) class SalesChannelViewAssignFilter(SearchFilterMixin): - search: str | None id: auto sales_channel: Optional[SalesChannelFilter] sales_channel_view: Optional[SalesChannelViewFilter] diff --git a/OneSila/sales_prices/schema/types/filters.py b/OneSila/sales_prices/schema/types/filters.py index f3d40f03..60379199 100644 --- a/OneSila/sales_prices/schema/types/filters.py +++ b/OneSila/sales_prices/schema/types/filters.py @@ -10,7 +10,6 @@ @filter(SalesPrice) class SalesPriceFilter(SearchFilterMixin): - search: str | None id: auto product: ProductFilter | None currency: CurrencyFilter | None @@ -18,7 +17,6 @@ class SalesPriceFilter(SearchFilterMixin): @filter(SalesPriceList) class SalesPriceListFilter(SearchFilterMixin): - search: str | None id: auto name: auto currency: Optional[CurrencyFilter] @@ -33,7 +31,6 @@ class SalesPriceListFilter(SearchFilterMixin): @filter(SalesPriceListItem) class SalesPriceListItemFilter(SearchFilterMixin): - search: str | None id: auto salespricelist: SalesPriceListFilter | None product: ProductFilter | None diff --git a/OneSila/taxes/schema/types/filters.py b/OneSila/taxes/schema/types/filters.py index 695f8d47..14b1fa2e 100644 --- a/OneSila/taxes/schema/types/filters.py +++ b/OneSila/taxes/schema/types/filters.py @@ -6,7 +6,6 @@ @filter(VatRate) class VatRateFilter(SearchFilterMixin): - search: str | None id: auto name: auto rate: auto diff --git a/OneSila/units/schema/types/filters.py b/OneSila/units/schema/types/filters.py index 4985a1e4..b6437f66 100644 --- a/OneSila/units/schema/types/filters.py +++ b/OneSila/units/schema/types/filters.py @@ -6,6 +6,5 @@ @filter(Unit) class UnitFilter(SearchFilterMixin): - search: str | None id: auto name: auto diff --git a/requirements.txt b/requirements.txt index f5b7c812..7bcae4db 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,8 +36,8 @@ tblib # To find the right version, go to the strawberry-graphql-django repo and inpect the peotry.lock file # strawberry-graphql==0.219.1 # strawberry-graphql-django==0.32.1 -strawberry-graphql==0.219.1 -strawberry-graphql-django==0.32.1 +strawberry-graphql==0.247.1 +strawberry-graphql-django==0.49.1 django_get_absolute_url @ git+https://git@github.com/TweaveTech/django_get_absolute_url.git@master