diff --git a/ecommerce/baskets/serializers.py b/ecommerce/baskets/serializers.py index 9dc4c30..0c53dd3 100644 --- a/ecommerce/baskets/serializers.py +++ b/ecommerce/baskets/serializers.py @@ -10,6 +10,7 @@ class BasketItemSerializer(serializers.ModelSerializer): class Meta: model = BasketItem fields = ("id", "basket", "product", "quantity", "price") + read_only_fields = ["basket", "price"] class BasketSerializer(serializers.ModelSerializer): diff --git a/ecommerce/baskets/views.py b/ecommerce/baskets/views.py index ee32571..3b95083 100644 --- a/ecommerce/baskets/views.py +++ b/ecommerce/baskets/views.py @@ -1,9 +1,14 @@ +from django.core.exceptions import ObjectDoesNotExist +from django.db.transaction import atomic from rest_framework import viewsets +from rest_framework.decorators import action +from rest_framework.response import Response from baskets.filters import BasketItemFilter, BasketFilter from baskets.models import BasketItem, Basket from baskets.serializers import BasketItemSerializer, BasketSerializer, BasketItemDetailedSerializer, BasketDetailedSerializer from core.mixins import DetailedViewSetMixin +from products.models import Product class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): @@ -15,12 +20,48 @@ class BasketItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": BasketItemDetailedSerializer, } + def get_queryset(self): + queryset = super().get_queryset() + user_id = self.request.user.id + return queryset.filter(basket__customer__id=user_id) + class BasketViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + http_method_names = ["get", "delete"] queryset = Basket.objects.all() serializer_class = BasketSerializer filterset_class = BasketFilter serializer_action_classes = { "detailed_list": BasketDetailedSerializer, "detailed": BasketDetailedSerializer, + "add_to_basket": BasketItemSerializer, } + + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) + + @atomic() + @action(detail=True, methods=['post'], http_method_names=['post']) + def add_to_basket(self, request, pk=None): + user_id = self.request.user.id + product = Product.objects.get(id=request.data["product"]) + quantity = request.data["quantity"] + price = product.price + try: + basket = Basket.objects.get(customer__id=user_id, status="open") + except ObjectDoesNotExist: + basket = Basket.objects.create(customer_id=user_id, status="open") + + try: + basket_item = BasketItem.objects.get(basket__customer__id=user_id, product=product) + basket_item.quantity += int(quantity) + except ObjectDoesNotExist: + basket_item = BasketItem.objects.create(basket=basket, product=product, quantity=int(quantity), price=price) + + basket.save() + basket_item.save() + + serializer = BasketItemSerializer(basket_item) + return Response(serializer.data) diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py index ffad735..cbfa456 100644 --- a/ecommerce/customers/serializers.py +++ b/ecommerce/customers/serializers.py @@ -13,6 +13,24 @@ class Meta: fields = ("id", "first_name", "last_name", "email", "is_staff", "is_active", "date_joined") +class RegisterSerializer(serializers.ModelSerializer): + password = serializers.CharField(write_only=True) + + def create(self, validated_data): + customer = Customer.objects.create_user( + email=validated_data['email'], + first_name=validated_data['first_name'], + last_name=validated_data["last_name"], + password=validated_data["password"] + ) + customer.save() + return customer + + class Meta: + model = Customer + fields = ("id", "email", "first_name", "last_name", "password",) + + class ProfileSerializer(serializers.ModelSerializer): class Meta: diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index e2d05b6..48abaf6 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -7,8 +7,15 @@ from customers.filters import CustomerFilter, AddressFilter, CountryFilter, CityFilter from customers.models import Customer, Address, City, Country from customers.serializers import CustomerSerializer, AddressSerializer, CitySerializer, \ - CountrySerializer, \ - AddressDetailedSerializer, CityDetailedSerializer, ProfileSerializer + CountrySerializer, AddressDetailedSerializer, CityDetailedSerializer, \ + ProfileSerializer, RegisterSerializer + + +class RegisterViewSet(viewsets.ModelViewSet, mixins.CreateModelMixin): + permission_classes = () + http_method_names = ['post'] + queryset = Customer.objects.all() + serializer_class = RegisterSerializer class AdminCustomerViewSet(viewsets.ModelViewSet): diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 28278ef..4a6a5f1 100644 --- a/ecommerce/ecommerce/urls.py +++ b/ecommerce/ecommerce/urls.py @@ -21,7 +21,7 @@ from baskets.views import BasketItemViewSet, BasketViewSet from core.views import APITokenObtainPairView from customers.views import AddressViewSet, CityViewSet, \ - CountryViewSet, AdminCustomerViewSet, MyProfileViewSet + CountryViewSet, AdminCustomerViewSet, MyProfileViewSet, RegisterViewSet from ecommerce.router import router from orders.views import OrderItemViewSet, OrderViewSet, BillingAddressViewSet, ShippingAddressViewSet, \ OrderBankAccountViewSet @@ -46,6 +46,7 @@ router.register("banks", BankViewSet) router.register("admin-products", AdminProductViewSet, basename="admin-product") router.register("admin-customers", AdminCustomerViewSet, basename="admin-customer") +router.register("register", RegisterViewSet) urlpatterns = [ diff --git a/ecommerce/orders/views.py b/ecommerce/orders/views.py index dde7137..ba2dc29 100644 --- a/ecommerce/orders/views.py +++ b/ecommerce/orders/views.py @@ -1,6 +1,7 @@ -from rest_framework import viewsets +from rest_framework import viewsets, permissions from core.mixins import DetailedViewSetMixin +from core.utils import IsStaffUserAuthenticated from orders.filters import OrderItemFilter, OrderFilter, BillingAddressFilter, ShippingAddressFilter, \ OrderBankAccountFilter from orders.models import OrderItem, Order, BillingAddress, ShippingAddress, OrderBankAccount @@ -18,6 +19,25 @@ class OrderItemViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": OrderItemDetailedSerializer, } + def get_queryset(self): + queryset = super().get_queryset() + user_id = self.request.user.id + return queryset.filter(order__customer__id=user_id) + + +class AdminOrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): + permission_classes = ( + permissions.IsAuthenticated, + IsStaffUserAuthenticated + ) + queryset = Order.objects.all() + serializer_class = OrderSerializer + filterset_class = OrderFilter + serializer_action_classes = { + "detailed_list": OrderDetailedSerializer, + "detailed": OrderDetailedSerializer, + } + class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = Order.objects.all() @@ -28,6 +48,11 @@ class OrderViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed": OrderDetailedSerializer, } + def get_queryset(self): + queryset = super().get_queryset() + user = self.request.user + return queryset.filter(customer=user) + class BillingAddressViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): queryset = BillingAddress.objects.all() @@ -57,3 +82,8 @@ class OrderBankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): "detailed_list": OrderBankAccountDetailedSerializer, "detailed": OrderBankAccountDetailedSerializer, } + + def get_queryset(self): + queryset = super().get_queryset() + user_id = self.request.user.id + return queryset.filter(order__customer__id=user_id) diff --git a/ecommerce/payments/views.py b/ecommerce/payments/views.py index 09b28a7..f8f1cd2 100644 --- a/ecommerce/payments/views.py +++ b/ecommerce/payments/views.py @@ -17,6 +17,7 @@ class BankAccountViewSet(DetailedViewSetMixin, viewsets.ModelViewSet): class BankViewSet(viewsets.ModelViewSet): + http_method_names = ["get"] queryset = Bank.objects.all() serializer_class = BankSerializer filterset_class = BankFilter