change chosen tag functional

This commit is contained in:
Dmitriy Kuzmenko 2020-01-14 15:40:49 +03:00
parent bc1a9ac496
commit 11b55e9f4c
6 changed files with 28 additions and 42 deletions

View File

@ -58,8 +58,6 @@ class EstablishmentType(TypeDefaultImageMixin, TranslatedFieldsMixin, ProjectBas
blank=True, null=True, default=None, blank=True, null=True, default=None,
verbose_name='default image') verbose_name='default image')
chosen_tags = generic.GenericRelation(to='tag.ChosenTag')
class Meta: class Meta:
"""Meta class.""" """Meta class."""

View File

@ -8,6 +8,8 @@ from comment.serializers import common as comment_serializers
from establishment import models from establishment import models
from location.serializers import AddressBaseSerializer, CitySerializer, AddressDetailSerializer, \ from location.serializers import AddressBaseSerializer, CitySerializer, AddressDetailSerializer, \
CityShortSerializer CityShortSerializer
from location.serializers import EstablishmentWineRegionBaseSerializer, \
EstablishmentWineOriginBaseSerializer
from main.serializers import AwardSerializer, CurrencySerializer from main.serializers import AwardSerializer, CurrencySerializer
from review.serializers import ReviewShortSerializer from review.serializers import ReviewShortSerializer
from tag.serializers import TagBaseSerializer from tag.serializers import TagBaseSerializer
@ -16,8 +18,6 @@ from utils import exceptions as utils_exceptions
from utils.serializers import ImageBaseSerializer, CarouselCreateSerializer from utils.serializers import ImageBaseSerializer, CarouselCreateSerializer
from utils.serializers import (ProjectModelSerializer, TranslatedField, from utils.serializers import (ProjectModelSerializer, TranslatedField,
FavoritesCreateSerializer) FavoritesCreateSerializer)
from location.serializers import EstablishmentWineRegionBaseSerializer, \
EstablishmentWineOriginBaseSerializer
class ContactPhonesSerializer(serializers.ModelSerializer): class ContactPhonesSerializer(serializers.ModelSerializer):

View File

@ -6,7 +6,7 @@ from django.contrib.contenttypes import fields as generic
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields import JSONField
from django.core.validators import EMPTY_VALUES from django.core.validators import EMPTY_VALUES
from django.db import connections, connection from django.db import connections
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -16,6 +16,7 @@ from configuration.models import TranslationSettings
from location.models import Country from location.models import Country
from main import methods from main import methods
from review.models import Review from review.models import Review
from tag.models import Tag
from utils.exceptions import UnprocessableEntityError from utils.exceptions import UnprocessableEntityError
from utils.methods import dictfetchall from utils.methods import dictfetchall
from utils.models import (ProjectBaseMixin, TJSONField, URLImageMixin, from utils.models import (ProjectBaseMixin, TJSONField, URLImageMixin,
@ -117,6 +118,8 @@ class Feature(ProjectBaseMixin, PlatformMixin):
site_settings = models.ManyToManyField(SiteSettings, through='SiteFeature') site_settings = models.ManyToManyField(SiteSettings, through='SiteFeature')
old_id = models.IntegerField(null=True, blank=True) old_id = models.IntegerField(null=True, blank=True)
chosen_tags = generic.GenericRelation(to='tag.ChosenTag')
class Meta: class Meta:
"""Meta class.""" """Meta class."""
verbose_name = _('Feature') verbose_name = _('Feature')
@ -125,6 +128,10 @@ class Feature(ProjectBaseMixin, PlatformMixin):
def __str__(self): def __str__(self):
return f'{self.slug}' return f'{self.slug}'
@property
def get_chosen_tags(self):
return Tag.objects.filter(chosen_tags__in=self.chosen_tags.all()).distinct()
class SiteFeatureQuerySet(models.QuerySet): class SiteFeatureQuerySet(models.QuerySet):
"""Extended queryset for SiteFeature model.""" """Extended queryset for SiteFeature model."""

View File

@ -2,11 +2,12 @@
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from rest_framework import serializers from rest_framework import serializers
from account.models import User
from account.serializers.back import BackUserSerializer
from location.serializers import CountrySerializer from location.serializers import CountrySerializer
from main import models from main import models
from tag.serializers import TagBackOfficeSerializer
from utils.serializers import ProjectModelSerializer, TranslatedField, RecursiveFieldSerializer from utils.serializers import ProjectModelSerializer, TranslatedField, RecursiveFieldSerializer
from account.serializers.back import BackUserSerializer
from account.models import User
class FeatureSerializer(serializers.ModelSerializer): class FeatureSerializer(serializers.ModelSerializer):
@ -90,6 +91,8 @@ class SiteFeatureSerializer(serializers.ModelSerializer):
route = serializers.CharField(source='feature.route.name') route = serializers.CharField(source='feature.route.name')
source = serializers.IntegerField(source='feature.source') source = serializers.IntegerField(source='feature.source')
nested = RecursiveFieldSerializer(many=True, allow_null=True) nested = RecursiveFieldSerializer(many=True, allow_null=True)
chosen_tags = TagBackOfficeSerializer(
source='feature.get_chosen_tags', many=True, read_only=True)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -101,6 +104,7 @@ class SiteFeatureSerializer(serializers.ModelSerializer):
'route', 'route',
'source', 'source',
'nested', 'nested',
'chosen_tags',
) )

View File

@ -54,7 +54,6 @@ class NewsType(models.Model):
name = models.CharField(_('name'), max_length=250) name = models.CharField(_('name'), max_length=250)
tag_categories = models.ManyToManyField('tag.TagCategory', tag_categories = models.ManyToManyField('tag.TagCategory',
related_name='news_types') related_name='news_types')
chosen_tags = generic.GenericRelation(to='tag.ChosenTag')
class Meta: class Meta:
"""Meta class.""" """Meta class."""

View File

@ -9,6 +9,7 @@ from tag import models
from utils.exceptions import BindingObjectNotFound, ObjectAlreadyAdded, RemovedBindingObjectNotFound from utils.exceptions import BindingObjectNotFound, ObjectAlreadyAdded, RemovedBindingObjectNotFound
from utils.serializers import TranslatedField from utils.serializers import TranslatedField
from utils.models import get_default_locale, get_language, to_locale from utils.models import get_default_locale, get_language, to_locale
from main.models import Feature
def translate_obj(obj): def translate_obj(obj):
@ -301,48 +302,25 @@ class ChosenTagSerializer(serializers.ModelSerializer):
class ChosenTagBindObjectSerializer(serializers.Serializer): class ChosenTagBindObjectSerializer(serializers.Serializer):
"""Serializer for binding chosen tag and objects""" """Serializer for binding chosen tag and objects"""
ESTABLISHMENT_TYPE = 'establishment_type' feature_id = serializers.IntegerField()
NEWS_TYPE = 'news_type'
TYPE_CHOICES = (
(ESTABLISHMENT_TYPE, 'Establishment type'),
(NEWS_TYPE, 'News type'),
)
type = serializers.ChoiceField(TYPE_CHOICES)
object_id = serializers.IntegerField()
def validate(self, attrs): def validate(self, attrs):
view = self.context.get('view') view = self.context.get('view')
request = self.context.get('request') request = self.context.get('request')
obj_type = attrs.get('type') obj_id = attrs.get('feature_id')
obj_id = attrs.get('object_id')
tag = view.get_object() tag = view.get_object()
attrs['tag'] = tag attrs['tag'] = tag
if obj_type == self.ESTABLISHMENT_TYPE: feature = Feature.objects.filter(pk=obj_id). \
establishment_type = EstablishmentType.objects.filter(pk=obj_id). \ first()
first() if not feature:
if not establishment_type: raise BindingObjectNotFound()
raise BindingObjectNotFound() if request.method == 'DELETE' and not feature. \
if request.method == 'DELETE' and not establishment_type. \ chosen_tags.filter(tag=tag). \
chosen_tags.filter(tag=tag). \ exists():
exists(): raise RemovedBindingObjectNotFound()
raise RemovedBindingObjectNotFound() attrs['related_object'] = feature
attrs['related_object'] = establishment_type
elif obj_type == self.NEWS_TYPE:
news_type = NewsType.objects.filter(pk=obj_id).first()
if not news_type:
raise BindingObjectNotFound()
if request.method == 'POST' and news_type.chosen_tags. \
filter(tag=tag).exists():
raise ObjectAlreadyAdded()
if request.method == 'DELETE' and not news_type.chosen_tags. \
filter(tag=tag).exists():
raise RemovedBindingObjectNotFound()
attrs['related_object'] = news_type
return attrs return attrs