13 Commits

Author SHA1 Message Date
xoliqberdiyev
51b3535a80 write 2026-05-04 17:29:20 +05:00
xoliqberdiyev
c88ea1aa77 Merge branch 'main' of https://gitea.felixits.uz/sifatbaho/backend-v1 into behruz 2026-05-04 14:47:05 +05:00
github-actions[bot]
581021cbb7 🔄 Update image to 150 [CI SKIP] 2026-05-04 05:38:53 +00:00
62f65385e1 fix: DB_HOST=postgres (stack.yaml service nomi bilan mos)
All checks were successful
Deploy to Production / build-and-deploy (push) Successful in 2m13s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 10:37:11 +05:00
github-actions[bot]
76d2fe5090 🔄 Update image to 149 [CI SKIP] 2026-05-04 05:14:11 +00:00
92d23901a1 ci cd uchun test commit
All checks were successful
Deploy to Production / build-and-deploy (push) Successful in 4m28s
2026-05-04 10:12:19 +05:00
github-actions[bot]
42987e4154 🔄 Update image to 148 [CI SKIP] 2026-05-04 04:50:59 +00:00
84b14da3f4 ci cd uchun test commit
All checks were successful
Deploy to Production / build-and-deploy (push) Successful in 2m10s
2026-05-04 09:49:08 +05:00
xoliqberdiyev
cb53924f9b change 2026-04-30 16:33:00 +05:00
github-actions[bot]
f53125cfdc 🔄 Update image to 147 [CI SKIP] 2026-04-30 11:05:42 +00:00
65ab51e652 Merge pull request 'update' (#128) from shaxob into main
All checks were successful
Deploy to Production / build-and-deploy (push) Successful in 2m11s
Reviewed-on: #128
2026-04-30 11:03:51 +00:00
2997810fae Merge pull request 'behruz' (#129) from behruz into main
Some checks failed
Deploy to Production / build-and-deploy (push) Has been cancelled
Reviewed-on: #129
2026-04-30 11:03:44 +00:00
Shaxobff
c29546a04b update 2026-04-30 11:11:12 +05:00
13 changed files with 128 additions and 23 deletions

View File

@@ -23,7 +23,7 @@ DB_ENGINE=django.db.backends.postgresql_psycopg2
DB_NAME=django DB_NAME=django
DB_USER=postgres DB_USER=postgres
DB_PASSWORD=2309 DB_PASSWORD=2309
DB_HOST=db DB_HOST=postgres
DB_PORT=5432 DB_PORT=5432
# Cache # Cache

View File

@@ -151,6 +151,11 @@ jobs:
git fetch origin main git fetch origin main
git reset --hard origin/main git reset --hard origin/main
cp .env.example .env if [ ! -f .env ]; then
cp .env.example .env
echo ".env yaratildi, production qiymatlarini kiriting!"
fi
export PORT=8085 export PORT=8085
docker pull ${{ secrets.DOCKER_USERNAME }}/${{ env.PROJECT_NAME }}:${{ github.run_number }}
docker stack deploy -c stack.yaml ${{ env.PROJECT_NAME }} --with-registry-auth docker stack deploy -c stack.yaml ${{ env.PROJECT_NAME }} --with-registry-auth

View File

@@ -13,7 +13,7 @@ from config.env import env
def home(request): def home(request):
return HttpResponse("OK: #3781ce29e5447f1473964c4c47fbdef2a38c6751") return HttpResponse("OK: #62f65385e1dada519459965e9e24cfdd20a41e26")
urlpatterns = [ urlpatterns = [

View File

@@ -0,0 +1,15 @@
from rest_framework.exceptions import PermissionDenied
from rest_framework.permissions import BasePermission
from core.apps.accounts.choices import RoleChoice
class IsAdminRole(BasePermission):
def has_permission(self, request, view):
if not request.user.is_authenticated:
return False
if request.user.role != RoleChoice.ADMIN:
raise PermissionDenied("Only admin can access this")
return True

View File

@@ -27,7 +27,7 @@ urlpatterns = [
path("", include(router.urls)), path("", include(router.urls)),
path("auth/token/", jwt_views.TokenObtainPairView.as_view(), name="token_obtain_pair"), path("auth/token/", jwt_views.TokenObtainPairView.as_view(), name="token_obtain_pair"),
path("auth/token/verify/", jwt_views.TokenVerifyView.as_view(), name="token_verify"), path("auth/token/verify/", jwt_views.TokenVerifyView.as_view(), name="token_verify"),
path("auth/token/refresh/",jwt_views.TokenRefreshView.as_view()), path("auth/token/refresh/", jwt_views.TokenRefreshView.as_view()),
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/", AdminCreateAPIView.as_view(), name="user-create"), path("admin/create/", AdminCreateAPIView.as_view(), name="user-create"),

View File

@@ -87,14 +87,8 @@ class DeleteAdminUserApiView(APIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
def delete(self, request, pk): def delete(self, request, pk):
if request.user.role != RoleChoice.SUPERUSER:
return Response({'detail': 'Forbidden'}, status=403)
user = get_object_or_404(User, pk=pk) user = get_object_or_404(User, pk=pk)
if user.role != RoleChoice.ADMIN:
return Response({'detail': 'This user is not an admin'}, status=400)
user.delete() user.delete()
return Response(status=204) return Response(status=204)
@@ -106,6 +100,7 @@ class UserDetailAPIView(generics.RetrieveAPIView):
class AdminPermissionsAPIView(generics.GenericAPIView): class AdminPermissionsAPIView(generics.GenericAPIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
queryset = User.objects.all()
def get(self, request): def get(self, request):
if request.user.role.name != RoleChoice.ADMIN: if request.user.role.name != RoleChoice.ADMIN:

View File

@@ -321,6 +321,7 @@ class AutoEvaluationAppraisersSerializer(serializers.Serializer):
data['users'] = users data['users'] = users
return data return data
class AutoEvaluationSerializer(serializers.Serializer): class AutoEvaluationSerializer(serializers.Serializer):
brand = serializers.CharField() brand = serializers.CharField()
brand_model = serializers.CharField() brand_model = serializers.CharField()
@@ -331,7 +332,58 @@ class AutoEvaluationSerializer(serializers.Serializer):
fuel_type = serializers.CharField() fuel_type = serializers.CharField()
mileage = serializers.CharField() mileage = serializers.CharField()
class AutoEvaluationModelSerializer(serializers.ModelSerializer): class AutoEvaluationModelSerializer(serializers.ModelSerializer):
user = serializers.StringRelatedField(read_only=True)
appraisers = serializers.PrimaryKeyRelatedField(
many=True,
queryset=User.objects.all(),
required=False
)
class Meta: class Meta:
model = AutoEvaluationModel model = AutoEvaluationModel
fields = "__all__" fields = ("tex_passport_file",
"registration_number",
"contract_date",
"object_inspection_date",
"rate_date",
"rate_report_date",
"object_type",
"object_owner_type",
"object_owner_individual_person_f_name",
"object_owner_individual_person_l_name",
"object_owner_individual_person_p_name",
"object_owner_individual_person_passport_num",
"object_owner_legal_entity",
"object_owner_legal_inn",
"value_determined",
"rate_type",
"tex_passport_serie_num",
"tex_passport_gived_date",
"tex_passport_gived_location",
"car_type",
"car_wheel",
"car_brand",
"car_model",
"car_number",
"manufacture_year",
"car_dvigatel_number",
"car_color",
"rating_goal",
"status",
"is_archived",
"created_at",
"updated_at",
)
read_only_fields = (
"id",
"created_at",
"updated_at",
)

View File

@@ -131,4 +131,39 @@ class CreateQuickevaluationSerializer(serializers.ModelSerializer):
class QuickEvaluationModelSerializer(serializers.ModelSerializer): class QuickEvaluationModelSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = QuickEvaluationModel model = QuickEvaluationModel
fields = '__all__' fields = (
"id",
"created_by",
"brand",
"marka",
"car_position",
"body_type",
"color",
"fuel_type",
"state_car",
"tex_passport_serie_num",
"tech_passport_issued_date",
"tech_passport_issued_place",
"car_type",
"distance_covered",
"vin_number",
"car_number",
"car_manufactured_date",
"engine_number",
"estimated_price",
"status",
"is_archive",
"created_at",
"updated_at",
)
read_only_fields = (
"id",
"created_at",
"updated_at",
)

View File

@@ -11,7 +11,7 @@ from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ModelViewSet
from core.apps.accounts.choices import RoleChoice from core.apps.accounts.permissions import IsAdminRole
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
@@ -177,13 +177,14 @@ class AutoEvaluationArchiveAPIView(APIView):
status=200 status=200
) )
@extend_schema(tags=["AutoEvaluation"]) @extend_schema(tags=["AutoEvaluation"])
class AdminEvaluationsAPIView(generics.GenericAPIView): class AdminEvaluationsAPIView(generics.GenericAPIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated, IsAdminRole]
queryset = AutoEvaluationModel.objects.all()
serializer_class = AutoEvaluationModel
def get(self, request): def get(self, request):
if request.user.role != RoleChoice.ADMIN:
return Response({'detail': 'Forbidden'}, status=403)
auto_eval = AutoEvaluationModel.objects.filter( auto_eval = AutoEvaluationModel.objects.filter(
created_by=self.request.user created_by=self.request.user
).select_related('appraisers').distinct() ).select_related('appraisers').distinct()

View File

@@ -16,7 +16,7 @@ from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ModelViewSet
from core.apps.accounts.choices import RoleChoice from core.apps.accounts.permissions import IsAdminRole
# core apps # core apps
from core.apps.evaluation.filters.quick import QuickevaluationFilter from core.apps.evaluation.filters.quick import QuickevaluationFilter
from core.apps.evaluation.models import QuickEvaluationModel from core.apps.evaluation.models import QuickEvaluationModel
@@ -88,11 +88,11 @@ class QuickEvaluationArchivedListAPIView(ListAPIView):
@extend_schema(tags=["QuickEvaluation"]) @extend_schema(tags=["QuickEvaluation"])
class AdminQuickEvalAPIView(generics.GenericAPIView): class AdminQuickEvalAPIView(generics.GenericAPIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated, IsAdminRole]
queryset = QuickEvaluationModel.objects.all()
serializer_class = QuickEvaluationModelSerializer
def get(self, request): def get(self, request):
if request.user.role != RoleChoice.ADMIN:
return Response({'detail': 'Forbidden'}, status=403)
quick_eval = QuickEvaluationModel.objects.filter( quick_eval = QuickEvaluationModel.objects.filter(
created_by=self.request.user created_by=self.request.user
).select_related('created_by').distinct() ).select_related('created_by').distinct()

View File

@@ -2,7 +2,7 @@ from rest_framework import serializers
from core.apps.tasks.serializers.comment import CommentSerializer from core.apps.tasks.serializers.comment import CommentSerializer
from core.apps.tasks.serializers.task import TaskSerializer from core.apps.tasks.serializers.task import TaskSerializer
from core.apps.tasks.models import Column, Task from core.apps.tasks.models import Column
class BoardTaskSerializer(TaskSerializer): class BoardTaskSerializer(TaskSerializer):

View File

@@ -5,6 +5,8 @@ from core.apps.tasks.serializers.board import BoardSerializer
from core.apps.tasks.models import Column from core.apps.tasks.models import Column
#test commit
class BoardListView(generics.ListAPIView): class BoardListView(generics.ListAPIView):
queryset = Column.objects.order_by('id') queryset = Column.objects.order_by('id')
serializer_class = BoardSerializer serializer_class = BoardSerializer

View File

@@ -84,7 +84,7 @@ services:
max-file: "5" max-file: "5"
web: web:
image: husanjon/sifatbaho:145 image: husanjon/sifatbaho:150
env_file: env_file:
- .env - .env
environment: environment:
@@ -129,7 +129,7 @@ services:
max-file: "5" max-file: "5"
celery: celery:
image: husanjon/sifatbaho:145 image: husanjon/sifatbaho:150
env_file: env_file:
- .env - .env
environment: environment: