add project apis

This commit is contained in:
behruz-dev
2025-08-04 10:47:12 +05:00
parent 1831ceae80
commit 1a5187f68d
7 changed files with 178 additions and 5 deletions

View File

@@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from core.apps.projects.models.project import ProjectDepartment, Project from core.apps.projects.models.project import ProjectDepartment, Project, ProjectFolder
class ProjectDepartmentInline(admin.TabularInline): class ProjectDepartmentInline(admin.TabularInline):
@@ -18,4 +18,10 @@ class ProjectAdmin(admin.ModelAdmin):
@admin.register(ProjectDepartment) @admin.register(ProjectDepartment)
class ProjectDepartmentAdmin(admin.ModelAdmin): class ProjectDepartmentAdmin(admin.ModelAdmin):
list_display = ['name', 'project'] list_display = ['name', 'project']
search_fields = ['name']
@admin.register(ProjectFolder)
class ProjectFolderAdmin(admin.ModelAdmin):
list_display = ['id', 'name']
search_fields = ['name'] search_fields = ['name']

View File

@@ -0,0 +1,33 @@
# Generated by Django 5.2.4 on 2025-08-04 10:23
import django.db.models.deletion
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='ProjectFolder',
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)),
],
options={
'verbose_name': 'Loyiha papkasi',
'verbose_name_plural': 'Loyiha papkalari',
},
),
migrations.AddField(
model_name='project',
name='folder',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='projects.projectfolder'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 5.2.4 on 2025-08-04 10:27
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0002_projectfolder_project_folder'),
]
operations = [
migrations.AlterField(
model_name='project',
name='folder',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='projects', to='projects.projectfolder'),
),
]

View File

@@ -4,11 +4,25 @@ from django.utils.translation import gettext_lazy as _
from core.apps.shared.models import BaseModel from core.apps.shared.models import BaseModel
class ProjectFolder(BaseModel):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Meta:
verbose_name = _('Loyiha papkasi')
verbose_name_plural = _('Loyiha papkalari')
class Project(BaseModel): class Project(BaseModel):
name = models.CharField(max_length=200) name = models.CharField(max_length=200)
location = models.CharField(max_length=200) location = models.CharField(max_length=200)
start_date = models.DateField() start_date = models.DateField()
end_date = models.DateField() end_date = models.DateField()
folder = models.ForeignKey(
ProjectFolder, on_delete=models.SET_NULL, null=True, blank=True, related_name='projects'
)
def __str__(self): def __str__(self):
return self.name return self.name

View File

@@ -1,6 +1,8 @@
from django.db import transaction
from rest_framework import serializers from rest_framework import serializers
from core.apps.projects.models.project import Project, ProjectDepartment from core.apps.projects.models.project import Project, ProjectDepartment, ProjectFolder
class ProjectDepartmentListSerializer(serializers.ModelSerializer): class ProjectDepartmentListSerializer(serializers.ModelSerializer):
@@ -26,4 +28,65 @@ class ProjectDetailSerialzier(serializers.ModelSerializer):
model = Project model = Project
fields = [ fields = [
'id', 'name', 'location', 'start_date', 'end_date', 'project_departments' 'id', 'name', 'location', 'start_date', 'end_date', 'project_departments'
] ]
class ProjectCreateSerializer(serializers.ModelSerializer):
location = serializers.CharField()
start_date = serializers.DateField()
end_date = serializers.DateField()
name = serializers.CharField()
def create(self, validated_data):
with transaction.atomic():
return Project.objects.create(
name=validated_data.get('name'),
start_date=validated_data.get('start_date'),
end_date=validated_data.get('end_date'),
location=validated_data.get('location')
)
class ProjectFolderCreateSerializer(serializers.Serializer):
name = serializers.CharField()
def create(self, validated_data):
with transaction.atomic():
folder = ProjectFolder.objects.create(
name=validated_data.get('name')
)
return folder
class ProjectFolderListSerializer(serializers.ModelSerializer):
projects = ProjectListSerializer(many=True)
class Meta:
model = ProjectFolder
fields = ['id', 'name', 'projects']
class ProjectFolderProjectCreateSerializer(serializers.Serializer):
folder_id = serializers.UUIDField()
name = serializers.CharField()
location = serializers.CharField()
start_date = serializers.DateField()
end_date = serializers.DateField()
def validate(self, data):
folder = ProjectFolder.objects.filter(id=data['folder_id']).first()
if not folder:
raise serializers.ValidationError("Folder not found")
data['folder'] = folder
return data
def create(self, validated_data):
with transaction.atomic():
return Project.objects.create(
name=validated_data.get('name'),
folder=validated_data.get('folder'),
location=validated_data.get('location'),
start_date=validated_data.get('start_date'),
end_date=validated_data.get('end_date')
)

View File

@@ -7,6 +7,14 @@ urlpatterns = [
[ [
path('list/', project_views.ProjectListApiView.as_view()), path('list/', project_views.ProjectListApiView.as_view()),
path('<uuid:id>/', project_views.ProjectDetailApiView.as_view()), path('<uuid:id>/', project_views.ProjectDetailApiView.as_view()),
path('create/', project_views.ProjectCreateApiView.as_view()),
]
)),
path('project_folder/', include(
[
path('create/', project_views.ProjectFolderCreateApiView.as_view()),
path('list/', project_views.ProjectFolderListApiView.as_view()),
path('create/project/', project_views.ProjectFolderCreateProjectApiView.as_view()),
] ]
)) ))
] ]

View File

@@ -1,7 +1,7 @@
from rest_framework import generics, status from rest_framework import generics, status
from rest_framework.response import Response from rest_framework.response import Response
from core.apps.projects.models.project import Project, ProjectDepartment from core.apps.projects.models.project import Project, ProjectDepartment, ProjectFolder
from core.apps.projects.serializers import project as serializers from core.apps.projects.serializers import project as serializers
from core.apps.accounts.permissions.permissions import HasRolePermission from core.apps.accounts.permissions.permissions import HasRolePermission
from core.apps.shared.paginations.custom import CustomPageNumberPagination from core.apps.shared.paginations.custom import CustomPageNumberPagination
@@ -20,4 +20,34 @@ class ProjectDetailApiView(generics.RetrieveAPIView):
queryset = Project.objects.prefetch_related('project_departments') queryset = Project.objects.prefetch_related('project_departments')
permission_classes = [HasRolePermission] permission_classes = [HasRolePermission]
required_permissions = [] required_permissions = []
lookup_field = 'id' lookup_field = 'id'
class ProjectCreateApiView(generics.CreateAPIView):
serializer_class = serializers.ProjectCreateSerializer
queryset = Project.objects.all()
permission_classes = [HasRolePermission]
required_permissions = []
# Project Folder
class ProjectFolderCreateApiView(generics.CreateAPIView):
serializer_class = serializers.ProjectFolderCreateSerializer
queryset = ProjectFolder.objects.all()
permission_classes = [HasRolePermission]
required_permissions = []
class ProjectFolderListApiView(generics.ListAPIView):
serializer_class = serializers.ProjectFolderListSerializer
queryset = ProjectFolder.objects.prefetch_related('projects')
permission_classes = [HasRolePermission]
required_permissions = []
pagination_class = CustomPageNumberPagination
class ProjectFolderCreateProjectApiView(generics.CreateAPIView):
serializer_class = serializers.ProjectFolderProjectCreateSerializer
queryset = Project.objects.all()
permission_classes = [HasRolePermission]
required_permissions = []