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': 'settings', 'name': 'all settings access'},
{'code': 'product_folder', 'name': 'all access to product folder'}, {'code': 'product_folder', 'name': 'all access to product folder'},
{'code': 'product', 'name': 'all access to product'}, {'code': 'product', 'name': 'all access to product'},
{'code': 'order', 'name': 'all access to orders'},
] ]
for perm in permissions: 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_folder=validated_data.get('project_folder'),
project=validated_data.get('project'), project=validated_data.get('project'),
quantity=validated_data.get('quantity'), quantity=validated_data.get('quantity'),
date=validated_data.get('date') date=validated_data.get('date'),
employee=self.context.get('user'),
) )
return order return order
@@ -82,3 +83,11 @@ class OrderListSerializer(serializers.ModelSerializer):
'id', 'product', 'unity', 'quantity', 'project', 'project_folder', 'id', 'product', 'unity', 'quantity', 'project', 'project_folder',
'wherehouse', 'date', 'status', 'employee' '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('list/', order_views.OrderListApiView.as_view()),
path('create/', order_views.OrderCreateApiView.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 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.serializers import order as serializers
from core.apps.orders.models import Order 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.accounts.permissions.permissions import HasRolePermission
from core.apps.shared.paginations.custom import CustomPageNumberPagination from core.apps.shared.paginations.custom import CustomPageNumberPagination
@@ -13,19 +18,43 @@ class OrderListApiView(generics.ListAPIView):
'product', 'unity', 'project', 'project_folder', 'wherehouse' 'product', 'unity', 'project', 'project_folder', 'wherehouse'
) )
permission_classes = [HasRolePermission] permission_classes = [HasRolePermission]
required_permissions = [] required_permissions = ['order']
pagination_class = CustomPageNumberPagination 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): class OrderCreateApiView(generics.CreateAPIView):
serializer_class = serializers.OrderCreateSerializer serializer_class = serializers.OrderCreateSerializer
queryset = Order.objects.all() queryset = Order.objects.all()
permission_classes = [HasRolePermission] permission_classes = [HasRolePermission]
required_permissions = [] required_permissions = ['order']
def get_serializer_context(self): def get_serializer_context(self):
context = super().get_serializer_context() context = super().get_serializer_context()
context['user'] = self.request.user context['user'] = self.request.user
return context 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-cacheops==7.2
django-cors-headers==4.7.0 django-cors-headers==4.7.0
django-environ==0.12.0 django-environ==0.12.0
django-filter==25.1
django-jazzmin==3.0.1 django-jazzmin==3.0.1
django-modeltranslation==0.19.16 django-modeltranslation==0.19.16
django-redis==6.0.0 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'?