diff --git a/core/apps/admin_panel/serializers/order.py b/core/apps/admin_panel/serializers/order.py new file mode 100644 index 0000000..b2d19c6 --- /dev/null +++ b/core/apps/admin_panel/serializers/order.py @@ -0,0 +1,11 @@ +from rest_framework import serializers + +from core.apps.orders.models import Order + + +class OrderSerializer(serializers.ModelSerializer): + class Meta: + model = Order + fields = [ + 'id', 'order_number', 'total_price', 'user' + ] \ No newline at end of file diff --git a/core/apps/admin_panel/serializers/user.py b/core/apps/admin_panel/serializers/user.py index af7545b..8902c68 100644 --- a/core/apps/admin_panel/serializers/user.py +++ b/core/apps/admin_panel/serializers/user.py @@ -37,4 +37,16 @@ class UserSerializer(serializers.ModelSerializer): if validated_data.get('password'): instance.set_password(validated_data.get('password')) instance.save() - return instance \ No newline at end of file + return instance + + +class UserLoginSerializer(serializers.Serializer): + username = serializers.CharField() + password = serializers.CharField() + + def validate(self, data): + user = User.objects.filter(username=data['username'], is_superuser=True).first() + if not user: + raise serializers.ValidationError("User not found") + data['user'] = user + return data \ No newline at end of file diff --git a/core/apps/admin_panel/urls.py b/core/apps/admin_panel/urls.py index 362f7bc..730bd9f 100644 --- a/core/apps/admin_panel/urls.py +++ b/core/apps/admin_panel/urls.py @@ -7,7 +7,6 @@ from core.apps.admin_panel.views import category as category_views from core.apps.admin_panel.views import product as product_views - urlpatterns = [ path('user/', include( [ @@ -17,6 +16,7 @@ urlpatterns = [ path('/delete/', user_views.UserDeleteApiView.as_view()), path('/', user_views.UserDetailApiView.as_view()), path('dashboard/', user_views.UserDashboardApiView.as_view()), + path('login/', user_views.UserLoginApiView.as_view()), ] )), path('banner/', include( diff --git a/core/apps/admin_panel/views/user.py b/core/apps/admin_panel/views/user.py index ccb266c..ee3994f 100644 --- a/core/apps/admin_panel/views/user.py +++ b/core/apps/admin_panel/views/user.py @@ -1,8 +1,9 @@ from django.shortcuts import get_object_or_404 from rest_framework import generics, permissions, status, views +from rest_framework_simplejwt.tokens import RefreshToken -from core.apps.admin_panel.serializers.user import UserSerializer +from core.apps.admin_panel.serializers.user import UserSerializer, UserLoginSerializer from core.apps.accounts.models import User from core.apps.shared.mixins.response import ResponseMixin @@ -82,4 +83,23 @@ class UserDashboardApiView(views.APIView, ResponseMixin): return self.success_response( data={'admin_users': admin_users, 'users': users}, message='userlar soni', - ) \ No newline at end of file + ) + + +class UserLoginApiView(generics.GenericAPIView, ResponseMixin): + serializer_class = UserLoginSerializer + queryset = User.objects.all() + + def post(self, request): + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + user = serializer.validated_data.get('user') + token = RefreshToken.for_user(user) + return self.success_response( + data={ + 'access': str(token.access_token), + 'refresh': str(token) + }, + message='user tizimga kirish muvaffaqiyatli yakunlandi' + ) + return self.failure_response(message='user tizimga kirishda xatolik', data=serializer.errors) \ No newline at end of file diff --git a/core/apps/orders/apps.py b/core/apps/orders/apps.py index da81335..9034a09 100644 --- a/core/apps/orders/apps.py +++ b/core/apps/orders/apps.py @@ -6,4 +6,5 @@ class OrdersConfig(AppConfig): name = 'core.apps.orders' def ready(self): - from . import admin \ No newline at end of file + from . import admin + from . import signals \ No newline at end of file diff --git a/core/apps/orders/migrations/0003_order_order_number.py b/core/apps/orders/migrations/0003_order_order_number.py new file mode 100644 index 0000000..408db8e --- /dev/null +++ b/core/apps/orders/migrations/0003_order_order_number.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2 on 2025-09-03 16:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orders', '0002_orderitem_product'), + ] + + operations = [ + migrations.AddField( + model_name='order', + name='order_number', + field=models.PositiveBigIntegerField(default=1), + ), + ] diff --git a/core/apps/orders/models/order.py b/core/apps/orders/models/order.py index 0f1e626..8cd66a4 100644 --- a/core/apps/orders/models/order.py +++ b/core/apps/orders/models/order.py @@ -6,8 +6,17 @@ from core.apps.products.models import Product class Order(BaseModel): + # STATUS = ( + # ('', ''), + # ('', ''), + # ('', ''), + # ('', ''), + # ('', '') + # ) total_price = models.PositiveBigIntegerField(default=0) user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders') + order_number = models.PositiveBigIntegerField(default=1) + # status = models.CharField(max_length=20, choices=STATUS) def __str__(self): return f'{self.user} order' diff --git a/core/apps/orders/signals/__init__.py b/core/apps/orders/signals/__init__.py new file mode 100644 index 0000000..5c48881 --- /dev/null +++ b/core/apps/orders/signals/__init__.py @@ -0,0 +1 @@ +from .order import * \ No newline at end of file diff --git a/core/apps/orders/signals/order.py b/core/apps/orders/signals/order.py new file mode 100644 index 0000000..14f03ab --- /dev/null +++ b/core/apps/orders/signals/order.py @@ -0,0 +1,12 @@ +from django.db.models.signals import post_save +from django.dispatch import receiver + +from core.apps.orders.models import Order + + +@receiver(post_save, sender=Order) +def set_order_number(sender, instance, created, **kwargs): + if created: + last_order = Order.objects.order_by('order_number').last() + instance.order_number = (last_order.order_number + 1) if last_order else 1 + instance.save(update_fields=["order_number"]) \ No newline at end of file