Compare commits
9 Commits
1ff23af8bf
...
behruz
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51b3535a80 | ||
|
|
c88ea1aa77 | ||
|
|
581021cbb7 | ||
| 62f65385e1 | |||
|
|
76d2fe5090 | ||
| 92d23901a1 | |||
|
|
42987e4154 | ||
| 84b14da3f4 | |||
|
|
cb53924f9b |
@@ -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
|
||||||
|
|||||||
5
.github/workflows/deploy.yaml
vendored
5
.github/workflows/deploy.yaml
vendored
@@ -151,6 +151,11 @@ jobs:
|
|||||||
git fetch origin main
|
git fetch origin main
|
||||||
git reset --hard origin/main
|
git reset --hard origin/main
|
||||||
|
|
||||||
|
if [ ! -f .env ]; then
|
||||||
cp .env.example .env
|
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
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from config.env import env
|
|||||||
|
|
||||||
|
|
||||||
def home(request):
|
def home(request):
|
||||||
return HttpResponse("OK: #65ab51e65224a92a4b6d488d3e8f9b21d3256876")
|
return HttpResponse("OK: #62f65385e1dada519459965e9e24cfdd20a41e26")
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
from django.db import models
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
|
||||||
|
|
||||||
|
|
||||||
class EvaluationCategory(models.TextChoices):
|
|
||||||
AUTO = "auto_transport", _("Avtotransport")
|
|
||||||
REAL_ESTATE = "real estate", _("ko'chmas mulk")
|
|
||||||
EQUIPMENT = "equipment", _("uskuna va jihozlar")
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# Generated by Django 5.2.7 on 2026-05-01 06:45
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('evaluation', '0038_evaluationrequestmodel_distance_covered_and_more'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Bonus',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('updated_at', models.DateTimeField(auto_now=True)),
|
|
||||||
('bonus_type', models.CharField(choices=[('lightweight_auto', 'Yengil automobil'), ('truck_car', 'Yuk automobil'), ('special_tech', 'Maxsus texnika')], max_length=50)),
|
|
||||||
('percentage', models.FloatField()),
|
|
||||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
||||||
('price', models.FloatField()),
|
|
||||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bonuses', to=settings.AUTH_USER_MODEL)),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'abstract': False,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# Generated by Django 5.2.7 on 2026-05-01 11:43
|
|
||||||
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('evaluation', '0039_bonus'),
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='BaseValueBonus',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
||||||
('updated_at', models.DateTimeField(auto_now=True)),
|
|
||||||
('base_price', models.DecimalField(decimal_places=2, max_digits=12)),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'abstract': False,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='BonusType',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
||||||
('updated_at', models.DateTimeField(auto_now=True)),
|
|
||||||
('name', models.CharField(max_length=255)),
|
|
||||||
('category', models.CharField(choices=[('auto_transport', 'Avtotransport'), ('real estate', "ko'chmas mulk"), ('equipment', 'uskuna va jihozlar')], max_length=50)),
|
|
||||||
('percentage', models.PositiveIntegerField()),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'abstract': False,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='EmployeeBonus',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
||||||
('updated_at', models.DateTimeField(auto_now=True)),
|
|
||||||
('percentage', models.PositiveIntegerField()),
|
|
||||||
('bonus_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='evaluation.bonustype')),
|
|
||||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bonuses', to=settings.AUTH_USER_MODEL)),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'unique_together': {('user', 'bonus_type')},
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.DeleteModel(
|
|
||||||
name='Bonus',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# Generated by Django 5.2.7 on 2026-05-01 12:06
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('evaluation', '0040_basevaluebonus_bonustype_employeebonus_delete_bonus'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RenameModel(
|
|
||||||
old_name='BonusType',
|
|
||||||
new_name='BonusCategory',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -9,11 +9,14 @@ from core.apps.evaluation.choices.auto import (
|
|||||||
AutoEvaluationStatus,
|
AutoEvaluationStatus,
|
||||||
AutoObjectType,
|
AutoObjectType,
|
||||||
# FormOwnership,
|
# FormOwnership,
|
||||||
|
LocationConvenience,
|
||||||
|
LocationHighways,
|
||||||
ObjectOwnerType,
|
ObjectOwnerType,
|
||||||
# PropertyRights,
|
# PropertyRights,
|
||||||
# RateType,
|
# RateType,
|
||||||
# ValueDetermined,
|
# ValueDetermined,
|
||||||
)
|
)
|
||||||
|
|
||||||
from .valuation import ValuationModel
|
from .valuation import ValuationModel
|
||||||
from .vehicle import VehicleModel
|
from .vehicle import VehicleModel
|
||||||
|
|
||||||
@@ -241,6 +244,8 @@ class AutoEvaluationModel(AbstractBaseModel):
|
|||||||
default=False,
|
default=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"Auto Evaluation {self.registration_number or self.pk}"
|
return f"Auto Evaluation {self.registration_number or self.pk}"
|
||||||
|
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
from django.db import models
|
|
||||||
from django.db.models.fields import PositiveIntegerField
|
|
||||||
from django_core.models import AbstractBaseModel
|
|
||||||
|
|
||||||
from core.apps.evaluation.choices.bonus import EvaluationCategory
|
|
||||||
|
|
||||||
|
|
||||||
class BaseValueBonus(AbstractBaseModel):
|
|
||||||
base_price = models.DecimalField(max_digits=12, decimal_places=2)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"Base: {self.base_price}"
|
|
||||||
|
|
||||||
|
|
||||||
class BonusCategory(AbstractBaseModel):
|
|
||||||
name = models.CharField(max_length=255)
|
|
||||||
category = models.CharField(
|
|
||||||
max_length=50,
|
|
||||||
choices=EvaluationCategory.choices
|
|
||||||
)
|
|
||||||
percentage = PositiveIntegerField()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.name
|
|
||||||
|
|
||||||
|
|
||||||
class EmployeeBonus(AbstractBaseModel):
|
|
||||||
user = models.ForeignKey("accounts.User", on_delete=models.CASCADE, related_name="bonuses", )
|
|
||||||
bonus_type = models.ForeignKey(BonusCategory, on_delete=models.CASCADE)
|
|
||||||
percentage = models.PositiveIntegerField()
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
unique_together = ("user", "bonus_type")
|
|
||||||
@@ -3,11 +3,12 @@ from django.utils.translation import gettext_lazy as _
|
|||||||
from django_core.models import AbstractBaseModel
|
from django_core.models import AbstractBaseModel
|
||||||
from model_bakery import baker
|
from model_bakery import baker
|
||||||
|
|
||||||
|
|
||||||
|
from .valuation import ValuationModel
|
||||||
from core.apps.evaluation.choices.movable import (
|
from core.apps.evaluation.choices.movable import (
|
||||||
MovablePropertyCategory,
|
MovablePropertyCategory,
|
||||||
MovablePropertyCondition,
|
MovablePropertyCondition,
|
||||||
)
|
)
|
||||||
from .valuation import ValuationModel
|
|
||||||
|
|
||||||
|
|
||||||
class MovablePropertyEvaluationModel(AbstractBaseModel):
|
class MovablePropertyEvaluationModel(AbstractBaseModel):
|
||||||
@@ -50,3 +51,4 @@ class MovablePropertyEvaluationModel(AbstractBaseModel):
|
|||||||
db_table = "MovablePropertyEvaluation"
|
db_table = "MovablePropertyEvaluation"
|
||||||
verbose_name = _("Movable Property Evaluation")
|
verbose_name = _("Movable Property Evaluation")
|
||||||
verbose_name_plural = _("Movable Property Evaluations")
|
verbose_name_plural = _("Movable Property Evaluations")
|
||||||
|
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
from rest_framework import serializers
|
|
||||||
|
|
||||||
from core.apps.evaluation.models.bonus import BonusCategory, EmployeeBonus, BaseValueBonus
|
|
||||||
|
|
||||||
|
|
||||||
class BaseBonusSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = BaseValueBonus
|
|
||||||
fields = 'id', 'base_price'
|
|
||||||
|
|
||||||
def create(self, validated_data):
|
|
||||||
if BaseValueBonus.objects.exists():
|
|
||||||
raise serializers.ValidationError("Base bonus already exists")
|
|
||||||
|
|
||||||
return super().create(validated_data)
|
|
||||||
|
|
||||||
|
|
||||||
class BonusCategorySerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = BonusCategory
|
|
||||||
fields = 'name', 'category', 'percentage'
|
|
||||||
|
|
||||||
|
|
||||||
class BonusCategoryListSerializer(serializers.ModelSerializer):
|
|
||||||
price = serializers.DecimalField(max_digits=12, decimal_places=2)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = BonusCategory
|
|
||||||
fields = 'id', 'name', 'category', 'percentage' , 'price'
|
|
||||||
|
|
||||||
def get_price(self, obj):
|
|
||||||
base_obj = BaseValueBonus.objects.first()
|
|
||||||
if not base_obj:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
return (base_obj.base_price * obj.percentage) / 100
|
|
||||||
|
|
||||||
|
|
||||||
class BonusEmployeeBonusSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = EmployeeBonus
|
|
||||||
fields = 'user', 'bonus_type', 'percentage'
|
|
||||||
|
|
||||||
|
|
||||||
class EmployeeBonusListSerializer(serializers.ModelSerializer):
|
|
||||||
price = serializers.DecimalField(max_digits=12, decimal_places=2)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = EmployeeBonus
|
|
||||||
fields = 'id', 'user', 'bonus_type', 'percentage' , 'price'
|
|
||||||
|
|
||||||
def get_price(self, obj):
|
|
||||||
base_obj = BaseValueBonus.objects.first()
|
|
||||||
if not base_obj:
|
|
||||||
return 0
|
|
||||||
return (base_obj.base_price * obj.percentage) / 100
|
|
||||||
@@ -27,9 +27,6 @@ router.register("valuation", views.ValuationView, basename="valuation")
|
|||||||
router.register("property-owner", views.PropertyOwnerView, basename="property-owner")
|
router.register("property-owner", views.PropertyOwnerView, basename="property-owner")
|
||||||
router.register("customer", views.CustomerView, basename="customer")
|
router.register("customer", views.CustomerView, basename="customer")
|
||||||
router.register("certificate", views.CertificateView, basename="certificate")
|
router.register("certificate", views.CertificateView, basename="certificate")
|
||||||
router.register("bonus-type", views.BonusTypeView, basename="bonus-type")
|
|
||||||
router.register("bonus-employee", views.BonusEmployeeViewSet, basename="bonus-employee")
|
|
||||||
router.register("bonus-base", views.BaseBonusViewSet, basename="bonus-base")
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("", include(router.urls)),
|
path("", include(router.urls)),
|
||||||
|
|||||||
@@ -15,4 +15,3 @@ from .didox import * # noqa
|
|||||||
from .tech_passport import * # noqa
|
from .tech_passport import * # noqa
|
||||||
from .certificate import * # noqa
|
from .certificate import * # noqa
|
||||||
from .avg_cost import *
|
from .avg_cost import *
|
||||||
from .bonus import *
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
from django_core.mixins import BaseViewSetMixin
|
|
||||||
from drf_spectacular.utils import extend_schema
|
|
||||||
from rest_framework import viewsets
|
|
||||||
from rest_framework.permissions import IsAdminUser
|
|
||||||
from rest_framework.viewsets import ModelViewSet
|
|
||||||
|
|
||||||
# core
|
|
||||||
from core.apps.evaluation.models.bonus import BonusCategory, EmployeeBonus, BaseValueBonus
|
|
||||||
from core.apps.evaluation.serializers.bonus.Bonus import BonusCategorySerializer, \
|
|
||||||
BonusCategoryListSerializer, EmployeeBonusListSerializer, BonusEmployeeBonusSerializer, BaseBonusSerializer
|
|
||||||
|
|
||||||
|
|
||||||
@extend_schema(tags=["BaseBonus"])
|
|
||||||
class BaseBonusViewSet(BaseViewSetMixin, viewsets.ModelViewSet):
|
|
||||||
queryset = BaseValueBonus.objects.all()
|
|
||||||
serializer_class = BaseBonusSerializer
|
|
||||||
|
|
||||||
|
|
||||||
@extend_schema(tags=["Bonus-Category"])
|
|
||||||
class BonusTypeView(BaseViewSetMixin, ModelViewSet):
|
|
||||||
queryset = BonusCategory.objects.all()
|
|
||||||
|
|
||||||
serializer_class = BonusCategorySerializer
|
|
||||||
|
|
||||||
action_serializer_class = {
|
|
||||||
'create': BonusCategorySerializer,
|
|
||||||
'update': BonusCategorySerializer,
|
|
||||||
'partial_update': BonusCategorySerializer,
|
|
||||||
'list': BonusCategoryListSerializer,
|
|
||||||
'retrieve': BonusCategoryListSerializer,
|
|
||||||
}
|
|
||||||
|
|
||||||
action_permission_classes = {
|
|
||||||
'create': [IsAdminUser],
|
|
||||||
'update': [IsAdminUser],
|
|
||||||
'partial_update': [IsAdminUser],
|
|
||||||
'destroy': [IsAdminUser],
|
|
||||||
'list': [IsAdminUser],
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class BonusEmployeeViewSet(BaseViewSetMixin, ModelViewSet):
|
|
||||||
queryset = EmployeeBonus.objects.all()
|
|
||||||
serializer_class = BonusEmployeeBonusSerializer
|
|
||||||
|
|
||||||
action_serializer_class = {
|
|
||||||
'create': BonusEmployeeBonusSerializer,
|
|
||||||
'update': BonusEmployeeBonusSerializer,
|
|
||||||
'partial_update': BonusEmployeeBonusSerializer,
|
|
||||||
'list': EmployeeBonusListSerializer,
|
|
||||||
'retrieve': EmployeeBonusListSerializer,
|
|
||||||
}
|
|
||||||
|
|
||||||
action_permission_classes = {
|
|
||||||
'create': [IsAdminUser],
|
|
||||||
'update': [IsAdminUser],
|
|
||||||
'partial_update': [IsAdminUser],
|
|
||||||
'destroy': [IsAdminUser],
|
|
||||||
'list': [IsAdminUser],
|
|
||||||
}
|
|
||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ services:
|
|||||||
max-file: "5"
|
max-file: "5"
|
||||||
|
|
||||||
web:
|
web:
|
||||||
image: husanjon/sifatbaho:147
|
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:147
|
image: husanjon/sifatbaho:150
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
environment:
|
||||||
|
|||||||
Reference in New Issue
Block a user