From b480f978136130c7ed25463402efacc017e62c8a Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Mon, 18 Aug 2025 10:25:10 +0500 Subject: [PATCH] add order apis --- .../management/commands/seed_permissions.py | 1 + core/apps/orders/filters/order.py | 12 + core/apps/orders/serializers/order.py | 11 +- core/apps/orders/urls.py | 2 + core/apps/orders/views/order.py | 39 +- requirements.txt | 1 + resources/logs/django.log.2025-08-16 | 389 ++++++++++++++++++ 7 files changed, 449 insertions(+), 6 deletions(-) create mode 100644 core/apps/orders/filters/order.py create mode 100644 resources/logs/django.log.2025-08-16 diff --git a/core/apps/accounts/management/commands/seed_permissions.py b/core/apps/accounts/management/commands/seed_permissions.py index 1bba4db..1b16ec1 100644 --- a/core/apps/accounts/management/commands/seed_permissions.py +++ b/core/apps/accounts/management/commands/seed_permissions.py @@ -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: diff --git a/core/apps/orders/filters/order.py b/core/apps/orders/filters/order.py new file mode 100644 index 0000000..917540b --- /dev/null +++ b/core/apps/orders/filters/order.py @@ -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' + ] + \ No newline at end of file diff --git a/core/apps/orders/serializers/order.py b/core/apps/orders/serializers/order.py index 827893f..7569f1a 100644 --- a/core/apps/orders/serializers/order.py +++ b/core/apps/orders/serializers/order.py @@ -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', ] \ No newline at end of file diff --git a/core/apps/orders/urls.py b/core/apps/orders/urls.py index 929f16f..d770aa6 100644 --- a/core/apps/orders/urls.py +++ b/core/apps/orders/urls.py @@ -8,6 +8,8 @@ urlpatterns = [ [ path('list/', order_views.OrderListApiView.as_view()), path('create/', order_views.OrderCreateApiView.as_view()), + path('/update/', order_views.OrderUpdateApiView.as_view()), + path('/delete/', order_views.OrderDeleteApiView.as_view()), ] )), ] \ No newline at end of file diff --git a/core/apps/orders/views/order.py b/core/apps/orders/views/order.py index 4112766..49ff0da 100644 --- a/core/apps/orders/views/order.py +++ b/core/apps/orders/views/order.py @@ -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 - \ No newline at end of file + + +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) + + diff --git a/requirements.txt b/requirements.txt index 10caba4..5a62723 100644 --- a/requirements.txt +++ b/requirements.txt @@ -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 diff --git a/resources/logs/django.log.2025-08-16 b/resources/logs/django.log.2025-08-16 new file mode 100644 index 0000000..0518abd --- /dev/null +++ b/resources/logs/django.log.2025-08-16 @@ -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'?