Merge branch 'feature/gm-192' into feature/gm-148

This commit is contained in:
evgeniy-st 2019-10-15 18:33:44 +03:00
commit c268575a04
16 changed files with 37 additions and 377 deletions

View File

@ -79,18 +79,3 @@ class MenuAdmin(admin.ModelAdmin):
return obj.category_translated
category_translated.short_description = _('category')
#
# @admin.register(models.EstablishmentTypeTagCategory)
# class EstablishmentTypeTagCategoryAdmin(admin.ModelAdmin):
# """EstablishmentTypeTagCategory admin."""
#
#
# @admin.register(models.EstablishmentSubTypeTagCategory)
# class EstablishmentSubTypeTagCategoryAdmin(admin.ModelAdmin):
# """EstablishmentTypeTagCategory admin."""
#
#
# @admin.register(models.EstablishmentTag)
# class EstablishmentTagAdmin(admin.ModelAdmin):
# """EstablishmentTag admin."""

View File

@ -17,29 +17,11 @@ from phonenumber_field.modelfields import PhoneNumberField
from collection.models import Collection
from location.models import Address
from main.models import Award
from tag.models import Tag, TagCategory
from review.models import Review
from utils.models import (ProjectBaseMixin, TJSONField, URLImageMixin,
TranslatedFieldsMixin, BaseAttributes)
class EstablishmentTypeQuerySet(models.QuerySet):
"""QuerySet for model EstablishmentType."""
def with_base_related(self):
"""Return QuerySet with base related."""
return self
# return self.prefetch_related(
# models.Prefetch('tag_categories',
# EstablishmentTypeTagCategory.objects.select_related('tag_category')),
# models.Prefetch('establishmentsubtype_set',
# EstablishmentSubType.objects.prefetch_related(
# models.Prefetch(
# 'tag_categories',
# EstablishmentSubTypeTagCategory.objects.select_related('tag_category'))))
# )
# todo: establishment type&subtypes check
class EstablishmentType(TranslatedFieldsMixin, ProjectBaseMixin):
"""Establishment type model."""
@ -53,8 +35,6 @@ class EstablishmentType(TranslatedFieldsMixin, ProjectBaseMixin):
related_name='establishment_types',
verbose_name=_('Tag'))
objects = EstablishmentTypeQuerySet.as_manager()
class Meta:
"""Meta class."""
@ -102,15 +82,8 @@ class EstablishmentQuerySet(models.QuerySet):
def with_base_related(self):
"""Return qs with related objects."""
return self
# return self.select_related('address', 'establishment_type').prefetch_related(
# models.Prefetch('tags',
# 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')),
# )
return self.select_related('address', 'establishment_type').\
prefetch_related('tags')
def with_extended_related(self):
return self.select_related('establishment_type').\
@ -588,81 +561,3 @@ class SocialNetwork(models.Model):
def __str__(self):
return self.title
#
# class EstablishmentTagQuerySet(models.QuerySet):
# """Establishment tag QuerySet."""
#
# def by_country_code(self, code):
# """Return establishment tags by establishment country code."""
# return self.filter(establishment__address__city__country__code=code)
#
# class EstablishmentTag(models.Model):
# """Establishment tag model."""
# tag = models.ForeignKey('tag.Tag',
# on_delete=models.CASCADE,
# related_name='tags',
# verbose_name=_('tag'))
# establishment = models.ForeignKey('establishment.Establishment',
# on_delete=models.CASCADE,
# related_name='tags',
# verbose_name=_('establishment'))
# objects = EstablishmentTagQuerySet.as_manager()
#
# class Meta:
# verbose_name = _('establishment tag')
# verbose_name_plural = _('establishment tags')
#
#
# class EstablishmentTypeTagCategoryQuerySet(models.QuerySet):
# """EstablishmentTypeTagCategory QuerySet."""
#
# def by_country_code(self, code):
# """Return establishment tags by country code"""
# return self.filter(tag_category__country__code=code)
#
# def with_base_related(self):
# """Return with related relations."""
# return self.select_related('establishment_type', 'tag_category')
#
#
# class EstablishmentTypeTagCategory(models.Model):
# """Tag categories based on establishment type."""
# establishment_type = models.ForeignKey(EstablishmentType,
# on_delete=models.CASCADE,
# related_name='tag_categories',
# verbose_name=_('establishment type'))
# tag_category = models.ForeignKey('tag.TagCategory',
# on_delete=models.CASCADE,
# related_name='est_type_tag_categories',
# verbose_name=_('tag category'))
# objects = EstablishmentTypeTagCategoryQuerySet.as_manager()
#
# class Meta:
# verbose_name = _('establishment type tag categories')
# verbose_name_plural = _('establishment type tag categories')
#
#
# class EstablishmentSubTypeTagCategoryQuerySet(models.QuerySet):
# """QuerySet for tag categories based on establishment subtype."""
#
# def with_base_related(self):
# """Return queryset with base related."""
# return self.select_related('establishment_subtype', 'tag_category')
#
#
# class EstablishmentSubTypeTagCategory(models.Model):
# """Tag categories based on establishment subtype."""
# establishment_subtype = models.ForeignKey(EstablishmentSubType,
# on_delete=models.CASCADE,
# related_name='tag_categories',
# verbose_name=_('establishment subtype'))
# tag_category = models.ForeignKey('tag.TagCategory',
# on_delete=models.CASCADE,
# related_name='est_subtype_tag_categories',
# verbose_name=_('tag category'))
# objects = EstablishmentSubTypeTagCategoryQuerySet.as_manager()
#
# class Meta:
# verbose_name = _('establishment subtype tag categories')
# verbose_name_plural = _('establishment subtype tag categories')

View File

@ -1,16 +1,12 @@
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, EstablishmentSubTypeBaseSerializer)
# EstablishmentTypeTagCategoryBaseSerializer)
EstablishmentTypeBaseSerializer)
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):
@ -144,96 +140,3 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
'user',
'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

@ -139,36 +139,6 @@ class EstablishmentSubTypeBaseSerializer(serializers.ModelSerializer):
}
# class EstablishmentTypeTagCategoryBaseSerializer(serializers.ModelSerializer):
# """Serializer for intermediate model EstablishmentTypeTagCategories."""
# 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.EstablishmentTypeTagCategory
# fields = [
# 'id',
# 'label_translated',
# 'tags',
# 'establishment_type',
# 'tag_category',
# ]
# extra_kwargs = {
# 'establishment_type': {'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 EstablishmentEmployeeSerializer(serializers.ModelSerializer):
"""Serializer for actual employees."""
@ -184,20 +154,6 @@ class EstablishmentEmployeeSerializer(serializers.ModelSerializer):
model = models.Employee
fields = ('id', 'name', 'position_translated', 'awards', 'priority')
#
# class EstablishmentTagSerializer(serializers.ModelSerializer):
# """Serializer for intermediate model EstablishmentTag."""
# id = serializers.IntegerField(source='tag.id')
# label_translated = serializers.CharField(source='tag.label_translated')
#
# class Meta:
# """Meta class."""
# model = models.EstablishmentTag
# fields = [
# 'id',
# 'label_translated'
# ]
class EstablishmentBaseSerializer(ProjectModelSerializer):
"""Base serializer for Establishment model."""

View File

@ -14,7 +14,6 @@ urlpatterns = [
name='schedule-rud'),
path('<int:pk>/schedule/', views.EstablishmentScheduleCreateView.as_view(),
name='schedule-create'),
# 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'),
@ -28,12 +27,7 @@ urlpatterns = [
path('employees/', views.EmployeeListCreateView.as_view(), name='employees'),
path('employees/<int:pk>/', views.EmployeeRUDView.as_view(), name='employees-rud'),
path('types/', views.EstablishmentTypeListCreateView.as_view(), name='type-list'),
# path('types/tags/', views.EstablishmentTypeTagListView.as_view(), name='type-tag-list'),
path('types/<int:pk>/', views.EstablishmentTypeRUDView.as_view(), name='type-rud'),
# path('types/attach-tag-category/', views.EstablishmentTypeAttachTagCategoryView.as_view(),
# name='type-attach-tag-category'),
path('subtypes/', views.EstablishmentSubtypeListCreateView.as_view(), name='subtype-list'),
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

@ -7,7 +7,6 @@ app_name = 'establishment'
urlpatterns = [
path('', views.EstablishmentListView.as_view(), name='list'),
# path('types/tags/', views.EstablishmentTypeTagListView.as_view(), name='type-tag-list'),
path('recent-reviews/', views.EstablishmentRecentReviewListView.as_view(),
name='recent-reviews'),
path('slug/<slug:slug>/', views.EstablishmentRetrieveView.as_view(), name='detail'),

View File

@ -1,11 +1,9 @@
"""Establishment app views."""
from django.shortcuts import get_object_or_404
from rest_framework import generics, status, permissions
from rest_framework import generics
from establishment import models, serializers
from rest_framework.response import Response
from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer
from establishment.filters import EstablishmentTypeTagFilter
class EstablishmentMixinViews:
@ -55,25 +53,6 @@ class EstablishmentScheduleCreateView(generics.CreateAPIView):
serializer_class = ScheduleCreateSerializer
# class EstablishmentTypeAttachTagCategoryView(generics.CreateAPIView):
# """Attach tag category to establishment type."""
# serializer_class = serializers.EstablishmentTypeTagCategoryBaseSerializer
#
# def get_queryset(self):
# """Override get_queryset method."""
# return models.EstablishmentTypeTagCategory.objects.with_base_related()
#
# def post(self, request, *args, **kwargs):
# """Overridden post-method."""
# super(EstablishmentTypeAttachTagCategoryView, self).post(request)
# 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
@ -164,15 +143,6 @@ class EstablishmentTypeRUDView(generics.RetrieveUpdateDestroyAPIView):
queryset = models.EstablishmentType.objects.all()
# class EstablishmentTypeTagListView(generics.ListAPIView):
# """List of tags with categories by establishment type."""
# serializer_class = serializers.EstablishmentTagsByType
# queryset = models.EstablishmentType.objects.with_base_related()
# filter_class = EstablishmentTypeTagFilter
# permission_classes = (permissions.AllowAny, )
# pagination_class = None
class EstablishmentSubtypeListCreateView(generics.ListCreateAPIView):
"""Establishment subtype list/create view."""
serializer_class = serializers.EstablishmentSubTypeBaseSerializer
@ -184,17 +154,3 @@ class EstablishmentSubtypeRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Establishment subtype retrieve/update/destroy view."""
serializer_class = serializers.EstablishmentSubTypeBaseSerializer
queryset = models.EstablishmentSubType.objects.all()
# class EstablishmentSubTypeAttachTagCategoryView(generics.CreateAPIView):
# """Attach tag category to establishment subtype."""
# serializer_class = serializers.EstablishmentSubTypeTagCategoryBaseSerializer
#
# def get_queryset(self):
# """Override get_queryset method."""
# return models.EstablishmentSubTypeTagCategory.objects.with_base_related()
#
# def post(self, request, *args, **kwargs):
# """Overridden post-method."""
# super(EstablishmentSubTypeAttachTagCategoryView, self).post(request)
# return Response(status=status.HTTP_200_OK)

View File

@ -4,6 +4,7 @@ from django.conf import settings
from news import models
from .tasks import send_email_with_news
@admin.register(models.NewsType)
class NewsTypeAdmin(admin.ModelAdmin):
"""News type admin."""

View File

@ -7,7 +7,5 @@ app_name = 'news'
urlpatterns = [
path('', views.NewsListView.as_view(), name='list'),
path('types/', views.NewsTypeListView.as_view(), name='type'),
path('types/<int:pk>/tags/', views.NewsTypeTagsView.as_view(),
name='type-tags'),
path('slug/<slug:slug>/', views.NewsDetailView.as_view(), name='rud'),
]

View File

@ -8,7 +8,6 @@ from rest_framework.response import Response
from gallery.tasks import delete_image
from news import filters, models, serializers
from rating.tasks import add_rating
from tag.serializers import TagCategoryDetailSerializer
class NewsMixinView:
@ -52,18 +51,6 @@ class NewsTypeListView(generics.ListAPIView):
serializer_class = serializers.NewsTypeSerializer
class NewsTypeTagsView(generics.ListAPIView):
"""Resource to get a list of tags for a news type."""
pagination_class = None
permission_classes = (permissions.AllowAny, )
serializer_class = TagCategoryDetailSerializer
def get_queryset(self):
news_type = get_object_or_404(models.NewsType, pk=self.kwargs.get('pk'))
return news_type.tag_categories.with_related()
class NewsBackOfficeMixinView:
"""News back office mixin view."""

View File

@ -39,13 +39,15 @@ class EstablishmentDocument(Document):
}),
},
multi=True)
# tags = fields.ObjectField(
# properties={
# 'tag': fields.ObjectField(properties={
# 'id': fields.IntegerField(),
# }),
# },
# multi=True)
tags = fields.ObjectField(
properties={
'id': fields.IntegerField(attr='id'),
'label': fields.ObjectField(attr='label_indexing',
properties=OBJECT_FIELD_PROPERTIES),
'category': fields.ObjectField(attr='category',
properties={'id': fields.IntegerField()})
},
multi=True)
address = fields.ObjectField(
properties={
'id': fields.IntegerField(),

View File

@ -24,15 +24,15 @@ class NewsDocument(Document):
country = fields.ObjectField(properties={'id': fields.IntegerField(),
'code': fields.KeywordField()})
web_url = fields.KeywordField(attr='web_url')
# tags = fields.ObjectField(
# properties={
# 'id': fields.IntegerField(attr='metadata.id'),
# 'label': fields.ObjectField(attr='metadata.label_indexing',
# properties=OBJECT_FIELD_PROPERTIES),
# 'category': fields.ObjectField(attr='metadata.category',
# properties={'id': fields.IntegerField()})
# },
# multi=True)
tags = fields.ObjectField(
properties={
'id': fields.IntegerField(attr='id'),
'label': fields.ObjectField(attr='label_indexing',
properties=OBJECT_FIELD_PROPERTIES),
'category': fields.ObjectField(attr='category',
properties={'id': fields.IntegerField()})
},
multi=True)
class Django:

View File

@ -33,19 +33,21 @@ class TagCategoryQuerySet(models.QuerySet):
"""Extended queryset for TagCategory model."""
def with_base_related(self):
"""Select related objects."""
return self.prefetch_related('tags')
def for_news(self):
"""Select tag categories for news."""
return self.filter(news_types__isnull=True)
def for_establishments(self):
return self
# return self.filter(models.Q(est_subtype_tag_categories__isnull=True) |
# models.Q(est_type_tag_categories__isnull=True)).\
# distinct()
"""Select tag categories for establishments."""
return self.filter(models.Q(establishment_types__isnull=False) |
models.Q(establishment_subtypes__isnull=False))
def with_related(self):
return self.select_related('country').prefetch_related('tags')
def with_tags(self, switcher=True):
"""Filter by existing tags."""
return self.filter(tags__isnull=not switcher)
class TagCategory(TranslatedFieldsMixin, models.Model):

View File

@ -48,23 +48,14 @@ class TagCategoryBaseSerializer(serializers.ModelSerializer):
)
class TagCategoryDetailSerializer(TagCategoryBaseSerializer):
class Meta(TagCategoryBaseSerializer.Meta):
"""Meta class."""
fields = TagCategoryBaseSerializer.Meta.fields + ('tags', )
class TagCategoryBackOfficeDetailSerializer(TagCategoryDetailSerializer):
class TagCategoryBackOfficeDetailSerializer(TagCategoryBaseSerializer):
country_translated = TranslatedField(source='country.name_translated')
class Meta(TagCategoryDetailSerializer.Meta):
class Meta(TagBaseSerializer.Meta):
"""Meta class."""
fields = TagCategoryDetailSerializer.Meta.fields + (
fields = TagCategoryBaseSerializer.Meta.fields + (
'news_types',
'country',
'country_translated',

View File

@ -1,5 +1,5 @@
"""Tag views."""
from rest_framework import generics, viewsets, mixins
from rest_framework import viewsets, mixins
from tag import filters, models, serializers
from rest_framework import permissions
@ -14,20 +14,11 @@ class TagViewSet(mixins.ListModelMixin, mixins.CreateModelMixin,
serializer_class = serializers.TagBackOfficeSerializer
class TagCategoryListCreateView(generics.ListCreateAPIView):
"""List/create tag category view."""
pagination_class = None
permission_classes = (permissions.AllowAny, )
queryset = models.TagCategory.objects.all()
serializer_class = serializers.TagCategoryBackOfficeDetailSerializer
class TagCategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""ViewSet for TagCategory model."""
filterset_class = filters.TagCategoryFilterSet
pagination_class = None
permission_classes = (permissions.AllowAny, )
queryset = models.TagCategory.objects.with_base_related()
queryset = models.TagCategory.objects.with_tags().with_base_related()
serializer_class = serializers.TagCategoryBaseSerializer

View File

@ -7,7 +7,7 @@ urlpatterns = [
path('establishments/', include('establishment.urls.back')),
path('location/', include('location.urls.back')),
path('news/', include('news.urls.back')),
path('tags/', include(('tag.urls.back', 'tag'), namespace='tag')),
# path('tags/', include(('tag.urls.back', 'tag'), namespace='tag')),
path('account/', include('account.urls.back')),
path('comment/', include('comment.urls.back')),
]