fix: ordering

This commit is contained in:
2024-11-24 13:36:32 +01:00
parent 1f02858477
commit 7d80c64e40
9 changed files with 67 additions and 7 deletions
+16 -3
View File
@@ -2,7 +2,7 @@ import django_filters
from django.utils.text import gettext_lazy as _
from django_filters import OrderingFilter
from shop.models import Product
from shop.models import Product, ProductPrice
class ProductFilter(django_filters.FilterSet):
@@ -10,7 +10,21 @@ class ProductFilter(django_filters.FilterSet):
field_name="name", lookup_expr="icontains", label=_("Nombre")
)
tags = django_filters.BaseInFilter(field_name="tags", label=_("Etiquetas"))
ordering = OrderingFilter(fields={"name": "name"})
price_lt = django_filters.NumberFilter(method="filter_price_lt")
o = OrderingFilter(
fields=(
("name", "name"),
("id", "id"),
)
)
def filter_price_lt(self, queryset, name, value):
ids = queryset.values("id")
product_ids = ProductPrice.objects.filter(
product_id__in=ids, current=True, price_with_tax__lte=value
).values("product_id")
return queryset.filter(pk__in=product_ids)
class Meta:
model = Product
@@ -19,5 +33,4 @@ class ProductFilter(django_filters.FilterSet):
"stock",
"is_digital_asset",
"tags",
"ordering",
)
@@ -0,0 +1,24 @@
# Generated by Django 5.1.3 on 2024-11-24 12:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("shop", "0004_alter_product_options_product_slug"),
]
operations = [
migrations.AddField(
model_name="productprice",
name="price_with_tax",
field=models.DecimalField(
blank=True,
decimal_places=2,
max_digits=11,
null=True,
verbose_name="precio con impuestos",
),
),
]
-27
View File
@@ -1,27 +0,0 @@
from django.conf import settings
from django.core.paginator import Paginator
class FilteredQuerysetMixin:
queryset = None
filter_class = None
def get_filter_class(self):
return self.filter_class
def get_queryset(self):
filter_cls = self.get_filter_class()
filter_obj = filter_cls(self.request.GET)
filter_obj.is_valid()
qs = filter_obj.filter_queryset(self.queryset)
return qs
class PaginatedQuerysetMixin:
objects_per_page = settings.ITEMS_PER_PAGE or 20
def get_paginated_queryset(self, qs):
paginator = Paginator(qs, self.objects_per_page)
page = self.request.GET.get("page", 1)
qs = paginator.get_page(page)
return qs
+10 -3
View File
@@ -113,15 +113,22 @@ class ProductPrice(TimestampedModel):
on_delete=models.PROTECT,
verbose_name=_("impuesto aplicable"),
)
price_with_tax = models.DecimalField(
max_digits=11,
decimal_places=2,
blank=True,
null=True,
verbose_name=_("precio con impuestos"),
)
current = models.BooleanField(default=False, verbose_name=_("es el precio actual"))
def __str__(self):
return f"{self.price} - {self.tax.code}"
@property
def price_with_tax(self) -> Decimal:
def save(self, *args, **kwargs):
tax_value = self.price * Decimal(self.tax.value / 100)
return round(self.price + tax_value, 2)
self.price_with_tax = round(self.price + tax_value, 2)
super().save()
class Meta:
verbose_name = _("precio de producto")
View File
-13
View File
@@ -1,13 +0,0 @@
from django.test import TestCase
from django.urls import reverse
from shop.tests.mixins import CreateProductsMixin
class TestWebComponents(TestCase, CreateProductsMixin):
def setUp(self):
self.product = self.create_product()
def test_list_products_component(self):
response = self.client.get(reverse("web:list_products"))
assert response.status_code == 200
-22
View File
@@ -1,22 +0,0 @@
from django.test import TestCase
from django.urls import reverse
from shop.tests.mixins import CreateProductsMixin
class TestIndex(TestCase, CreateProductsMixin):
def setUp(self):
self.product = self.create_product()
def test_index_view(self):
response = self.client.get(reverse("web:index"))
assert response.status_code == 200
def test_product_detail_view(self):
response = self.client.get(
reverse(
"web:product_detail",
kwargs={"pk": self.product.pk, "slug": self.product.slug},
)
)
assert response.status_code == 200