add finance app
This commit is contained in:
@@ -1 +1,2 @@
|
||||
from .project import *
|
||||
from .project import *
|
||||
from .builder import *
|
||||
9
core/apps/projects/admin/builder.py
Normal file
9
core/apps/projects/admin/builder.py
Normal file
@@ -0,0 +1,9 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from core.apps.projects.models import Builder
|
||||
|
||||
|
||||
@admin.register(Builder)
|
||||
class BuilderAdmin(admin.ModelAdmin):
|
||||
list_display = ['id', 'name']
|
||||
|
||||
@@ -1,24 +1,14 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from core.apps.projects.models.project import ProjectDepartment, Project, ProjectFolder
|
||||
from core.apps.projects.models.project import Project, ProjectFolder
|
||||
|
||||
|
||||
class ProjectDepartmentInline(admin.TabularInline):
|
||||
model = ProjectDepartment
|
||||
extra = 0
|
||||
|
||||
|
||||
@admin.register(Project)
|
||||
class ProjectAdmin(admin.ModelAdmin):
|
||||
list_display = ['name', 'location', 'start_date', 'end_date']
|
||||
search_fields = ['name']
|
||||
inlines = [ProjectDepartmentInline]
|
||||
|
||||
|
||||
@admin.register(ProjectDepartment)
|
||||
class ProjectDepartmentAdmin(admin.ModelAdmin):
|
||||
list_display = ['name', 'project']
|
||||
search_fields = ['name']
|
||||
inlines = []
|
||||
|
||||
|
||||
@admin.register(ProjectFolder)
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
# Generated by Django 5.2.4 on 2025-08-04 11:12
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('orders', '0004_remove_order_project_department_order_project_folder_and_more'),
|
||||
('projects', '0003_alter_project_folder'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.DeleteModel(
|
||||
name='ProjectDepartment',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,77 @@
|
||||
# Generated by Django 5.2.4 on 2025-08-04 11:58
|
||||
|
||||
import django.db.models.deletion
|
||||
import uuid
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('finance', '0001_initial'),
|
||||
('projects', '0004_delete_projectdepartment'),
|
||||
('wherehouse', '0002_stockmovemend'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Builder',
|
||||
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)),
|
||||
('name', models.CharField(max_length=200, unique=True)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Quruvchi',
|
||||
'verbose_name_plural': 'Quruvchilar',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='area',
|
||||
field=models.PositiveBigIntegerField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='benifit_plan',
|
||||
field=models.PositiveBigIntegerField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='boss',
|
||||
field=models.ManyToManyField(related_name='project_bosses', to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='cash_transaction',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='finance.cashtransaction'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='currency',
|
||||
field=models.CharField(choices=[('usd', 'usd'), ('uzs', 'uzs')], default='uzs', max_length=3),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='foreman',
|
||||
field=models.ManyToManyField(related_name='project_foremans', to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='other_members',
|
||||
field=models.ManyToManyField(related_name='project_members', to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='wherehouse',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='wherehouse.wherehouse'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='project',
|
||||
name='builder',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='projects.builder'),
|
||||
),
|
||||
]
|
||||
@@ -1 +1,2 @@
|
||||
from .project import *
|
||||
from .project import *
|
||||
from .builder import *
|
||||
15
core/apps/projects/models/builder.py
Normal file
15
core/apps/projects/models/builder.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from core.apps.shared.models import BaseModel
|
||||
|
||||
|
||||
class Builder(BaseModel):
|
||||
name = models.CharField(max_length=200, unique=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Quruvchi')
|
||||
verbose_name_plural = _('Quruvchilar')
|
||||
@@ -2,6 +2,10 @@ from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from core.apps.shared.models import BaseModel
|
||||
from core.apps.projects.models.builder import Builder
|
||||
from core.apps.accounts.models.user import User
|
||||
from core.apps.wherehouse.models.wherehouse import WhereHouse
|
||||
from core.apps.finance.models import CashTransaction
|
||||
|
||||
|
||||
class ProjectFolder(BaseModel):
|
||||
@@ -23,24 +27,29 @@ class Project(BaseModel):
|
||||
folder = models.ForeignKey(
|
||||
ProjectFolder, on_delete=models.SET_NULL, null=True, blank=True, related_name='projects'
|
||||
)
|
||||
builder = models.ForeignKey(
|
||||
Builder, on_delete=models.CASCADE, related_name='projects', null=True
|
||||
)
|
||||
area = models.PositiveBigIntegerField(null=True)
|
||||
|
||||
# project workers
|
||||
boss = models.ManyToManyField(User, related_name='project_bosses')
|
||||
foreman = models.ManyToManyField(User, related_name='project_foremans')
|
||||
other_members = models.ManyToManyField(User, related_name='project_members')
|
||||
|
||||
# project settings
|
||||
wherehouse = models.ForeignKey(
|
||||
WhereHouse, on_delete=models.CASCADE, related_name='projects', null=True
|
||||
)
|
||||
cash_transaction = models.ForeignKey(
|
||||
CashTransaction, on_delete=models.CASCADE, related_name='projects', null=True
|
||||
)
|
||||
currency = models.CharField(choices=[('usd', 'usd'),('uzs','uzs')], max_length=3, default='uzs')
|
||||
benifit_plan = models.PositiveBigIntegerField(null=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Loyiha')
|
||||
verbose_name_plural = _('Loyihalar')
|
||||
|
||||
|
||||
class ProjectDepartment(BaseModel):
|
||||
project = models.ForeignKey(
|
||||
Project, on_delete=models.CASCADE, related_name='project_departments'
|
||||
)
|
||||
name = models.CharField(max_length=200)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("Loyiha Bo'limi")
|
||||
verbose_name_plural = _("Loyiha Bo'limlari")
|
||||
verbose_name_plural = _('Loyihalar')
|
||||
9
core/apps/projects/serializers/builder.py
Normal file
9
core/apps/projects/serializers/builder.py
Normal file
@@ -0,0 +1,9 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from core.apps.projects.models import Builder
|
||||
|
||||
|
||||
class BuilderListSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Builder
|
||||
fields = ['id', 'name']
|
||||
@@ -2,15 +2,7 @@ from django.db import transaction
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
from core.apps.projects.models.project import Project, ProjectDepartment, ProjectFolder
|
||||
|
||||
|
||||
class ProjectDepartmentListSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = ProjectDepartment
|
||||
fields = [
|
||||
'id', 'name'
|
||||
]
|
||||
from core.apps.projects.models.project import Project, ProjectFolder
|
||||
|
||||
|
||||
class ProjectListSerializer(serializers.ModelSerializer):
|
||||
@@ -22,12 +14,10 @@ class ProjectListSerializer(serializers.ModelSerializer):
|
||||
|
||||
|
||||
class ProjectDetailSerialzier(serializers.ModelSerializer):
|
||||
project_departments = ProjectDepartmentListSerializer(many=True)
|
||||
|
||||
class Meta:
|
||||
model = Project
|
||||
fields = [
|
||||
'id', 'name', 'location', 'start_date', 'end_date', 'project_departments'
|
||||
'id', 'name', 'location', 'start_date', 'end_date',
|
||||
]
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from django.urls import path, include
|
||||
|
||||
from core.apps.projects.views import project as project_views
|
||||
from core.apps.projects.views import builder as builder_views
|
||||
|
||||
urlpatterns = [
|
||||
path('project/', include(
|
||||
@@ -16,5 +17,10 @@ urlpatterns = [
|
||||
path('list/', project_views.ProjectFolderListApiView.as_view()),
|
||||
path('create/project/', project_views.ProjectFolderCreateProjectApiView.as_view()),
|
||||
]
|
||||
)),
|
||||
path('builder/', include(
|
||||
[
|
||||
path('list/', builder_views.BuilderListApiView.as_view()),
|
||||
]
|
||||
))
|
||||
]
|
||||
17
core/apps/projects/views/builder.py
Normal file
17
core/apps/projects/views/builder.py
Normal file
@@ -0,0 +1,17 @@
|
||||
from rest_framework import generics
|
||||
|
||||
from core.apps.projects.models import Builder
|
||||
from core.apps.projects.serializers import builder as serializers
|
||||
from core.apps.accounts.permissions.permissions import HasRolePermission
|
||||
from core.apps.shared.paginations.custom import CustomPageNumberPagination
|
||||
|
||||
|
||||
class BuilderListApiView(generics.ListAPIView):
|
||||
serializer_class = serializers.BuilderListSerializer
|
||||
queryset = Builder.objects.all()
|
||||
permission_classes = [HasRolePermission]
|
||||
required_permissions = []
|
||||
pagination_class = CustomPageNumberPagination
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from rest_framework import generics, status
|
||||
from rest_framework.response import Response
|
||||
|
||||
from core.apps.projects.models.project import Project, ProjectDepartment, ProjectFolder
|
||||
from core.apps.projects.models.project import Project, ProjectFolder
|
||||
from core.apps.projects.serializers import project as serializers
|
||||
from core.apps.accounts.permissions.permissions import HasRolePermission
|
||||
from core.apps.shared.paginations.custom import CustomPageNumberPagination
|
||||
@@ -17,7 +17,7 @@ class ProjectListApiView(generics.ListAPIView):
|
||||
|
||||
class ProjectDetailApiView(generics.RetrieveAPIView):
|
||||
serializer_class = serializers.ProjectDetailSerialzier
|
||||
queryset = Project.objects.prefetch_related('project_departments')
|
||||
queryset = Project.objects.all()
|
||||
permission_classes = [HasRolePermission]
|
||||
required_permissions = []
|
||||
lookup_field = 'id'
|
||||
|
||||
Reference in New Issue
Block a user