diff --git a/ecommerce/customers/serializers.py b/ecommerce/customers/serializers.py index ffad735..0c5118b 100644 --- a/ecommerce/customers/serializers.py +++ b/ecommerce/customers/serializers.py @@ -2,10 +2,42 @@ from django.db.transaction import atomic from rest_framework import serializers from rest_framework.exceptions import ValidationError +from rest_framework.validators import UniqueValidator +from django.contrib.auth.password_validation import validate_password from customers.models import Customer, Address, City, Country +class RegisterSerializer(serializers.ModelSerializer): + email = serializers.EmailField( + required=True, + validators=[UniqueValidator(queryset=Customer.objects.all())] + ) + + password = serializers.CharField(write_only=True, required=True, validators=[validate_password]) + repeat_password = serializers.CharField(write_only=True, required=True) + + class Meta: + model = Customer + fields = ('id', 'email', 'first_name', 'last_name', 'password', 'repeat_password') + + def validate(self, attrs): + if attrs['password'] != attrs['repeat_password']: + raise ValidationError(detail=_("Password fields do not match.")) + + return attrs + + @atomic() + def create(self, validated_data): + customer = Customer.objects.create_user( + email=validated_data['email'], + password=validated_data['password'], + first_name=validated_data['first_name'], + last_name=validated_data['last_name'] + ) + + return customer + class CustomerSerializer(serializers.ModelSerializer): class Meta: diff --git a/ecommerce/customers/views.py b/ecommerce/customers/views.py index e2d05b6..5507237 100644 --- a/ecommerce/customers/views.py +++ b/ecommerce/customers/views.py @@ -1,5 +1,5 @@ from django.shortcuts import get_object_or_404 -from rest_framework import viewsets, permissions, mixins +from rest_framework import viewsets, permissions, mixins, generics from rest_framework.viewsets import GenericViewSet from core.mixins import DetailedViewSetMixin @@ -8,7 +8,7 @@ from customers.models import Customer, Address, City, Country from customers.serializers import CustomerSerializer, AddressSerializer, CitySerializer, \ CountrySerializer, \ - AddressDetailedSerializer, CityDetailedSerializer, ProfileSerializer + AddressDetailedSerializer, CityDetailedSerializer, ProfileSerializer, RegisterSerializer class AdminCustomerViewSet(viewsets.ModelViewSet): @@ -65,4 +65,7 @@ def get_queryset(self): return queryset.filter(customer=user) +class RegisterViewSet(generics.CreateAPIView): + queryset = Customer.objects.all() + serializer_class = RegisterSerializer diff --git a/ecommerce/ecommerce/urls.py b/ecommerce/ecommerce/urls.py index 28278ef..2b01951 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 @@ -55,6 +55,7 @@ path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('api/profile/', MyProfileViewSet.as_view( {"get": "retrieve", "put": "update", "patch": "partial_update"}), name='profile'), + path('register/', RegisterViewSet.as_view(), name='auth_register') ] if settings.DEBUG: diff --git a/ecommerce/requirements.txt b/ecommerce/requirements.txt index 5df574f..858bb1b 100644 --- a/ecommerce/requirements.txt +++ b/ecommerce/requirements.txt @@ -4,7 +4,7 @@ django-environ==0.8.1 django-extensions==3.1.2 django-filter==21.1 djangorestframework==3.12.4 -djangorestframework-simplejwt==5.0.0 +djangorestframework_simplejwt==5.0.0 factory-boy==3.2.1 ipython==7.30.1 psycopg2-binary==2.9.2