Compare commits
11 Commits
76563b3ef0
...
7a88e39b96
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7a88e39b96 | ||
|
|
dc622ce305 | ||
|
|
6e0718c5db | ||
|
|
32d3bea234 | ||
|
|
129827b495 | ||
|
|
50cc555783 | ||
|
|
207363dc6a | ||
| 2a08ad9662 | |||
|
|
5cf4b950fb | ||
|
|
3a08c81ff3 | ||
|
|
4fee037467 |
@@ -13,7 +13,7 @@ from config.env import env
|
|||||||
|
|
||||||
|
|
||||||
def home(request):
|
def home(request):
|
||||||
return HttpResponse("OK: #d4e6d80c86fcf4422f71238c6552dfa4b42f9737")
|
return HttpResponse("OK: #6e0718c5dbc0c00aac698272f4a2cfde074453fa")
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 6.0.4 on 2026-04-23 07:22
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('evaluation', '0031_remove_autoevaluationmodel_object_location_city_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='evaluationrequestmodel',
|
||||||
|
name='is_archive',
|
||||||
|
field=models.BooleanField(default=False, verbose_name='is archive'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 6.0.4 on 2026-04-23 07:24
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('evaluation', '0031_remove_autoevaluationmodel_object_location_city_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='quickevaluationmodel',
|
||||||
|
name='is_archive',
|
||||||
|
field=models.BooleanField(default=False, verbose_name='is archive'),
|
||||||
|
),
|
||||||
|
]
|
||||||
15
core/apps/evaluation/migrations/0033_merge_20260423_1622.py
Normal file
15
core/apps/evaluation/migrations/0033_merge_20260423_1622.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Generated by Django 6.0.4 on 2026-04-23 11:22
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('evaluation', '0032_certificatemodel'),
|
||||||
|
('evaluation', '0032_evaluationrequestmodel_is_archive'),
|
||||||
|
('evaluation', '0032_quickevaluationmodel_is_archive'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
]
|
||||||
@@ -1,11 +1,21 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from django_core.models import AbstractBaseModel
|
from django_core.models import AbstractBaseModel
|
||||||
from model_bakery import baker
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from model_bakery import baker
|
||||||
|
|
||||||
|
|
||||||
class CertificateModel(AbstractBaseModel):
|
class CertificateModel(AbstractBaseModel):
|
||||||
title = models.CharField(verbose_name=_("title"), max_length=255, blank=False, null=False)
|
title = models.CharField(
|
||||||
file_url = models.URLField(verbose_name=_("file url"), max_length=255, blank=False, null=False)
|
verbose_name=_("title"),
|
||||||
|
max_length=255
|
||||||
|
)
|
||||||
|
|
||||||
|
file = models.FileField(
|
||||||
|
verbose_name=_("file"),
|
||||||
|
upload_to="certificates/",
|
||||||
|
blank=True,
|
||||||
|
null=True
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.title
|
return self.title
|
||||||
|
|||||||
@@ -132,6 +132,11 @@ class QuickEvaluationModel(AbstractBaseModel):
|
|||||||
default=QuickEvaluationStatus.CREATED,
|
default=QuickEvaluationStatus.CREATED,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
is_archive = models.BooleanField(
|
||||||
|
verbose_name=_("is archive"),
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"Quick Evaluation {self.pk} by {self.created_by}"
|
return f"Quick Evaluation {self.pk} by {self.created_by}"
|
||||||
|
|
||||||
|
|||||||
@@ -118,6 +118,10 @@ class EvaluationrequestModel(AbstractBaseModel):
|
|||||||
choices=RequestStatus.choices,
|
choices=RequestStatus.choices,
|
||||||
default=RequestStatus.PENDING,
|
default=RequestStatus.PENDING,
|
||||||
)
|
)
|
||||||
|
is_archive = models.BooleanField(
|
||||||
|
verbose_name=_("is archive"),
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"Requests #{self.pk} — {self.get_rate_type_display()}"
|
return f"Requests #{self.pk} — {self.get_rate_type_display()}"
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,25 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from core.apps.evaluation.models import CertificateModel
|
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
|
||||||
fields = [
|
fields = [
|
||||||
"id",
|
"id",
|
||||||
"title",
|
"title",
|
||||||
"file_url"
|
"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
|
||||||
@@ -38,7 +38,8 @@ class BaseQuickevaluationSerializer(serializers.ModelSerializer):
|
|||||||
"state_car_name",
|
"state_car_name",
|
||||||
"created_at",
|
"created_at",
|
||||||
"distance_covered",
|
"distance_covered",
|
||||||
"tex_passport_serie_num"
|
"tex_passport_serie_num",
|
||||||
|
"is_archive"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -125,3 +126,8 @@ class CreateQuickevaluationSerializer(serializers.ModelSerializer):
|
|||||||
if request and request.user and request.user.is_authenticated:
|
if request and request.user and request.user.is_authenticated:
|
||||||
validated_data["created_by"] = request.user
|
validated_data["created_by"] = request.user
|
||||||
return super().create(validated_data)
|
return super().create(validated_data)
|
||||||
|
|
||||||
|
|
||||||
|
class ArchiveQuickevaluationSerializer(serializers.Serializer):
|
||||||
|
id = serializers.IntegerField(required=True)
|
||||||
|
is_archive = serializers.BooleanField(required=True)
|
||||||
@@ -55,6 +55,7 @@ class BaseEvaluationrequestSerializer(serializers.ModelSerializer):
|
|||||||
"user",
|
"user",
|
||||||
"created_at",
|
"created_at",
|
||||||
"updated_at",
|
"updated_at",
|
||||||
|
"is_archive",
|
||||||
]
|
]
|
||||||
|
|
||||||
def get_location(self, obj):
|
def get_location(self, obj):
|
||||||
@@ -183,3 +184,7 @@ class CreateEvaluationrequestSerializer(serializers.ModelSerializer):
|
|||||||
validated_data["location_name"] = str(location_name)
|
validated_data["location_name"] = str(location_name)
|
||||||
validated_data["user"] = self.context["request"].user
|
validated_data["user"] = self.context["request"].user
|
||||||
return super().create(validated_data)
|
return super().create(validated_data)
|
||||||
|
|
||||||
|
class ArchiveEvaluationrequestSerializer(serializers.Serializer):
|
||||||
|
id = serializers.IntegerField(required=True)
|
||||||
|
is_archive = serializers.BooleanField(required=True)
|
||||||
@@ -30,6 +30,8 @@ from .views import (
|
|||||||
TechPassportAPIView,
|
TechPassportAPIView,
|
||||||
EvaluationStatusChange,
|
EvaluationStatusChange,
|
||||||
CertificateView,
|
CertificateView,
|
||||||
|
ArchiveQuickEvaluationView,
|
||||||
|
ArchiveEvaluationrequestView,
|
||||||
)
|
)
|
||||||
|
|
||||||
router = DefaultRouter()
|
router = DefaultRouter()
|
||||||
@@ -76,4 +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("evaluation-request/archive/", ArchiveEvaluationrequestView.as_view(), name="evaluation-request-archive"),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ from rest_framework.viewsets import ModelViewSet
|
|||||||
from core.apps.evaluation.models import CertificateModel
|
from core.apps.evaluation.models import CertificateModel
|
||||||
from core.apps.evaluation.serializers.certificate import BaseCertificateSerializer
|
from core.apps.evaluation.serializers.certificate import BaseCertificateSerializer
|
||||||
from rest_framework.filters import SearchFilter
|
from rest_framework.filters import SearchFilter
|
||||||
|
from rest_framework.parsers import MultiPartParser, FormParser
|
||||||
|
|
||||||
@extend_schema(tags=["Certificate"])
|
@extend_schema(tags=["Certificate"])
|
||||||
class CertificateView(BaseViewSetMixin, ModelViewSet):
|
class CertificateView(BaseViewSetMixin, ModelViewSet):
|
||||||
@@ -12,6 +13,8 @@ class CertificateView(BaseViewSetMixin, ModelViewSet):
|
|||||||
serializer_class = BaseCertificateSerializer
|
serializer_class = BaseCertificateSerializer
|
||||||
permission_classes = [IsAuthenticated]
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
|
parser_classes = [MultiPartParser, FormParser]
|
||||||
|
|
||||||
filter_backends = [SearchFilter]
|
filter_backends = [SearchFilter]
|
||||||
search_fields = ["title"]
|
search_fields = ["title"]
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.permissions import AllowAny
|
from rest_framework.permissions import IsAuthenticated
|
||||||
from rest_framework.generics import GenericAPIView
|
from rest_framework.generics import GenericAPIView
|
||||||
|
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ from core.services.didox import DidoxService
|
|||||||
|
|
||||||
class DidoxCompanyInfoAPIView(GenericAPIView):
|
class DidoxCompanyInfoAPIView(GenericAPIView):
|
||||||
authentication_classes = []
|
authentication_classes = []
|
||||||
permission_classes = [AllowAny]
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
@extend_schema(
|
@extend_schema(
|
||||||
tags=["Didox"],
|
tags=["Didox"],
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
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, OpenApiResponse
|
||||||
from rest_framework.filters import OrderingFilter, SearchFilter
|
from rest_framework.filters import OrderingFilter, SearchFilter
|
||||||
from rest_framework.parsers import FormParser, MultiPartParser
|
from rest_framework.parsers import FormParser, MultiPartParser
|
||||||
from rest_framework.permissions import AllowAny
|
from rest_framework.permissions import AllowAny, IsAuthenticated
|
||||||
from rest_framework.viewsets import ModelViewSet
|
from rest_framework.viewsets import ModelViewSet
|
||||||
|
from rest_framework.generics import GenericAPIView
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework import status
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
|
|
||||||
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
|
||||||
@@ -12,6 +16,7 @@ from core.apps.evaluation.serializers.quick import (
|
|||||||
CreateQuickevaluationSerializer,
|
CreateQuickevaluationSerializer,
|
||||||
ListQuickevaluationSerializer,
|
ListQuickevaluationSerializer,
|
||||||
RetrieveQuickevaluationSerializer,
|
RetrieveQuickevaluationSerializer,
|
||||||
|
ArchiveQuickevaluationSerializer,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -20,7 +25,7 @@ class QuickEvaluationView(BaseViewSetMixin, ModelViewSet):
|
|||||||
queryset = QuickEvaluationModel.objects.select_related(
|
queryset = QuickEvaluationModel.objects.select_related(
|
||||||
"created_by", "brand", "marka", "color", "fuel_type",
|
"created_by", "brand", "marka", "color", "fuel_type",
|
||||||
"body_type", "state_car", "car_position",
|
"body_type", "state_car", "car_position",
|
||||||
).all()
|
).filter(is_archive=False)
|
||||||
serializer_class = ListQuickevaluationSerializer
|
serializer_class = ListQuickevaluationSerializer
|
||||||
permission_classes = [AllowAny]
|
permission_classes = [AllowAny]
|
||||||
parser_classes = [MultiPartParser, FormParser]
|
parser_classes = [MultiPartParser, FormParser]
|
||||||
@@ -50,3 +55,76 @@ class QuickEvaluationView(BaseViewSetMixin, ModelViewSet):
|
|||||||
"retrieve": RetrieveQuickevaluationSerializer,
|
"retrieve": RetrieveQuickevaluationSerializer,
|
||||||
"create": CreateQuickevaluationSerializer,
|
"create": CreateQuickevaluationSerializer,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@extend_schema(tags=["QuickEvaluation"])
|
||||||
|
class ArchiveQuickEvaluationView(GenericAPIView):
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.request.method == "GET":
|
||||||
|
return ListQuickevaluationSerializer
|
||||||
|
return ArchiveQuickevaluationSerializer
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
tags=["QuickEvaluation"],
|
||||||
|
summary="Get archived quick evaluations list",
|
||||||
|
description="""
|
||||||
|
Returns only archived quick evaluations.
|
||||||
|
|
||||||
|
This endpoint works like quick-evaluation/,
|
||||||
|
but only records with is_archive=True are returned.
|
||||||
|
""",
|
||||||
|
responses={200: ListQuickevaluationSerializer(many=True)},
|
||||||
|
)
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
queryset = QuickEvaluationModel.objects.filter(
|
||||||
|
is_archive=True
|
||||||
|
).order_by("-created_at")
|
||||||
|
|
||||||
|
serializer = self.get_serializer(queryset, many=True)
|
||||||
|
|
||||||
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
tags=["QuickEvaluation"],
|
||||||
|
summary="Archive or unarchive quick evaluation",
|
||||||
|
description="""
|
||||||
|
Update archive status for quick evaluation.
|
||||||
|
|
||||||
|
- is_archive=true → archive
|
||||||
|
- is_archive=false → remove from archive
|
||||||
|
""",
|
||||||
|
request=ArchiveQuickevaluationSerializer,
|
||||||
|
responses={
|
||||||
|
200: OpenApiResponse(
|
||||||
|
description="Archive status updated successfully"
|
||||||
|
),
|
||||||
|
400: OpenApiResponse(
|
||||||
|
description="Validation error"
|
||||||
|
),
|
||||||
|
404: OpenApiResponse(
|
||||||
|
description="Quick evaluation not found"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
serializer = self.get_serializer(data=request.data)
|
||||||
|
serializer.is_valid(raise_exception=True)
|
||||||
|
|
||||||
|
validated_data = serializer.validated_data
|
||||||
|
|
||||||
|
obj = get_object_or_404(
|
||||||
|
QuickEvaluationModel,
|
||||||
|
id=validated_data["id"]
|
||||||
|
)
|
||||||
|
|
||||||
|
obj.is_archive = validated_data["is_archive"]
|
||||||
|
obj.save(update_fields=["is_archive"])
|
||||||
|
|
||||||
|
return Response(
|
||||||
|
{
|
||||||
|
"success": True,
|
||||||
|
"message": "Archive status updated successfully"
|
||||||
|
},
|
||||||
|
status=status.HTTP_200_OK
|
||||||
|
)
|
||||||
@@ -17,8 +17,11 @@ from core.apps.evaluation.serializers.request import (
|
|||||||
CreateEvaluationrequestSerializer,
|
CreateEvaluationrequestSerializer,
|
||||||
ListEvaluationrequestSerializer,
|
ListEvaluationrequestSerializer,
|
||||||
RetrieveEvaluationrequestSerializer,
|
RetrieveEvaluationrequestSerializer,
|
||||||
|
ArchiveEvaluationrequestSerializer,
|
||||||
)
|
)
|
||||||
from core.apps.evaluation.choices.request import RequestStatus
|
from core.apps.evaluation.choices.request import RequestStatus
|
||||||
|
from rest_framework.generics import GenericAPIView
|
||||||
|
from drf_spectacular.utils import OpenApiResponse
|
||||||
|
|
||||||
|
|
||||||
# class RequestPagination(PageNumberPagination):
|
# class RequestPagination(PageNumberPagination):
|
||||||
@@ -171,4 +174,77 @@ class EvaluationStatusChange(APIView):
|
|||||||
'success': True,
|
'success': True,
|
||||||
'status': evaluation.status,
|
'status': evaluation.status,
|
||||||
'id': evaluation.pk
|
'id': evaluation.pk
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@extend_schema(tags=["EvaluationRequest"])
|
||||||
|
class ArchiveEvaluationrequestView(GenericAPIView):
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.request.method == "GET":
|
||||||
|
return ListEvaluationrequestSerializer
|
||||||
|
return ArchiveEvaluationrequestSerializer
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
tags=["EvaluationRequest"],
|
||||||
|
summary="Get archived evaluation requests list",
|
||||||
|
description="""
|
||||||
|
Returns only archived evaluation requests.
|
||||||
|
|
||||||
|
This endpoint works like evaluation-request/,
|
||||||
|
but only records with is_archive=True are returned.
|
||||||
|
""",
|
||||||
|
responses={200: ListEvaluationrequestSerializer(many=True)},
|
||||||
|
)
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
queryset = EvaluationrequestModel.objects.filter(
|
||||||
|
is_archive=True
|
||||||
|
).order_by("-created_at")
|
||||||
|
|
||||||
|
serializer = self.get_serializer(queryset, many=True)
|
||||||
|
|
||||||
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
tags=["EvaluationRequest"],
|
||||||
|
summary="Archive or unarchive evaluation request",
|
||||||
|
description="""
|
||||||
|
Update archive status for evaluation request.
|
||||||
|
|
||||||
|
- is_archive=true → archive
|
||||||
|
- is_archive=false → remove from archive
|
||||||
|
""",
|
||||||
|
request=ArchiveEvaluationrequestSerializer,
|
||||||
|
responses={
|
||||||
|
200: OpenApiResponse(
|
||||||
|
description="Archive status updated successfully"
|
||||||
|
),
|
||||||
|
400: OpenApiResponse(
|
||||||
|
description="Validation error"
|
||||||
|
),
|
||||||
|
404: OpenApiResponse(
|
||||||
|
description="Evaluation request not found"
|
||||||
|
),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
serializer = self.get_serializer(data=request.data)
|
||||||
|
serializer.is_valid(raise_exception=True)
|
||||||
|
|
||||||
|
validated_data = serializer.validated_data
|
||||||
|
|
||||||
|
obj = get_object_or_404(
|
||||||
|
EvaluationrequestModel,
|
||||||
|
id=validated_data["id"]
|
||||||
|
)
|
||||||
|
|
||||||
|
obj.is_archive = validated_data["is_archive"]
|
||||||
|
obj.save(update_fields=["is_archive"])
|
||||||
|
|
||||||
|
return Response(
|
||||||
|
{
|
||||||
|
"success": True,
|
||||||
|
"message": "Archive status updated successfully"
|
||||||
|
},
|
||||||
|
status=status.HTTP_200_OK
|
||||||
|
)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.permissions import AllowAny
|
from rest_framework.permissions import IsAuthenticated
|
||||||
from rest_framework.generics import GenericAPIView
|
from rest_framework.generics import GenericAPIView
|
||||||
|
|
||||||
from drf_spectacular.utils import (
|
from drf_spectacular.utils import (
|
||||||
@@ -14,7 +14,7 @@ from ..serializers import TechPassportSerializer
|
|||||||
|
|
||||||
class TechPassportAPIView(GenericAPIView):
|
class TechPassportAPIView(GenericAPIView):
|
||||||
authentication_classes = []
|
authentication_classes = []
|
||||||
permission_classes = [AllowAny]
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
@extend_schema(
|
@extend_schema(
|
||||||
tags=["Tech Passport"],
|
tags=["Tech Passport"],
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ services:
|
|||||||
max-file: "5"
|
max-file: "5"
|
||||||
|
|
||||||
web:
|
web:
|
||||||
image: husanjon/sifatbaho:107
|
image: husanjon/sifatbaho:111
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
@@ -129,7 +129,7 @@ services:
|
|||||||
max-file: "5"
|
max-file: "5"
|
||||||
|
|
||||||
celery:
|
celery:
|
||||||
image: husanjon/sifatbaho:107
|
image: husanjon/sifatbaho:111
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
|
|||||||
Reference in New Issue
Block a user