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.utils.text import gettext_lazy as _
from django_filters import OrderingFilter from django_filters import OrderingFilter
from shop.models import Product from shop.models import Product, ProductPrice
class ProductFilter(django_filters.FilterSet): class ProductFilter(django_filters.FilterSet):
@@ -10,7 +10,21 @@ class ProductFilter(django_filters.FilterSet):
field_name="name", lookup_expr="icontains", label=_("Nombre") field_name="name", lookup_expr="icontains", label=_("Nombre")
) )
tags = django_filters.BaseInFilter(field_name="tags", label=_("Etiquetas")) 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: class Meta:
model = Product model = Product
@@ -19,5 +33,4 @@ class ProductFilter(django_filters.FilterSet):
"stock", "stock",
"is_digital_asset", "is_digital_asset",
"tags", "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",
),
),
]
+10 -3
View File
@@ -113,15 +113,22 @@ class ProductPrice(TimestampedModel):
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_("impuesto aplicable"), 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")) current = models.BooleanField(default=False, verbose_name=_("es el precio actual"))
def __str__(self): def __str__(self):
return f"{self.price} - {self.tax.code}" return f"{self.price} - {self.tax.code}"
@property def save(self, *args, **kwargs):
def price_with_tax(self) -> Decimal:
tax_value = self.price * Decimal(self.tax.value / 100) 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: class Meta:
verbose_name = _("precio de producto") verbose_name = _("precio de producto")
+16
View File
@@ -80,3 +80,19 @@ class TestLogin(APITestCase):
response = self.client.post(reverse("users:logout")) response = self.client.post(reverse("users:logout"))
assert response.status_code == status.HTTP_302_FOUND assert response.status_code == status.HTTP_302_FOUND
assert response.url == reverse("web:index") assert response.url == reverse("web:index")
def test_login_then_get_logout(self):
response = self.client.post(
reverse("users:login"),
{
"username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_302_FOUND
assert response.url == reverse("web:index")
response = self.client.get(reverse("users:logout"))
assert response.status_code == status.HTTP_302_FOUND
assert response.url == reverse("web:index")
View File
+1 -1
View File
@@ -2,8 +2,8 @@ from django.shortcuts import get_object_or_404
from django.views.generic import TemplateView from django.views.generic import TemplateView
from shop.filters import ProductFilter from shop.filters import ProductFilter
from shop.mixins import FilteredQuerysetMixin, PaginatedQuerysetMixin
from shop.models import Product from shop.models import Product
from web.mixins import FilteredQuerysetMixin, PaginatedQuerysetMixin
class IndexView(TemplateView): class IndexView(TemplateView):