diff --git a/apps/tag/serializers.py b/apps/tag/serializers.py index 2cc818a9..5b6f390c 100644 --- a/apps/tag/serializers.py +++ b/apps/tag/serializers.py @@ -1,9 +1,12 @@ """Tag serializers.""" from rest_framework import serializers +from rest_framework.fields import SerializerMethodField + from establishment.models import (Establishment, EstablishmentType, EstablishmentSubType) from news.models import News, NewsType from tag import models +from tag.models import Tag from utils.exceptions import (ObjectAlreadyAdded, BindingObjectNotFound, RemovedBindingObjectNotFound) from utils.serializers import TranslatedField @@ -12,6 +15,9 @@ from utils.serializers import TranslatedField class TagBaseSerializer(serializers.ModelSerializer): """Serializer for model Tag.""" + def get_extra_kwargs(self): + return super().get_extra_kwargs() + label_translated = TranslatedField() index_name = serializers.CharField(source='value', read_only=True, allow_null=True) @@ -37,6 +43,7 @@ class TagBackOfficeSerializer(TagBaseSerializer): 'category' ) + class TagCategoryProductSerializer(serializers.ModelSerializer): """SHORT Serializer for TagCategory""" @@ -57,7 +64,7 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer): """Serializer for model TagCategory.""" label_translated = TranslatedField() - tags = TagBaseSerializer(many=True, read_only=True) + tags = SerializerMethodField() class Meta: """Meta class.""" @@ -70,6 +77,22 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer): 'tags', ) + def get_tags(self, obj): + query_params = dict(self.context['request'].query_params) + if len(query_params) > 1: + return None + + tags = Tag.objects.all() + + if 'establishment_type' in query_params: + types = query_params['establishment_type'] + tags = tags.filter(establishments__establishment_type__index_name__in=types).distinct() + elif 'product_type' in query_params: + types = query_params['product_type'] + tags = tags.filter(products__product_type__index_name__in=types).distinct() + + return TagBaseSerializer(instance=tags, many=True, read_only=True).data + class TagCategoryShortSerializer(serializers.ModelSerializer): """Serializer for model TagCategory.""" @@ -174,15 +197,15 @@ class TagCategoryBindObjectSerializer(serializers.Serializer): attrs['tag_category'] = tag_category if obj_type == self.ESTABLISHMENT_TYPE: - establishment_type = EstablishmentType.objects.filter(pk=obj_id).\ + establishment_type = EstablishmentType.objects.filter(pk=obj_id). \ first() if not establishment_type: raise BindingObjectNotFound() - if request.method == 'POST' and tag_category.establishment_types.\ + if request.method == 'POST' and tag_category.establishment_types. \ filter(pk=establishment_type.pk).exists(): raise ObjectAlreadyAdded() - if request.method == 'DELETE' and not tag_category.\ - establishment_types.filter(pk=establishment_type.pk).\ + if request.method == 'DELETE' and not tag_category. \ + establishment_types.filter(pk=establishment_type.pk). \ exists(): raise RemovedBindingObjectNotFound() attrs['related_object'] = establishment_type @@ -190,10 +213,10 @@ class TagCategoryBindObjectSerializer(serializers.Serializer): news_type = NewsType.objects.filter(pk=obj_id).first() if not news_type: raise BindingObjectNotFound() - if request.method == 'POST' and tag_category.news_types.\ + if request.method == 'POST' and tag_category.news_types. \ filter(pk=news_type.pk).exists(): raise ObjectAlreadyAdded() - if request.method == 'DELETE' and not tag_category.news_types.\ + if request.method == 'DELETE' and not tag_category.news_types. \ filter(pk=news_type.pk).exists(): raise RemovedBindingObjectNotFound() attrs['related_object'] = news_type