From 287c53829460620c4754c1c8ce596102a0cdcfe2 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Sat, 1 Feb 2020 16:01:40 +0300 Subject: [PATCH] dish update-delete --- apps/establishment/serializers/back.py | 21 +++++++- apps/establishment/urls/back.py | 1 + apps/establishment/views/back.py | 66 ++++++++++++++------------ 3 files changed, 57 insertions(+), 31 deletions(-) diff --git a/apps/establishment/serializers/back.py b/apps/establishment/serializers/back.py index 52c18c83..969e1b1d 100644 --- a/apps/establishment/serializers/back.py +++ b/apps/establishment/serializers/back.py @@ -847,7 +847,10 @@ class CardAndWinesPlatesSerializer(serializers.ModelSerializer): establishment = get_object_or_404(models.Establishment, pk=self.context['view'].kwargs['establishment_id']) menu_type = validated_data.pop('menu')['type'] if menu_type not in models.Menu.VALID_CARD_AND_WINES_CHOICES: - raise serializers.ValidationError({'detail': f'incorrect type: {menu_type}'}) + raise serializers.ValidationError({ + 'detail': + f'Incorrect type: {menu_type}. Valid types: [{", ".join(models.Menu.VALID_CARD_AND_WINES_CHOICES)}]' + }) menu_to_bind = establishment.menu_set.filter(type=menu_type).first() if menu_to_bind is None: menu_to_bind = models.Menu.objects.create(type=menu_type, category={'en-GB': menu_type}, @@ -855,6 +858,22 @@ class CardAndWinesPlatesSerializer(serializers.ModelSerializer): validated_data.update({'menu': menu_to_bind}) return super().create(validated_data) + def update(self, instance, validated_data): + menu_type = validated_data.pop('menu')['type'] + if menu_type not in models.Menu.VALID_CARD_AND_WINES_CHOICES: + raise serializers.ValidationError({ + 'detail': + f'Incorrect type: {menu_type}. Valid types: [{", ".join(models.Menu.VALID_CARD_AND_WINES_CHOICES)}]' + }) + if instance.menu.type != menu_type: # type changed + establishment = instance.menu.establishment + menu_to_bind = establishment.menu_set.filter(type=menu_type).first() + if menu_to_bind is None: + menu_to_bind = models.Menu.objects.create(type=menu_type, category={'en-GB': menu_type}, + establishment=establishment) + validated_data.update({'menu': menu_to_bind}) + return super().update(instance, validated_data) + class CardAndWinesSerializer(serializers.ModelSerializer): """View to show menus(not formulas) with dishes for certain establishment""" diff --git a/apps/establishment/urls/back.py b/apps/establishment/urls/back.py index 08de5751..d3b739a6 100644 --- a/apps/establishment/urls/back.py +++ b/apps/establishment/urls/back.py @@ -41,6 +41,7 @@ urlpatterns = [ path('card_and_wines//', views.CardAndWinesListView.as_view(), name='card-and-wines-get'), path('menus//', views.MenuRUDView.as_view(), name='menu-rud'), path('menus/dish//', views.DishCreateView.as_view(), name='create-dish'), + path('menus/dish/change//', views.DishUpdateDeleteView.as_view(), name='update-delete-dish'), path('menus/wine//', views.EstablishmentWineView.as_view(), name='menu-wine'), path('menus/uploads/', views.MenuUploadsRUDView.as_view(), name='menu-uploads-rud'), path('menus/uploads/', views.MenuUploadsCreateView.as_view(), name='menu-uploads-create'), diff --git a/apps/establishment/views/back.py b/apps/establishment/views/back.py index 852135f5..b3d71488 100644 --- a/apps/establishment/views/back.py +++ b/apps/establishment/views/back.py @@ -158,14 +158,12 @@ class EstablishmentScheduleCreateView(generics.CreateAPIView): class CardAndWinesListView(generics.RetrieveAPIView): - # permission_classes = get_permission_classes( - # IsEstablishmentManager, - # IsEstablishmentAdministrator, - # ) + permission_classes = get_permission_classes( + IsEstablishmentManager, + IsEstablishmentAdministrator, + ) serializer_class = serializers.CardAndWinesSerializer queryset = models.Establishment.objects.with_base_related() - from rest_framework.permissions import AllowAny - permission_classes = (AllowAny, ) def get_object(self): establishment = models.Establishment.objects.prefetch_plates()\ @@ -184,12 +182,10 @@ class MenuListCreateView(generics.ListCreateAPIView): """Menu list create view. This view works only with menu formulas type""" serializer_class = serializers.MenuBackOfficeSerializer queryset = models.Menu.objects.with_base_related().by_type(menu_type=models.Menu.FORMULAS) - # permission_classes = get_permission_classes( - # IsEstablishmentManager, - # IsEstablishmentAdministrator, - # ) - from rest_framework.permissions import AllowAny - permission_classes = (AllowAny, ) + permission_classes = get_permission_classes( + IsEstablishmentManager, + IsEstablishmentAdministrator, + ) filter_backends = (DjangoFilterBackend,) filterset_fields = ( @@ -247,12 +243,10 @@ class EstablishmentWineView(generics.CreateAPIView): serializer_class = serializers.EstablishmentBackOfficeWineSerializer queryset = models.EstablishmentBackOfficeWine.objects.all() - # permission_classes = get_permission_classes( - # IsEstablishmentManager, - # IsEstablishmentAdministrator, - # ) - from rest_framework.permissions import AllowAny - permission_classes = (AllowAny, ) + permission_classes = get_permission_classes( + IsEstablishmentManager, + IsEstablishmentAdministrator, + ) def create(self, request, *args, **kwargs): data = request.data.copy() @@ -274,24 +268,36 @@ class DishCreateView(generics.CreateAPIView): """View for creating and binding dish to establishment""" serializer_class = serializers.CardAndWinesPlatesSerializer queryset = models.Plate.objects.all() - # permission_classes = get_permission_classes( - # IsEstablishmentManager, - # IsEstablishmentAdministrator, - # ) - from rest_framework.permissions import AllowAny - permission_classes = (AllowAny, ) + permission_classes = get_permission_classes( + IsEstablishmentManager, + IsEstablishmentAdministrator, + ) + + +class DishUpdateDeleteView(generics.UpdateAPIView, generics.DestroyAPIView): + serializer_class = serializers.CardAndWinesPlatesSerializer + queryset = models.Plate.objects.all() + permission_classes = get_permission_classes( + IsEstablishmentManager, + IsEstablishmentAdministrator, + ) + + def get_object(self): + return get_object_or_404(models.Plate, pk=self.kwargs['dish_id']) + + def update(self, request, *args, **kwargs): + with transaction.atomic(): + return super().update(request, *args, **kwargs) class MenuUploadsCreateView(generics.CreateAPIView): """Menu uploads list view""" serializer_class = serializers.MenuFilesSerializers queryset = models.MenuFiles.objects.all() - # permission_classes = get_permission_classes( - # IsEstablishmentManager, - # IsEstablishmentAdministrator, - # ) - from rest_framework.permissions import AllowAny - permission_classes = (AllowAny, ) + permission_classes = get_permission_classes( + IsEstablishmentManager, + IsEstablishmentAdministrator, + ) class SocialChoiceListCreateView(generics.ListCreateAPIView):