diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 22cd9925..9999d25a 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -733,7 +733,7 @@ class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin, now_at_est_tz = datetime.now(tz=self.tz) current_week = now_at_est_tz.weekday() schedule_for_today = self.schedule.filter(weekday=current_week).first() - if schedule_for_today is None or schedule_for_today.opening_time is None or schedule_for_today.ending_time is\ + if schedule_for_today is None or schedule_for_today.opening_time is None or schedule_for_today.ending_time is \ None: return False time_at_est_tz = now_at_est_tz.time() @@ -747,9 +747,9 @@ class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin, @property def tags_indexing(self): return [{ - 'id': tag.metadata.id, - 'label': tag.metadata.label - } for tag in self.tags.all()] + 'id': tag.metadata.id, + 'label': tag.metadata.label + } for tag in self.tags.all()] @property def last_published_review(self): @@ -1286,6 +1286,9 @@ class MenuQuerySet(models.QuerySet): """Search by category.""" return self.filter(category__icontains=value) + def with_dishes(self): + return self.filter(~Q(dishes=None)) + class Menu(TranslatedFieldsMixin, BaseAttributes): """Menu model.""" diff --git a/apps/establishment/serializers/back.py b/apps/establishment/serializers/back.py index 4b92d985..85fe8fa2 100644 --- a/apps/establishment/serializers/back.py +++ b/apps/establishment/serializers/back.py @@ -7,7 +7,7 @@ from rest_framework import serializers from account.serializers.common import UserShortSerializer from establishment import models, serializers as model_serializers -from establishment.models import ContactPhone, EstablishmentEmployee, ContactEmail +from establishment.models import ContactEmail, ContactPhone, EstablishmentEmployee from establishment.serializers import MenuDishSerializer from gallery.models import Image from location.models import Address @@ -599,6 +599,30 @@ class MenuDishesSerializer(ProjectModelSerializer): ] +class MenuDishesCreateSerializer(ProjectModelSerializer): + """Menu dishes create serializer""" + + menu_id = serializers.IntegerField(write_only=True) + + class Meta: + model = models.MenuDish + fields = [ + 'id', + 'name', + 'category', + 'price', + 'signature', + 'menu_id' + ] + + def create(self, validated_data): + menu_id = validated_data.pop('menu_id') + menu = get_object_or_404(models.Menu, pk=menu_id) + instance = models.MenuDish.objects.create(**validated_data) + menu.dishes.add(instance) + return instance + + class MenuDishesRUDSerializers(ProjectModelSerializer): """for dessert, main_course and starter category""" @@ -614,4 +638,3 @@ class MenuDishesRUDSerializers(ProjectModelSerializer): 'establishment_slug', 'dishes', ] - diff --git a/apps/establishment/serializers/common.py b/apps/establishment/serializers/common.py index 3c58f476..3af43e27 100644 --- a/apps/establishment/serializers/common.py +++ b/apps/establishment/serializers/common.py @@ -79,7 +79,6 @@ class MenuDishSerializer(ProjectModelSerializer): 'id', 'name', 'category', - 'category_translated', 'price', 'signature' ] diff --git a/apps/establishment/urls/back.py b/apps/establishment/urls/back.py index 053d47fd..09c2f2a8 100644 --- a/apps/establishment/urls/back.py +++ b/apps/establishment/urls/back.py @@ -31,7 +31,9 @@ urlpatterns = [ path('slug//admin/', views.EstablishmentAdminView.as_view(), name='establishment-admin-list'), path('menus/dishes/', views.MenuDishesListView.as_view(), name='menu-dishes-list'), + path('menus/dishes/create/', views.MenuDishesCreateView.as_view(), name='menu-dishes-create'), path('menus/dishes//', views.MenuDishesRUDView.as_view(), name='menu-dishes-rud'), + path('menus/dishes/slug//', views.MenuDishesRUDView.as_view(), name='menu-dishes-rud'), path('menus/', views.MenuListCreateView.as_view(), name='menu-list'), path('menus//', views.MenuRUDView.as_view(), name='menu-rud'), path('menus/slug//', views.MenuRUDView.as_view(), name='menu-rud'), diff --git a/apps/establishment/views/back.py b/apps/establishment/views/back.py index d1384b1e..39ede5c3 100644 --- a/apps/establishment/views/back.py +++ b/apps/establishment/views/back.py @@ -1,5 +1,6 @@ """Establishment app views.""" - +from django.db.models.query_utils import Q +from django.http import Http404 from django.shortcuts import get_object_or_404 from django_filters.rest_framework import DjangoFilterBackend from rest_framework import generics, permissions @@ -14,6 +15,20 @@ from utils.permissions import IsCountryAdmin, IsEstablishmentManager, IsWineryRe from utils.views import CreateDestroyGalleryViewMixin +class MenuRUDMixinViews: + """Menu mixin""" + + def get_object(self): + instance = self.get_queryset().filter( + Q(establishment__slug=self.kwargs.get('slug')) | Q(establishment__id=self.kwargs.get('pk')) + ).first() + + if instance is None: + raise Http404 + + return instance + + class EstablishmentMixinViews: """Establishment mixin.""" @@ -121,7 +136,7 @@ class MenuListCreateView(generics.ListCreateAPIView): permission_classes = [IsWineryReviewer | IsEstablishmentManager] filter_backends = (DjangoFilterBackend,) filterset_fields = ( - 'establishment', + 'establishment__id', 'establishment__slug', ) @@ -129,8 +144,10 @@ class MenuListCreateView(generics.ListCreateAPIView): return super().get_queryset().prefetch_related('establishment') -class MenuRUDView(generics.RetrieveUpdateDestroyAPIView): +class MenuRUDView(MenuRUDMixinViews, generics.RetrieveUpdateDestroyAPIView): """Menu RUD view.""" + + lookup_field = None serializer_class = serializers.MenuRUDSerializers queryset = models.Menu.objects.all() permission_classes = [IsWineryReviewer | IsEstablishmentManager] @@ -469,13 +486,23 @@ class EstablishmentAdminView(generics.ListAPIView): class MenuDishesListView(generics.ListAPIView): """Menu (dessert, main_course, starter) list create view.""" serializer_class = serializers.MenuDishesSerializer - queryset = models.Menu.objects.all() + queryset = models.Menu.objects.with_dishes() permission_classes = [IsWineryReviewer | IsEstablishmentManager] filter_class = filters.MenuDishesBackFilter -class MenuDishesRUDView(generics.RetrieveUpdateDestroyAPIView): +class MenuDishesRUDView(MenuRUDMixinViews, generics.RetrieveUpdateDestroyAPIView): """Menu (dessert, main_course, starter) RUD view.""" + + lookup_field = None serializer_class = serializers.MenuDishesRUDSerializers - queryset = models.Menu.objects.all() + queryset = models.Menu.objects.with_dishes() permission_classes = [IsWineryReviewer | IsEstablishmentManager] + + +class MenuDishesCreateView(generics.CreateAPIView): + """Menu (dessert, main_course, starter) list create view.""" + serializer_class = serializers.MenuDishesCreateSerializer + queryset = models.MenuDish.objects.all() + permission_classes = [IsWineryReviewer | IsEstablishmentManager] + filter_class = filters.MenuDishesBackFilter