added param to attr for Establoishment model and small refactoring, boost queries

This commit is contained in:
Anatoly 2019-10-11 18:26:13 +03:00
parent ddb3eec679
commit cb762ce746
6 changed files with 130 additions and 68 deletions

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.4 on 2019-10-11 13:56
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('establishment', '0035_establishmentsubtypetagcategory'),
]
operations = [
migrations.AlterField(
model_name='establishment',
name='establishment_subtypes',
field=models.ManyToManyField(blank=True, related_name='subtype_establishment', to='establishment.EstablishmentSubType', verbose_name='subtype'),
),
]

View File

@ -23,6 +23,10 @@ from utils.models import (ProjectBaseMixin, TJSONField, URLImageMixin,
TranslatedFieldsMixin, BaseAttributes)
class EstablishmentTypeQuerySet(models.QuerySet):
"""QuerySet for model EstablishmentType."""
# todo: establishment type&subtypes check
class EstablishmentType(TranslatedFieldsMixin, ProjectBaseMixin):
"""Establishment type model."""
@ -82,6 +86,8 @@ class EstablishmentQuerySet(models.QuerySet):
EstablishmentTag.objects.select_related('tag')),
models.Prefetch('establishment_type__tag_categories',
EstablishmentTypeTagCategory.objects.select_related('tag_category')),
models.Prefetch('establishment_type__establishmentsubtype_set',
EstablishmentSubType.objects.prefetch_related('tag_categories')),
)
def with_extended_related(self):
@ -257,6 +263,7 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin):
on_delete=models.PROTECT,
verbose_name=_('type'))
establishment_subtypes = models.ManyToManyField(EstablishmentSubType,
blank=True,
related_name='subtype_establishment',
verbose_name=_('subtype'))
address = models.ForeignKey(Address, blank=True, null=True, default=None,

View File

@ -1,12 +1,16 @@
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from establishment import models
from establishment.serializers import (
EstablishmentBaseSerializer, PlateSerializer, ContactEmailsSerializer,
ContactPhonesSerializer, SocialNetworkRelatedSerializers,
EstablishmentTypeBaseSerializer)
EstablishmentTypeBaseSerializer, EstablishmentSubTypeBaseSerializer,
EstablishmentTypeTagCategoryBaseSerializer)
from main.models import Currency
from tag.serializers import TagBaseSerializer
from utils.decorators import with_base_attributes
from utils.serializers import TranslatedField
class EstablishmentListCreateSerializer(EstablishmentBaseSerializer):
@ -141,3 +145,95 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
'name'
]
class EstablishmentTagCreateSerializer(serializers.ModelSerializer):
"""Serializer for model EstablishmentTag."""
class Meta:
model = models.EstablishmentTag
fields = [
'tag',
'establishment'
]
extra_kwargs = {
'tag': {'write_only': True},
'establishment': {'write_only': True},
}
def validate(self, attrs):
"""Validate method."""
establishment = attrs.get('establishment')
tag = attrs.get('tag')
# Check if tag is already added to establishment.
if establishment.tags.filter(tag=tag).exists():
raise serializers.ValidationError(detail={'detail': _('Tag is already added.')})
# Сhecking tag availability for establishment type.
if not establishment.establishment_type.use_subtypes:
qs = establishment.establishment_type.tag_categories.filter(tag_category=tag.category)
else:
# Сhecking tag availability for establishment subtype.
qs = establishment.establishment_type.tag_categories.filter(
establishmentsubtype_set__tag_category=tag.category)
if not qs.exists():
raise serializers.ValidationError(
detail={'detail': _('Tag is not available for this establishment type|subtype.')})
return attrs
class EstablishmentSubTypeTagCategoryBaseSerializer(serializers.ModelSerializer):
"""Serializer for intermediate model EstablishmentSubTypeTagCategories."""
id = serializers.IntegerField(source='tag_category.id', read_only=True)
label_translated = TranslatedField(source='tag_category.label_translated')
tags = TagBaseSerializer(source='tag_category.tags', many=True, read_only=True)
class Meta:
"""Meta class."""
model = models.EstablishmentSubTypeTagCategory
fields = [
'id',
'label_translated',
'tags',
'establishment_subtype',
'tag_category',
]
extra_kwargs = {
'establishment_subtype': {'write_only': True},
'tag_category': {'write_only': True},
}
def validate(self, attrs):
"""Override validate method."""
if models.EstablishmentTypeTagCategory.objects.filter(
establishment_type=attrs.get('establishment_type'),
tag_category=attrs.get('tag_category')).exists():
raise serializers.ValidationError(detail={'detail': _('Objects is already attached.')})
return attrs
class EstablishmentSubTypeSerializer(EstablishmentSubTypeBaseSerializer):
"""Extended serializer for EstablishmentSubType model with tags."""
tag_categories = EstablishmentSubTypeTagCategoryBaseSerializer(many=True, read_only=True)
class Meta(EstablishmentSubTypeBaseSerializer.Meta):
"""Meta class"""
fields = [
'id',
'name_translated',
'tag_categories'
]
class EstablishmentTagsByType(EstablishmentTypeBaseSerializer):
"""Tags by establishment type"""
tag_categories = EstablishmentTypeTagCategoryBaseSerializer(many=True)
subtypes = EstablishmentSubTypeSerializer(many=True, source='establishmentsubtype_set')
class Meta(EstablishmentTypeBaseSerializer.Meta):
"""Meta class."""
fields = [
'id',
'name_translated',
'tag_categories',
'subtypes',
]

View File

@ -9,7 +9,6 @@ from favorites.models import Favorites
from location.serializers import AddressBaseSerializer
from main.serializers import AwardSerializer, CurrencySerializer
from review import models as review_models
from tag import models as tag_models
from tag.serializers import TagBaseSerializer
from timetable.serialziers import ScheduleRUDSerializer
from utils import exceptions as utils_exceptions
@ -170,64 +169,6 @@ class EstablishmentTypeTagCategoryBaseSerializer(serializers.ModelSerializer):
return attrs
class EstablishmentSubTypeTagCategoryBaseSerializer(serializers.ModelSerializer):
"""Serializer for intermediate model EstablishmentSubTypeTagCategories."""
id = serializers.IntegerField(source='tag_category.id', read_only=True)
label_translated = TranslatedField(source='tag_category.label_translated')
tags = TagBaseSerializer(source='tag_category.tags', many=True, read_only=True)
class Meta:
"""Meta class."""
model = models.EstablishmentSubTypeTagCategory
fields = [
'id',
'label_translated',
'tags',
'establishment_subtype',
'tag_category',
]
extra_kwargs = {
'establishment_subtype': {'write_only': True},
'tag_category': {'write_only': True},
}
def validate(self, attrs):
"""Override validate method."""
if models.EstablishmentTypeTagCategory.objects.filter(
establishment_type=attrs.get('establishment_type'),
tag_category=attrs.get('tag_category')).exists():
raise serializers.ValidationError(detail={'detail': _('Objects is already attached.')})
return attrs
class EstablishmentSubTypeSerializer(EstablishmentSubTypeBaseSerializer):
"""Extended serializer for EstablishmentSubType model with tags."""
tag_categories = EstablishmentSubTypeTagCategoryBaseSerializer(many=True, read_only=True)
class Meta(EstablishmentSubTypeBaseSerializer.Meta):
"""Meta class"""
fields = [
'id',
'name_translated',
'tag_categories'
]
class EstablishmentTagsByType(EstablishmentTypeBaseSerializer):
"""Tags by establishment type"""
tag_categories = EstablishmentTypeTagCategoryBaseSerializer(many=True)
subtypes = EstablishmentSubTypeSerializer(many=True, source='establishmentsubtype_set')
class Meta(EstablishmentTypeBaseSerializer.Meta):
"""Meta class."""
fields = [
'id',
'name_translated',
'tag_categories',
'subtypes',
]
class EstablishmentEmployeeSerializer(serializers.ModelSerializer):
"""Serializer for actual employees."""

View File

@ -14,8 +14,9 @@ urlpatterns = [
name='schedule-rud'),
path('<int:pk>/schedule/', views.EstablishmentScheduleCreateView.as_view(),
name='schedule-create'),
path('<int:pk>/tags/', views.EstablishmentTagCategoryListView.as_view(),
path('<int:pk>/type/tags/', views.EstablishmentTagCategoryListView.as_view(),
name='tag-category-list'),
path('attach-tag/', views.EstablishmentTagCreateView.as_view(), name='attach-tag'),
path('menus/', views.MenuListCreateView.as_view(), name='menu-list'),
path('menus/<int:pk>/', views.MenuRUDView.as_view(), name='menu-rud'),
path('plates/', views.PlateListCreateView.as_view(), name='plates'),
@ -36,4 +37,4 @@ urlpatterns = [
path('subtypes/<int:pk>/', views.EstablishmentSubtypeRUDView.as_view(), name='subtype-rud'),
path('subtypes/attach-tag-category/', views.EstablishmentSubTypeAttachTagCategoryView.as_view(),
name='subtype-attach-tag-category'),
]
]

View File

@ -91,6 +91,11 @@ class EstablishmentTypeAttachTagCategoryView(generics.CreateAPIView):
return Response(status=status.HTTP_200_OK)
class EstablishmentTagCreateView(EstablishmentMixinViews, generics.CreateAPIView):
"""Attach tag to establishment."""
serializer_class = serializers.EstablishmentTagCreateSerializer
class MenuListCreateView(generics.ListCreateAPIView):
"""Menu list create view."""
serializer_class = serializers.MenuSerializers
@ -206,9 +211,3 @@ class EstablishmentSubTypeAttachTagCategoryView(generics.CreateAPIView):
"""Overridden post-method."""
super(EstablishmentSubTypeAttachTagCategoryView, self).post(request)
return Response(status=status.HTTP_200_OK)
# class EstablishmentTagListCreateView(generics.CreateAPIView):
# """Establishment tag list/create view."""
# serializer_class = serializers.EstablishmentTagCategoryListCreateSerializer
# queryset = models.EstablishmentTag.objects.all()