add order apis

This commit is contained in:
behruz-dev
2025-08-18 10:25:10 +05:00
parent 331a79112d
commit b480f97813
7 changed files with 449 additions and 6 deletions

View File

@@ -18,6 +18,7 @@ class Command(BaseCommand):
{'code': 'settings', 'name': 'all settings access'},
{'code': 'product_folder', 'name': 'all access to product folder'},
{'code': 'product', 'name': 'all access to product'},
{'code': 'order', 'name': 'all access to orders'},
]
for perm in permissions:

View File

@@ -0,0 +1,12 @@
import django_filters
from core.apps.orders.models.order import Order
class OrderFilter(django_filters.FilterSet):
class Meta:
model = Order
fields = [
'wherehouse', 'project', 'project_folder'
]

View File

@@ -64,7 +64,8 @@ class OrderCreateSerializer(serializers.Serializer):
project_folder=validated_data.get('project_folder'),
project=validated_data.get('project'),
quantity=validated_data.get('quantity'),
date=validated_data.get('date')
date=validated_data.get('date'),
employee=self.context.get('user'),
)
return order
@@ -81,4 +82,12 @@ class OrderListSerializer(serializers.ModelSerializer):
fields = [
'id', 'product', 'unity', 'quantity', 'project', 'project_folder',
'wherehouse', 'date', 'status', 'employee'
]
class OrderUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = Order
fields = [
'product', 'unity', 'quantity', 'project', 'project_folder', 'wherehouse', 'date',
]

View File

@@ -8,6 +8,8 @@ urlpatterns = [
[
path('list/', order_views.OrderListApiView.as_view()),
path('create/', order_views.OrderCreateApiView.as_view()),
path('<uuid:id>/update/', order_views.OrderUpdateApiView.as_view()),
path('<uuid:id>/delete/', order_views.OrderDeleteApiView.as_view()),
]
)),
]

View File

@@ -1,8 +1,13 @@
from rest_framework import generics, status
from django.shortcuts import get_object_or_404
from rest_framework import generics, status, views, filters
from rest_framework.response import Response
from django_filters.rest_framework import DjangoFilterBackend
from core.apps.orders.serializers import order as serializers
from core.apps.orders.models import Order
from core.apps.orders.filters.order import OrderFilter
from core.apps.accounts.permissions.permissions import HasRolePermission
from core.apps.shared.paginations.custom import CustomPageNumberPagination
@@ -13,19 +18,43 @@ class OrderListApiView(generics.ListAPIView):
'product', 'unity', 'project', 'project_folder', 'wherehouse'
)
permission_classes = [HasRolePermission]
required_permissions = []
required_permissions = ['order']
pagination_class = CustomPageNumberPagination
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
search_fields = [
'product__name', 'unity__value', 'project_folder__name', 'project__name',
'wherehouse__name', 'date', 'quantity', 'employee__full_name', 'employee__phone_number'
]
filterset_class = [OrderFilter]
class OrderCreateApiView(generics.CreateAPIView):
serializer_class = serializers.OrderCreateSerializer
queryset = Order.objects.all()
permission_classes = [HasRolePermission]
required_permissions = []
required_permissions = ['order']
def get_serializer_context(self):
context = super().get_serializer_context()
context['user'] = self.request.user
return context
class OrderUpdateApiView(generics.UpdateAPIView):
serializer_class = serializers.OrderUpdateSerializer
queryset = Order.objects.all()
permission_classes = [HasRolePermission]
required_permissions = ['order']
lookup_field = 'id'
class OrderDeleteApiView(views.APIView):
permission_classes = [HasRolePermission]
required_permissions = ['order']
def delete(self, request, id):
order = get_object_or_404(Order, id=id)
order.delete()
return Response({"success": True, "message": "Deleted!"}, status=204)

View File

@@ -10,6 +10,7 @@ Django==5.2.4
django-cacheops==7.2
django-cors-headers==4.7.0
django-environ==0.12.0
django-filter==25.1
django-jazzmin==3.0.1
django-modeltranslation==0.19.16
django-redis==6.0.0

View File

@@ -0,0 +1,389 @@
ERROR 2025-08-16 11:23:37,974 log Internal Server Error: /api/v1/products/product/list/
Traceback (most recent call last):
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 489, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.13/site-packages/django/core/handlers/exception.py", line 42, in inner
response = await get_response(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 489, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.13/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
response = await wrapped_callback(
^^^^^^^^^^^^^^^^^^^^^^^
request, *callback_args, **callback_kwargs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 439, in __call__
ret = await asyncio.shield(exec_coro)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 493, in thread_handler
return func(*args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
return view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/django/views/generic/base.py", line 105, in view
return self.dispatch(request, *args, **kwargs)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 515, in dispatch
response = self.handle_exception(exc)
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 475, in handle_exception
self.raise_uncaught_exception(exc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 486, in raise_uncaught_exception
raise exc
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 512, in dispatch
response = handler(request, *args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/rest_framework/generics.py", line 203, in get
return self.list(request, *args, **kwargs)
~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/mixins.py", line 43, in list
return self.get_paginated_response(serializer.data)
^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/serializers.py", line 797, in data
ret = super().data
^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/serializers.py", line 251, in data
self._data = self.to_representation(self.instance)
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/serializers.py", line 716, in to_representation
self.child.to_representation(item) for item in iterable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/serializers.py", line 540, in to_representation
ret[field.field_name] = field.to_representation(attribute)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/fields.py", line 1870, in to_representation
return method(value)
File "/code/core/apps/products/serializers/product.py", line 19, in get_unity
'id': obj.unity.id,
^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'id'
ERROR 2025-08-16 11:27:58,451 log Internal Server Error: /api/v1/products/product/list/
Traceback (most recent call last):
File "/usr/local/lib/python3.13/site-packages/django/db/models/options.py", line 683, in get_field
return self.fields_map[field_name]
~~~~~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 'name'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 489, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.13/site-packages/django/core/handlers/exception.py", line 42, in inner
response = await get_response(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 489, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.13/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
response = await wrapped_callback(
^^^^^^^^^^^^^^^^^^^^^^^
request, *callback_args, **callback_kwargs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 439, in __call__
ret = await asyncio.shield(exec_coro)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 493, in thread_handler
return func(*args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
return view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/django/views/generic/base.py", line 105, in view
return self.dispatch(request, *args, **kwargs)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 515, in dispatch
response = self.handle_exception(exc)
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 475, in handle_exception
self.raise_uncaught_exception(exc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 486, in raise_uncaught_exception
raise exc
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 512, in dispatch
response = handler(request, *args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/rest_framework/generics.py", line 203, in get
return self.list(request, *args, **kwargs)
~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/mixins.py", line 40, in list
page = self.paginate_queryset(queryset)
File "/usr/local/lib/python3.13/site-packages/rest_framework/generics.py", line 175, in paginate_queryset
return self.paginator.paginate_queryset(queryset, self.request, view=self)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/pagination.py", line 211, in paginate_queryset
self.page = paginator.page(page_number)
~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/core/paginator.py", line 89, in page
number = self.validate_number(number)
File "/usr/local/lib/python3.13/site-packages/django/core/paginator.py", line 70, in validate_number
if number > self.num_pages:
^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/utils/functional.py", line 47, in __get__
res = instance.__dict__[self.name] = self.func(instance)
~~~~~~~~~^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/core/paginator.py", line 116, in num_pages
if self.count == 0 and not self.allow_empty_first_page:
^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/utils/functional.py", line 47, in __get__
res = instance.__dict__[self.name] = self.func(instance)
~~~~~~~~~^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/core/paginator.py", line 110, in count
return c()
File "/usr/local/lib/python3.13/site-packages/cacheops/query.py", line 271, in count
return cached_as(self)(lambda: self._no_monkey.count(self))()
~~~~~~~~~^^^^^^
File "/usr/local/lib/python3.13/site-packages/cacheops/query.py", line 64, in cached_as
qs_keys = [qs._cache_key(prefix=False) for qs in querysets]
~~~~~~~~~~~~~^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/cacheops/query.py", line 152, in _cache_key
sql, params = self.query.get_compiler(self.db).as_sql()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/compiler.py", line 766, in as_sql
extra_select, order_by, group_by = self.pre_sql_setup(
~~~~~~~~~~~~~~~~~~^
with_col_aliases=with_col_aliases or bool(combinator),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/compiler.py", line 85, in pre_sql_setup
self.setup_query(with_col_aliases=with_col_aliases)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/compiler.py", line 74, in setup_query
self.select, self.klass_info, self.annotation_col_map = self.get_select(
~~~~~~~~~~~~~~~^
with_col_aliases=with_col_aliases,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/compiler.py", line 252, in get_select
select_mask = self.query.get_select_mask()
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/query.py", line 885, in get_select_mask
return self._get_only_select_mask(opts, mask)
~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/query.py", line 860, in _get_only_select_mask
self._get_only_select_mask(
~~~~~~~~~~~~~~~~~~~~~~~~~~^
related_model._meta, field_mask, field_select_mask
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/query.py", line 854, in _get_only_select_mask
field = opts.get_field(field_name)
File "/usr/local/lib/python3.13/site-packages/django/db/models/options.py", line 685, in get_field
raise FieldDoesNotExist(
"%s has no field named '%s'" % (self.object_name, field_name)
)
django.core.exceptions.FieldDoesNotExist: Unity has no field named 'name'
ERROR 2025-08-16 11:27:59,903 log Internal Server Error: /api/v1/products/product/list/
Traceback (most recent call last):
File "/usr/local/lib/python3.13/site-packages/django/db/models/options.py", line 683, in get_field
return self.fields_map[field_name]
~~~~~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 'name'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 489, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.13/site-packages/django/core/handlers/exception.py", line 42, in inner
response = await get_response(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 489, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.13/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
response = await wrapped_callback(
^^^^^^^^^^^^^^^^^^^^^^^
request, *callback_args, **callback_kwargs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 439, in __call__
ret = await asyncio.shield(exec_coro)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 493, in thread_handler
return func(*args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
return view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/django/views/generic/base.py", line 105, in view
return self.dispatch(request, *args, **kwargs)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 515, in dispatch
response = self.handle_exception(exc)
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 475, in handle_exception
self.raise_uncaught_exception(exc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 486, in raise_uncaught_exception
raise exc
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 512, in dispatch
response = handler(request, *args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/rest_framework/generics.py", line 203, in get
return self.list(request, *args, **kwargs)
~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/mixins.py", line 40, in list
page = self.paginate_queryset(queryset)
File "/usr/local/lib/python3.13/site-packages/rest_framework/generics.py", line 175, in paginate_queryset
return self.paginator.paginate_queryset(queryset, self.request, view=self)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/pagination.py", line 211, in paginate_queryset
self.page = paginator.page(page_number)
~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/core/paginator.py", line 89, in page
number = self.validate_number(number)
File "/usr/local/lib/python3.13/site-packages/django/core/paginator.py", line 70, in validate_number
if number > self.num_pages:
^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/utils/functional.py", line 47, in __get__
res = instance.__dict__[self.name] = self.func(instance)
~~~~~~~~~^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/core/paginator.py", line 116, in num_pages
if self.count == 0 and not self.allow_empty_first_page:
^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/utils/functional.py", line 47, in __get__
res = instance.__dict__[self.name] = self.func(instance)
~~~~~~~~~^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/core/paginator.py", line 110, in count
return c()
File "/usr/local/lib/python3.13/site-packages/cacheops/query.py", line 271, in count
return cached_as(self)(lambda: self._no_monkey.count(self))()
~~~~~~~~~^^^^^^
File "/usr/local/lib/python3.13/site-packages/cacheops/query.py", line 64, in cached_as
qs_keys = [qs._cache_key(prefix=False) for qs in querysets]
~~~~~~~~~~~~~^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/cacheops/query.py", line 152, in _cache_key
sql, params = self.query.get_compiler(self.db).as_sql()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/compiler.py", line 766, in as_sql
extra_select, order_by, group_by = self.pre_sql_setup(
~~~~~~~~~~~~~~~~~~^
with_col_aliases=with_col_aliases or bool(combinator),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/compiler.py", line 85, in pre_sql_setup
self.setup_query(with_col_aliases=with_col_aliases)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/compiler.py", line 74, in setup_query
self.select, self.klass_info, self.annotation_col_map = self.get_select(
~~~~~~~~~~~~~~~^
with_col_aliases=with_col_aliases,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/compiler.py", line 252, in get_select
select_mask = self.query.get_select_mask()
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/query.py", line 885, in get_select_mask
return self._get_only_select_mask(opts, mask)
~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/query.py", line 860, in _get_only_select_mask
self._get_only_select_mask(
~~~~~~~~~~~~~~~~~~~~~~~~~~^
related_model._meta, field_mask, field_select_mask
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/django/db/models/sql/query.py", line 854, in _get_only_select_mask
field = opts.get_field(field_name)
File "/usr/local/lib/python3.13/site-packages/django/db/models/options.py", line 685, in get_field
raise FieldDoesNotExist(
"%s has no field named '%s'" % (self.object_name, field_name)
)
django.core.exceptions.FieldDoesNotExist: Unity has no field named 'name'
ERROR 2025-08-16 11:33:25,683 log Internal Server Error: /api/v1/products/product/df0d43f9-14c2-4db8-a31b-ab49220c0b50/update/
Traceback (most recent call last):
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 489, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.13/site-packages/django/core/handlers/exception.py", line 42, in inner
response = await get_response(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 489, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.13/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
response = await wrapped_callback(
^^^^^^^^^^^^^^^^^^^^^^^
request, *callback_args, **callback_kwargs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 439, in __call__
ret = await asyncio.shield(exec_coro)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 493, in thread_handler
return func(*args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
return view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/django/views/generic/base.py", line 105, in view
return self.dispatch(request, *args, **kwargs)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 515, in dispatch
response = self.handle_exception(exc)
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 475, in handle_exception
self.raise_uncaught_exception(exc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 486, in raise_uncaught_exception
raise exc
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 512, in dispatch
response = handler(request, *args, **kwargs)
File "/code/core/apps/products/views/product.py", line 73, in patch
if serializer.is_valid(raise_exception=True):
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/serializers.py", line 225, in is_valid
self._validated_data = self.run_validation(self.initial_data)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/serializers.py", line 447, in run_validation
value = self.validate(value)
File "/code/core/apps/products/serializers/product.py", line 33, in validate
folder = Folder.objects.filter(id=data['folder_id']).first()
~~~~^^^^^^^^^^^^^
KeyError: 'folder_id'
WARNING 2025-08-16 11:33:54,147 log Bad Request: /api/v1/products/product/df0d43f9-14c2-4db8-a31b-ab49220c0b50/update/
WARNING 2025-08-16 11:36:02,628 log Not Found: /api/v1/products/product/df0d43f9-14c2-4db8-a31b-ab49220c0b50/delete/
WARNING 2025-08-16 11:36:05,795 log Not Found: /api/v1/products/product/df0d43f9-14c2-4db8-a31b-ab49220c0b50/delete/
WARNING 2025-08-16 11:36:06,351 log Not Found: /api/v1/products/product/df0d43f9-14c2-4db8-a31b-ab49220c0b50/delete/
ERROR 2025-08-16 14:32:15,075 log Internal Server Error: /api/v1/products/folder/1d47d62e-f6ba-4816-8fde-a459fb8c107e/products/
Traceback (most recent call last):
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 489, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.13/site-packages/django/core/handlers/exception.py", line 42, in inner
response = await get_response(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 489, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.13/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
response = await wrapped_callback(
^^^^^^^^^^^^^^^^^^^^^^^
request, *callback_args, **callback_kwargs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 439, in __call__
ret = await asyncio.shield(exec_coro)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/concurrent/futures/thread.py", line 59, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.13/site-packages/asgiref/sync.py", line 493, in thread_handler
return func(*args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
return view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.13/site-packages/django/views/generic/base.py", line 105, in view
return self.dispatch(request, *args, **kwargs)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 515, in dispatch
response = self.handle_exception(exc)
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 475, in handle_exception
self.raise_uncaught_exception(exc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 486, in raise_uncaught_exception
raise exc
File "/usr/local/lib/python3.13/site-packages/rest_framework/views.py", line 512, in dispatch
response = handler(request, *args, **kwargs)
File "/code/core/apps/products/views/product.py", line 111, in get
products = Product.objects.filder(folder=folder)
^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Manager' object has no attribute 'filder'. Did you mean: 'filter'?