dishes menu list-create

This commit is contained in:
alex 2020-01-24 10:21:35 +03:00
parent 792c11e128
commit 29a7fb82ce
7 changed files with 118 additions and 4 deletions

View File

@ -126,3 +126,27 @@ class EmployeeBackSearchFilter(EmployeeBackFilter):
raise ValidationError({'detail': _('Type at least 3 characters to search please.')}) raise ValidationError({'detail': _('Type at least 3 characters to search please.')})
return queryset.trigram_search(value) return queryset.trigram_search(value)
return queryset return queryset
class MenuDishesBackFilter(filters.FilterSet):
"""Menu filter set."""
category = filters.CharFilter(method='search_by_category')
is_drinks_included = filters.BooleanFilter(field_name='is_drinks_included')
establishment_id = filters.NumberFilter(field_name='establishment_id')
class Meta:
"""Meta class."""
model = models.Menu
fields = (
'category',
'is_drinks_included',
'establishment_id',
)
def search_by_category(self, queryset, name, value):
"""Search by category."""
if value not in EMPTY_VALUES:
return queryset.search_by_category(value)
return queryset

View File

@ -0,0 +1,23 @@
# Generated by Django 2.2.7 on 2020-01-24 07:20
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('establishment', '0078_menu_old_id'),
]
operations = [
migrations.AlterModelOptions(
name='menu',
options={'ordering': ('-created',), 'verbose_name': 'menu', 'verbose_name_plural': 'menu'},
),
migrations.AlterField(
model_name='plate',
name='menu',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='plates', to='establishment.Menu', verbose_name='menu'),
),
]

View File

@ -1214,7 +1214,11 @@ class Plate(TranslatedFieldsMixin, models.Model):
_('currency code'), max_length=250, blank=True, null=True, default=None) _('currency code'), max_length=250, blank=True, null=True, default=None)
menu = models.ForeignKey( menu = models.ForeignKey(
'establishment.Menu', verbose_name=_('menu'), on_delete=models.CASCADE) 'establishment.Menu',
verbose_name=_('menu'),
related_name='plates',
on_delete=models.CASCADE,
)
@property @property
def establishment_id(self): def establishment_id(self):
@ -1225,6 +1229,27 @@ class Plate(TranslatedFieldsMixin, models.Model):
verbose_name_plural = _('plates') verbose_name_plural = _('plates')
class MenuQuerySet(models.QuerySet):
def with_schedule_plates_establishment(self):
return self.select_related(
'establishment',
).prefetch_related(
'schedule',
'plates',
)
def dishes(self):
return self.filter(
Q(category__icontains='starter') |
Q(category__icontains='dessert') |
Q(category__icontains='main_course')
)
def search_by_category(self, value):
"""Search by category."""
return self.filter(category__icontains=value)
class Menu(TranslatedFieldsMixin, BaseAttributes): class Menu(TranslatedFieldsMixin, BaseAttributes):
"""Menu model.""" """Menu model."""
@ -1245,9 +1270,12 @@ class Menu(TranslatedFieldsMixin, BaseAttributes):
) )
old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None)
objects = MenuQuerySet.as_manager()
class Meta: class Meta:
verbose_name = _('menu') verbose_name = _('menu')
verbose_name_plural = _('menu') verbose_name_plural = _('menu')
ordering = ('-created',)
class MenuUploads(BaseAttributes): class MenuUploads(BaseAttributes):

View File

@ -12,8 +12,9 @@ from location.models import Address
from location.serializers import AddressDetailSerializer, TranslatedField from location.serializers import AddressDetailSerializer, TranslatedField
from main.models import Currency from main.models import Currency
from main.serializers import AwardSerializer from main.serializers import AwardSerializer
from timetable.serialziers import ScheduleRUDSerializer
from utils.decorators import with_base_attributes from utils.decorators import with_base_attributes
from utils.serializers import ImageBaseSerializer, TimeZoneChoiceField from utils.serializers import ImageBaseSerializer, TimeZoneChoiceField, ProjectModelSerializer
def phones_handler(phones_list, establishment): def phones_handler(phones_list, establishment):
@ -513,3 +514,33 @@ class EstablishmentAdminListSerializer(UserShortSerializer):
'username', 'username',
'email' 'email'
] ]
class _PlateSerializer(ProjectModelSerializer):
name_translated = TranslatedField()
class Meta:
model = models.Plate
fields = [
'name_translated',
'price',
]
class MenuDishesSerializer(ProjectModelSerializer):
"""for dessert, main_course and starter category"""
schedule = ScheduleRUDSerializer(many=True, allow_null=True)
plates = _PlateSerializer(read_only=True, many=True, source='plate_set')
category_translated = serializers.CharField(read_only=True)
class Meta:
model = models.Menu
fields = [
'id',
'category',
'category_translated',
'establishment',
'schedule',
'plates',
]

View File

@ -24,6 +24,7 @@ from utils.serializers import (ProjectModelSerializer, TranslatedField,
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class ContactPhonesSerializer(serializers.ModelSerializer): class ContactPhonesSerializer(serializers.ModelSerializer):
"""Contact phone serializer""" """Contact phone serializer"""

View File

@ -30,6 +30,7 @@ urlpatterns = [
name='note-rud'), name='note-rud'),
path('slug/<slug:slug>/admin/', views.EstablishmentAdminView.as_view(), path('slug/<slug:slug>/admin/', views.EstablishmentAdminView.as_view(),
name='establishment-admin-list'), name='establishment-admin-list'),
path('menus/dishes/', views.MenuDishesListCreateView.as_view(), name='menu-dishes-list'),
path('menus/', views.MenuListCreateView.as_view(), name='menu-list'), path('menus/', views.MenuListCreateView.as_view(), name='menu-list'),
path('menus/<int:pk>/', views.MenuRUDView.as_view(), name='menu-rud'), path('menus/<int:pk>/', views.MenuRUDView.as_view(), name='menu-rud'),
path('plates/', views.PlateListCreateView.as_view(), name='plates'), path('plates/', views.PlateListCreateView.as_view(), name='plates'),

View File

@ -1,6 +1,4 @@
"""Establishment app views.""" """Establishment app views."""
from django.core.exceptions import ObjectDoesNotExist
from django.http import Http404
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics, permissions from rest_framework import generics, permissions
@ -417,3 +415,11 @@ class EstablishmentAdminView(generics.ListAPIView):
establishment = get_object_or_404( establishment = get_object_or_404(
models.Establishment, slug=self.kwargs['slug']) models.Establishment, slug=self.kwargs['slug'])
return User.objects.establishment_admin(establishment).distinct() return User.objects.establishment_admin(establishment).distinct()
class MenuDishesListCreateView(generics.ListCreateAPIView):
"""Menu (dessert, main_course, starter) list create view."""
serializer_class = serializers.MenuDishesSerializer
queryset = models.Menu.objects.with_schedule_plates_establishment().dishes().distinct()
permission_classes = [IsWineryReviewer | IsEstablishmentManager]
filter_class = filters.MenuDishesBackFilter