2 Commits

Author SHA1 Message Date
Shaxobff
84cc11fe2a UPDATE 2026-04-24 16:21:19 +05:00
Shaxobff
deebae384c UPDATE 2026-04-24 16:00:17 +05:00
7 changed files with 80 additions and 59 deletions

View File

@@ -18,7 +18,7 @@ class User(auth_models.AbstractUser):
default=RoleChoice.USER, default=RoleChoice.USER,
) )
avatar = models.ImageField(upload_to="avatars/", null=True, blank=True) avatar = models.ImageField(upload_to="avatars/", null=True, blank=True)
role_permission = models.ForeignKey(Role, on_delete=models.SET_NULL, null=True) permission = models.ForeignKey(Role, on_delete=models.SET_NULL, null=True)
USERNAME_FIELD = "phone" USERNAME_FIELD = "phone"
objects = UserManager() objects = UserManager()

View File

@@ -5,7 +5,7 @@ Accounts app urls
from django.urls import path, include from django.urls import path, include
from rest_framework_simplejwt import views as jwt_views 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, \
AdminUpdate, AdminCreate AdminUpdateAPIView, AdminCreateAPIView
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
router = DefaultRouter() router = DefaultRouter()
@@ -26,6 +26,6 @@ urlpatterns = [
), ),
path("user/list/", UserListApiView.as_view(), name="user-list"), path("user/list/", UserListApiView.as_view(), name="user-list"),
path("admin-user/list/", AdminUserListApiView.as_view(), name="admin-user-list"), path("admin-user/list/", AdminUserListApiView.as_view(), name="admin-user-list"),
path("admin/create/", AdminCreate.as_view(), name="user-create"), path("admin/create/", AdminCreateAPIView.as_view(), name="user-create"),
path("admin/update/", AdminUpdate.as_view(), name="user-update"), path("admin/update/", AdminUpdateAPIView.as_view(), name="user-update"),
] ]

View File

@@ -1,9 +1,9 @@
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from h11 import Response
from rest_framework import generics, filters from rest_framework import generics, filters
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from core.apps.accounts.choices.user import RoleChoice from core.apps.accounts.choices.user import RoleChoice
@@ -36,7 +36,7 @@ class AdminUserListApiView(generics.ListAPIView):
@extend_schema(tags=['User'], @extend_schema(tags=['User'],
responses={200: UserSerializer}, responses={200: UserSerializer},
request=UserCreateSerializer) request=UserCreateSerializer)
class AdminCreate(APIView): class AdminCreateAPIView(APIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
def post(self, request): def post(self, request):
@@ -52,7 +52,8 @@ class AdminCreate(APIView):
@extend_schema(tags=['User'], @extend_schema(tags=['User'],
responses={200: UserSerializer}, responses={200: UserSerializer},
request=UserCreateSerializer) request=UserCreateSerializer)
class AdminUpdate(APIView):
class AdminUpdateAPIView(APIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
def put(self, request, pk): def put(self, request, pk):

View File

@@ -1,21 +1,60 @@
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _
from pydantic import BaseModel
class PermissionToAction(BaseModel):
name = models.CharField(max_length=200)
code = models.CharField(max_length=100, unique=True)
def __str__(self):
return f"{self.name} - {self.code}"
class Meta:
verbose_name = _('Harakatlar uchun ruxsatnoma')
verbose_name_plural = _('Harakatlar uchun ruxsatnomalar')
class PermissionToTab(BaseModel):
name = models.CharField(max_length=200)
code = models.CharField(max_length=100, unique=True)
permission_to_actions = models.ManyToManyField(
PermissionToAction, related_name='permission_to_tabs'
)
def __str__(self):
return f'{self.name} - {self.code}'
class Meta:
verbose_name = _("Bo'lim uchun ruxsatnoma")
verbose_name_plural = _("Bo'lim uchun ruxsatnomalar")
class Permission(BaseModel):
name = models.CharField(max_length=200)
code = models.CharField(max_length=100, unique=True)
permission_tab = models.ManyToManyField(PermissionToTab, related_name='permissions')
def __str__(self):
return f'{self.name} - {self.code}'
class Meta:
verbose_name = _('Sahifa uchun ruxsatnoma')
verbose_name_plural = _('Sahifa uchun ruxsatnomalar')
class Role(models.Model): class Role(models.Model):
name = models.CharField(max_length=50) name = models.CharField(max_length=200, unique=True)
permissions = models.ManyToManyField(Permission, related_name='roles', blank=True)
permission_to_tabs = models.ManyToManyField(PermissionToTab, related_name='roles', blank=True)
permission_to_actions = models.ManyToManyField(
PermissionToAction, related_name='roles', blank=True
)
comment = models.CharField(max_length=200, null=True, blank=True)
def __str__(self):
return self.name
class Permission(models.Model): class Meta:
class Action(models.TextChoices): verbose_name = _('Rol')
CREATE = "create_avto_valuation" verbose_name_plural = _('Rollar')
CREATE_FAST = "create_fast_auto_valuation"
CREATE_AVTO_APPEAL = "create_avto_appeal"
page = models.CharField(max_length=100)
section = models.CharField(max_length=100, null=True, blank=True)
action = models.CharField(max_length=20, choices=Action.choices)
class RolePermission(models.Model):
role = models.ForeignKey(Role, on_delete=models.CASCADE)
permission = models.ForeignKey(Permission, on_delete=models.CASCADE)

View File

@@ -29,7 +29,7 @@ from .views import (
DidoxCompanyInfoAPIView, DidoxCompanyInfoAPIView,
TechPassportAPIView, TechPassportAPIView,
EvaluationStatusChange, EvaluationStatusChange,
AutoEvaluationRequestView, GetArchivedEvaluation GetArchivedEvaluationListAPIView
) )
router = DefaultRouter() router = DefaultRouter()
@@ -76,8 +76,10 @@ urlpatterns = [
), ),
path("evaluation-request/<int:pk>/change-status/", EvaluationStatusChange.as_view(), path("evaluation-request/<int:pk>/change-status/", EvaluationStatusChange.as_view(),
name="evaluation-change-status"), name="evaluation-change-status"),
path("auto-evaluation-request/", AutoEvaluationRequestView.as_view(),
name="evaluation-request-price-estimate"), path("archived-evaluvation/", GetArchivedEvaluationListAPIView.as_view(),
path("archived-evaluvation/", GetArchivedEvaluation.as_view(), name="archived-evaluation"),
path("auto-evaluvation-change-status/<int:pk>", GetArchivedEvaluationListAPIView.as_view(),
name="archived-evaluation"), name="archived-evaluation"),
] ]

View File

@@ -1,4 +1,3 @@
import requests
from django.db.models import Q from django.db.models import Q
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django_core.mixins import BaseViewSetMixin from django_core.mixins import BaseViewSetMixin
@@ -14,7 +13,6 @@ from rest_framework.viewsets import ModelViewSet
from core.apps.accounts.serializers.user import UserSerializer from core.apps.accounts.serializers.user import UserSerializer
from core.apps.evaluation.filters.auto import AutoevaluationFilter from core.apps.evaluation.filters.auto import AutoevaluationFilter
from core.apps.evaluation.models import AutoEvaluationModel from core.apps.evaluation.models import AutoEvaluationModel
from core.apps.evaluation.serializers import AutoEvaluationSerializer
from core.apps.evaluation.serializers.auto import ( from core.apps.evaluation.serializers.auto import (
CreateAutoevaluationSerializer, CreateAutoevaluationSerializer,
ListAutoevaluationSerializer, ListAutoevaluationSerializer,
@@ -159,37 +157,20 @@ class AutoEvaluationListAppraisersView(GenericAPIView):
return Response({"error": str(e)}, status=500) 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)
if serializer.is_valid():
data = serializer.validated_data
url = "https://uzxarid.felixits.uz/api/v1/ad/price-estimate/"
response = requests.post(url, json=data)
return Response({
"success": True,
"external_status": response.status_code,
"data": response.json(),
})
return Response({"error": serializer.errors}, status=400)
@extend_schema(tags=["AutoEvaluation"]) @extend_schema(tags=["AutoEvaluation"])
class GetArchivedEvaluation(ListAPIView): class GetArchivedEvaluationListAPIView(ListAPIView):
authentication_classes = []
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
def get_queryset(self): def get_queryset(self):
return AutoEvaluationModel.objects.filter(is_archived=True) return AutoEvaluationModel.objects.filter(is_archived=True)
@extend_schema(tags=["AutoEvaluation"])
class ArchivedEvaluation(APIView):
permission_classes = [IsAuthenticated]
def post(self, request, pk):
auto_evaluation = get_object_or_404(AutoEvaluationModel, pk=pk)
auto_evaluation.is_archived = request.data["is_archived"]
auto_evaluation.save()
return Response({"success": True}, status=200)

View File

@@ -1,17 +1,16 @@
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django_core.mixins import BaseViewSetMixin from django_core.mixins import BaseViewSetMixin
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from rest_framework import status
from rest_framework.filters import OrderingFilter, SearchFilter from rest_framework.filters import OrderingFilter, SearchFilter
from rest_framework.pagination import PageNumberPagination from rest_framework.permissions import IsAuthenticated
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework import status from rest_framework.viewsets import ModelViewSet
from core.apps.accounts.choices import RoleChoice from core.apps.accounts.choices import RoleChoice
from core.apps.evaluation.choices.request import RequestStatus
from core.apps.evaluation.filters.request import EvaluationrequestFilter from core.apps.evaluation.filters.request import EvaluationrequestFilter
from core.apps.evaluation.models import EvaluationrequestModel from core.apps.evaluation.models import EvaluationrequestModel
from core.apps.evaluation.serializers.request import ( from core.apps.evaluation.serializers.request import (
@@ -19,7 +18,6 @@ from core.apps.evaluation.serializers.request import (
ListEvaluationrequestSerializer, ListEvaluationrequestSerializer,
RetrieveEvaluationrequestSerializer, RetrieveEvaluationrequestSerializer,
) )
from core.apps.evaluation.choices.request import RequestStatus
# class RequestPagination(PageNumberPagination): # class RequestPagination(PageNumberPagination):