diff --git a/apps/establishment/serializers/back.py b/apps/establishment/serializers/back.py index d9a78f3e..4b9744e9 100644 --- a/apps/establishment/serializers/back.py +++ b/apps/establishment/serializers/back.py @@ -12,7 +12,6 @@ from location.models import Address from location.serializers import AddressDetailSerializer, TranslatedField from main.models import Currency from main.serializers import AwardSerializer -from timetable.serialziers import ScheduleRUDSerializer from utils.decorators import with_base_attributes from utils.serializers import ImageBaseSerializer, ProjectModelSerializer, TimeZoneChoiceField @@ -593,6 +592,7 @@ class MenuDishesRUDSerializers(ProjectModelSerializer): """for dessert, main_course and starter category""" plates = _PlateSerializer(read_only=True, many=True, source='plate_set', allow_null=True) + gallery = ImageBaseSerializer(read_only=True, source='crop_gallery', many=True) class Meta: model = models.Menu @@ -603,4 +603,54 @@ class MenuDishesRUDSerializers(ProjectModelSerializer): 'establishment', 'is_drinks_included', 'schedule', + 'gallery', ] + + +class MenuGallerySerializer(serializers.ModelSerializer): + """Serializer class for model MenuGallery.""" + + class Meta: + """Meta class""" + + model = models.MenuGallery + fields = [ + 'id', + 'is_main', + ] + + @property + def request_kwargs(self): + """Get url kwargs from request.""" + return self.context.get('request').parser_context.get('kwargs') + + def create(self, validated_data): + menu_pk = self.request_kwargs.get('pk') + image_id = self.request_kwargs.get('image_id') + qs = models.MenuGallery.objects.filter(image_id=image_id, menu_id=menu_pk) + instance = qs.first() + if instance: + qs.update(**validated_data) + return instance + return super().create(validated_data) + + def validate(self, attrs): + """Override validate method.""" + menu_pk = self.request_kwargs.get('pk') + image_id = self.request_kwargs.get('image_id') + + menu_qs = models.Menu.objects.filter(pk=menu_pk) + image_qs = Image.objects.filter(id=image_id) + + if not menu_qs.exists(): + raise serializers.ValidationError({'detail': _('Menu not found')}) + if not image_qs.exists(): + raise serializers.ValidationError({'detail': _('Image not found')}) + + menu = menu_qs.first() + image = image_qs.first() + + attrs['menu'] = menu + attrs['image'] = image + + return attrs diff --git a/apps/establishment/urls/back.py b/apps/establishment/urls/back.py index 556b5c8b..d5173942 100644 --- a/apps/establishment/urls/back.py +++ b/apps/establishment/urls/back.py @@ -32,6 +32,9 @@ urlpatterns = [ name='establishment-admin-list'), path('menus/dishes/', views.MenuDishesListCreateView.as_view(), name='menu-dishes-list'), path('menus/dishes//', views.MenuDishesRUDView.as_view(), name='menu-dishes-rud'), + path('menus/dishes//gallery/', views.MenuGalleryListView.as_view(), name='menu-dishes-gallery-list'), + path('menus/dishes//gallery//', views.MenuGalleryCreateDestroyView.as_view(), + name='menu-dishes-gallery-create-destroy'), path('menus/', views.MenuListCreateView.as_view(), name='menu-list'), path('menus//', views.MenuRUDView.as_view(), name='menu-rud'), path('plates/', views.PlateListCreateView.as_view(), name='plates'), diff --git a/apps/establishment/views/back.py b/apps/establishment/views/back.py index 1dc7f6d9..dfd5ded7 100644 --- a/apps/establishment/views/back.py +++ b/apps/establishment/views/back.py @@ -2,7 +2,7 @@ from django.shortcuts import get_object_or_404 from django_filters.rest_framework import DjangoFilterBackend -from rest_framework import generics, permissions +from rest_framework import generics, permissions, response from rest_framework.response import Response from account.models import User @@ -462,3 +462,56 @@ class MenuDishesRUDView(generics.RetrieveUpdateDestroyAPIView): serializer_class = serializers.MenuDishesRUDSerializers queryset = models.Menu.objects.dishes().distinct() permission_classes = [IsWineryReviewer | IsEstablishmentManager] + + +class MenuGalleryListView(generics.ListAPIView): + """Resource for returning gallery for menu for back-office users.""" + serializer_class = serializers.ImageBaseSerializer + permission_classes = [IsWineryReviewer | IsEstablishmentManager] + queryset = models.Menu.objects.with_schedule_plates_establishment().with_gallery().dishes() + + def get_object(self): + """Override get_object method.""" + qs = super(MenuGalleryListView, self).get_queryset() + menu = get_object_or_404(qs, pk=self.kwargs.get('pk')) + + # May raise a permission denied + # self.check_object_permissions(self.request, menu) + + return menu + + def get_queryset(self): + """Override get_queryset method.""" + return self.get_object().crop_gallery + + +class MenuGalleryCreateDestroyView(CreateDestroyGalleryViewMixin): + """Resource for a create gallery for menu for back-office users.""" + serializer_class = serializers.MenuGallerySerializer + permission_classes = [IsWineryReviewer | IsEstablishmentManager] + + def get_queryset(self): + """Override get_queryset method.""" + qs = models.Menu.objects.with_schedule_plates_establishment().with_gallery().dishes() + return qs + + def create(self, request, *args, **kwargs): + _ = super().create(request, *args, **kwargs) + news_qs = self.filter_queryset(self.get_queryset()) + return response.Response( + data=serializers.MenuDishesRUDSerializers(get_object_or_404(news_qs, pk=kwargs.get('pk'))).data + ) + + def get_object(self): + """ + Returns the object the view is displaying. + """ + menu_qs = self.filter_queryset(self.get_queryset()) + + menu = get_object_or_404(menu_qs, pk=self.kwargs.get('pk')) + gallery = get_object_or_404(menu.menu_gallery, image_id=self.kwargs.get('image_id')) + + # May raise a permission denied + self.check_object_permissions(self.request, gallery) + + return gallery