From c902a09c7b2757e1e00d9e015bb084aee5291d90 Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Thu, 7 Aug 2025 17:29:05 +0500 Subject: [PATCH] change serializer fields --- core/apps/projects/admin/__init__.py | 3 +- core/apps/projects/admin/project_estimate.py | 18 +++++ ...ctestimate_estimateproduct_estimatework.py | 65 +++++++++++++++++++ core/apps/projects/models/__init__.py | 3 +- core/apps/projects/models/project.py | 2 +- core/apps/projects/models/project_estimate.py | 50 +++++++++++++- core/apps/projects/serializers/project.py | 8 +-- .../projects/serializers/project_estimate.py | 11 ++++ core/apps/projects/views/project_estimate.py | 5 ++ 9 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 core/apps/projects/admin/project_estimate.py create mode 100644 core/apps/projects/migrations/0013_projectestimate_estimateproduct_estimatework.py create mode 100644 core/apps/projects/serializers/project_estimate.py create mode 100644 core/apps/projects/views/project_estimate.py diff --git a/core/apps/projects/admin/__init__.py b/core/apps/projects/admin/__init__.py index 6fec5d2..5e55997 100644 --- a/core/apps/projects/admin/__init__.py +++ b/core/apps/projects/admin/__init__.py @@ -1,2 +1,3 @@ from .project import * -from .builder import * \ No newline at end of file +from .builder import * +from .project_estimate import * \ No newline at end of file diff --git a/core/apps/projects/admin/project_estimate.py b/core/apps/projects/admin/project_estimate.py new file mode 100644 index 0000000..a30afe3 --- /dev/null +++ b/core/apps/projects/admin/project_estimate.py @@ -0,0 +1,18 @@ +from django.contrib import admin + +from core.apps.projects.models.project_estimate import ProjectEstimate, EstimateWork, EstimateProduct + + +@admin.register(ProjectEstimate) +class ProjectEstimateAdmin(admin.ModelAdmin): + list_display = ['id', 'number', 'name'] + + +@admin.register(EstimateWork) +class EstimateWorkAdmin(admin.ModelAdmin): + list_display = ['id', 'number', 'name', 'price', 'quantity'] + + +@admin.register(EstimateProduct) +class EstimateProductAdmin(admin.ModelAdmin): + list_display = ['id', 'product', 'price', 'quantity'] diff --git a/core/apps/projects/migrations/0013_projectestimate_estimateproduct_estimatework.py b/core/apps/projects/migrations/0013_projectestimate_estimateproduct_estimatework.py new file mode 100644 index 0000000..62e461c --- /dev/null +++ b/core/apps/projects/migrations/0013_projectestimate_estimateproduct_estimatework.py @@ -0,0 +1,65 @@ +# Generated by Django 5.2.4 on 2025-08-07 16:01 + +import django.db.models.deletion +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('products', '0004_product_type'), + ('projects', '0012_project_is_archive'), + ] + + operations = [ + migrations.CreateModel( + name='ProjectEstimate', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('number', models.PositiveIntegerField(default=1)), + ('name', models.CharField(max_length=200)), + ], + options={ + 'verbose_name': 'Loyiha smetasi', + 'verbose_name_plural': 'Loyiha smetalari', + }, + ), + migrations.CreateModel( + name='EstimateProduct', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('quantity', models.PositiveIntegerField(default=1)), + ('price', models.PositiveBigIntegerField(blank=True, null=True)), + ('date', models.DateField(blank=True, null=True)), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='estimate_products', to='products.product')), + ('unity', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='estimate_products', to='products.unity')), + ], + options={ + 'verbose_name': 'Smeta mahsuloti', + 'verbose_name_plural': 'Smeta mahsulotlari', + }, + ), + migrations.CreateModel( + name='EstimateWork', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('number', models.PositiveIntegerField(default=1)), + ('name', models.CharField(max_length=200)), + ('quantity', models.PositiveIntegerField(default=1)), + ('price', models.PositiveBigIntegerField(blank=True, null=True)), + ('date', models.DateField(blank=True, null=True)), + ('unity', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='estimate_works', to='products.unity')), + ('estimate', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='estimate_works', to='projects.projectestimate')), + ], + options={ + 'verbose_name': 'Smeta ishlar', + }, + ), + ] diff --git a/core/apps/projects/models/__init__.py b/core/apps/projects/models/__init__.py index 6fec5d2..5e55997 100644 --- a/core/apps/projects/models/__init__.py +++ b/core/apps/projects/models/__init__.py @@ -1,2 +1,3 @@ from .project import * -from .builder import * \ No newline at end of file +from .builder import * +from .project_estimate import * \ No newline at end of file diff --git a/core/apps/projects/models/project.py b/core/apps/projects/models/project.py index ce2a252..1550e6c 100644 --- a/core/apps/projects/models/project.py +++ b/core/apps/projects/models/project.py @@ -79,7 +79,7 @@ class Project(BaseModel): CashTransaction, related_name='projects' ) currency = models.CharField(choices=[('usd', 'usd'),('uzs','uzs')], max_length=3, default='uzs') - benifit_plan = models.PositiveBigIntegerField(null=True) + benifit_plan = models.PositiveBigIntegerField(null=True, blank=True) status = models.CharField(max_length=20, choices=STATUS, default='PLANNED') is_archive = models.BooleanField(default=False) diff --git a/core/apps/projects/models/project_estimate.py b/core/apps/projects/models/project_estimate.py index 4b46667..e6c13d9 100644 --- a/core/apps/projects/models/project_estimate.py +++ b/core/apps/projects/models/project_estimate.py @@ -3,7 +3,55 @@ from django.utils.translation import gettext_lazy as _ from core.apps.shared.models import BaseModel from core.apps.projects.models import Project +from core.apps.products.models import Unity, Product class ProjectEstimate(BaseModel): - ... \ No newline at end of file + number = models.PositiveIntegerField(default=1) + name = models.CharField(max_length=200) + + def __str__(self): + return f'{self.number}.{self.name}' + + class Meta: + verbose_name = _('Loyiha smetasi') + verbose_name_plural = _('Loyiha smetalari') + + +class EstimateWork(BaseModel): + number = models.PositiveIntegerField(default=1) + name = models.CharField(max_length=200) + quantity = models.PositiveIntegerField(default=1) + unity = models.ForeignKey( + Unity, on_delete=models.SET_NULL, null=True, related_name='estimate_works' + ) + price = models.PositiveBigIntegerField(null=True, blank=True) + estimate = models.ForeignKey( + ProjectEstimate, on_delete=models.CASCADE, related_name='estimate_works' + ) + date = models.DateField(null=True, blank=True) + + def __str__(self): + return f"{self.number}.{self.name}" + + class Meta: + verbose_name = _("Smeta ish") + verbose_name = _("Smeta ishlar") + + +class EstimateProduct(BaseModel): + product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='estimate_products') + quantity = models.PositiveIntegerField(default=1) + price = models.PositiveBigIntegerField() + unity = models.ForeignKey( + Unity, on_delete=models.SET_NULL, null=True, related_name='estimate_products' + ) + price = models.PositiveBigIntegerField(null=True, blank=True) + date = models.DateField(null=True, blank=True) + + def __str__(self): + return f'{self.product} - {self.price}' + + class Meta: + verbose_name = _('Smeta mahsuloti') + verbose_name_plural = _('Smeta mahsulotlari') \ No newline at end of file diff --git a/core/apps/projects/serializers/project.py b/core/apps/projects/serializers/project.py index 903e33e..9df4b8b 100644 --- a/core/apps/projects/serializers/project.py +++ b/core/apps/projects/serializers/project.py @@ -89,8 +89,8 @@ class ProjectCreateSerializer(serializers.Serializer): wherehouse = serializers.ListSerializer(child=serializers.UUIDField()) cash_transaction = serializers.ListSerializer(child=serializers.UUIDField()) - currency = serializers.ChoiceField(choices=[('uzs', 'uzs'), ('usd', 'usd')]) - benifit_plan = serializers.IntegerField() + currency = serializers.ChoiceField(choices=[('uzs', 'uzs'), ('usd', 'usd')], required=False) + benifit_plan = serializers.IntegerField(required=False) def create(self, validated_data): boss_ids = validated_data.pop('boss') @@ -165,8 +165,8 @@ class ProjectFolderProjectCreateSerializer(serializers.Serializer): wherehouse = serializers.ListSerializer(child=serializers.UUIDField()) cash_transaction = serializers.ListSerializer(child=serializers.UUIDField()) - currency = serializers.ChoiceField(choices=[('uzs', 'uzs'), ('usd', 'usd')]) - benifit_plan = serializers.IntegerField() + currency = serializers.ChoiceField(choices=[('uzs', 'uzs'), ('usd', 'usd')], required=False) + benifit_plan = serializers.IntegerField(required=False) def validate(self, data): folder = ProjectFolder.objects.filter(id=data['folder_id']).first() diff --git a/core/apps/projects/serializers/project_estimate.py b/core/apps/projects/serializers/project_estimate.py new file mode 100644 index 0000000..96fbf3f --- /dev/null +++ b/core/apps/projects/serializers/project_estimate.py @@ -0,0 +1,11 @@ +from rest_framework import serializers + +from core.apps.projects.models.project_estimate import EstimateProduct, EstimateWork, ProjectEstimate + + +class ProjectEstimateListSerializer(serializers.ModelSerializer): + class Meta: + model = ProjectEstimate + fields = [ + 'id', 'number', 'name' + ] diff --git a/core/apps/projects/views/project_estimate.py b/core/apps/projects/views/project_estimate.py new file mode 100644 index 0000000..98d3edf --- /dev/null +++ b/core/apps/projects/views/project_estimate.py @@ -0,0 +1,5 @@ +from rest_framework import generics, views +from rest_framework.response import Response + +from core.apps.accounts.permissions.permissions import HasRolePermission +from core.apps.projects.models.project_estimate import ProjectEstimate, EstimateProduct, EstimateWork