Features: 1) Add is_filterable field to Attribute model with migration; 2) Extend admin panel to include is_filterable in general_fields; 3) Update serializers to respect is_filterable for attribute querying; 4) Ensure object types enforce is_filterable in attribute filtering;

Fixes: None;

Extra: Improve `AlterUniqueTogether` constraint for attributes with `name` and `group`;
This commit is contained in:
Egor Pavlovich Gorbunov 2025-09-22 14:11:15 +03:00
parent 6f4e952b9b
commit 1f68fa8b73
4 changed files with 33 additions and 3 deletions

View file

@ -204,7 +204,7 @@ class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # typ
readonly_fields = ("uuid", "modified", "created") readonly_fields = ("uuid", "modified", "created")
autocomplete_fields = ["categories", "group"] autocomplete_fields = ["categories", "group"]
general_fields = ["is_active", "name", "value_type"] general_fields = ["is_active", "name", "value_type", "is_filterable"]
relation_fields = ["group", "categories"] relation_fields = ["group", "categories"]

View file

@ -250,7 +250,7 @@ class CategoryType(DjangoObjectType):
): ):
distinct_vals = ( distinct_vals = (
AttributeValue.objects.annotate(value_length=Length("value")) AttributeValue.objects.annotate(value_length=Length("value"))
.filter(attribute=attr, product__category=self, value_length__lte=30) .filter(attribute=attr, attribute__is_filterable=True, product__category=self, value_length__lte=30)
.values_list("value", flat=True) .values_list("value", flat=True)
.distinct() .distinct()
) )

View file

@ -0,0 +1,26 @@
# Generated by Django 5.2 on 2025-09-22 11:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("core", "0042_attribute_name_fa_ir_attribute_name_he_il_and_more"),
]
operations = [
migrations.AddField(
model_name="attribute",
name="is_filterable",
field=models.BooleanField(
default=True,
help_text="designates whether this attribute can be used for filtering or not",
verbose_name="is filterable",
),
),
migrations.AlterUniqueTogether(
name="attribute",
unique_together={("name", "group")},
),
]

View file

@ -81,7 +81,11 @@ class CategoryDetailSerializer(ModelSerializer):
request = self.context.get("request") request = self.context.get("request")
user = getattr(request, "user", AnonymousUser()) user = getattr(request, "user", AnonymousUser())
attrs_qs = obj.attributes.all() if user.has_perm("view_attribute") else obj.attributes.filter(is_active=True) attrs_qs = (
obj.attributes.filter(is_filterable=True)
if user.has_perm("view_attribute")
else obj.attributes.filter(is_active=True, is_filterable=True)
)
attributes = list(attrs_qs) attributes = list(attrs_qs)
attr_ids = [a.id for a in attributes] attr_ids = [a.id for a in attributes]