category tag tags filter by obj type

This commit is contained in:
alex 2019-12-03 19:31:05 +03:00
parent 848008cae1
commit 7596652a3f

View File

@ -1,9 +1,12 @@
"""Tag serializers.""" """Tag serializers."""
from rest_framework import serializers from rest_framework import serializers
from rest_framework.fields import SerializerMethodField
from establishment.models import (Establishment, EstablishmentType, from establishment.models import (Establishment, EstablishmentType,
EstablishmentSubType) EstablishmentSubType)
from news.models import News, NewsType from news.models import News, NewsType
from tag import models from tag import models
from tag.models import Tag
from utils.exceptions import (ObjectAlreadyAdded, BindingObjectNotFound, from utils.exceptions import (ObjectAlreadyAdded, BindingObjectNotFound,
RemovedBindingObjectNotFound) RemovedBindingObjectNotFound)
from utils.serializers import TranslatedField from utils.serializers import TranslatedField
@ -12,6 +15,9 @@ from utils.serializers import TranslatedField
class TagBaseSerializer(serializers.ModelSerializer): class TagBaseSerializer(serializers.ModelSerializer):
"""Serializer for model Tag.""" """Serializer for model Tag."""
def get_extra_kwargs(self):
return super().get_extra_kwargs()
label_translated = TranslatedField() label_translated = TranslatedField()
index_name = serializers.CharField(source='value', read_only=True, allow_null=True) index_name = serializers.CharField(source='value', read_only=True, allow_null=True)
@ -37,6 +43,7 @@ class TagBackOfficeSerializer(TagBaseSerializer):
'category' 'category'
) )
class TagCategoryProductSerializer(serializers.ModelSerializer): class TagCategoryProductSerializer(serializers.ModelSerializer):
"""SHORT Serializer for TagCategory""" """SHORT Serializer for TagCategory"""
@ -57,7 +64,7 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer):
"""Serializer for model TagCategory.""" """Serializer for model TagCategory."""
label_translated = TranslatedField() label_translated = TranslatedField()
tags = TagBaseSerializer(many=True, read_only=True) tags = SerializerMethodField()
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -70,6 +77,22 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer):
'tags', '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): class TagCategoryShortSerializer(serializers.ModelSerializer):
"""Serializer for model TagCategory.""" """Serializer for model TagCategory."""
@ -174,15 +197,15 @@ class TagCategoryBindObjectSerializer(serializers.Serializer):
attrs['tag_category'] = tag_category attrs['tag_category'] = tag_category
if obj_type == self.ESTABLISHMENT_TYPE: if obj_type == self.ESTABLISHMENT_TYPE:
establishment_type = EstablishmentType.objects.filter(pk=obj_id).\ establishment_type = EstablishmentType.objects.filter(pk=obj_id). \
first() first()
if not establishment_type: if not establishment_type:
raise BindingObjectNotFound() 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(): filter(pk=establishment_type.pk).exists():
raise ObjectAlreadyAdded() raise ObjectAlreadyAdded()
if request.method == 'DELETE' and not tag_category.\ if request.method == 'DELETE' and not tag_category. \
establishment_types.filter(pk=establishment_type.pk).\ establishment_types.filter(pk=establishment_type.pk). \
exists(): exists():
raise RemovedBindingObjectNotFound() raise RemovedBindingObjectNotFound()
attrs['related_object'] = establishment_type attrs['related_object'] = establishment_type
@ -190,10 +213,10 @@ class TagCategoryBindObjectSerializer(serializers.Serializer):
news_type = NewsType.objects.filter(pk=obj_id).first() news_type = NewsType.objects.filter(pk=obj_id).first()
if not news_type: if not news_type:
raise BindingObjectNotFound() 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(): filter(pk=news_type.pk).exists():
raise ObjectAlreadyAdded() 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(): filter(pk=news_type.pk).exists():
raise RemovedBindingObjectNotFound() raise RemovedBindingObjectNotFound()
attrs['related_object'] = news_type attrs['related_object'] = news_type