added param to attr for Establoishment model and small refactoring, boost queries
This commit is contained in:
parent
ddb3eec679
commit
cb762ce746
18
apps/establishment/migrations/0036_auto_20191011_1356.py
Normal file
18
apps/establishment/migrations/0036_auto_20191011_1356.py
Normal 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'),
|
||||
),
|
||||
]
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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."""
|
||||
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
]
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user