diff --git a/insalan/pizza/admin.py b/insalan/pizza/admin.py index 8446bd5..f7fc75b 100644 --- a/insalan/pizza/admin.py +++ b/insalan/pizza/admin.py @@ -1,9 +1,12 @@ +"""This module contains the admin configuration for the Pizza app.""" + from django.contrib import admin from django.http import HttpResponse from .models import Pizza, TimeSlot, Order, PizzaOrder, PizzaExport, PaymentMethod class PizzaAdmin(admin.ModelAdmin): + """Admin class for the Pizza model""" list_display = ("id", "name", "ingredients") search_fields = ["name", "ingredients", "allergens"] @@ -11,6 +14,7 @@ class PizzaAdmin(admin.ModelAdmin): class TimeSlotAdmin(admin.ModelAdmin): + """Admin class for the TimeSlot model""" list_display = ("id", "delivery_time", "end", "pizza_max") search_fields = ["delivery_time", "end"] @@ -18,10 +22,12 @@ class TimeSlotAdmin(admin.ModelAdmin): class PizzaOrderInline(admin.TabularInline): + """Admin class for the PizzaOrder model""" model = PizzaOrder extra = 1 class OrderAdmin(admin.ModelAdmin): + """Admin class for the Order model""" list_display = ("id", "get_username", "time_slot", "created_at") search_fields = ["user", "time_slot__delivery_time"] inlines = [PizzaOrderInline] @@ -56,6 +62,7 @@ def export(self, request, queryset): admin.site.register(Order, OrderAdmin) class ExportAdmin(admin.ModelAdmin): + """Admin class for the Export model""" list_display = ("id", "time_slot", "created_at") search_fields = ["time_slot"] diff --git a/insalan/pizza/apps.py b/insalan/pizza/apps.py index f1ba478..8ee5d90 100644 --- a/insalan/pizza/apps.py +++ b/insalan/pizza/apps.py @@ -3,6 +3,7 @@ from django.utils.translation import gettext_lazy as _ class PizzaConfig(AppConfig): + """Configuration of the Pizza App""" default_auto_field = "django.db.models.BigAutoField" name = "insalan.pizza" verbose_name = _("Pizza") diff --git a/insalan/pizza/models.py b/insalan/pizza/models.py index 89e97d6..00e7f1e 100644 --- a/insalan/pizza/models.py +++ b/insalan/pizza/models.py @@ -3,14 +3,15 @@ It includes the following models: - Pizza: Represents a pizza with its name, price, ingredients, image, and availability. -- TimeSlot: Represents a time slot for ordering pizzas, including delivery time, end time, and maximum number of pizzas. -- Order: Represents a pizza order, including the user, time slot, pizzas, payment method, price, and delivery status. +- TimeSlot: Represents a time slot for ordering pizzas, including delivery time, end time, and + maximum number of pizzas. +- Order: Represents a pizza order, including the user, time slot, pizzas, payment method, price, + and delivery status. """ from typing import List from django.core.validators import FileExtensionValidator from django.db import models -from django.utils import timezone from django.utils.translation import gettext_lazy as _ from django.contrib.postgres.fields import ArrayField @@ -216,6 +217,7 @@ def get_orders_id(self) -> List[int]: return Order.objects.filter(time_slot=self).values_list("id", flat=True).order_by("-id") class PizzaOrder(models.Model): + """Pizza order model""" order = models.ForeignKey('Order', on_delete=models.CASCADE) pizza = models.ForeignKey('pizza.Pizza', on_delete=models.CASCADE) diff --git a/insalan/pizza/serializers.py b/insalan/pizza/serializers.py index b538a3d..a8f54cf 100644 --- a/insalan/pizza/serializers.py +++ b/insalan/pizza/serializers.py @@ -1,8 +1,10 @@ """ Serializers for pizza models""" + +from typing import List + from rest_framework import serializers from .models import Pizza, Order, TimeSlot, PizzaOrder, PizzaExport, PaymentMethod -from typing import List class PizzaSerializer(serializers.ModelSerializer): """Serializer for a pizza model""" @@ -27,7 +29,8 @@ class OrderSerializer(serializers.ModelSerializer): class Meta: model = Order read_only_fields = ("id", ) - fields = ("id", "user", "time_slot", "pizza", "payment_method", "price", "paid", "created_at", "delivered", "delivery_date") + fields = ("id", "user", "time_slot", "pizza", "payment_method", "price", "paid", + "created_at", "delivered", "delivery_date") class CreateOrderSerializer(serializers.ModelSerializer): """ Serializer for an order""" @@ -53,9 +56,13 @@ def create(self, validated_data): elif price_type == "staff": price = TimeSlot.objects.get(id=validated_data["time_slot"].id).staff_price * len(pizza) elif price_type == "player": - price = TimeSlot.objects.get(id=validated_data["time_slot"].id).player_price * len(pizza) + price = TimeSlot.objects.get( + id=validated_data["time_slot"].id + ).player_price * len(pizza) else: - price = TimeSlot.objects.get(id=validated_data["time_slot"].id).external_price * len(pizza) + price = TimeSlot.objects.get( + id=validated_data["time_slot"].id + ).external_price * len(pizza) validated_data["price"] = price order = Order.objects.create(**validated_data) for p in pizza: @@ -75,7 +82,7 @@ class Meta: """ model = Order fields = ("id", ) - + def to_representation(self, instance): """Turn a Django object into a serialized representation""" return instance.id @@ -112,8 +119,14 @@ class Meta: def get_pizza(self, obj): result = {} # for each pizza type in the timeslot, count the number of pizza ordered - for pizza in PizzaOrder.objects.filter(order__time_slot__id=obj.id).values("pizza__id").distinct(): - result[pizza["pizza__id"]] = PizzaOrder.objects.filter(order__time_slot__id=obj.id, pizza__id=pizza["pizza__id"]).count() + pizzas = PizzaOrder.objects.filter( + order__time_slot__id=obj.id + ).values("pizza__id").distinct() + for pizza in pizzas: + result[pizza["pizza__id"]] = PizzaOrder.objects.filter( + order__time_slot__id=obj.id, + pizza__id=pizza["pizza__id"] + ).count() return result class PizzaExportSerializer(serializers.ModelSerializer): diff --git a/insalan/pizza/tests.py b/insalan/pizza/tests.py index d40b639..c7f9488 100644 --- a/insalan/pizza/tests.py +++ b/insalan/pizza/tests.py @@ -6,6 +6,8 @@ """ +from datetime import timedelta + from django.test import TestCase from django.urls import reverse from django.utils import timezone @@ -13,9 +15,7 @@ from rest_framework.test import APIClient from insalan.pizza.models import Pizza, TimeSlot, Order, PizzaOrder, PizzaExport -from insalan.pizza.serializers import PizzaSerializer, PizzaIdSerializer from insalan.user.models import User -from datetime import timedelta class PizzaEndpointsTestCase(TestCase): diff --git a/insalan/pizza/urls.py b/insalan/pizza/urls.py index e61cff4..61b9234 100644 --- a/insalan/pizza/urls.py +++ b/insalan/pizza/urls.py @@ -1,5 +1,5 @@ """ URLs for pizza -- /pizza/pizza: +- /pizza/pizza: - GET: return pizza list id - POST: create a pizza (admin only) - /pizza/pizza/full: list pizza available with their infos @@ -34,7 +34,8 @@ path("pizza//", views.PizzaDetail.as_view(), name="pizza/detail"), path("pizza/search/",views.PizzaSearch.as_view(), name="pizza/fuzzy-find"), path("pizza/by-timeslot/", views.PizzaListByTimeSlot.as_view(), name="pizza/list/by-timeslot"), - path("pizza/by-timeslot/", views.PizzaListByGivenTimeSlot.as_view(), name="pizza/list/by-timeslot-id"), + path("pizza/by-timeslot/", views.PizzaListByGivenTimeSlot.as_view(), + name="pizza/list/by-timeslot-id"), path("timeslot/", views.TimeSlotList.as_view(), name="timeslot/list"), path("timeslot/full/", views.TimeSlotListFull.as_view(), name="timeslot/list/full"), path("timeslot//", views.TimeSlotDetail.as_view(), name="timeslot/detail"), diff --git a/insalan/pizza/views.py b/insalan/pizza/views.py index 9155fe6..3c9936f 100644 --- a/insalan/pizza/views.py +++ b/insalan/pizza/views.py @@ -14,10 +14,11 @@ from drf_yasg.utils import swagger_auto_schema from drf_yasg import openapi -import insalan.pizza.serializers as serializers +from insalan.pizza import serializers from .models import Pizza, TimeSlot, Order, PizzaExport class ReadOnly(permissions.BasePermission): + """Read-Only permissions""" def has_permission(self, request, _view): return request.method in permissions.SAFE_METHODS @@ -468,7 +469,9 @@ class NextTimeSlot(generics.ListAPIView): def get(self, request, *args, **kwargs): # select incoming timeslot and currents timeslot in the same day - timeslot = TimeSlot.objects.filter(delivery_time__gte=timezone.now().date()).order_by("delivery_time") + timeslot = TimeSlot.objects.filter( + delivery_time__gte=timezone.now().date() + ).order_by("delivery_time") serializers_data = [] for ts in timeslot: @@ -593,13 +596,14 @@ def patch(self, request, *args, **kwargs): order.delivery_date = timezone.now() order.save() return Response({"detail": _("Modified.")}, status=200) - elif "delivered" in data and data["delivered"] is False: + + if "delivered" in data and data["delivered"] is False: order.delivered = False order.delivery_date = None order.save() return Response({"detail": _("Modified.")}, status=200) - else: - return Response({"detail": _("Bad request.")}, status=400) + + return Response({"detail": _("Bad request.")}, status=400) @swagger_auto_schema( responses={