From 049cd6ff258cc48c82467ac69e4391f94a1468c4 Mon Sep 17 00:00:00 2001 From: Shaxobff Date: Thu, 23 Apr 2026 13:54:31 +0500 Subject: [PATCH] /api/v1/admin-user/list/ edit va post --- core/apps/accounts/serializers/user.py | 10 +++++ core/apps/accounts/urls.py | 5 ++- core/apps/accounts/views/user.py | 44 +++++++++++++++++-- .../serializers/auto/AutoEvaluation.py | 15 ++++--- core/apps/evaluation/urls.py | 3 +- core/apps/evaluation/views/auto.py | 18 ++++++-- core/apps/evaluation/views/request.py | 1 + 7 files changed, 82 insertions(+), 14 deletions(-) diff --git a/core/apps/accounts/serializers/user.py b/core/apps/accounts/serializers/user.py index 4f3276e..9ba1eb8 100644 --- a/core/apps/accounts/serializers/user.py +++ b/core/apps/accounts/serializers/user.py @@ -30,3 +30,13 @@ class UserUpdateSerializer(serializers.ModelSerializer): "last_name", "avatar" ] +class UserCreateSerializer(serializers.ModelSerializer): + class Meta: + model = get_user_model() + fields = [ + "phone", + "first_name", + "last_name", + "password", + "role" + ] \ No newline at end of file diff --git a/core/apps/accounts/urls.py b/core/apps/accounts/urls.py index f7a1e2d..fb662b4 100644 --- a/core/apps/accounts/urls.py +++ b/core/apps/accounts/urls.py @@ -4,7 +4,8 @@ Accounts app urls from django.urls import path, include from rest_framework_simplejwt import views as jwt_views -from .views import RegisterView, ResetPasswordView, MeView, ChangePasswordView, UserListApiView, AdminUserListApiView +from .views import RegisterView, ResetPasswordView, MeView, ChangePasswordView, UserListApiView, AdminUserListApiView, \ + UserCreate, UserUpdate from rest_framework.routers import DefaultRouter router = DefaultRouter() @@ -25,4 +26,6 @@ urlpatterns = [ ), path("user/list/", UserListApiView.as_view(), name="user-list"), path("admin-user/list/", AdminUserListApiView.as_view(), name="admin-user-list"), + path("user/create/", UserCreate.as_view(), name="user-create"), + path("user/update/", UserUpdate.as_view(), name="user-update"), ] diff --git a/core/apps/accounts/views/user.py b/core/apps/accounts/views/user.py index f9d4b9e..a9b301e 100644 --- a/core/apps/accounts/views/user.py +++ b/core/apps/accounts/views/user.py @@ -1,15 +1,17 @@ from django.contrib.auth import get_user_model - +from django.shortcuts import get_object_or_404 +from drf_spectacular.utils import extend_schema +from h11 import Response from rest_framework import generics, filters from rest_framework.permissions import IsAuthenticated +from rest_framework.views import APIView -from drf_spectacular.utils import extend_schema - -from core.apps.accounts.serializers.user import UserSerializer from core.apps.accounts.choices.user import RoleChoice +from core.apps.accounts.serializers.user import UserSerializer, UserCreateSerializer User = get_user_model() + @extend_schema(tags=['User']) class UserListApiView(generics.ListAPIView): queryset = User.objects.filter(role=RoleChoice.USER) @@ -29,3 +31,37 @@ class AdminUserListApiView(generics.ListAPIView): permission_classes = [IsAuthenticated] filter_backends = [filters.SearchFilter] search_fields = ['phone', 'first_name', 'last_name'] + + +@extend_schema(tags=['User'], + responses={200: UserSerializer}, + request=UserCreateSerializer) +class UserCreate(APIView): + permission_classes = [IsAuthenticated] + + def post(self, request): + if request.user.role not in (RoleChoice.SUPERUSER, RoleChoice.ADMIN): + return Response({'detail': 'Forbidden'}, status=403) + + serializer = UserCreateSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + serializer.save() + + return Response(serializer.data, status=201) + +@extend_schema(tags=['User'], + responses={200: UserSerializer}, + request=UserCreateSerializer) +class UserUpdate(APIView): + permission_classes = [IsAuthenticated] + + def put(self, request, pk): + if request.user.role not in (RoleChoice.SUPERUSER, RoleChoice.ADMIN): + return Response({'detail': 'Forbidden'}, status=403) + + user = get_object_or_404(User, pk=pk) + serializer = UserCreateSerializer(user, data=request.data) + serializer.is_valid(raise_exception=True) + serializer.save() + + return Response(serializer.data, status=200) \ No newline at end of file diff --git a/core/apps/evaluation/serializers/auto/AutoEvaluation.py b/core/apps/evaluation/serializers/auto/AutoEvaluation.py index fcd4d6e..137278f 100644 --- a/core/apps/evaluation/serializers/auto/AutoEvaluation.py +++ b/core/apps/evaluation/serializers/auto/AutoEvaluation.py @@ -1,4 +1,5 @@ import re + from django.contrib.auth import get_user_model from rest_framework import serializers @@ -358,8 +359,12 @@ class AutoEvaluationAppraisersSerializer(serializers.Serializer): data['users'] = users return data - -class AutoEvaluationSerializer(ModelSerializer): - class Meta: - model = AutoEvaluationModel - fields = ("brand", "brand_model", "year", "color", "transmission", "condition", "fuel_type", "mileage") +class AutoEvaluationSerializer(serializers.Serializer): + brand = serializers.CharField() + brand_model = serializers.CharField() + year = serializers.CharField() + color = serializers.CharField() + transmission = serializers.CharField() + condition = serializers.CharField() + fuel_type = serializers.CharField() + mileage = serializers.CharField() \ No newline at end of file diff --git a/core/apps/evaluation/urls.py b/core/apps/evaluation/urls.py index ab62e18..4786343 100644 --- a/core/apps/evaluation/urls.py +++ b/core/apps/evaluation/urls.py @@ -54,7 +54,6 @@ router.register("vehicle", VehicleView, basename="vehicle") router.register("valuation", ValuationView, basename="valuation") router.register("property-owner", PropertyOwnerView, basename="property-owner") router.register("customer", CustomerView, basename="customer") -router.register("auto-evaluation-request", AutoEvaluationRequestView, basename="auto") urlpatterns = [ path("", include(router.urls)), path("auto-evaluation/appraisers/", include( @@ -77,4 +76,6 @@ urlpatterns = [ ), path("evaluation-request//change-status/", EvaluationStatusChange.as_view(), name="evaluation-change-status"), + path("auto-evaluation-request/", AutoEvaluationRequestView.as_view(), + name="evaluation-request-price-estimate"), ] diff --git a/core/apps/evaluation/views/auto.py b/core/apps/evaluation/views/auto.py index 6e42239..1cd8e74 100644 --- a/core/apps/evaluation/views/auto.py +++ b/core/apps/evaluation/views/auto.py @@ -1,17 +1,20 @@ +import requests from django.db.models import Q -from django_core.mixins import BaseViewSetMixin from django.shortcuts import get_object_or_404 +from django_core.mixins import BaseViewSetMixin from django_filters.rest_framework import DjangoFilterBackend from drf_spectacular.utils import extend_schema, OpenApiParameter from rest_framework.filters import OrderingFilter, SearchFilter -from rest_framework.permissions import AllowAny, IsAuthenticated -from rest_framework.viewsets import ModelViewSet from rest_framework.generics import GenericAPIView +from rest_framework.permissions import AllowAny, IsAuthenticated from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework.viewsets import ModelViewSet from core.apps.accounts.serializers.user import UserSerializer from core.apps.evaluation.filters.auto import AutoevaluationFilter from core.apps.evaluation.models import AutoEvaluationModel +from core.apps.evaluation.serializers import AutoEvaluationSerializer from core.apps.evaluation.serializers.auto import ( CreateAutoevaluationSerializer, ListAutoevaluationSerializer, @@ -155,7 +158,16 @@ class AutoEvaluationListAppraisersView(GenericAPIView): except Exception as e: return Response({"error": str(e)}, status=500) + + +@extend_schema( + tags=["AutoEvaluation"], + request=AutoEvaluationSerializer, + ) class AutoEvaluationRequestView(APIView): + authentication_classes = [] + permission_classes = [AllowAny] + def post(self, request): serializer = AutoEvaluationSerializer(data=request.data) diff --git a/core/apps/evaluation/views/request.py b/core/apps/evaluation/views/request.py index 1548049..37104f8 100644 --- a/core/apps/evaluation/views/request.py +++ b/core/apps/evaluation/views/request.py @@ -11,6 +11,7 @@ from rest_framework.response import Response from rest_framework.views import APIView from rest_framework import status +from core.apps.accounts.choices import RoleChoice from core.apps.evaluation.filters.request import EvaluationrequestFilter from core.apps.evaluation.models import EvaluationrequestModel from core.apps.evaluation.serializers.request import (