10 Commits

Author SHA1 Message Date
komoliddin
fb275a091a Add view for crud user 2026-04-24 11:21:01 +05:00
github-actions[bot]
190480b6f7 🔄 Update image to 114 [CI SKIP] 2026-04-24 05:16:20 +00:00
1a985ffa4b Merge pull request 'Refactor URL patterns for evaluation archiving and remove unused file_url field from BaseCertificateSerializer' (#94) from certificate into main
All checks were successful
Deploy to Production / build-and-deploy (push) Successful in 1m57s
Reviewed-on: #94
2026-04-24 05:14:45 +00:00
komoliddin
3b62c5a7bf Refactor URL patterns for evaluation archiving and remove unused file_url field from BaseCertificateSerializer 2026-04-24 10:14:01 +05:00
github-actions[bot]
07f8d55966 🔄 Update image to 113 [CI SKIP] 2026-04-23 14:02:58 +00:00
b0b4ccfeee Merge pull request 'makemigrations' (#93) from certificate into main
All checks were successful
Deploy to Production / build-and-deploy (push) Successful in 3m52s
Reviewed-on: #93
2026-04-23 14:01:14 +00:00
komoliddin
ccefe9c119 Merge branch 'main' of https://gitea.felixits.uz/sifatbaho/backend-v1 into certificate 2026-04-23 19:00:42 +05:00
komoliddin
6456283f72 makemigrations 2026-04-23 18:59:06 +05:00
github-actions[bot]
6eed2d998e 🔄 Update image to 112 [CI SKIP] 2026-04-23 13:07:08 +00:00
2c82691166 Merge pull request 'Enhance Certificate model and serializer to support file uploads and URL generation' (#92) from certificate into main
All checks were successful
Deploy to Production / build-and-deploy (push) Successful in 4m27s
Reviewed-on: #92
2026-04-23 13:05:27 +00:00
9 changed files with 61 additions and 21 deletions

View File

@@ -13,7 +13,7 @@ from config.env import env
def home(request): def home(request):
return HttpResponse("OK: #6e0718c5dbc0c00aac698272f4a2cfde074453fa") return HttpResponse("OK: #1a985ffa4b785b63a71b9e0cdd78042c3fcda239")
urlpatterns = [ urlpatterns = [

View File

@@ -30,3 +30,16 @@ class UserUpdateSerializer(serializers.ModelSerializer):
"last_name", "last_name",
"avatar" "avatar"
] ]
class AdminUserSerializer(serializers.ModelSerializer):
avatar = serializers.SerializerMethodField(method_name='get_avatar')
class Meta:
model = get_user_model()
fields = "__all__"
def get_avatar(self, obj):
request = self.context.get('request')
if obj.avatar:
return request.build_absolute_uri(obj.avatar.url)
return None

View File

@@ -4,7 +4,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,AdminUserView
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
router = DefaultRouter() router = DefaultRouter()
@@ -12,6 +12,7 @@ router.register("auth", RegisterView, basename="auth")
router.register("auth", ResetPasswordView, basename="reset-password") router.register("auth", ResetPasswordView, basename="reset-password")
router.register("auth", MeView, basename="me") router.register("auth", MeView, basename="me")
router.register("auth", ChangePasswordView, basename="change-password") router.register("auth", ChangePasswordView, basename="change-password")
router.register("user", AdminUserView, basename="user-crud")
urlpatterns = [ urlpatterns = [

View File

@@ -5,8 +5,11 @@ from rest_framework.permissions import IsAuthenticated
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from core.apps.accounts.serializers.user import UserSerializer from core.apps.accounts.serializers.user import UserSerializer, AdminUserSerializer
from core.apps.accounts.choices.user import RoleChoice from core.apps.accounts.choices.user import RoleChoice
from django_core.mixins import BaseViewSetMixin
from rest_framework.viewsets import ModelViewSet
User = get_user_model() User = get_user_model()
@@ -29,3 +32,16 @@ class AdminUserListApiView(generics.ListAPIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
filter_backends = [filters.SearchFilter] filter_backends = [filters.SearchFilter]
search_fields = ['phone', 'first_name', 'last_name'] search_fields = ['phone', 'first_name', 'last_name']
@extend_schema(tags=["User"],request=AdminUserSerializer)
class AdminUserView(BaseViewSetMixin, ModelViewSet):
queryset = User.objects.filter(role=RoleChoice.USER)
serializer_class = AdminUserSerializer
permission_classes = [IsAuthenticated]
filter_backends = [filters.SearchFilter]
search_fields = ['phone', 'first_name', 'last_name']
def serializer_context(self):
return self.serializer_class(context={"request": self.request})

View File

@@ -0,0 +1,22 @@
# Generated by Django 6.0.4 on 2026-04-23 13:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('evaluation', '0033_merge_20260423_1622'),
]
operations = [
migrations.RemoveField(
model_name='certificatemodel',
name='file_url',
),
migrations.AddField(
model_name='certificatemodel',
name='file',
field=models.FileField(blank=True, null=True, upload_to='certificates/', verbose_name='file'),
),
]

View File

@@ -3,7 +3,6 @@ from core.apps.evaluation.models import CertificateModel
class BaseCertificateSerializer(serializers.ModelSerializer): class BaseCertificateSerializer(serializers.ModelSerializer):
file_url = serializers.SerializerMethodField()
class Meta: class Meta:
model = CertificateModel model = CertificateModel
@@ -11,15 +10,4 @@ class BaseCertificateSerializer(serializers.ModelSerializer):
"id", "id",
"title", "title",
"file", "file",
"file_url",
] ]
def get_file_url(self, obj):
request = self.context.get("request")
if obj.file:
if request:
return request.build_absolute_uri(obj.file.url)
return obj.file.url
return None

View File

@@ -78,6 +78,6 @@ 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("quick-evaluation/archive/", ArchiveQuickEvaluationView.as_view(), name="quick-evaluation-archive"), path("archive/quick-evaluation/", ArchiveQuickEvaluationView.as_view(), name="quick-evaluation-archive"),
path("evaluation-request/archive/", ArchiveEvaluationrequestView.as_view(), name="evaluation-request-archive"), path("archive/evaluation-request/", ArchiveEvaluationrequestView.as_view(), name="evaluation-request-archive"),
] ]

View File

@@ -7,7 +7,7 @@ from core.apps.evaluation.serializers.certificate import BaseCertificateSerializ
from rest_framework.filters import SearchFilter from rest_framework.filters import SearchFilter
from rest_framework.parsers import MultiPartParser, FormParser from rest_framework.parsers import MultiPartParser, FormParser
@extend_schema(tags=["Certificate"]) @extend_schema(tags=["Certificate"],request=BaseCertificateSerializer)
class CertificateView(BaseViewSetMixin, ModelViewSet): class CertificateView(BaseViewSetMixin, ModelViewSet):
queryset = CertificateModel.objects.all() queryset = CertificateModel.objects.all()
serializer_class = BaseCertificateSerializer serializer_class = BaseCertificateSerializer

View File

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