add new apis

This commit is contained in:
behruz-dev
2025-08-01 17:28:48 +05:00
parent f757e42906
commit 4c6a0b4445
17 changed files with 205 additions and 42 deletions

View File

@@ -1,7 +1,9 @@
REST_FRAMEWORK = { REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [ "DEFAULT_AUTHENTICATION_CLASSES": [
'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication' 'rest_framework.authentication.BasicAuthentication',
'rest_framework_simplejwt.authentication.JWTAuthentication', 'rest_framework_simplejwt.authentication.JWTAuthentication',
] ],
'DEFAULT_PAGINATION_CLASS': 'core.apps.shared.paginations.custom.CustomPageNumberPagination',
'PAGE_SIZE': 10
} }

View File

@@ -3,7 +3,7 @@ from rest_framework.response import Response
from core.apps.company.models import Company from core.apps.company.models import Company
from core.apps.company.serializers import company as serializers from core.apps.company.serializers import company as serializers
from core.apps.shared.paginations.custom import CustomPageNumberPagination
from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.accounts.permissions.permissions import HasRolePermission
@@ -12,6 +12,7 @@ class CompanyListApiView(generics.ListAPIView):
queryset = Company.objects.all() queryset = Company.objects.all()
permission_classes = [HasRolePermission] permission_classes = [HasRolePermission]
required_permissions = [] required_permissions = []
pagination_class = CustomPageNumberPagination
class CompanyDetailApiView(generics.RetrieveAPIView): class CompanyDetailApiView(generics.RetrieveAPIView):

View File

@@ -0,0 +1,26 @@
# Generated by Django 5.2.4 on 2025-08-01 16:41
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('orders', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='order',
name='employee',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='order',
name='status',
field=models.CharField(choices=[('NEW', 'yangi'), ('CANCELLED', 'bekor qilindi'), ('ACCEPTED', 'qabul qilindi')], default='NEW', max_length=20),
),
]

View File

@@ -9,6 +9,12 @@ from core.apps.wherehouse.models import WhereHouse
class Order(BaseModel): class Order(BaseModel):
STATUS = (
('NEW', 'yangi'),
('CANCELLED', "bekor qilindi"),
('ACCEPTED', 'qabul qilindi'),
)
product = models.ForeignKey( product = models.ForeignKey(
Product, on_delete=models.CASCADE, related_name='orders' Product, on_delete=models.CASCADE, related_name='orders'
) )
@@ -26,6 +32,8 @@ class Order(BaseModel):
) )
date = models.DateField() date = models.DateField()
quantity = models.PositiveBigIntegerField(default=1) quantity = models.PositiveBigIntegerField(default=1)
status = models.CharField(max_length=20, choices=STATUS, default="NEW")
employee = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders', null=True)
def __str__(self): def __str__(self):
return f"{self.product} {self.unity} quantity order" return f"{self.product} {self.unity} quantity order"

View File

@@ -3,9 +3,20 @@ from django.db import transaction
from rest_framework import serializers from rest_framework import serializers
from core.apps.orders.models import Order, OrderApplication from core.apps.orders.models import Order, OrderApplication
# products
from core.apps.products.models import Product, Unity from core.apps.products.models import Product, Unity
from core.apps.products.serializers.product import ProductListSerializer
from core.apps.products.serializers.unity import UnityListSerializer
# wherehouse
from core.apps.wherehouse.models import WhereHouse from core.apps.wherehouse.models import WhereHouse
from core.apps.wherehouse.serializers.wherehouse import WhereHouseListSerializer
# projects
from core.apps.projects.models import Project, ProjectDepartment from core.apps.projects.models import Project, ProjectDepartment
from core.apps.projects.serializers.project import (
ProjectListSerializer,
ProjectDepartmentListSerializer
)
class OrderCreateSerializer(serializers.Serializer): class OrderCreateSerializer(serializers.Serializer):
@@ -48,28 +59,16 @@ class OrderCreateSerializer(serializers.Serializer):
return data return data
class OrderApplicationCreateSerializer(serializers.Serializer): class OrderListSerializer(serializers.ModelSerializer):
orders = serializers.ListSerializer(child=OrderCreateSerializer()) product = ProductListSerializer()
unity = UnityListSerializer()
project = ProjectListSerializer()
project_department = ProjectDepartmentListSerializer()
wherehouse = WhereHouseListSerializer()
def create(self, validated_data): class Meta:
employee = self.context.get('user') model = Order
orders_data = validated_data.pop('orders') fields = [
application = OrderApplication.objects.create( 'id', 'product', 'unity', 'quantity', 'project', 'project_department',
employee=employee, status="NEW" 'wherehouse', 'date', 'status', 'employee'
) ]
order_objs = []
for order_data in orders_data:
order_objs.append(Order(
product=order_data['product'],
unity=order_data['unity'],
quantity=order_data['quantity'],
wherehouse=order_data['wherehouse'],
project=order_data['project'],
project_department=order_data.get('project_department'),
date=order_data['date']
))
created_orders = Order.objects.bulk_create(order_objs)
application.orders.add(*created_orders)
return application

View File

@@ -0,0 +1,41 @@
from rest_framework import serializers
from core.apps.orders.models import OrderApplication, Order
from core.apps.orders.serializers.order import OrderCreateSerializer, OrderListSerializer
class OrderApplicationCreateSerializer(serializers.Serializer):
orders = serializers.ListSerializer(child=OrderCreateSerializer())
def create(self, validated_data):
employee = self.context.get('user')
orders_data = validated_data.pop('orders')
application = OrderApplication.objects.create(
employee=employee, status="NEW"
)
order_objs = []
for order_data in orders_data:
order_objs.append(Order(
product=order_data['product'],
unity=order_data['unity'],
quantity=order_data['quantity'],
wherehouse=order_data['wherehouse'],
project=order_data['project'],
project_department=order_data.get('project_department'),
date=order_data['date']
))
created_orders = Order.objects.bulk_create(order_objs)
application.orders.add(*created_orders)
return application
class OrderApplicationListSerializer(serializers.ModelSerializer):
orders = OrderListSerializer(many=True)
class Meta:
model = OrderApplication
fields = [
'id', 'employee', 'status', 'orders'
]

View File

@@ -1,11 +1,19 @@
from django.urls import path, include from django.urls import path, include
from core.apps.orders.views import order_application as application_views
from core.apps.orders.views import order as order_views from core.apps.orders.views import order as order_views
urlpatterns = [ urlpatterns = [
path('order_application/', include( path('order_application/', include(
[ [
path('create/', order_views.OrderApplicationCreateApiView.as_view()), path('create/', application_views.OrderApplicationCreateApiView.as_view()),
path('list/', application_views.OrderApplicationListApiView.as_view()),
]
)),
path('order/', include(
[
path('list/', order_views.OrderListApiView.as_view()),
] ]
)), )),
] ]

View File

@@ -1,18 +1,17 @@
from rest_framework import generics, response from rest_framework import generics, status
from rest_framework.response import Response from rest_framework.response import Response
from core.apps.orders.models import Order, OrderApplication
from core.apps.orders.serializers import order as serializers from core.apps.orders.serializers import order as serializers
from core.apps.orders.models import Order
from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.accounts.permissions.permissions import HasRolePermission
from core.apps.shared.paginations.custom import CustomPageNumberPagination
class OrderApplicationCreateApiView(generics.CreateAPIView): class OrderListApiView(generics.ListAPIView):
serializer_class = serializers.OrderApplicationCreateSerializer serializer_class = serializers.OrderListSerializer
queryset = OrderApplication.objects.all() queryset = Order.objects.select_related(
'product', 'unity', 'project', 'project_department', 'wherehouse'
)
permission_classes = [HasRolePermission] permission_classes = [HasRolePermission]
required_permissions = [] required_permissions = []
pagination_class = CustomPageNumberPagination
def get_serializer_context(self):
context = super().get_serializer_context()
context['user'] = self.request.user
return context

View File

@@ -0,0 +1,27 @@
from rest_framework import generics, response
from rest_framework.response import Response
from core.apps.orders.models import Order, OrderApplication
from core.apps.orders.serializers import order_application as serializers
from core.apps.accounts.permissions.permissions import HasRolePermission
from core.apps.shared.paginations.custom import CustomPageNumberPagination
class OrderApplicationCreateApiView(generics.CreateAPIView):
serializer_class = serializers.OrderApplicationCreateSerializer
queryset = OrderApplication.objects.all()
permission_classes = [HasRolePermission]
required_permissions = []
def get_serializer_context(self):
context = super().get_serializer_context()
context['user'] = self.request.user
return context
class OrderApplicationListApiView(generics.ListAPIView):
queryset = OrderApplication.objects.prefetch_related('orders')
serializer_class = serializers.OrderApplicationListSerializer
pagination_class = CustomPageNumberPagination
permission_classes = [HasRolePermission]
required_permissions = []

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.4 on 2025-08-01 17:27
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('products', '0003_unity'),
]
operations = [
migrations.AddField(
model_name='product',
name='type',
field=models.CharField(choices=[('TANGIBLE', "ushlab bo'ladigan"), ('INTANGIBLE', "ushlab bo'lmaydigan")], default='TANGIBLE', max_length=20),
),
]

View File

@@ -5,7 +5,13 @@ from core.apps.shared.models import BaseModel
class Product(BaseModel): class Product(BaseModel):
TYPE = (
("TANGIBLE", "ushlab bo'ladigan"),
("INTANGIBLE", "ushlab bo'lmaydigan"),
)
name = models.CharField(max_length=200) name = models.CharField(max_length=200)
type = models.CharField(max_length=20, choices=TYPE, default="TANGIBLE")
def __str__(self): def __str__(self):
return self.name return self.name

View File

@@ -7,5 +7,5 @@ class ProductListSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Product model = Product
fields = [ fields = [
'id', 'name' 'id', 'name', 'type'
] ]

View File

@@ -4,6 +4,7 @@ from rest_framework.response import Response
from core.apps.products.models.product import Product from core.apps.products.models.product import Product
from core.apps.products.serializers import product as serializers from core.apps.products.serializers import product as serializers
from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.accounts.permissions.permissions import HasRolePermission
from core.apps.shared.paginations.custom import CustomPageNumberPagination
class ProductListApiView(generics.ListAPIView): class ProductListApiView(generics.ListAPIView):
@@ -11,3 +12,4 @@ class ProductListApiView(generics.ListAPIView):
queryset = Product.objects.all() queryset = Product.objects.all()
permission_classes = [HasRolePermission] permission_classes = [HasRolePermission]
required_permissions = [] required_permissions = []
pagination_class = CustomPageNumberPagination

View File

@@ -4,6 +4,7 @@ from rest_framework.response import Response
from core.apps.products.models import Unity from core.apps.products.models import Unity
from core.apps.products.serializers import unity as serializers from core.apps.products.serializers import unity as serializers
from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.accounts.permissions.permissions import HasRolePermission
from core.apps.shared.paginations.custom import CustomPageNumberPagination
class UnityListApiView(generics.ListAPIView): class UnityListApiView(generics.ListAPIView):
@@ -11,3 +12,4 @@ class UnityListApiView(generics.ListAPIView):
queryset = Unity.objects.all() queryset = Unity.objects.all()
permission_classes = [HasRolePermission] permission_classes = [HasRolePermission]
required_permissions = [] required_permissions = []
pagination_class = CustomPageNumberPagination

View File

@@ -4,6 +4,7 @@ from rest_framework.response import Response
from core.apps.projects.models.project import Project, ProjectDepartment from core.apps.projects.models.project import Project, ProjectDepartment
from core.apps.projects.serializers import project as serializers from core.apps.projects.serializers import project as serializers
from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.accounts.permissions.permissions import HasRolePermission
from core.apps.shared.paginations.custom import CustomPageNumberPagination
class ProjectListApiView(generics.ListAPIView): class ProjectListApiView(generics.ListAPIView):
@@ -11,6 +12,7 @@ class ProjectListApiView(generics.ListAPIView):
queryset = Project.objects.all() queryset = Project.objects.all()
permission_classes = [HasRolePermission] permission_classes = [HasRolePermission]
required_permissions = [] required_permissions = []
pagination_class = CustomPageNumberPagination
class ProjectDetailApiView(generics.RetrieveAPIView): class ProjectDetailApiView(generics.RetrieveAPIView):

View File

View File

@@ -0,0 +1,22 @@
from rest_framework.pagination import PageNumberPagination
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
class CustomPageNumberPagination(PageNumberPagination):
page_size = 10
page_query_param = 'page'
page_size_query_param = 'page_size'
max_page_size = 100
def get_paginated_response(self, data):
return Response({
'total': self.page.paginator.count,
'page': self.page.number,
'page_size': self.get_page_size(self.request),
'total_pages': self.page.paginator.num_pages,
'has_next': self.page.has_next(),
'has_previous': self.page.has_previous(),
'results': data
})